#include <lighting_manager.h>
Nevrax France
Definition at line 60 of file lighting_manager.h.
Public Member Functions | |
CLightingManager (bool bSmallScene) | |
Constructor (bSmallScene is used to setup size of the grids). | |
void | computeModelLightContributions (CTransform *model, CLightContribution &lightContrib, ILogicInfo *logicInfo=NULL) |
Dynamic Lights localisation. | |
void | addDynamicLight (CPointLight *light) |
void | clearDynamicLights () |
clear for the pass all the lights. | |
const std::vector< CPointLight * > & | getAllDynamicLightList () const |
Static Lighted Objects Localisation. Used for lights to touch nearest static models. | |
CQGItLightedModel | eraseStaticLightedModel (CQGItLightedModel ite) |
CQGItLightedModel | insertStaticLightedModel (CTransform *model) |
Parameters | |
float | getLightTransitionThreshold () const |
uint | getMaxLightContribution () const |
float | getNoAttLightRadius () const |
float | getOutOfAttLightInfFactor () const |
void | setLightTransitionThreshold (float lightTransitionThreshold) |
void | setMaxLightContribution (uint nlights) |
void | setNoAttLightRadius (float noAttLightRadius) |
void | setOutOfAttLightInfFactor (float outOfAttLightInfFactor) |
Private Member Functions | |
void | getDynamicPointLightList (const CVector &worldPos, std::vector< CPointLightInfluence > &lightList) |
get the list of dynamic light viewed from a position. append to lightList | |
Private Attributes | |
std::vector< CPointLight * > | _DynamicLightList |
CQuadGrid< CPointLightInfo > | _LightQuadGrid [4] |
float | _LightQuadGridRadiusLimit [4] |
CQuadGrid< CTransform * > | _StaticLightedModelQuadGrid [4] |
Parameters. | |
float | _LightTransitionThreshold |
uint | _MaxLightContribution |
float | _NoAttLightRadius |
float | _OutOfAttLightInfFactor |
|
|
temp add a dynamic light to the manager. light is added to the _LightQuadGrid. This method calls CTransform::resetLighting() for all models around the light. Additionaly light are added to a list (a vector of pointer), see getDynamicLightList() Definition at line 151 of file lighting_manager.cpp. References _LightQuadGrid, _LightQuadGridRadiusLimit, _NoAttLightRadius, _StaticLightedModelQuadGrid, NL3D::CQuadGrid< CTransform * >::begin(), NLMISC::CBSphere::Center, NL3D::CQuadGrid< T >::end(), NL3D::CPointLight::getAttenuationEnd(), NLMISC::CMatrix::getPos(), NL3D::CPointLight::getPosition(), NL3D::CTransform::getWorldMatrix(), NLMISC::CBSphere::include(), NL3D::CQuadGrid< CPointLightInfo >::insert(), NL3D::CLightingManager::CPointLightInfo::Light, NL3D_QUADGRID_LIGHT_NUM_LEVEL, NLMISC::CBSphere::Radius, NL3D::CTransform::resetLighting(), NL3D::CQuadGrid< CTransform * >::select(), NL3D::CLightingManager::CPointLightInfo::Sphere, and uint. Referenced by NL3D::CPointLightModel::traverseLight().
00152 { 00153 00154 // Insert the light in the quadGrid. 00155 //---------- 00156 CPointLightInfo plInfo; 00157 plInfo.Light= light; 00158 00159 // build the bounding sphere for this light, with the AttenuationEnd of the light 00160 float radius=light->getAttenuationEnd(); 00161 // if attenuation is disabled (ie getAttenuationEnd() return 0), then have a dummy radius 00162 if(radius==0) 00163 radius= _NoAttLightRadius; 00164 plInfo.Sphere.Center= light->getPosition(); 00165 plInfo.Sphere.Radius= radius; 00166 00167 // build a bbox, so it includes the sphere 00168 CVector bbmin= light->getPosition(); 00169 bbmin-= CVector(radius, radius, radius); 00170 CVector bbmax= light->getPosition(); 00171 bbmax+= CVector(radius, radius, radius); 00172 00173 // choose the correct quadgrid according to the radius of the light. 00174 uint qgId; 00175 for(qgId= 0; qgId<NL3D_QUADGRID_LIGHT_NUM_LEVEL-1; qgId++) 00176 { 00177 // if radius is inferior to the requested radius for this quadGrid, ok! 00178 if(radius<_LightQuadGridRadiusLimit[qgId]) 00179 break; 00180 } 00181 // insert this light in the correct quadgrid. 00182 _LightQuadGrid[qgId].insert(bbmin, bbmax, plInfo); 00183 00184 00185 // touch the objects around the lights. 00186 //---------- 00187 00188 // Select the static lightedModels to update around this light. 00189 // Use the same level of _StaticLightedModelQuadGrid than me to not select too many squares in the quadGrid 00190 _StaticLightedModelQuadGrid[qgId].select(bbmin, bbmax); 00191 // For all those models. 00192 CQuadGrid<CTransform*>::CIterator itModel= _StaticLightedModelQuadGrid[qgId].begin(); 00193 while(itModel != _StaticLightedModelQuadGrid[qgId].end() ) 00194 { 00195 CTransform *model= *itModel; 00196 const CVector &modelPos= model->getWorldMatrix().getPos(); 00197 00198 // test first if this model is in the area of the light. 00199 if( plInfo.Sphere.include(modelPos) ) 00200 { 00201 // yes, then this model must recompute his lighting, because a dynamic light touch him. 00202 model->resetLighting(); 00203 } 00204 00205 // next. 00206 itModel++; 00207 } 00208 00209 00210 // insert the light in the list. 00211 //---------- 00212 _DynamicLightList.push_back(light); 00213 00214 } |
|
clear for the pass all the lights.
Definition at line 137 of file lighting_manager.cpp. References _LightQuadGrid, NL3D::CQuadGrid< CPointLightInfo >::clear(), NL3D_QUADGRID_LIGHT_NUM_LEVEL, and uint. Referenced by NL3D::CLightTrav::traverse().
00138 { 00139 // for all levels 00140 for(uint i=0;i<NL3D_QUADGRID_LIGHT_NUM_LEVEL;i++) 00141 { 00142 // clear all the lights in the quadGrid. 00143 _LightQuadGrid[i].clear(); 00144 } 00145 00146 // clear the list. 00147 _DynamicLightList.clear(); 00148 } |
|
get the description of nearsest lights viewed for this model. Dynamic lights are parsed to get list of lights, and ILogicInfo->getStaticLightDesc() is parsed too. Then, maxLights are returned, which may be a blended result of max influence light. NB: model->_LightContribution is filled with real contributions of lights. NB: model is append to the _LightedModelList of each contributed light NB: this list is valid until model->isNeedUpdateLighting() is true. Definition at line 256 of file lighting_manager.cpp. References _LightTransitionThreshold, _MaxLightContribution, _OutOfAttLightInfFactor, NL3D::CPointLight::appendLightedModel(), NL3D::CLightContribution::AttFactor, NLMISC::CRGBA::B, NLMISC::CRGBAF::B, NLMISC::clamp(), NL3D::CPointLight::computeLinearAttenuation(), NL3D::CLightContribution::Factor, NL3D::CLightContribution::FrozenStaticLightSetup, NLMISC::CRGBA::G, NLMISC::CRGBAF::G, NL3D::CPointLight::getAmbient(), NL3D::CPointLight::getAttenuationBegin(), NL3D::CPointLight::getAttenuationEnd(), NL3D::CPointLight::getDiffuse(), getDynamicPointLightList(), NL3D::CTransform::getLightHotSpotInWorld(), NL3D::CPointLight::getPosition(), NL3D::ILogicInfo::getStaticLightSetup(), NL3D::CPointLight::getType(), NL3D::CLightContribution::LocalAmbient, NL3D::CLightContribution::MergedPointLight, NL3D_MAX_LIGHT_CONTRIBUTION, NL3D::CLightContribution::NumFrozenStaticLight, NLMISC::OptFastFloor(), NL3D::CLightContribution::PointLight, NLMISC::CRGBA::R, NLMISC::CRGBAF::R, NLMISC::CRGBA::set(), sint, NL3D::CLightContribution::SunContribution, NL3D::CLightContribution::TransformIterator, uint, uint8, NL3D::CLightContribution::UseMergedPointLight, and v. Referenced by NL3D::CTransform::traverseLight().
00258 { 00259 sint i; 00260 00261 // This is the list of light which touch this model. 00262 static std::vector<CPointLightInfluence> lightList; 00263 // static, for malloc perf. 00264 lightList.clear(); 00265 00266 // the position of the model. 00267 CVector modelPos; 00268 float modelRadius; 00269 00270 // depends on model 00271 model->getLightHotSpotInWorld(modelPos, modelRadius); 00272 00273 // First pass, fill the list of light which touch this model. 00274 //========= 00275 // get the dynamic lights around the model 00276 getDynamicPointLightList(modelPos, lightList); 00277 00278 // if not already precomputed, append staticLights to this list. 00279 if( !lightContrib.FrozenStaticLightSetup ) 00280 { 00281 // If no logicInfo provided 00282 if(!logicInfo) 00283 { 00284 // Default: suppose full SunLight and no PointLights. 00285 lightContrib.SunContribution= 255; 00286 // Take full SunAmbient. 00287 lightContrib.LocalAmbient.set(0,0,0,0); 00288 // do not append any pointLight to the setup 00289 } 00290 else 00291 { 00292 // NB: SunContribution is computed by logicInfo 00293 logicInfo->getStaticLightSetup(lightList, lightContrib.SunContribution, lightContrib.LocalAmbient); 00294 } 00295 } 00296 00297 // Second pass, in the lightList, choose the best suited light to lit this model 00298 //========= 00299 00300 // for each light, modulate the factor of influence 00301 for(i=0; i<(sint)lightList.size();i++) 00302 { 00303 CPointLight *pl= lightList[i].PointLight; 00304 00305 // get the distance from the light to the model 00306 float dist= (pl->getPosition() - modelPos).norm(); 00307 float distMinusRadius= dist - modelRadius; 00308 00309 // modulate the factor by the distance and the attenuation distance. 00310 float inf; 00311 float attBegin= pl->getAttenuationBegin(); 00312 float attEnd= pl->getAttenuationEnd(); 00313 // if no attenuation 00314 if( attEnd==0 ) 00315 { 00316 // influence is awlays 1. 00317 inf= 1; 00318 00319 // If SpotLight, must modulate with SpotAttenuation. 00320 if(pl->getType() == CPointLight::SpotLight) 00321 inf*= pl->computeLinearAttenuation(modelPos, dist, modelRadius); 00322 } 00323 else 00324 { 00325 // if correct attenuation radius 00326 if(distMinusRadius<attBegin) 00327 { 00328 // NB: we are sure that attBegin>0, because dist>=0. 00329 // if < attBegin, inf should be ==1, but must select the nearest lights; for better 00330 // understanding of the scene 00331 inf= 1 + _OutOfAttLightInfFactor * (attBegin - distMinusRadius); // inf E [1, +oo[ 00332 // NB: this formula favour big lights (ie light with big attBegin). 00333 00334 // If SpotLight, must modulate with SpotAttenuation. 00335 if(pl->getType() == CPointLight::SpotLight) 00336 inf*= pl->computeLinearAttenuation(modelPos, dist, modelRadius); 00337 } 00338 else if(distMinusRadius<attEnd) 00339 { 00340 // we are sure attEnd-attBegin>0 because of the test 00341 // compute influence of the light: attenuation and SpotAttenuation 00342 inf= pl->computeLinearAttenuation(modelPos, dist, modelRadius); 00343 } 00344 else 00345 { 00346 // if >= attEnd, inf should be ==0, but must select the nearest lights; for better 00347 // understanding of the scene 00348 inf= _OutOfAttLightInfFactor * (attEnd - distMinusRadius); // inf E ]-oo, 0] 00349 } 00350 } 00351 00352 // modulate the influence with this factor 00353 lightList[i].BkupInfluence= lightList[i].Influence; 00354 lightList[i].Influence*= inf; 00355 00356 // Bkup distance to model. 00357 lightList[i].DistanceToModel= dist; 00358 } 00359 00360 // sort the light by influence 00361 sort(lightList.begin(), lightList.end()); 00362 00363 // prepare Light Merging. 00364 static std::vector<float> lightToMergeWeight; 00365 lightToMergeWeight.clear(); 00366 lightToMergeWeight.resize(lightList.size(), 1); 00367 00368 00369 // and choose only max light. 00370 uint startId= 0; 00371 uint ligthSrcId= 0; 00372 // skip already setuped light (statically) 00373 if(lightContrib.FrozenStaticLightSetup) 00374 startId= lightContrib.NumFrozenStaticLight; 00375 00376 // If there is still place for unFrozen static lights or dynamic lights. 00377 if(startId < _MaxLightContribution) 00378 { 00379 // setup the transition. 00380 float deltaMinInfluence= _LightTransitionThreshold; 00381 float minInfluence= 0; 00382 sint doMerge= 0; 00383 sint firstLightToMergeFull= _MaxLightContribution-startId; 00384 // If there is more light than we can accept in not merged mode, Must merge 00385 if((sint)lightList.size() > firstLightToMergeFull) 00386 { 00387 doMerge= 1; 00388 // the minInfluence is the influence of the first light not taken. 00389 minInfluence= lightList[firstLightToMergeFull].Influence; 00390 // but must still be >=0. 00391 minInfluence= max(minInfluence, 0.f); 00392 } 00393 // Any light under this minInfluence+deltaMinInfluence will be smoothly darken. 00394 float minInfluenceStart = minInfluence + deltaMinInfluence; 00395 float OOdeltaMinInfluence= 1.0f / deltaMinInfluence; 00396 /* NB: this is not an error if we have only 3 light for example (assuming _MaxLightContribution=3), 00397 and still have minInfluenceStart>0. 00398 It's to have a continuity in the case of for example we have 3 lights in lightLists at frame T0, 00399 resulting in "doMerge=0" and at frame T1 we have 4 lights, the farthest having an influence of 0 00400 or nearly 0. 00401 */ 00402 00403 // fill maxLight at max. 00404 for(i=startId;i<(sint)_MaxLightContribution; i++) 00405 { 00406 // if not so many pointLights found, end!! 00407 if(ligthSrcId>=lightList.size()) 00408 break; 00409 else 00410 { 00411 CPointLight *pl= lightList[ligthSrcId].PointLight; 00412 float inf= lightList[ligthSrcId].Influence; 00413 float bkupInf= lightList[ligthSrcId].BkupInfluence; 00414 float distToModel= lightList[ligthSrcId].DistanceToModel; 00415 // else fill it. 00416 lightContrib.PointLight[i]= pl; 00417 00418 // Compute the Final factor of influence of the light. 00419 if(inf >= minInfluenceStart) 00420 { 00421 // For Static LightSetup BiLinear to work correctly, modulate with BkupInfluence 00422 // don't worry about the precision of floor, because of *255. 00423 lightContrib.Factor[i]= (uint8)NLMISC::OptFastFloor(bkupInf*255); 00424 // Indicate that this light don't need to be merged at all! 00425 lightToMergeWeight[ligthSrcId]= 0; 00426 } 00427 else 00428 { 00429 float f= (inf-minInfluence) * OOdeltaMinInfluence; 00430 // For Static LightSetup BiLinear to work correctly, modulate with BkupInfluence 00431 // don't worry about the precision of floor, because of *255. 00432 sint fi= NLMISC::OptFastFloor( bkupInf*f*255 ); 00433 clamp(fi, 0, 255); 00434 lightContrib.Factor[i]= fi; 00435 // The rest of the light contribution is to be merged. 00436 lightToMergeWeight[ligthSrcId]= 1-f; 00437 } 00438 00439 // Compute the Final Att factor for models using Global Attenuation. NB: modulate with Factor 00440 // don't worry about the precision of floor, because of *255. 00441 // NB: compute att on the center of the model => modelRadius==0 00442 sint attFactor= NLMISC::OptFastFloor( lightContrib.Factor[i] * pl->computeLinearAttenuation(modelPos, distToModel) ); 00443 lightContrib.AttFactor[i]= (uint8)attFactor; 00444 00445 // must append this lightedModel to the list in the light. 00446 lightContrib.TransformIterator[i]= pl->appendLightedModel(model); 00447 00448 // next light. 00449 ligthSrcId++; 00450 } 00451 } 00452 00453 // Compute LightToMerge. 00454 if(doMerge) 00455 { 00456 CRGBAF mergedAmbient(0,0,0); 00457 uint j; 00458 00459 // For all lights in the lightList, merge Diffuse and Ambient term to mergedAmbient. 00460 for(j=0;j<lightToMergeWeight.size();j++) 00461 { 00462 if(lightToMergeWeight[j] && lightList[j].Influence>0) 00463 { 00464 CPointLight *pl= lightList[j].PointLight; 00465 00466 // Get the original influence (ie for static PLs, biLinear influence) 00467 float bkupInf= lightList[j].BkupInfluence; 00468 // Get the attenuation of the pointLight to the model 00469 float distToModel= lightList[j].DistanceToModel; 00470 float attInf= pl->computeLinearAttenuation(modelPos, distToModel); 00471 // Attenuate the color of the light by biLinear and distance/spot attenuation. 00472 float lightInf= attInf * bkupInf; 00473 // Modulate also by the percentage to merge 00474 lightInf*= lightToMergeWeight[j]; 00475 // Add the full ambient term of the light, attenuated by light attenuation and WeightMerge 00476 mergedAmbient.R+= pl->getAmbient().R * lightInf; 00477 mergedAmbient.G+= pl->getAmbient().G * lightInf; 00478 mergedAmbient.B+= pl->getAmbient().B * lightInf; 00479 // Add 0.25f of the diffuse term of the light, attenuated by light attenuation and WeightMerge 00480 // mul by 0.25f, because this is the averaged contribution of the diffuse part of a 00481 // light to a sphere (do the maths...). 00482 float f= lightInf*0.25f; 00483 mergedAmbient.R+= pl->getDiffuse().R * f; 00484 mergedAmbient.G+= pl->getDiffuse().G * f; 00485 mergedAmbient.B+= pl->getDiffuse().B * f; 00486 } 00487 } 00488 00489 00490 // Setup the merged Light 00491 CRGBA amb; 00492 sint v; 00493 // Because of floating point error, it appears that sometime result may be slightly below 0. 00494 // => clamp necessary 00495 v= NLMISC::OptFastFloor(mergedAmbient.R); fastClamp8(v); amb.R= v; 00496 v= NLMISC::OptFastFloor(mergedAmbient.G); fastClamp8(v); amb.G= v; 00497 v= NLMISC::OptFastFloor(mergedAmbient.B); fastClamp8(v); amb.B= v; 00498 lightContrib.MergedPointLight= amb; 00499 00500 // Indicate we use the merged pointLight => the model must recompute lighting each frame 00501 lightContrib.UseMergedPointLight= true; 00502 } 00503 else 00504 { 00505 // If the model is freezeHRC(), need to test each frame only if MergedPointLight is used. 00506 lightContrib.UseMergedPointLight= false; 00507 } 00508 } 00509 else 00510 { 00511 // point to end the list 00512 i= startId; 00513 } 00514 00515 // End the list. 00516 if(i<NL3D_MAX_LIGHT_CONTRIBUTION) 00517 { 00518 lightContrib.PointLight[i]= NULL; 00519 } 00520 00521 } |
|
erase a lighted object to the _StaticLightedModelQuadGrid. must do it at deletion of the model or when it leaves freeHRC state. NB: default CQGItLightedModel (ie NULL) can be passed in.
Definition at line 217 of file lighting_manager.cpp. References _StaticLightedModelQuadGrid, NL3D::CQuadGrid< CTransform * >::erase(), NL3D_QUADGRID_LIGHT_NUM_LEVEL, NL3D::CLightingManager::CQGItLightedModel::QgItes, and uint. Referenced by NL3D::CTransform::unfreezeHRC(), NL3D::CTransform::update(), and NL3D::CTransform::~CTransform().
00218 { 00219 // Erase the iterator for all levels 00220 for(uint i=0;i<NL3D_QUADGRID_LIGHT_NUM_LEVEL;i++) 00221 { 00222 // NB: it is possible here that the iterator is NULL (ie end()). 00223 _StaticLightedModelQuadGrid[i].erase(ite.QgItes[i]); 00224 } 00225 00226 // return end(), ie NULL iterators 00227 return CQGItLightedModel(); 00228 } |
|
retrieve (for this pass only) list of all pointLights visible in scene Definition at line 126 of file lighting_manager.h. Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
00126 {return _DynamicLightList;} |
|
get the list of dynamic light viewed from a position. append to lightList
Definition at line 525 of file lighting_manager.cpp. References _LightQuadGrid, NL3D::CQuadGrid< T >::begin(), NL3D::CQuadGrid< T >::end(), NL3D::CPointLightInfluence::Influence, NL3D_QUADGRID_LIGHT_NUM_LEVEL, NL3D::CPointLightInfluence::PointLight, NL3D::CQuadGrid< T >::select(), and uint. Referenced by computeModelLightContributions().
00526 { 00527 // For all quadGrids. 00528 for(uint qgId=0; qgId<NL3D_QUADGRID_LIGHT_NUM_LEVEL; qgId++) 00529 { 00530 CQuadGrid<CPointLightInfo> &quadGrid= _LightQuadGrid[qgId]; 00531 00532 // select the lights around this position in the quadGrids. 00533 quadGrid.select(worldPos, worldPos); 00534 00535 // for all possible found lights 00536 CQuadGrid<CPointLightInfo>::CIterator itLight; 00537 for(itLight= quadGrid.begin(); itLight!=quadGrid.end(); itLight++) 00538 { 00539 // verify it includes the entity 00540 if( (*itLight).Sphere.include(worldPos) ) 00541 { 00542 // ok, insert in list. 00543 CPointLightInfluence pli; 00544 pli.PointLight= (*itLight).Light; 00545 // No special Influence degradation scheme for Dynamic lighting 00546 pli.Influence= 1; 00547 lightList.push_back( pli ); 00548 } 00549 } 00550 } 00551 } |
|
Definition at line 109 of file lighting_manager.h. References _LightTransitionThreshold. Referenced by NL3D::CScene::getLightTransitionThreshold().
00109 {return _LightTransitionThreshold;} |
|
Definition at line 84 of file lighting_manager.h. References _MaxLightContribution, and uint. Referenced by NL3D::CScene::getMaxLightContribution().
00084 {return _MaxLightContribution;} |
|
Definition at line 91 of file lighting_manager.h. References _NoAttLightRadius.
00091 {return _NoAttLightRadius;} |
|
Definition at line 98 of file lighting_manager.h. References _OutOfAttLightInfFactor.
00098 {return _OutOfAttLightInfFactor;} |
|
insert a lighted object to the _StaticLightedModelQuadGrid. must not be inserted before must do it only for static objects, ie when freeHRC state is validated (see CTransform::update()) NB: only lightable models with no AncestorSkeletonModel should be inserted Definition at line 231 of file lighting_manager.cpp. References _StaticLightedModelQuadGrid, NLMISC::CMatrix::getPos(), NL3D::CTransform::getWorldMatrix(), NL3D::CQuadGrid< CTransform * >::insert(), NL3D_QUADGRID_LIGHT_NUM_LEVEL, NL3D::CLightingManager::CQGItLightedModel::QgItes, and uint. Referenced by NL3D::CTransform::update().
00232 { 00233 CQGItLightedModel ite; 00234 const CVector &worldPos= model->getWorldMatrix().getPos(); 00235 00236 // Insert the models in all levels, because addDynamicLight() may choose the best suited level to select 00237 for(uint i=0;i<NL3D_QUADGRID_LIGHT_NUM_LEVEL;i++) 00238 { 00239 ite.QgItes[i]= _StaticLightedModelQuadGrid[i].insert(worldPos, worldPos, model); 00240 } 00241 00242 // return the iterator 00243 return ite; 00244 } |
|
Advanced. When a model is influenced by more light than allowed, or when it reach the limits of the light (attenuationEnd), the light can be darkened according to some threshold. The resultLightColor begin to fade when distModelToLight== attEnd- threshold*(attEnd-attBegin). when distModelToLight== 0, resultLightColor==Black. By default, this value is 0.1f. Setting higher values will smooth transition but will generally darken the global effects of lights. NB: clamp(value, 0, 1); Definition at line 128 of file lighting_manager.cpp. References _LightTransitionThreshold, and NLMISC::clamp(). Referenced by NL3D::CScene::setLightTransitionThreshold().
00129 { 00130 clamp(lightTransitionThreshold, 0.f, 1.f); 00131 _LightTransitionThreshold= lightTransitionThreshold; 00132 } |
|
set the max number of point light that can influence a model. NB: clamped by NL3D_MAX_LIGHT_CONTRIBUTION Default is 3. NB: the sun contribution is not taken into account Definition at line 105 of file lighting_manager.cpp. References _MaxLightContribution, min, NL3D_MAX_LIGHT_CONTRIBUTION, and uint. Referenced by CLightingManager(), and NL3D::CScene::setMaxLightContribution().
00106 { 00107 _MaxLightContribution= min(nlights, (uint)NL3D_MAX_LIGHT_CONTRIBUTION); 00108 } |
|
Advanced. When a light has no attenuation, it's still inserted in a quadgrid with some radius and won't influence models beyond. You can setup this radius with this method. Default is 1000m. NB: nlassert(noAttLightRadius>0); Definition at line 112 of file lighting_manager.cpp. References _NoAttLightRadius, and nlassert.
00113 { 00114 nlassert(noAttLightRadius>0); 00115 _NoAttLightRadius= noAttLightRadius; 00116 } |
|
Advanced. When a model is out of [AttBegin, AttEnd] of a light, the computed influence of the light used to choose "best lights" is not constant, and is a function of distance multiplied by a factor you can setup here. Default is 0.1f and is good for lights with att like (50, 100) (arbitrary). Definition at line 120 of file lighting_manager.cpp. References _OutOfAttLightInfFactor.
00121 { 00122 outOfAttLightInfFactor= max(0.f, outOfAttLightInfFactor); 00123 _OutOfAttLightInfFactor= outOfAttLightInfFactor; 00124 } |
|
Definition at line 181 of file lighting_manager.h. |
|
Definition at line 177 of file lighting_manager.h. Referenced by addDynamicLight(), clearDynamicLights(), CLightingManager(), and getDynamicPointLightList(). |
|
Definition at line 179 of file lighting_manager.h. Referenced by addDynamicLight(), and CLightingManager(). |
|
Definition at line 188 of file lighting_manager.h. Referenced by CLightingManager(), computeModelLightContributions(), getLightTransitionThreshold(), and setLightTransitionThreshold(). |
|
Definition at line 185 of file lighting_manager.h. Referenced by computeModelLightContributions(), getMaxLightContribution(), and setMaxLightContribution(). |
|
Definition at line 186 of file lighting_manager.h. Referenced by addDynamicLight(), CLightingManager(), getNoAttLightRadius(), and setNoAttLightRadius(). |
|
Definition at line 187 of file lighting_manager.h. Referenced by CLightingManager(), computeModelLightContributions(), getOutOfAttLightInfFactor(), and setOutOfAttLightInfFactor(). |
|
Definition at line 176 of file lighting_manager.h. Referenced by addDynamicLight(), CLightingManager(), eraseStaticLightedModel(), and insertStaticLightedModel(). |