#include <cloud_scape.h>
|
|
Definition at line 264 of file cloud_scape.cpp.
00265 { 00266 } |
|
Definition at line 424 of file cloud_scape.cpp. References _AllClouds, _AverageFrameRate, _CloudPower, _CurrentCSS, _DeltaTime, _DTRest, _GlobalTime, _IncomingCSS, _IsIncomingCSS, _NbHalfCloudToUpdate, _NewCSS, _OldCSS, _ShouldProcessCloud, _TimeNewCSS, _ViewerCam, NLMISC::CRGBA::A, NLMISC::CValueSmootherTemplate< float >::addValue(), NL3D::SCloudScapeSetup::Ambient, NLMISC::CRGBA::B, NL3D::CCloud::CloudPower, NL3D::SCloudScapeSetup::CloudSpeed, NL3D::SCloudScapeSetup::Diffuse, NLMISC::CRGBA::G, makeHalfCloud(), MAX_CLOUDS, NL3D::SCloudScapeSetup::NbCloud, NLMISC::CRGBA::R, sint32, NL3D::CCloud::Time, NL3D::SCloudScapeSetup::TimeToChange, uint32, uint8, and NL3D::SCloudScapeSetup::WindSpeed. Referenced by NL3D::CCloudScapeUser::anim(), and init().
00425 { 00426 sint32 i; 00427 00428 _ViewerCam = pCamera; 00429 00430 // 10 fps -> 200 fps 00431 if (dt > 0.1) dt = 0.1; 00432 if (dt < 0.005) dt = 0.005; 00433 00434 _DeltaTime = dt; 00435 _GlobalTime += _DeltaTime; 00436 _AverageFrameRate.addValue ((float)_DeltaTime); 00437 00438 // Animate the CSS 00439 if (_TimeNewCSS > _NewCSS.TimeToChange) 00440 { 00441 _CurrentCSS = _NewCSS; 00442 _OldCSS = _NewCSS; 00443 if (_IsIncomingCSS) 00444 { 00445 _IsIncomingCSS = false; 00446 _NewCSS = _IncomingCSS; 00447 _TimeNewCSS = 0; 00448 if (_NewCSS.NbCloud > _OldCSS.NbCloud) 00449 for (i = 0; i < (sint32)(_NewCSS.NbCloud-_OldCSS.NbCloud); ++i) 00450 { 00451 CCloud &c = _AllClouds[_OldCSS.NbCloud+i]; 00452 c.CloudPower = 0; 00453 _CloudPower[_OldCSS.NbCloud+i] = 0; 00454 } 00455 } 00456 } 00457 else 00458 { 00459 float inter = (float)(_TimeNewCSS / _NewCSS.TimeToChange); 00460 _CurrentCSS.WindSpeed = (_NewCSS.WindSpeed - _OldCSS.WindSpeed)*inter + _OldCSS.WindSpeed; 00461 _CurrentCSS.CloudSpeed = (_NewCSS.CloudSpeed - _OldCSS.CloudSpeed)*inter + _OldCSS.CloudSpeed; 00462 00463 _CurrentCSS.Ambient.R = (uint8)((_NewCSS.Ambient.R - _OldCSS.Ambient.R)*inter + _OldCSS.Ambient.R); 00464 _CurrentCSS.Ambient.G = (uint8)((_NewCSS.Ambient.G - _OldCSS.Ambient.G)*inter + _OldCSS.Ambient.G); 00465 _CurrentCSS.Ambient.B = (uint8)((_NewCSS.Ambient.B - _OldCSS.Ambient.B)*inter + _OldCSS.Ambient.B); 00466 _CurrentCSS.Ambient.A = (uint8)((_NewCSS.Ambient.A - _OldCSS.Ambient.A)*inter + _OldCSS.Ambient.A); 00467 00468 _CurrentCSS.Diffuse.R = (uint8)((_NewCSS.Diffuse.R - _OldCSS.Diffuse.R)*inter + _OldCSS.Diffuse.R); 00469 _CurrentCSS.Diffuse.G = (uint8)((_NewCSS.Diffuse.G - _OldCSS.Diffuse.G)*inter + _OldCSS.Diffuse.G); 00470 _CurrentCSS.Diffuse.B = (uint8)((_NewCSS.Diffuse.B - _OldCSS.Diffuse.B)*inter + _OldCSS.Diffuse.B); 00471 _CurrentCSS.Diffuse.A = (uint8)((_NewCSS.Diffuse.A - _OldCSS.Diffuse.A)*inter + _OldCSS.Diffuse.A); 00472 00473 if (_NewCSS.NbCloud > _OldCSS.NbCloud) 00474 { 00475 // Add some clouds 00476 float slice = (_NewCSS.TimeToChange/4) / (_NewCSS.NbCloud-_OldCSS.NbCloud); 00477 sint32 diffCloud = _NewCSS.NbCloud-_OldCSS.NbCloud; 00478 00479 _CurrentCSS.NbCloud = _OldCSS.NbCloud + (1+(uint32)(_TimeNewCSS/slice)); 00480 if (_CurrentCSS.NbCloud > _NewCSS.NbCloud) 00481 _CurrentCSS.NbCloud = _NewCSS.NbCloud; 00482 00483 for (i = 0; i < diffCloud; ++i) 00484 { 00485 _ShouldProcessCloud[_OldCSS.NbCloud+i] = true; 00486 if (_TimeNewCSS < i*slice) 00487 _CloudPower[_OldCSS.NbCloud+i] = 1; 00488 else if (_TimeNewCSS > (i*slice+3*_NewCSS.TimeToChange/4)) 00489 _CloudPower[_OldCSS.NbCloud+i] = 255; 00490 else 00491 _CloudPower[_OldCSS.NbCloud+i] = (uint8)(255*(_TimeNewCSS-i*slice)/(3*_NewCSS.TimeToChange/4)); 00492 } 00493 } 00494 else 00495 { 00496 // Remove some clouds 00497 sint32 diffCloud = _OldCSS.NbCloud-_NewCSS.NbCloud; 00498 if (diffCloud) 00499 { 00500 float slice = (_NewCSS.TimeToChange/4) / (float)diffCloud; 00501 _CurrentCSS.NbCloud = _OldCSS.NbCloud; 00502 00503 for (i = 0; i < diffCloud; ++i) 00504 { 00505 if (_TimeNewCSS < i*slice) 00506 _CloudPower[_OldCSS.NbCloud-i-1] = 255; 00507 else if (_TimeNewCSS > (i*slice+3*_NewCSS.TimeToChange/4)) 00508 _CloudPower[_OldCSS.NbCloud-i-1] = 0; 00509 else 00510 _CloudPower[_OldCSS.NbCloud-i-1] = (uint8)(255-255*(_TimeNewCSS-i*slice)/(3*_NewCSS.TimeToChange/4)); 00511 } 00512 } 00513 } 00514 } 00515 00516 // Make the right number of half cloud 00517 _DTRest += dt; 00518 00519 while (_DTRest > (0.04/_NbHalfCloudToUpdate)) 00520 { 00521 makeHalfCloud (); 00522 _DTRest -= 0.04/_NbHalfCloudToUpdate; 00523 00524 for (i = 0; i < MAX_CLOUDS; ++i) 00525 { 00526 CCloud &c = _AllClouds[i]; 00527 c.Time += 0.04/_NbHalfCloudToUpdate; 00528 } 00529 00530 _TimeNewCSS += 0.04/_NbHalfCloudToUpdate; 00531 } 00532 } |
|
Definition at line 829 of file cloud_scape.cpp. References _AllClouds, NL3D::CCloud::getMemSize(), MAX_CLOUDS, and uint32. Referenced by NL3D::CCloudScapeUser::getMemSize().
00830 { 00831 uint32 nMemSize = 0; 00832 for (uint32 i = 0; i < MAX_CLOUDS; ++i) 00833 { 00834 CCloud &c = _AllClouds[i]; 00835 nMemSize += c.getMemSize(); 00836 } 00837 return nMemSize; 00838 } |
|
Definition at line 269 of file cloud_scape.cpp. References _AllClouds, _AverageFrameRate, _CloudPower, _CloudScheduler, _CloudSchedulerLastAdded, _CloudSchedulerSize, _CurrentCSS, _DTRest, _ExtrapolatedPriorities, _FrameCounter, _Generate, _GlobalTime, _IsIncomingCSS, _NbHalfCloudToUpdate, _NewCSS, _Noise3D, _OldCSS, _ShouldProcessCloud, _SortedClouds, _TimeNewCSS, _ViewerCam, NLMISC::CValueSmootherTemplate< float >::addValue(), NL3D::SCloudScapeSetup::Ambient, NL3D::CCloudScape::SCloudSchedulerEntry::Ambient, anim(), CCloud, NL3D::CCloudScape::SCloudSchedulerEntry::CloudIndex, NL3D::CCloudScape::SCloudSchedulerEntry::DeltaNextCalc, NL3D::SCloudScapeSetup::Diffuse, NL3D::CCloudScape::SCloudSchedulerEntry::Diffuse, NL3D::CCloudScape::SCloudSchedulerEntry::Frame, NL3D::CCloud::FuturTime, NL3D::CCloud::getSizeX(), NL3D::CCloud::getSizeY(), NL3D::CCloud::getSizeZ(), NL3D::CCloud::getX(), NL3D::CCloud::getY(), NL3D::CCloud::getZ(), NLMISC::CValueSmootherTemplate< float >::init(), NL3D::CCloud::init(), NL3D::SCloudTextureClamp::init(), NL3D::SCloudTexture3D::init(), NL3D::CNoise3d::init(), MAX_CLOUDS, MAX_DIST, NL3D::SCloudScapeSetup::NbCloud, NL3D::CCloudScape::SCloudSchedulerEntry::Power, QUEUE_SIZE, NL3D::CCloud::setSizeX(), NL3D::CCloud::setSizeY(), NL3D::CCloud::setSizeZ(), NL3D::CCloud::setTex3DTemp(), NL3D::CCloud::setTexClamp(), NL3D::CCloud::setX(), NL3D::CCloud::setY(), NL3D::CCloud::setZ(), sint32, SQR, Tex3DTemp, TexClamp, NL3D::CCloud::Time, and uint32. Referenced by NL3D::CCloudScapeUser::init().
00270 { 00271 _ViewerCam = pCamera; 00272 00273 _Noise3D.init(); 00274 00275 _AllClouds.resize (MAX_CLOUDS, CCloud(this)); 00276 _CloudPower.resize (MAX_CLOUDS); 00277 _ShouldProcessCloud.resize (MAX_CLOUDS); 00278 00279 // For the moment only one clamp texture (generated) 00280 Tex3DTemp.init (64, 32, 32); 00281 TexClamp.init (64, 32, 32,""); 00282 00283 if (pCSS != NULL) 00284 { 00285 _CurrentCSS = *pCSS; 00286 _NewCSS = *pCSS; 00287 _OldCSS = *pCSS; 00288 } 00289 _IsIncomingCSS = false; 00290 _TimeNewCSS = 60.0*60.0; 00291 00292 uint32 i; 00293 for (i = 0; i < MAX_CLOUDS; ++i) 00294 { 00295 float newX, newY, newZ, newSizeX, newSizeY, newSizeZ; 00296 00297 CCloud &c = _AllClouds[i]; 00298 00299 c.setTex3DTemp (Tex3DTemp); 00300 c.setTexClamp (TexClamp); 00301 00302 while (true) 00303 { 00304 bool bRecalc = false; 00305 newX = MAX_DIST*(1.0f-2.0f*(((float)rand())/RAND_MAX)); 00306 newY = MAX_DIST*(1.0f-2.0f*(((float)rand())/RAND_MAX)); 00307 newZ = 85.0f+40.0f*(1.0f-2.0f*(((float)rand())/RAND_MAX)); 00308 00309 newSizeX = 60.0f+10.0f*(1.0f-2.0f*(((float)rand())/RAND_MAX)); 00310 newSizeY = 30.0f+10.0f*(1.0f-2.0f*(((float)rand())/RAND_MAX)); 00311 newSizeZ = 30.0f+10.0f*(1.0f-2.0f*(((float)rand())/RAND_MAX)); 00312 float f = 0.7f+0.3f*((float)rand())/RAND_MAX; 00313 newSizeX *= 1.5f*f; 00314 newSizeY *= 1.5f*f; 00315 newSizeZ *= 1.5f*f; 00316 00317 float d = sqrtf(SQR(newX)+SQR(newY)); 00318 if (d > MAX_DIST) bRecalc = true; 00319 00320 float r1 = sqrtf(SQR(newSizeX/2)+SQR(newSizeY/2)+SQR(newSizeZ/2)); 00321 for (uint32 k = 0;k < i; ++k) 00322 { 00323 CCloud &c2 = _AllClouds[k]; 00324 00325 if ((fabs(newX-c2.getX()) < (newSizeX/2+c2.getSizeX()/2)) && 00326 (fabs(newY-c2.getY()) < (newSizeY/2+c2.getSizeY()/2)) && 00327 (fabs(newZ-c2.getZ()) < (newSizeZ/2+c2.getSizeZ()/2))) 00328 bRecalc = true; 00329 } 00330 if (!bRecalc) break; 00331 } 00332 00333 c.init (64, 32, 32, 0.122f, 4); 00334 c.setX (newX-newSizeX/2); 00335 c.setY (newY-newSizeY/2); 00336 c.setZ (newZ-newSizeZ/2); 00337 00338 c.setSizeX (newSizeX); 00339 c.setSizeY (newSizeY); 00340 c.setSizeZ (newSizeZ); 00341 00342 c.Time = 0; 00343 c.FuturTime = _CurrentCSS.NbCloud * 2 * (0.04/_NbHalfCloudToUpdate); 00344 if (i < _CurrentCSS.NbCloud) 00345 { 00346 _CloudPower[i] = 255; 00347 _ShouldProcessCloud[i] = true; 00348 } 00349 else 00350 { 00351 _CloudPower[i] = 0; 00352 _ShouldProcessCloud[i] = false; 00353 } 00354 } 00355 00356 _SortedClouds.resize (MAX_CLOUDS); 00357 00358 _CloudSchedulerSize = _CurrentCSS.NbCloud; 00359 _CloudSchedulerLastAdded.resize (MAX_CLOUDS); 00360 _FrameCounter = 0; 00361 _CloudScheduler.clear(); 00362 for (i = 0; i < MAX_CLOUDS; ++i) 00363 _CloudSchedulerLastAdded[i].ValidPos = false; 00364 00365 if (_CurrentCSS.NbCloud == 0) 00366 { 00367 for (i = 0; i < QUEUE_SIZE; ++i) 00368 { 00369 SCloudSchedulerEntry cse; 00370 cse.CloudIndex = -1; 00371 cse.Frame = _FrameCounter; 00372 cse.Ambient = _CurrentCSS.Ambient; 00373 cse.Diffuse = _CurrentCSS.Diffuse; 00374 _CloudScheduler.insert(_CloudScheduler.end(), cse); 00375 ++_FrameCounter; 00376 } 00377 } 00378 else 00379 { 00380 for (i = 0; i < QUEUE_SIZE; ++i) 00381 { 00382 sint32 nCloudNb; 00383 nCloudNb = i%_CurrentCSS.NbCloud; 00384 SCloudSchedulerEntry cse; 00385 cse.CloudIndex = nCloudNb; 00386 if (_CloudSchedulerLastAdded[nCloudNb].ValidPos == true) 00387 { 00388 SCloudSchedulerEntry &lastCSE = *_CloudSchedulerLastAdded[nCloudNb].Pos; 00389 sint32 delta = _FrameCounter - lastCSE.Frame; 00390 lastCSE.DeltaNextCalc = delta; 00391 } 00392 cse.Frame = _FrameCounter; 00393 cse.Ambient = _CurrentCSS.Ambient; 00394 cse.Diffuse = _CurrentCSS.Diffuse; 00395 cse.Power = _CloudPower[cse.CloudIndex]; 00396 _CloudSchedulerLastAdded[cse.CloudIndex].Pos = _CloudScheduler.insert(_CloudScheduler.end(), cse); 00397 _CloudSchedulerLastAdded[cse.CloudIndex].ValidPos = true; 00398 //_CloudSchedulerLastAdded[cse.CloudIndex].Pos = _CloudScheduler.end()-1; 00399 ++_FrameCounter; 00400 } 00401 } 00402 00403 _GlobalTime = 0.0f; 00404 _DTRest = 0.0f; 00405 _Generate = true; 00406 _AverageFrameRate.init(16); 00407 for (i = 0; i < 16; ++i) 00408 _AverageFrameRate.addValue (40.0f/1000.0f); 00409 00410 _ExtrapolatedPriorities.resize (MAX_CLOUDS); 00411 00412 for (i = 0; i < QUEUE_SIZE; ++i) 00413 anim (41.0/1000.0, _ViewerCam); 00414 } |
|
Definition at line 97 of file cloud_scape.h. References _DebugQuad. Referenced by NL3D::CCloud::dispBill(), and NL3D::CCloudScapeUser::isDebugQuadEnabled().
00097 { return _DebugQuad; } |
|
Definition at line 535 of file cloud_scape.cpp. References _AllClouds, _CloudPower, _CloudScheduler, _CloudSchedulerLastAdded, _CurrentCloudInProcess, _CurrentCloudInProcessFuturTime, _CurrentCSS, _ExtrapolatedPriorities, _FrameCounter, _Generate, _LODQualityThreshold, _NbHalfCloudToUpdate, _Noise3D, _ShouldProcessCloud, _ViewerCam, NL3D::SCloudScapeSetup::Ambient, NL3D::CCloudScape::SCloudSchedulerEntry::Ambient, NL3D::CCloud::anim(), NL3D::CCloud::CloudAmbient, NL3D::CCloud::CloudDiffuse, NL3D::CCloud::CloudDistAtt, NL3D::CCloudScape::SCloudSchedulerEntry::CloudIndex, NL3D::CCloud::CloudPower, NL3D::SCloudScapeSetup::CloudSpeed, NL3D::CCloudScape::SCloudSchedulerEntry::DeltaNextCalc, NL3D::SCloudScapeSetup::Diffuse, NL3D::CCloudScape::SCloudSchedulerEntry::Diffuse, NL3D::CCloudScape::SCloudSchedulerEntry::Frame, NL3D::CCloud::FuturTime, NL3D::CCloud::genBill(), NL3D::CCloud::generate(), NL3D::CCloud::getLastX(), NL3D::CCloud::getSizeX(), NL3D::CCloud::getSizeY(), NL3D::CCloud::getSizeZ(), NL3D::CCloud::getX(), NL3D::CCloud::getY(), NL3D::CCloud::getZ(), NL3D::CCloud::LastCloudPower, NL3D::CCloud::light(), MAX_CLOUDS, MAX_DIST, NL3D::SCloudScapeSetup::NbCloud, nlassert, NL3D::CCloudScape::SCloudSchedulerEntry::Power, QUEUE_SIZE, r, NLMISC::raiseToNextPowerOf2(), NL3D::CCloud::setLooping(), NL3D::CCloud::setX(), sint32, SQR, NL3D::CCloud::Time, uint32, uint8, NL3D::SCloudScapeSetup::WindSpeed, NLMISC::CVector::x, x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by anim().
00536 { 00537 CVector Viewer = CVector(0,0,0); //_ViewerCam->getMatrix().getPos(); 00538 00539 if (_Generate) 00540 { 00541 // Find the next cloud in the list 00542 SCloudSchedulerEntry FrontCSE; 00543 00544 FrontCSE = _CloudScheduler.front(); 00545 00546 // Is the cloud do not have another reference in the list add it now because it should be processed 00547 sint32 CloudIndexToAdd = -1; 00548 00549 if ((FrontCSE.CloudIndex != -1) && 00550 (_ShouldProcessCloud[FrontCSE.CloudIndex] == true) && 00551 ( (_CloudSchedulerLastAdded[FrontCSE.CloudIndex].ValidPos == false) || 00552 ((_CloudSchedulerLastAdded[FrontCSE.CloudIndex].ValidPos == true) && 00553 (_CloudSchedulerLastAdded[FrontCSE.CloudIndex].Pos == _CloudScheduler.begin())) 00554 )) 00555 { 00556 // It should be added now ! 00557 CloudIndexToAdd = FrontCSE.CloudIndex; 00558 FrontCSE.DeltaNextCalc = QUEUE_SIZE; 00559 } 00560 else if (_CurrentCSS.NbCloud != 0) 00561 { 00562 // Choose a Cloud Index To Add at the end of the list 00563 uint32 nPeriodeMax = _CurrentCSS.NbCloud+_CurrentCSS.NbCloud/10; 00564 sint32 Priority = -10000; 00565 uint32 i; 00566 00567 float sumPrior = 0.0f; 00568 for (i = 0; i < MAX_CLOUDS; ++i) 00569 if (_ShouldProcessCloud[i]) 00570 { 00571 CCloud &rC = _AllClouds[i]; 00572 float ExtrapolatedTime = ((0.04f/_NbHalfCloudToUpdate) * QUEUE_SIZE * 2); 00573 float x = rC.getLastX () + ExtrapolatedTime * _CurrentCSS.WindSpeed; 00574 //float d = sqrtf(SQR(x+rC.getSizeX()/2-Viewer.x)+SQR(rC.getY()+rC.getSizeY()/2-Viewer.y)+ 00575 // SQR(rC.getZ()+rC.getSizeZ()/2-Viewer.z)); 00576 float d = SQR(x+rC.getSizeX()/2-Viewer.x)+SQR(rC.getY()+rC.getSizeY()/2-Viewer.y)+ 00577 SQR(rC.getZ()+rC.getSizeZ()/2-Viewer.z); 00578 float d05 = sqrtf(d); 00579 float d025 = sqrtf(d05); 00580 float d075 = d05*d025; 00581 00582 _ExtrapolatedPriorities[i] = 1.0f / d075; 00583 sumPrior += _ExtrapolatedPriorities[i]; 00584 } 00585 00586 sint32 sumJeton = 0; 00587 for (i = 0; i < MAX_CLOUDS; ++i) 00588 if (_ShouldProcessCloud[i]) 00589 { 00590 // Normalize priorities 00591 float factor = ((float)QUEUE_SIZE) / sumPrior; 00592 sint32 nbJeton = (sint32)(0.5f+(factor * _ExtrapolatedPriorities[i])); 00593 00594 if (nbJeton < 1) 00595 nbJeton = 1; 00596 00597 _ExtrapolatedPriorities[i] = (float)nbJeton; 00598 sumJeton += nbJeton; 00599 } 00600 00601 if (sumJeton > QUEUE_SIZE) 00602 { 00603 do 00604 { 00605 for (i = 0; i < MAX_CLOUDS; ++i) 00606 if (_ShouldProcessCloud[i]) 00607 { 00608 if (_ExtrapolatedPriorities[i] > 1) 00609 { 00610 _ExtrapolatedPriorities[i] -= 1; 00611 --sumJeton; 00612 if (sumJeton == QUEUE_SIZE) break; 00613 } 00614 } 00615 } 00616 while (sumJeton > QUEUE_SIZE); 00617 } 00618 00619 for (i = 0; i < MAX_CLOUDS; ++i) 00620 if (_ShouldProcessCloud[i]) 00621 { 00622 // Cloud Period 00623 sint32 newPriority = nPeriodeMax; 00624 // Is there a last entry in array ? 00625 if (_CloudSchedulerLastAdded[i].ValidPos == true) 00626 { 00627 SCloudSchedulerEntry &rLastCSE = *_CloudSchedulerLastAdded[i].Pos; 00628 newPriority = (sint32)(QUEUE_SIZE/_ExtrapolatedPriorities[i]); 00629 newPriority = (_FrameCounter - rLastCSE.Frame) - newPriority; 00630 } 00631 else 00632 { 00633 newPriority = 10000; 00634 } 00635 if (newPriority > Priority) 00636 { 00637 Priority = newPriority; 00638 CloudIndexToAdd = i; 00639 } 00640 } 00641 nlassert (CloudIndexToAdd != -1); 00642 } 00643 00644 // Ok now we have a good cloud index to add so make the new cloud entry 00645 SCloudSchedulerEntry newCSE; 00646 00647 newCSE.CloudIndex = CloudIndexToAdd; 00648 newCSE.Frame = _FrameCounter; 00649 newCSE.Ambient = _CurrentCSS.Ambient; 00650 newCSE.Diffuse = _CurrentCSS.Diffuse; 00651 if (CloudIndexToAdd != -1) 00652 { 00653 newCSE.Power = _CloudPower[CloudIndexToAdd]; 00654 00655 // If the cloud where added previously to the list 00656 if (_CloudSchedulerLastAdded[CloudIndexToAdd].ValidPos == true) 00657 { 00658 // This means that the cloud were added from a long time ago 00659 SCloudSchedulerEntry &lastCSE = *_CloudSchedulerLastAdded[CloudIndexToAdd].Pos; 00660 sint32 delta = _FrameCounter - lastCSE.Frame; 00661 lastCSE.DeltaNextCalc = delta; 00662 00663 // But the cloud can be removed (if so we have to not process it anymore) 00664 if (newCSE.Power == 0) 00665 _ShouldProcessCloud[CloudIndexToAdd] = false; 00666 } 00667 else 00668 { 00669 // No the cloud do not appear previously in the list... So its a new one 00670 _AllClouds[CloudIndexToAdd].reset (_ViewerCam); 00671 } 00672 00673 // If the last cloud occurence of the cloud appear at beginning so no more occurence in list 00674 if (_CloudSchedulerLastAdded[FrontCSE.CloudIndex].Pos == _CloudScheduler.begin()) 00675 _CloudSchedulerLastAdded[FrontCSE.CloudIndex].ValidPos = false; 00676 00677 _CloudSchedulerLastAdded[CloudIndexToAdd].Pos = _CloudScheduler.insert(_CloudScheduler.end(), newCSE); 00678 _CloudSchedulerLastAdded[CloudIndexToAdd].ValidPos = true; 00679 //_CloudSchedulerLastAdded[CloudIndexToAdd].Pos = _CloudScheduler.end()-1; 00680 } 00681 else 00682 { 00683 _CloudScheduler.insert(_CloudScheduler.end(), newCSE); 00684 } 00685 _CloudScheduler.pop_front (); 00686 ++_FrameCounter; 00687 // End of scheduling 00688 00689 // Get the cloud to process (this must be the next occurence of front cloud) 00690 std::list<SCloudSchedulerEntry>::iterator it = _CloudScheduler.begin(); 00691 while (it != _CloudScheduler.end()) 00692 { 00693 SCloudSchedulerEntry &rCSE = *it; 00694 if (rCSE.CloudIndex == FrontCSE.CloudIndex) 00695 break; 00696 ++it; 00697 } 00698 00699 SCloudSchedulerEntry CSEToCalc; 00700 // The cloud is no more present in the list 00701 if (it == _CloudScheduler.end()) 00702 { 00703 FrontCSE.DeltaNextCalc = 1; 00704 CSEToCalc = FrontCSE; 00705 } 00706 else 00707 { 00708 CSEToCalc = *it; 00709 } 00710 00711 // Is the cloud to calc is a real cloud 00712 if (CSEToCalc.CloudIndex == -1) 00713 { 00714 _CurrentCloudInProcess = NULL; 00715 } 00716 else 00717 { 00718 _CurrentCloudInProcess = &_AllClouds[CSEToCalc.CloudIndex]; 00719 CCloud &c = *_CurrentCloudInProcess; 00720 00721 // To go from Front cloud to CSEToCalc cloud we should take the front DeltaNextCalc 00722 00723 _CurrentCloudInProcessFuturTime = ((0.04/_NbHalfCloudToUpdate) * FrontCSE.DeltaNextCalc * 2); 00724 c.setX ((float)(c.getLastX() + _CurrentCloudInProcessFuturTime * _CurrentCSS.WindSpeed)); 00725 00726 float d2D = sqrtf(SQR(c.getX()+c.getSizeX()/2-Viewer.x)+SQR(c.getY()+c.getSizeY()/2-Viewer.y)); 00727 00728 if (d2D > MAX_DIST) 00729 c.CloudDistAtt = 255; 00730 else if (d2D > (MAX_DIST-100.0f)) 00731 c.CloudDistAtt = (uint8)(255*((d2D-(MAX_DIST-100.0f))/100.0f)); 00732 else 00733 c.CloudDistAtt = 0; 00734 00735 c.LastCloudPower = c.CloudPower; 00736 c.CloudPower = CSEToCalc.Power; 00737 c.CloudDiffuse = CSEToCalc.Diffuse; 00738 c.CloudAmbient = CSEToCalc.Ambient; 00739 00740 c.anim (_CurrentCloudInProcessFuturTime*_CurrentCSS.CloudSpeed, 00741 _CurrentCloudInProcessFuturTime*_CurrentCSS.WindSpeed); 00742 00743 c.generate (_Noise3D); 00744 } 00745 } 00746 else 00747 { 00748 if (_CurrentCloudInProcess != NULL) 00749 { 00750 CCloud &c = *_CurrentCloudInProcess; 00751 00752 c.Time = 0; 00753 c.FuturTime = _CurrentCloudInProcessFuturTime; 00754 c.light(); 00755 00756 if (c.getX() > MAX_DIST) 00757 { 00758 c.setX (c.getX() - (2 * MAX_DIST)); 00759 c.setLooping (); 00760 } 00761 00762 float r = sqrtf(SQR(c.getSizeX()/2)+SQR(c.getSizeY()/2)+SQR(c.getSizeZ()/2)); 00763 float d2D = sqrtf(SQR(c.getX()+c.getSizeX()/2-Viewer.x)+SQR(c.getY()+c.getSizeY()/2-Viewer.y)); 00764 float d = sqrtf(SQR(c.getX()+c.getSizeX()/2-Viewer.x)+SQR(c.getY()+c.getSizeY()/2-Viewer.y)+ 00765 SQR(c.getZ()+c.getSizeZ()/2-Viewer.z)); 00766 uint32 lookAtSize = (uint32)(_LODQualityThreshold*r/d); 00767 lookAtSize = raiseToNextPowerOf2 (lookAtSize); 00768 if (lookAtSize > 128) lookAtSize = 128; 00769 00770 c.genBill (_ViewerCam, lookAtSize); 00771 } 00772 } 00773 _Generate = !_Generate; 00774 } |
|
Definition at line 777 of file cloud_scape.cpp. References _AllClouds, _SortedClouds, _ViewerCam, NL3D::CFrustum::Bottom, NL3D::CCloudScape::SSortedCloudEntry::Cloud, NL3D::CCloud::CloudPower, NL3D::CCloud::dispBill(), NL3D::CCloudScape::SSortedCloudEntry::Distance, NL3D::CFrustum::Far, NL3D::CCamera::getFrustum(), NL3D::ITransformable::getMatrix(), NL3D::CCloud::getSizeX(), NL3D::CCloud::getSizeY(), NL3D::CCloud::getSizeZ(), NL3D::CCloud::getX(), NL3D::CCloud::getY(), NL3D::CCloud::getZ(), NLMISC::CMatrix::invert(), NL3D::CCloud::LastCloudPower, NL3D::CFrustum::Left, MAX_CLOUDS, NL3D::CFrustum::Near, NL3D::CFrustum::Perspective, NL3D::CFrustum::Right, s, NL3D::IDriver::setFrustum(), NLMISC::CMatrix::setPos(), NL3D::IDriver::setupModelMatrix(), NL3D::IDriver::setupScissor(), NL3D::IDriver::setupViewMatrix(), NL3D::IDriver::setupViewport(), SQR, NL3D::CFrustum::Top, uint32, v, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by NL3D::CCloudScapeUser::render().
00778 { 00779 uint32 i, j; 00780 00781 CVector Viewer = CVector (0,0,0); 00782 00783 CMatrix viewMat; 00784 viewMat = _ViewerCam->getMatrix (); 00785 viewMat.setPos(CVector(0,0,0)); 00786 viewMat.invert (); 00787 CScissor s; 00788 s.initFullScreen (); 00789 _Driver->setupScissor (s); 00790 CViewport v; 00791 _Driver->setupViewport (v); 00792 CFrustum f = _ViewerCam->getFrustum(); 00793 _Driver->setFrustum (f.Left, f.Right, f.Bottom, f.Top, f.Near, f.Far, f.Perspective); 00794 _Driver->setupViewMatrix (viewMat); 00795 _Driver->setupModelMatrix (CMatrix::Identity); 00796 00797 uint32 nNbCloudToRender = 0; 00798 00799 for (i = 0; i < MAX_CLOUDS; ++i) 00800 { 00801 CCloud &c = _AllClouds[i]; 00802 SSortedCloudEntry &sce = _SortedClouds[nNbCloudToRender]; 00803 sce.Cloud = &c; 00804 sce.Distance = sqrtf(SQR(c.getX()+c.getSizeX()/2-Viewer.x)+SQR(c.getY()+c.getSizeY()/2-Viewer.y)+ 00805 SQR(c.getZ()+c.getSizeZ()/2-Viewer.z)); 00806 nNbCloudToRender++; 00807 } 00808 00809 for (i = 0; i < nNbCloudToRender-1; ++i) 00810 for (j = i+1; j < nNbCloudToRender; ++j) 00811 { 00812 if (_SortedClouds[i].Distance < _SortedClouds[j].Distance) 00813 { 00814 SSortedCloudEntry sceTmp = _SortedClouds[i]; 00815 _SortedClouds[i] = _SortedClouds[j]; 00816 _SortedClouds[j] = sceTmp; 00817 } 00818 } 00819 00820 for (i = 0; i < nNbCloudToRender; ++i) 00821 { 00822 CCloud *pC = _SortedClouds[i].Cloud; 00823 if ((pC->CloudPower > 0) || (pC->LastCloudPower > 0)) 00824 pC->dispBill (_ViewerCam); 00825 } 00826 } |
|
Definition at line 417 of file cloud_scape.cpp. References _IncomingCSS, and _IsIncomingCSS. Referenced by NL3D::CCloudScapeUser::set().
00418 { 00419 _IncomingCSS = css; 00420 _IsIncomingCSS = true; 00421 } |
|
Definition at line 98 of file cloud_scape.h. References _DebugQuad. Referenced by NL3D::CCloudScapeUser::setDebugQuad().
00098 { _DebugQuad = b; } |
|
Definition at line 95 of file cloud_scape.h. References _NbHalfCloudToUpdate, and uint32. Referenced by NL3D::CCloudScapeUser::setNbCloudToUpdateIn80ms().
00095 { _NbHalfCloudToUpdate = n; } |
|
Definition at line 93 of file cloud_scape.h. References _LODQualityThreshold. Referenced by NL3D::CCloudScapeUser::setQuality().
00093 { _LODQualityThreshold = threshold; } |
|
Definition at line 186 of file cloud_scape.h. Referenced by init(). |
|
Definition at line 128 of file cloud_scape.h. Referenced by anim(), getMemSize(), init(), makeHalfCloud(), and render(). |
|
Definition at line 110 of file cloud_scape.h. |
|
Definition at line 115 of file cloud_scape.h. Referenced by anim(), init(), and makeHalfCloud(). |
|
Definition at line 156 of file cloud_scape.h. Referenced by init(), and makeHalfCloud(). |
|
Definition at line 158 of file cloud_scape.h. Referenced by init(), and makeHalfCloud(). |
|
Definition at line 157 of file cloud_scape.h. Referenced by init(). |
|
Definition at line 112 of file cloud_scape.h. Referenced by CCloudScape(), and makeHalfCloud(). |
|
Definition at line 113 of file cloud_scape.h. Referenced by makeHalfCloud(). |
|
Definition at line 118 of file cloud_scape.h. Referenced by anim(), init(), and makeHalfCloud(). |
|
Definition at line 174 of file cloud_scape.h. Referenced by CCloudScape(), isDebugQuadEnabled(), and setDebugQuad(). |
|
Definition at line 108 of file cloud_scape.h. Referenced by anim(). |
|
Definition at line 176 of file cloud_scape.h. Referenced by NL3D::CCloud::CCloud(). |
|
Definition at line 109 of file cloud_scape.h. |
|
Definition at line 160 of file cloud_scape.h. Referenced by init(), and makeHalfCloud(). |
|
Definition at line 159 of file cloud_scape.h. Referenced by init(), and makeHalfCloud(). |
|
Definition at line 111 of file cloud_scape.h. Referenced by init(), and makeHalfCloud(). |
|
Definition at line 107 of file cloud_scape.h. |
|
Definition at line 124 of file cloud_scape.h. |
|
Definition at line 123 of file cloud_scape.h. Referenced by anim(), CCloudScape(), init(), and set(). |
|
Definition at line 173 of file cloud_scape.h. Referenced by CCloudScape(), makeHalfCloud(), and setQuality(). |
|
Definition at line 179 of file cloud_scape.h. Referenced by CCloudScape(), and NL3D::CCloud::dispBill(). |
|
Definition at line 178 of file cloud_scape.h. Referenced by CCloudScape(), NL3D::CCloud::genBill(), NL3D::CCloud::generate(), NL3D::CCloud::light(), and NL3D::CCloud::reset(). |
|
Definition at line 106 of file cloud_scape.h. Referenced by anim(), CCloudScape(), init(), makeHalfCloud(), and setNbCloudToUpdateIn80ms(). |
|
Definition at line 119 of file cloud_scape.h. |
|
Definition at line 126 of file cloud_scape.h. Referenced by init(), and makeHalfCloud(). |
|
Definition at line 120 of file cloud_scape.h. |
|
Definition at line 116 of file cloud_scape.h. Referenced by anim(), init(), and makeHalfCloud(). |
|
Definition at line 169 of file cloud_scape.h. |
|
Definition at line 121 of file cloud_scape.h. |
|
Definition at line 177 of file cloud_scape.h. Referenced by CCloudScape(), NL3D::CCloud::disp(), NL3D::CCloud::dispBill(), NL3D::CCloud::dispXYZ(), NL3D::CCloud::genBill(), NL3D::CCloud::generate(), NL3D::CCloud::light(), and NL3D::CCloud::reset(). |
|
Definition at line 181 of file cloud_scape.h. Referenced by anim(), init(), makeHalfCloud(), and render(). |
|
Definition at line 183 of file cloud_scape.h. Referenced by init(). |
|
Definition at line 184 of file cloud_scape.h. Referenced by init(). |