#include <instance_lighter.h>
Nevrax France
Definition at line 55 of file instance_lighter.h.
Cell Iteration. ie iteration on _IGRetrieverGridMap cells and _IGSurfaceLightBuild cells | |
void | beginCell () |
CSurfaceLightGrid::CCellCorner & | getCurrentCell () |
CIGSurfaceLightBuild::CCellCorner & | getCurrentCellInfo () |
uint | getCurrentCellNumber () const |
CSurfaceLightGrid::CCellCorner & | getCurrentNeighborCell (sint xnb, sint ynb) |
CIGSurfaceLightBuild::CCellCorner & | getCurrentNeighborCellInfo (sint xnb, sint ynb) |
uint | getTotalCellNumber () const |
bool | isCurrentNeighborCellInSurface (sint xnb, sint ynb) |
bool | isEndCell () |
void | nextCell () |
void | progressCell (const char *message) |
bool | _IsEndCell |
uint | _ItCellId |
uint | _ItCurrentCellNumber |
CIGSurfaceLight::ItRetrieverGridMap | _ItRetriever |
CIGSurfaceLightBuild::ItRetrieverGridMap | _ItRetrieverInfo |
uint | _ItSurfId |
float | _LastCellProgress |
uint | _TotalCellNumber |
Public Types | |
enum | { MaxOverSamples = 16 } |
Public Member Functions | |
CInstanceLighter () | |
Constructor. | |
void | init () |
void | light (const CInstanceGroup &igIn, CInstanceGroup &igOut, const CLightDesc &lightDesc, std::vector< CTriangle > &obstacles, CLandscape *landscape=NULL, CIGSurfaceLightBuild *igSurfaceLightBuild=NULL) |
virtual void | progress (const char *message, float progress) |
virtual | ~CInstanceLighter () |
Destructor. | |
Static PointLights mgt. | |
void | addStaticPointLight (const CPointLightNamed &pln, const char *igName) |
Static Public Member Functions | |
void | addTriangles (const IShape &shape, const NLMISC::CMatrix &modelMT, std::vector< CTriangle > &triangleArray, sint instanceId) |
void | addTriangles (CLandscape &landscape, std::vector< uint > &listZone, uint order, std::vector< CTriangle > &triangleArray) |
void | lightIgSimple (CInstanceLighter &instLighter, const CInstanceGroup &igIn, CInstanceGroup &igOut, const CLightDesc &lightDesc, const char *igName) |
Private Member Functions | |
void | compilePointLightRT (uint gridSize, float gridCellSize, std::vector< CTriangle > &obstacles, bool doShadow) |
Fill CubeGrid, and set PointLightRT in _StaticPointLightQuadGrid. | |
void | computeSunContribution (const CLightDesc &lightDesc, std::vector< CTriangle > &obstacles, CLandscape *landscape) |
void | dilateLightingOnSurfaceCells () |
void | processIGPointLightRT (std::vector< CPointLightNamed > &listPointLight) |
Static Private Member Functions | |
void | addTriangles (const CMeshMRMGeom &meshGeom, const NLMISC::CMatrix &modelMT, std::vector< CTriangle > &triangleArray, sint instanceId) |
void | addTriangles (const CMeshGeom &meshGeom, const NLMISC::CMatrix &modelMT, std::vector< CTriangle > &triangleArray, sint instanceId) |
void | excludeAllPatchFromRefineAll (CLandscape &landscape, std::vector< uint > &listZone, bool exclude) |
Private Attributes | |
sint | _CurrentInstanceComputed |
CIGSurfaceLight::TRetrieverGridMap | _IGRetrieverGridMap |
CIGSurfaceLightBuild * | _IGSurfaceLightBuild |
std::vector< CInstanceInfo > | _InstanceInfos |
std::vector< CInstanceGroup::CInstance > | _Instances |
CQuadGrid< CPointLightRT * > | _StaticPointLightQuadGrid |
QuadGrid of PointLights. Builded from _StaticPointLights. | |
std::vector< CPointLightRT > | _StaticPointLights |
List of PointLights. |
|
Definition at line 59 of file instance_lighter.h.
00059 {MaxOverSamples= 16}; |
|
Constructor.
Definition at line 66 of file instance_lighter.cpp. References _IGSurfaceLightBuild.
00067 { 00068 _IGSurfaceLightBuild= NULL; 00069 } |
|
Destructor.
Definition at line 131 of file instance_lighter.h.
00131 {} |
|
Append a static point light to compute. call at setup stage (before light() ). NB: you must append all PointLights of intersets, even ones from the IG to compute. Definition at line 999 of file instance_lighter.cpp. References _StaticPointLights, NL3D::CInstanceLighter::CPointLightRT::BSphere, NLMISC::CBSphere::Center, NL3D::CPointLight::getAttenuationBegin(), NL3D::CPointLight::getAttenuationEnd(), NL3D::CPointLight::getPosition(), NL3D::CInstanceLighter::CPointLightRT::OODeltaAttenuation, NL3D::CInstanceLighter::CPointLightRT::PointLight, and NLMISC::CBSphere::Radius. Referenced by lightIgSimple().
01000 { 01001 // NB: adding light more than 255 is allowed here, since the important thig is to not overflow really usefull lights 01002 01003 // build the plRT. 01004 CPointLightRT plRT; 01005 plRT.PointLight= pln; 01006 // compute plRT.OODeltaAttenuation 01007 plRT.OODeltaAttenuation= pln.getAttenuationEnd() - pln.getAttenuationBegin(); 01008 if(plRT.OODeltaAttenuation <=0 ) 01009 plRT.OODeltaAttenuation= 1e10f; 01010 else 01011 plRT.OODeltaAttenuation= 1.0f / plRT.OODeltaAttenuation; 01012 // compute plRT.BSphere 01013 plRT.BSphere.Center= pln.getPosition(); 01014 plRT.BSphere.Radius= pln.getAttenuationEnd(); 01015 // NB: FaceCubeGrid will be computed during light() 01016 01017 // add the plRT 01018 _StaticPointLights.push_back(plRT); 01019 } |
|
Definition at line 231 of file instance_lighter.cpp. References NL3D::CMeshMRMGeom::getNbRdrPass(), NL3D::CPrimitiveBlock::getNumQuad(), NL3D::CPrimitiveBlock::getNumTri(), NL3D::CPrimitiveBlock::getQuadPointer(), NL3D::CMeshMRMGeom::getRdrPassPrimitiveBlock(), NL3D::CPrimitiveBlock::getTriPointer(), NL3D::CMeshMRMGeom::getVertexBuffer(), NL3D::CVertexBuffer::getVertexCoordPointer(), sint, uint, and uint32.
00232 { 00233 // Get the vertex buffer 00234 const CVertexBuffer &vb=meshGeom.getVertexBuffer(); 00235 00236 // For each render pass 00237 uint numRenderPass=meshGeom.getNbRdrPass(0); 00238 for (uint pass=0; pass<numRenderPass; pass++) 00239 { 00240 // Get the primitive block 00241 const CPrimitiveBlock &primitive=meshGeom.getRdrPassPrimitiveBlock ( 0, pass); 00242 00243 // Dump triangles 00244 const uint32* triIndex=primitive.getTriPointer (); 00245 uint numTri=primitive.getNumTri (); 00246 uint tri; 00247 for (tri=0; tri<numTri; tri++) 00248 { 00249 // Vertex 00250 CVector v0=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*3])); 00251 CVector v1=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*3+1])); 00252 CVector v2=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*3+2])); 00253 00254 // Make a triangle 00255 triangleArray.push_back (CTriangle (NLMISC::CTriangle (v0, v1, v2), instanceId)); 00256 } 00257 00258 // Dump quad 00259 triIndex=primitive.getQuadPointer (); 00260 numTri=primitive.getNumQuad (); 00261 for (tri=0; tri<numTri; tri++) 00262 { 00263 // Vertex 00264 CVector v0=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*4])); 00265 CVector v1=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*4+1])); 00266 CVector v2=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*4+2])); 00267 CVector v3=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*4+3])); 00268 00269 // Make 2 triangles 00270 triangleArray.push_back (CTriangle (NLMISC::CTriangle (v0, v1, v2), instanceId)); 00271 triangleArray.push_back (CTriangle (NLMISC::CTriangle (v0, v2, v3), instanceId)); 00272 } 00273 } 00274 } |
|
Definition at line 179 of file instance_lighter.cpp. References NL3D::CMeshGeom::getNbMatrixBlock(), NL3D::CMeshGeom::getNbRdrPass(), NL3D::CPrimitiveBlock::getNumQuad(), NL3D::CPrimitiveBlock::getNumTri(), NL3D::CPrimitiveBlock::getQuadPointer(), NL3D::CMeshGeom::getRdrPassPrimitiveBlock(), NL3D::CPrimitiveBlock::getTriPointer(), NL3D::CMeshGeom::getVertexBuffer(), NL3D::CVertexBuffer::getVertexCoordPointer(), sint, uint, and uint32.
00180 { 00181 // Get the vertex buffer 00182 const CVertexBuffer &vb=meshGeom.getVertexBuffer(); 00183 00184 // For each matrix block 00185 uint numBlock=meshGeom.getNbMatrixBlock(); 00186 for (uint block=0; block<numBlock; block++) 00187 { 00188 // For each render pass 00189 uint numRenderPass=meshGeom.getNbRdrPass(block); 00190 for (uint pass=0; pass<numRenderPass; pass++) 00191 { 00192 // Get the primitive block 00193 const CPrimitiveBlock &primitive=meshGeom.getRdrPassPrimitiveBlock ( block, pass); 00194 00195 // Dump triangles 00196 const uint32* triIndex=primitive.getTriPointer (); 00197 uint numTri=primitive.getNumTri (); 00198 uint tri; 00199 for (tri=0; tri<numTri; tri++) 00200 { 00201 // Vertex 00202 CVector v0=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*3])); 00203 CVector v1=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*3+1])); 00204 CVector v2=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*3+2])); 00205 00206 // Make a triangle 00207 triangleArray.push_back (CTriangle (NLMISC::CTriangle (v0, v1, v2), instanceId)); 00208 } 00209 00210 // Dump quad 00211 triIndex=primitive.getQuadPointer (); 00212 numTri=primitive.getNumQuad (); 00213 for (tri=0; tri<numTri; tri++) 00214 { 00215 // Vertex 00216 CVector v0=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*4])); 00217 CVector v1=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*4+1])); 00218 CVector v2=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*4+2])); 00219 CVector v3=modelMT*(*(CVector*)vb.getVertexCoordPointer (triIndex[tri*4+3])); 00220 00221 // Make 2 triangles 00222 triangleArray.push_back (CTriangle (NLMISC::CTriangle (v0, v1, v2), instanceId)); 00223 triangleArray.push_back (CTriangle (NLMISC::CTriangle (v0, v2, v3), instanceId)); 00224 } 00225 } 00226 } 00227 } |
|
Add triangles from a transform shape. Work only for CMesh, CMultiMesh and CMeshMRM all without skinning. Give An instanceId!=-1 only for instances of the IG to compute. This is to avoid auto-shadowing. Definition at line 129 of file instance_lighter.cpp. References addTriangles(), NL3D::CMeshMRM::getMeshGeom(), NL3D::CMeshMultiLod::getMeshGeom(), NL3D::CMesh::getMeshGeom(), and sint.
00130 { 00131 // Lamed from CZoneLighter. 00132 00133 // Cast to CMesh 00134 const CMesh *mesh=dynamic_cast<const CMesh*>(&shape); 00135 00136 // Cast to CMeshMultiLod 00137 const CMeshMultiLod *meshMulti=dynamic_cast<const CMeshMultiLod*>(&shape); 00138 00139 // Cast to CMeshMultiLod 00140 const CMeshMRM *meshMRM=dynamic_cast<const CMeshMRM*>(&shape); 00141 00142 // It is a mesh ? 00143 if (mesh) 00144 { 00145 // Add its triangles 00146 addTriangles (mesh->getMeshGeom (), modelMT, triangleArray, instanceId); 00147 } 00148 // It is a CMeshMultiLod ? 00149 else if (meshMulti) 00150 { 00151 // Get the first geommesh 00152 const IMeshGeom *meshGeom=&meshMulti->getMeshGeom (0); 00153 00154 // Dynamic cast 00155 const CMeshGeom *geomMesh=dynamic_cast<const CMeshGeom*>(meshGeom); 00156 if (geomMesh) 00157 { 00158 addTriangles (*geomMesh, modelMT, triangleArray, instanceId); 00159 } 00160 00161 // Dynamic cast 00162 const CMeshMRMGeom *mrmGeomMesh=dynamic_cast<const CMeshMRMGeom*>(meshGeom); 00163 if (mrmGeomMesh) 00164 { 00165 addTriangles (*mrmGeomMesh, modelMT, triangleArray, instanceId); 00166 } 00167 } 00168 // It is a CMeshMultiLod ? 00169 else if (meshMRM) 00170 { 00171 // Get the first lod mesh geom 00172 addTriangles (meshMRM->getMeshGeom (), modelMT, triangleArray, instanceId); 00173 } 00174 } |
|
Definition at line 77 of file instance_lighter.cpp. References NL3D::CTessVertex::EndPos, excludeAllPatchFromRefineAll(), NL3D::CLandscape::getTessellationLeaves(), NL3D::CLandscape::refineAll(), NL3D::CLandscape::setThreshold(), NL3D::CLandscape::setTileMaxSubdivision(), uint, NL3D::CTessFace::VBase, NL3D::CTessFace::VLeft, and NL3D::CTessFace::VRight. Referenced by addTriangles().
00078 { 00079 // Lamed from CZoneLighter. 00080 // Set all to refine 00081 excludeAllPatchFromRefineAll (landscape, listZone, false); 00082 00083 // Setup the landscape 00084 landscape.setThreshold (0); 00085 landscape.setTileMaxSubdivision (order); 00086 00087 // Refine it 00088 landscape.refineAll (CVector (0, 0, 0)); 00089 00090 // Dump tesselated triangles 00091 std::vector<const CTessFace*> leaves; 00092 landscape.getTessellationLeaves(leaves); 00093 00094 // Number of leaves 00095 uint leavesCount=leaves.size(); 00096 00097 // Reserve the array 00098 triangleArray.reserve (triangleArray.size()+leavesCount); 00099 00100 // Scan each leaves 00101 for (uint leave=0; leave<leavesCount; leave++) 00102 { 00103 // Leave 00104 const CTessFace *face=leaves[leave]; 00105 00106 // Add a triangle. -1 because not an instance from an IG 00107 triangleArray.push_back (CTriangle (NLMISC::CTriangle (face->VBase->EndPos, face->VLeft->EndPos, face->VRight->EndPos), -1 )); 00108 } 00109 00110 // Setup the landscape 00111 landscape.setThreshold (1000); 00112 landscape.setTileMaxSubdivision (0); 00113 00114 // Remove all triangles 00115 landscape.refineAll (CVector (0, 0, 0)); 00116 landscape.refineAll (CVector (0, 0, 0)); 00117 landscape.refineAll (CVector (0, 0, 0)); 00118 landscape.refineAll (CVector (0, 0, 0)); 00119 landscape.refineAll (CVector (0, 0, 0)); 00120 landscape.refineAll (CVector (0, 0, 0)); 00121 landscape.refineAll (CVector (0, 0, 0)); 00122 landscape.refineAll (CVector (0, 0, 0)); 00123 landscape.refineAll (CVector (0, 0, 0)); 00124 landscape.refineAll (CVector (0, 0, 0)); 00125 00126 } |
|
Definition at line 1635 of file instance_lighter.cpp. References _IGRetrieverGridMap, _IGSurfaceLightBuild, _IsEndCell, _ItCellId, _ItCurrentCellNumber, _ItRetriever, _ItRetrieverInfo, _ItSurfId, _LastCellProgress, nlassert, and NL3D::CIGSurfaceLightBuild::RetrieverGridMap. Referenced by computeSunContribution(), dilateLightingOnSurfaceCells(), and processIGPointLightRT().
01636 { 01637 if(_IGSurfaceLightBuild) 01638 { 01639 _ItRetriever= _IGRetrieverGridMap.begin(); 01640 if(_ItRetriever != _IGRetrieverGridMap.end() ) 01641 { 01642 _ItRetrieverInfo= _IGSurfaceLightBuild->RetrieverGridMap.find(_ItRetriever->first); 01643 nlassert(_ItRetrieverInfo != _IGSurfaceLightBuild->RetrieverGridMap.end() ); 01644 // We are suze here that the retriever is not empty, and that the grid herself is not empty too 01645 _ItSurfId= 0; 01646 _ItCellId= 0; 01647 _ItCurrentCellNumber= 0; 01648 _IsEndCell= false; 01649 _LastCellProgress= 0; 01650 } 01651 else 01652 { 01653 _IsEndCell= true; 01654 } 01655 } 01656 else 01657 { 01658 _IsEndCell= true; 01659 } 01660 } |
|
Fill CubeGrid, and set PointLightRT in _StaticPointLightQuadGrid.
Definition at line 1023 of file instance_lighter.cpp. References _StaticPointLightQuadGrid, _StaticPointLights, NL3D::CQuadGrid< T >::begin(), NL3D::CInstanceLighter::CPointLightRT::BSphere, NLMISC::CBSphere::Center, NL3D::CCubeGrid< const CTriangle * >::compile(), NL3D::CCubeGrid< const CTriangle * >::create(), NL3D::CQuadGrid< T >::create(), NL3D::CQuadGrid< CPointLightRT * >::create(), NL3D::CQuadGrid< T >::end(), NLMISC::CAABBox::extend(), NL3D::CInstanceLighter::CPointLightRT::FaceCubeGrid, NL3D::CPointLight::getAttenuationEnd(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), NL3D::CPointLight::getPosition(), NL3D::CPointLight::getType(), NL3D::CCubeGrid< const CTriangle * >::insert(), NL3D::CQuadGrid< T >::insert(), NL3D::CQuadGrid< CPointLightRT * >::insert(), NL3D_INSTANCE_LIGHTER_CUBE_GRID_SIZE, NL3D::CInstanceLighter::CPointLightRT::PointLight, progress(), NLMISC::CBSphere::Radius, NL3D::CInstanceLighter::CPointLightRT::RefCount, NL3D::CQuadGrid< T >::select(), NLMISC::CAABBox::setCenter(), NLMISC::CAABBox::setHalfSize(), size, NL3D::CInstanceLighter::CTriangle::Triangle, and uint. Referenced by light().
01024 { 01025 uint i; 01026 01027 // Fill the quadGrid of Lights. 01028 // =========== 01029 _StaticPointLightQuadGrid.create(gridSize, gridCellSize); 01030 for(i=0; i<_StaticPointLights.size();i++) 01031 { 01032 CPointLightRT &plRT= _StaticPointLights[i]; 01033 01034 // Compute the bbox of the light 01035 CAABBox bbox; 01036 bbox.setCenter(plRT.BSphere.Center); 01037 float hl= plRT.BSphere.Radius; 01038 bbox.setHalfSize(CVector(hl,hl,hl)); 01039 01040 // Insert the pointLight in the quadGrid. 01041 _StaticPointLightQuadGrid.insert(bbox.getMin(), bbox.getMax(), &plRT); 01042 } 01043 01044 01045 // Append triangles to cubeGrid ?? 01046 if(doShadow) 01047 { 01048 // For all obstacles, Fill a quadGrid. 01049 // =========== 01050 CQuadGrid<CTriangle*> obstacleGrid; 01051 obstacleGrid.create(gridSize, gridCellSize); 01052 uint size= obstacles.size(); 01053 for(i=0; i<size; i++) 01054 { 01055 // bbox of triangle 01056 CAABBox bbox; 01057 bbox.setCenter(obstacles[i].Triangle.V0); 01058 bbox.extend(obstacles[i].Triangle.V1); 01059 bbox.extend(obstacles[i].Triangle.V2); 01060 // insert triangle in quadGrid. 01061 obstacleGrid.insert(bbox.getMin(), bbox.getMax(), &obstacles[i]); 01062 } 01063 01064 01065 // For all PointLights, fill his CubeGrid 01066 // =========== 01067 for(i=0; i<_StaticPointLights.size();i++) 01068 { 01069 // progress 01070 progress ("Compute Influences of PointLights 1/2", i / (float)_StaticPointLights.size()); 01071 01072 CPointLightRT &plRT= _StaticPointLights[i]; 01073 // Create the cubeGrid 01074 plRT.FaceCubeGrid.create(plRT.PointLight.getPosition(), NL3D_INSTANCE_LIGHTER_CUBE_GRID_SIZE); 01075 01076 // AmbiantLIghts: do nothing. 01077 if(plRT.PointLight.getType()!=CPointLight::AmbientLight) 01078 { 01079 // Select only obstacle Faces around the light. Other are not usefull 01080 CAABBox bbox; 01081 bbox.setCenter(plRT.PointLight.getPosition()); 01082 float hl= plRT.PointLight.getAttenuationEnd(); 01083 bbox.setHalfSize(CVector(hl,hl,hl)); 01084 obstacleGrid.select(bbox.getMin(), bbox.getMax()); 01085 01086 // For all faces, fill the cubeGrid. 01087 CQuadGrid<CTriangle*>::CIterator itObstacle; 01088 itObstacle= obstacleGrid.begin(); 01089 while( itObstacle!=obstacleGrid.end() ) 01090 { 01091 CTriangle &tri= *(*itObstacle); 01092 /* Don't Test BackFace culling Here (unlike in CZoneLighter !!). 01093 For objects: 01094 AutoOccluding problem is avoided with _CurrentInstanceComputed scheme. 01095 Also, With pointLights, there is no multiSampling (since no factor stored) 01096 Hence we are sure that no Object samples will lies under floor, and that the center of the 01097 object is far away. 01098 For IGSurface lighting: 01099 notice that we already add 20cm in height because of "stairs problem" so 01100 floor/surface auto_shadowing is not a problem here... 01101 */ 01102 // Insert the triangle in the CubeGrid 01103 plRT.FaceCubeGrid.insert( tri.Triangle, &tri); 01104 01105 itObstacle++; 01106 } 01107 } 01108 01109 // Compile the CubeGrid. 01110 plRT.FaceCubeGrid.compile(); 01111 01112 // And Reset RefCount. 01113 plRT.RefCount= 0; 01114 } 01115 } 01116 // else, just build empty grid 01117 else 01118 { 01119 for(i=0; i<_StaticPointLights.size();i++) 01120 { 01121 // progress 01122 progress ("Compute Influences of PointLights 1/2", i / (float)_StaticPointLights.size()); 01123 01124 CPointLightRT &plRT= _StaticPointLights[i]; 01125 // Create a dummy empty cubeGrid => no rayTrace :) 01126 plRT.FaceCubeGrid.create(plRT.PointLight.getPosition(), 4); 01127 01128 // Compile the CubeGrid. 01129 plRT.FaceCubeGrid.compile(); 01130 01131 // And Reset RefCount. 01132 plRT.RefCount= 0; 01133 } 01134 } 01135 01136 } |
|
Definition at line 633 of file instance_lighter.cpp. References _CurrentInstanceComputed, _IGSurfaceLightBuild, _InstanceInfos, NL3D::CQuadGrid< T >::begin(), beginCell(), NL3D::CQuadGrid< T >::changeBase(), NL3D::CQuadGrid< T >::create(), NL3D::CVisualCollisionManager::createEntity(), NL3D::CVisualCollisionManager::deleteEntity(), NL3D::CInstanceLighter::CLightDesc::DisableSunContribution, NL3D::CQuadGrid< T >::end(), NLMISC::CAABBox::extend(), getCurrentCell(), getCurrentCellInfo(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), NL3D::CVisualCollisionEntity::getStaticLightSetup(), NL3D::CInstanceLighter::CLightDesc::GridCellSize, NL3D::CInstanceLighter::CLightDesc::GridSize, NL3D::CQuadGrid< T >::insert(), NL3D::CInstanceLighter::CTriangle::InstanceId, NL3D::CIGSurfaceLightBuild::CCellCorner::InSurface, NLMISC::CTriangle::intersect(), NLMISC::CMatrix::inverted(), isEndCell(), NL3D::CInstanceLighter::CLightDesc::LightDirection, NL3D::NEL3DCalcBase(), nextCell(), nlassert, NLMISC::CVector::normalize(), NL3D::CIGSurfaceLightBuild::CCellCorner::NumOverSamples, NL3D::CIGSurfaceLightBuild::CCellCorner::OverSamples, NL3D::CInstanceLighter::CLightDesc::OverSampling, NL3D::CInstanceLighter::CTriangle::Plane, progress(), progressCell(), NL3D::CQuadGrid< T >::select(), NLMISC::CAABBox::setCenter(), NL3D::CVisualCollisionManager::setLandscape(), NL3D::CInstanceLighter::CLightDesc::Shadow, sint, NL3D::CIGSurfaceLightBuild::CCellCorner::SunContribution, NL3D::CSurfaceLightGrid::CCellCorner::SunContribution, NL3D::CInstanceLighter::CTriangle::Triangle, uint, and uint8. Referenced by light().
00634 { 00635 sint i; 00636 // Use precoputed landscape SunContribution 00637 CVisualCollisionManager *VCM= NULL; 00638 CVisualCollisionEntity *VCE= NULL; 00639 if(landscape) 00640 { 00641 // create a CVisualCollisionManager and a CVisualCollisionEntity 00642 VCM= new CVisualCollisionManager; 00643 VCM->setLandscape(landscape); 00644 VCE= VCM->createEntity(); 00645 } 00646 std::vector<CPointLightInfluence> dummyPointLightFromLandscape; 00647 dummyPointLightFromLandscape.reserve(1024); 00648 00649 00650 // If DisableSunContribution, easy, 00651 if(lightDesc.DisableSunContribution) 00652 { 00653 // Light all instances. 00654 //========== 00655 for(i=0; i<(sint)_Instances.size(); i++) 00656 { 00657 // If staticLight not enabled, skip. 00658 if( !_Instances[i].StaticLightEnabled ) 00659 continue; 00660 00661 // fill SunContribution to 0 00662 _Instances[i].SunContribution= 0; 00663 } 00664 00665 // Light SurfaceGrid Cells. 00666 //========== 00667 if(_IGSurfaceLightBuild) 00668 { 00669 // Begin cell iteration 00670 beginCell(); 00671 // For all surface cell corners 00672 while( !isEndCell() ) 00673 { 00674 // get the current cell and cellInfo iterated. 00675 CIGSurfaceLightBuild::CCellCorner &cellInfo= getCurrentCellInfo(); 00676 CSurfaceLightGrid::CCellCorner &cell= getCurrentCell(); 00677 00678 // if the cell corner lies in the polygon surface. 00679 if(cellInfo.InSurface) 00680 { 00681 // fill SunContribution to 0 00682 cell.SunContribution= 0; 00683 // copy it to cellInfo 00684 cellInfo.SunContribution= cell.SunContribution; 00685 } 00686 00687 // next cell 00688 nextCell(); 00689 } 00690 } 00691 } 00692 // If no Raytrace Shadow, easy, 00693 else if(!lightDesc.Shadow) 00694 { 00695 // Light all instances. 00696 //========== 00697 for(i=0; i<(sint)_Instances.size(); i++) 00698 { 00699 progress ("Compute SunContribution on Instances", i / float(_Instances.size()) ); 00700 00701 // If staticLight not enabled, skip. 00702 if( !_Instances[i].StaticLightEnabled ) 00703 continue; 00704 00705 // by default, fill SunContribution to 255 00706 _Instances[i].SunContribution= 255; 00707 // Try to get landscape SunContribution (better) 00708 if(landscape) 00709 { 00710 CVector pos= _InstanceInfos[i].CenterPos; 00711 uint8 landSunContribution; 00712 dummyPointLightFromLandscape.clear(); 00713 // If find faces under me 00714 NLMISC::CRGBA dummyAmbient; 00715 if(VCE->getStaticLightSetup(pos, dummyPointLightFromLandscape, landSunContribution, dummyAmbient) ) 00716 { 00717 _Instances[i].SunContribution= landSunContribution; 00718 } 00719 } 00720 } 00721 00722 // Light SurfaceGrid Cells. 00723 //========== 00724 if(_IGSurfaceLightBuild) 00725 { 00726 // Begin cell iteration 00727 beginCell(); 00728 // For all surface cell corners 00729 while( !isEndCell() ) 00730 { 00731 progressCell("Compute SunContribution on Surfaces"); 00732 00733 // get the current cell and cellInfo iterated. 00734 CIGSurfaceLightBuild::CCellCorner &cellInfo= getCurrentCellInfo(); 00735 CSurfaceLightGrid::CCellCorner &cell= getCurrentCell(); 00736 00737 // if the cell corner lies in the polygon surface. 00738 if(cellInfo.InSurface) 00739 { 00740 // Just init SunContribution to 255, since no shadowing. 00741 cell.SunContribution= 255; 00742 // copy it to cellInfo 00743 cellInfo.SunContribution= cell.SunContribution; 00744 } 00745 00746 // next cell 00747 nextCell(); 00748 } 00749 } 00750 } 00751 else 00752 { 00753 // Compute rayBasis 00754 CVector rayDir= lightDesc.LightDirection; 00755 CMatrix rayBasis; 00756 rayDir.normalize(); 00757 NEL3DCalcBase(rayDir, rayBasis); 00758 CMatrix invRayBasis; 00759 invRayBasis= rayBasis.inverted(); 00760 00761 // Build QuadGrid of obstacles. 00762 //========= 00763 // setup quadGrid 00764 CQuadGrid<const CTriangle*> quadGrid; 00765 quadGrid.changeBase (invRayBasis); 00766 quadGrid.create(lightDesc.GridSize, lightDesc.GridCellSize); 00767 // Insert all obstacles in quadGrid 00768 for(i=0; i<(sint)obstacles.size(); i++) 00769 { 00770 CAABBox triBBox; 00771 // Compute the bbox in rayBasis. 00772 triBBox.setCenter(invRayBasis * obstacles[i].Triangle.V0); 00773 triBBox.extend(invRayBasis * obstacles[i].Triangle.V1); 00774 triBBox.extend(invRayBasis * obstacles[i].Triangle.V2); 00775 // And set the coord in our world, because will be multiplied with invRayBasis in insert() 00776 quadGrid.insert(rayBasis * triBBox.getMin(), rayBasis * triBBox.getMax(), &obstacles[i]); 00777 } 00778 00779 // For all instances, light them. 00780 //========= 00781 for(i=0; i<(sint)_Instances.size(); i++) 00782 { 00783 progress ("Compute SunContribution on Instances", i / float(_Instances.size()) ); 00784 00785 // If staticLight not enabled, skip. 00786 if( !_Instances[i].StaticLightEnabled ) 00787 continue; 00788 00789 // try to use landscape SunContribution. 00790 bool landUsed= false; 00791 if(landscape) 00792 { 00793 CVector pos= _InstanceInfos[i].CenterPos; 00794 uint8 landSunContribution; 00795 dummyPointLightFromLandscape.clear(); 00796 // If find faces under me 00797 NLMISC::CRGBA dummyAmbient; 00798 if(VCE->getStaticLightSetup(pos, dummyPointLightFromLandscape, landSunContribution, dummyAmbient) ) 00799 { 00800 _Instances[i].SunContribution= landSunContribution; 00801 landUsed= true; 00802 } 00803 } 00804 00805 // If failed to use landscape SunContribution, rayTrace 00806 if(!landUsed) 00807 { 00808 // number of samples (1 if no overSampling) 00809 uint nSamples= max(1U, lightDesc.OverSampling); 00810 00811 // Default is full lighted. 00812 uint sunAccum= 255*nSamples; 00813 00814 // For all samples 00815 for(uint sample=0; sample<nSamples; sample++) 00816 { 00817 // pos to rayTrace against 00818 CVector pos= _InstanceInfos[i].OverSamples[sample]; 00819 00820 // rayTrace from this pos. 00821 CVector lightPos= pos-(rayDir*1000.f); 00822 // Select an element with the X axis as a 3d ray 00823 quadGrid.select (lightPos, lightPos); 00824 // For each triangle selected 00825 CQuadGrid<const CTriangle*>::CIterator it=quadGrid.begin(); 00826 while (it!=quadGrid.end()) 00827 { 00828 const CTriangle *tri= *it; 00829 00830 // If same instanceId, skip 00831 if(tri->InstanceId != i) 00832 { 00833 CVector hit; 00834 // If triangle occlude the ray, no sun Contribution 00835 if(tri->Triangle.intersect(lightPos, pos, hit, tri->Plane)) 00836 { 00837 // The sample is not touched by sun. sub his contribution 00838 sunAccum-= 255; 00839 // End 00840 break; 00841 } 00842 } 00843 00844 it++; 00845 } 00846 } 00847 00848 // Average samples 00849 _Instances[i].SunContribution= sunAccum / nSamples; 00850 } 00851 00852 } 00853 00854 00855 // Light SurfaceGrid Cells. 00856 //========== 00857 if(_IGSurfaceLightBuild) 00858 { 00859 // No instance currenlty computed, since we compute surface cells. 00860 _CurrentInstanceComputed= -1; 00861 00862 // Begin cell iteration 00863 beginCell(); 00864 // For all surface cell corners 00865 while( !isEndCell() ) 00866 { 00867 progressCell("Compute SunContribution on Surfaces"); 00868 00869 // get the current cell and cellInfo iterated. 00870 CIGSurfaceLightBuild::CCellCorner &cellInfo= getCurrentCellInfo(); 00871 CSurfaceLightGrid::CCellCorner &cell= getCurrentCell(); 00872 00873 // if the cell corner lies in the polygon surface. 00874 if(cellInfo.InSurface) 00875 { 00876 // number of samples (at least 1 if no overSampling) 00877 uint nSamples= cellInfo.NumOverSamples; 00878 nlassert(nSamples>=1); 00879 00880 // Default is full lighted. 00881 uint sunAccum= 255*nSamples; 00882 00883 // For all samples 00884 for(uint sample=0; sample<nSamples; sample++) 00885 { 00886 // Get pos to rayTrace. 00887 CVector pos= cellInfo.OverSamples[sample]; 00888 00889 // rayTrace from the pos of this Cell sample. 00890 CVector lightPos= pos-(rayDir*1000.f); 00891 // Select an element with the X axis as a 3d ray 00892 quadGrid.select (lightPos, lightPos); 00893 // For each triangle selected 00894 CQuadGrid<const CTriangle*>::CIterator it=quadGrid.begin(); 00895 while (it!=quadGrid.end()) 00896 { 00897 const CTriangle *tri= *it; 00898 00899 CVector hit; 00900 // If triangle occlude the ray, no sun Contribution 00901 if(tri->Triangle.intersect(lightPos, pos, hit, tri->Plane)) 00902 { 00903 // The cell sample is not touched by sun. sub his contribution 00904 sunAccum-= 255; 00905 // End 00906 break; 00907 } 00908 00909 it++; 00910 } 00911 } 00912 00913 // Average SunContribution 00914 cell.SunContribution= sunAccum / nSamples; 00915 00916 // copy it to cellInfo 00917 cellInfo.SunContribution= cell.SunContribution; 00918 } 00919 00920 // next cell 00921 nextCell(); 00922 } 00923 } 00924 } 00925 00926 00927 // Clean VCM and VCE 00928 if(landscape) 00929 { 00930 // delete CVisualCollisionManager and CVisualCollisionEntity 00931 VCM->deleteEntity(VCE); 00932 delete VCM; 00933 } 00934 00935 } |
|
Definition at line 1801 of file instance_lighter.cpp. References beginCell(), NL3D::CIGSurfaceLightBuild::CCellCorner::CenterPos, NL3D::CIGSurfaceLightBuild::CCellCorner::Dilated, getCurrentCell(), getCurrentCellInfo(), getCurrentNeighborCell(), getCurrentNeighborCellInfo(), NL3D::CIGSurfaceLightBuild::CCellCorner::InSurface, isCurrentNeighborCellInSurface(), isEndCell(), NL3D::CSurfaceLightGrid::CCellCorner::Light, NL3D::CSurfaceLightGrid::CCellCorner::LocalAmbientId, nextCell(), progressCell(), sint, NL3D::CIGSurfaceLightBuild::CCellCorner::SunContribution, NL3D::CSurfaceLightGrid::CCellCorner::SunContribution, uint, and NLMISC::CVector::z. Referenced by light().
01802 { 01803 // Begin cell iteration 01804 beginCell(); 01805 // For all surface cell corners 01806 while( !isEndCell() ) 01807 { 01808 progressCell("Dilate Surfaces grids"); 01809 01810 // get the current cell and cellInfo iterated. 01811 CIGSurfaceLightBuild::CCellCorner &cellInfo= getCurrentCellInfo(); 01812 CSurfaceLightGrid::CCellCorner &cell= getCurrentCell(); 01813 01814 // if the cell is not in the polygon surface, try to get from his neighbors. 01815 if(!cellInfo.InSurface) 01816 { 01817 // Add Weighted influence of SunContribution, and get one of the PointLightContribution (random). 01818 uint wgtSunContribution= 0; 01819 uint wgtSunCount= 0; 01820 // search if one of 8 neighbors is InSurface. 01821 for(sint ynb= -1; ynb<= 1; ynb++) 01822 { 01823 for(sint xnb= -1; xnb<= 1; xnb++) 01824 { 01825 // center => skip. 01826 if( xnb==0 && ynb==0 ) 01827 continue; 01828 // If the neighbor point is not out of the grid, and if in Surface. 01829 if( isCurrentNeighborCellInSurface(xnb, ynb) ) 01830 { 01831 // get the neighbor cell 01832 CIGSurfaceLightBuild::CCellCorner &nbCellInfo= getCurrentNeighborCellInfo(xnb, ynb); 01833 CSurfaceLightGrid::CCellCorner &nbCell= getCurrentNeighborCell(xnb, ynb); 01834 // Add SunContribution. 01835 wgtSunContribution+= nbCell.SunContribution; 01836 wgtSunCount++; 01837 // Just Copy PointLight info. 01838 for(uint lightId= 0; lightId<CSurfaceLightGrid::NumLightPerCorner; lightId++) 01839 cell.Light[lightId]= nbCell.Light[lightId]; 01840 // Just Copy AmbientLight info. 01841 cell.LocalAmbientId= nbCell.LocalAmbientId; 01842 01843 01844 // For debug mesh only, copy z from nb cellInfo 01845 cellInfo.CenterPos.z= nbCellInfo.CenterPos.z; 01846 } 01847 } 01848 } 01849 // average SunContribution. 01850 if(wgtSunCount>0) 01851 { 01852 cell.SunContribution= wgtSunContribution / wgtSunCount; 01853 01854 // For debug mesh only, copy SunContribution into cellInfo 01855 cellInfo.SunContribution= cell.SunContribution; 01856 cellInfo.Dilated= true; 01857 } 01858 } 01859 01860 // next cell 01861 nextCell(); 01862 } 01863 } |
|
Definition at line 278 of file instance_lighter.cpp. References NL3D::CLandscape::excludePatchFromRefineAll(), NL3D::CZone::getNumPatchs(), NL3D::CLandscape::getZone(), and uint. Referenced by addTriangles().
00279 { 00280 // For each zone 00281 for (uint zone=0; zone<listZone.size(); zone++) 00282 { 00283 // Get num patches 00284 uint patchCount=landscape.getZone(listZone[zone])->getNumPatchs(); 00285 00286 // For each patches 00287 for (uint patch=0; patch<patchCount; patch++) 00288 { 00289 // Exclude all the patches from refine all 00290 landscape.excludePatchFromRefineAll (listZone[zone], patch, exclude); 00291 } 00292 } 00293 } |
|
Definition at line 1705 of file instance_lighter.cpp. References _ItCellId, _ItRetriever, _ItSurfId, isEndCell(), and nlassert. Referenced by computeSunContribution(), dilateLightingOnSurfaceCells(), and processIGPointLightRT().
01706 { 01707 nlassert(!isEndCell()); 01708 01709 // return ref on Cell. 01710 return _ItRetriever->second.Grids[_ItSurfId].Cells[_ItCellId]; 01711 } |
|
Definition at line 1714 of file instance_lighter.cpp. References _ItCellId, _ItRetrieverInfo, _ItSurfId, isEndCell(), and nlassert. Referenced by computeSunContribution(), dilateLightingOnSurfaceCells(), and processIGPointLightRT().
01715 { 01716 nlassert(!isEndCell()); 01717 01718 // return ref on CellInfo. 01719 return _ItRetrieverInfo->second.Grids[_ItSurfId].Cells[_ItCellId]; 01720 } |
|
Definition at line 284 of file instance_lighter.h. References _ItCurrentCellNumber, and uint. Referenced by progressCell().
00284 {return _ItCurrentCellNumber;} |
|
Definition at line 1757 of file instance_lighter.cpp. References _ItCellId, _ItRetriever, _ItSurfId, NL3D::CSurfaceLightGrid::Cells, isCurrentNeighborCellInSurface(), nlassert, sint, uint, and NL3D::CSurfaceLightGrid::Width. Referenced by dilateLightingOnSurfaceCells().
01758 { 01759 nlassert(isCurrentNeighborCellInSurface(xnb, ynb)); 01760 01761 // get a ref on the current grid. 01762 CSurfaceLightGrid &surfGrid= _ItRetriever->second.Grids[_ItSurfId]; 01763 // copute coordinate of the current cellCorner. 01764 sint xCell, yCell; 01765 xCell= _ItCellId%surfGrid.Width; 01766 yCell= _ItCellId/surfGrid.Width; 01767 // compute coordinate of the neighbor cell corner 01768 xCell+= xnb; 01769 yCell+= ynb; 01770 // compute the neighbor id 01771 uint nbId= yCell*surfGrid.Width + xCell; 01772 01773 // then return a ref on it 01774 return surfGrid.Cells[nbId]; 01775 } |
|
Definition at line 1779 of file instance_lighter.cpp. References _ItCellId, _ItRetrieverInfo, _ItSurfId, NL3D::CIGSurfaceLightBuild::CSurface::Cells, isCurrentNeighborCellInSurface(), nlassert, sint, uint, and NL3D::CIGSurfaceLightBuild::CSurface::Width. Referenced by dilateLightingOnSurfaceCells().
01780 { 01781 nlassert(isCurrentNeighborCellInSurface(xnb, ynb)); 01782 01783 // get a ref on the current grid. 01784 CIGSurfaceLightBuild::CSurface &surfGrid= _ItRetrieverInfo->second.Grids[_ItSurfId]; 01785 // copute coordinate of the current cellCorner. 01786 sint xCell, yCell; 01787 xCell= _ItCellId%surfGrid.Width; 01788 yCell= _ItCellId/surfGrid.Width; 01789 // compute coordinate of the neighbor cell corner 01790 xCell+= xnb; 01791 yCell+= ynb; 01792 // compute the neighbor id 01793 uint nbId= yCell*surfGrid.Width + xCell; 01794 01795 // then return a ref on it 01796 return surfGrid.Cells[nbId]; 01797 } |
|
Definition at line 285 of file instance_lighter.h. References _TotalCellNumber, and uint. Referenced by progressCell().
00285 {return _TotalCellNumber;} |
|
Definition at line 72 of file instance_lighter.cpp. Referenced by lightIgSimple().
00073 { 00074 } |
|
Definition at line 1724 of file instance_lighter.cpp. References _ItCellId, _ItRetriever, _ItRetrieverInfo, _ItSurfId, NL3D::CSurfaceLightGrid::Height, isEndCell(), nlassert, sint, uint, and NL3D::CSurfaceLightGrid::Width. Referenced by dilateLightingOnSurfaceCells(), getCurrentNeighborCell(), and getCurrentNeighborCellInfo().
01725 { 01726 nlassert(!isEndCell()); 01727 01728 // get a ref on the current grid. 01729 CSurfaceLightGrid &surfGrid= _ItRetriever->second.Grids[_ItSurfId]; 01730 // copute coordinate of the current cellCorner. 01731 sint xCell, yCell; 01732 xCell= _ItCellId%surfGrid.Width; 01733 yCell= _ItCellId/surfGrid.Width; 01734 // compute coordinate of the neighbor cell corner 01735 xCell+= xnb; 01736 yCell+= ynb; 01737 01738 // check if in the surfaceGrid 01739 if(xCell<0 || xCell>=(sint)surfGrid.Width) 01740 return false; 01741 if(yCell<0 || yCell>=(sint)surfGrid.Height) 01742 return false; 01743 01744 // compute the neighbor id 01745 uint nbId= yCell*surfGrid.Width + xCell; 01746 01747 // Now check in the cellInfo if this cell is InSurface. 01748 if( !_ItRetrieverInfo->second.Grids[_ItSurfId].Cells[nbId].InSurface ) 01749 return false; 01750 01751 // Ok, the neighbor cell is valid. 01752 01753 return true; 01754 } |
|
Definition at line 1699 of file instance_lighter.cpp. References _IsEndCell. Referenced by computeSunContribution(), dilateLightingOnSurfaceCells(), getCurrentCell(), getCurrentCellInfo(), isCurrentNeighborCellInSurface(), nextCell(), and processIGPointLightRT().
01700 { 01701 return _IsEndCell; 01702 } |
|
Light an InstanceGroup igOut has different PointLights than igIn. eg: if a pointLight do not light anything, then it is not present in igOut. NB: shapes are used to retrieve usefull info on them (center of AABBox ...) . They are taken from lightDesc.UserShapeMap, or loaded from lightDesc.ShapePath if not found.
Definition at line 305 of file instance_lighter.cpp. References _IGRetrieverGridMap, _IGSurfaceLightBuild, _InstanceInfos, _IsEndCell, _TotalCellNumber, NL3D::CInstanceGroup::build(), NL3D::CIGSurfaceLightBuild::CSurface::Cells, NL3D::CSurfaceLightGrid::Cells, NL3D::CIGSurfaceLightBuild::CellSize, compilePointLightRT(), computeSunContribution(), dilateLightingOnSurfaceCells(), NLMISC::CObjectVector< CCellCorner >::fill(), NLMISC::CAABBox::getCenter(), NLMISC::CAABBox::getHalfSize(), NL3D::CShapeStream::getShapePointer(), NL3D::CInstanceLighter::CLightDesc::GridCellSize, NL3D::CIGSurfaceLight::CRetrieverLightGrid::Grids, NL3D::CInstanceLighter::CLightDesc::GridSize, NL3D::CIGSurfaceLightBuild::CSurface::Height, NL3D::CSurfaceLightGrid::Height, NL3D::CMeshBase::isLightable(), NL3D::CSurfaceLightGrid::CCellCorner::Light, NL3D::CSurfaceLightGrid::CCellCorner::LocalAmbientId, NLMISC::CPlane::make(), nlassert, nlwarning, NLMISC::CIFile::open(), NL3D::CIGSurfaceLightBuild::CSurface::Origin, NL3D::CSurfaceLightGrid::Origin, NL3D::CInstanceLighter::CLightDesc::OverSampling, NL3D::CInstanceLighter::CTriangle::Plane, processIGPointLightRT(), NLMISC::CObjectVector< CCellCorner >::resize(), NLMISC::CObjectVector< CSurfaceLightGrid >::resize(), NL3D::CInstanceGroup::retrieve(), NL3D::CIGSurfaceLightBuild::RetrieverGridMap, NLMISC::CMatrix::scale(), NL3D::CShapeStream::serial(), NLMISC::CAABBox::setCenter(), NLMISC::CAABBox::setHalfSize(), NLMISC::CMatrix::setPos(), NLMISC::CMatrix::setRot(), NL3D::CInstanceLighter::CLightDesc::Shadow, sint, NLMISC::CObjectVector< CCellCorner >::size(), NL3D::CSurfaceLightGrid::CCellCorner::SunContribution, NL3D::CInstanceLighter::CTriangle::Triangle, uint, NL3D::CInstanceLighter::CLightDesc::UserShapeMap, NLMISC::CTriangle::V0, NLMISC::CTriangle::V1, NLMISC::CTriangle::V2, NL3D::CIGSurfaceLightBuild::CSurface::Width, NL3D::CSurfaceLightGrid::Width, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by lightIgSimple().
00307 { 00308 sint i; 00309 CVector outGlobalPos; 00310 std::vector<CCluster> outClusters; 00311 std::vector<CPortal> outPortals; 00312 std::vector<CPointLightNamed> pointLightList; 00313 00314 nlassert(lightDesc.OverSampling==0 || lightDesc.OverSampling==2 || lightDesc.OverSampling==4 00315 || lightDesc.OverSampling==8 || lightDesc.OverSampling==16); 00316 00317 // Setup. 00318 //======== 00319 00320 // Prepare IGSurfaceLight lighting 00321 //----------- 00322 // Bkup SurfaceLightBuild to know if must light the surfaces, in differents part of the process. 00323 _IGSurfaceLightBuild= igSurfaceLightBuild; 00324 // Prepare _IGRetrieverGridMap. 00325 _IGRetrieverGridMap.clear(); 00326 if(_IGSurfaceLightBuild) 00327 { 00328 _TotalCellNumber= 0; 00329 CIGSurfaceLightBuild::ItRetrieverGridMap itSrc; 00330 itSrc= _IGSurfaceLightBuild->RetrieverGridMap.begin(); 00331 // For all retrievers Infos in _IGSurfaceLightBuild 00332 while(itSrc!=_IGSurfaceLightBuild->RetrieverGridMap.end()) 00333 { 00334 uint numSurfaces= itSrc->second.Grids.size(); 00335 // If !empty retriever. 00336 if(numSurfaces>0) 00337 { 00338 // Add it to the map, 00339 CIGSurfaceLight::CRetrieverLightGrid &rlgDst= _IGRetrieverGridMap[itSrc->first]; 00340 // resize Array of surfaces. 00341 rlgDst.Grids.resize(numSurfaces); 00342 // For all surfaces, init them in rlgDst. 00343 for(uint i=0; i<numSurfaces; i++) 00344 { 00345 CIGSurfaceLightBuild::CSurface &surfSrc= itSrc->second.Grids[i]; 00346 CSurfaceLightGrid &surfDst= rlgDst.Grids[i]; 00347 // Init Cells with a default CellCorner 00348 CSurfaceLightGrid::CCellCorner defaultCellCorner; 00349 defaultCellCorner.SunContribution= 0; 00350 defaultCellCorner.Light[0]= 0xFF; 00351 defaultCellCorner.LocalAmbientId= 0xFF; 00352 00353 // Init the grid. 00354 surfDst.Origin= surfSrc.Origin; 00355 surfDst.Width= surfSrc.Width; 00356 surfDst.Height= surfSrc.Height; 00357 surfDst.Cells.resize(surfSrc.Cells.size()); 00358 surfDst.Cells.fill(defaultCellCorner); 00359 // The grid must be valid an not empty 00360 nlassert( surfDst.Cells.size() == surfDst.Width*surfDst.Height ); 00361 nlassert( surfDst.Width>= 2 ); 00362 nlassert( surfDst.Height>= 2 ); 00363 00364 _TotalCellNumber+= surfDst.Cells.size(); 00365 } 00366 } 00367 00368 // Next localRetriever info. 00369 itSrc++; 00370 } 00371 } 00372 // Reset cell iteration. 00373 _IsEndCell= true; 00374 00375 00376 // Retrieve info from igIn. 00377 //----------- 00378 igIn.retrieve (outGlobalPos, _Instances, outClusters, outPortals, pointLightList); 00379 00380 00381 // set All Instances StaticLightEnabled= true, and Build _InstanceInfos. 00382 //----------- 00383 // Map of shape 00384 std::map<string, IShape*> shapeMap; 00385 _InstanceInfos.resize(_Instances.size()); 00386 for(i=0; i<(sint)_Instances.size();i++) 00387 { 00388 // Avoid StaticLight precomputing?? 00389 if(_Instances[i].AvoidStaticLightPreCompute) 00390 { 00391 _Instances[i].StaticLightEnabled= false; 00392 // Next instance. 00393 continue; 00394 } 00395 00396 // Else let's do it. 00397 _Instances[i].StaticLightEnabled= true; 00398 00399 00400 // Get the shape centerPos; 00401 //------------ 00402 CVector shapeCenterPos; 00403 CVector overSamples[MaxOverSamples]; 00404 00405 // Get the instance shape name 00406 string name= _Instances[i].Name; 00407 bool shapeFound= true; 00408 00409 // Try to find the shape in the UseShapeMap. 00410 std::map<string, IShape*>::const_iterator iteMap= lightDesc.UserShapeMap.find (name); 00411 00412 // If not found in userShape map, try to load it from the temp loaded ShapeBank. 00413 if( iteMap == lightDesc.UserShapeMap.end() ) 00414 { 00415 // Add a .shape at the end ? 00416 if (name.find('.') == std::string::npos) 00417 name += ".shape"; 00418 00419 // Get the instance shape name 00420 string nameLookup = CPath::lookup (name, false, false); 00421 if (!nameLookup.empty()) 00422 name = nameLookup; 00423 00424 // Find the shape in the bank 00425 iteMap= shapeMap.find (name); 00426 if (iteMap==shapeMap.end()) 00427 { 00428 // Input file 00429 CIFile inputFile; 00430 00431 if (!name.empty() && inputFile.open (name)) 00432 { 00433 // Load it 00434 CShapeStream stream; 00435 stream.serial (inputFile); 00436 00437 // Get the pointer 00438 iteMap=shapeMap.insert (std::map<string, IShape*>::value_type (name, stream.getShapePointer ())).first; 00439 } 00440 else 00441 { 00442 // Error 00443 nlwarning ("WARNING can't load shape %s\n", name.c_str()); 00444 shapeFound= false; 00445 } 00446 } 00447 } 00448 00449 00450 // Last chance to skip it: fully LightMapped ?? 00451 //----------- 00452 if(shapeFound) 00453 { 00454 CMeshBase *mesh= dynamic_cast<CMeshBase*>(iteMap->second); 00455 if(mesh) 00456 { 00457 // If this mesh is not lightable (fully lightMapped) 00458 if(!mesh->isLightable()) 00459 { 00460 // Force Avoid StaticLight precomputing 00461 _Instances[i].AvoidStaticLightPreCompute= true; 00462 // Disable static lighting. 00463 _Instances[i].StaticLightEnabled= false; 00464 // Next instance. 00465 continue; 00466 } 00467 } 00468 } 00469 00470 00471 // Compute pos and OverSamples 00472 //----------- 00473 { 00474 // Compute bbox, or default bbox 00475 CAABBox bbox; 00476 if(!shapeFound) 00477 { 00478 bbox.setCenter(CVector::Null); 00479 bbox.setHalfSize(CVector::Null); 00480 } 00481 else 00482 { 00483 iteMap->second->getAABBox(bbox); 00484 } 00485 // get pos 00486 shapeCenterPos= bbox.getCenter(); 00487 00488 00489 // Compute overSamples 00490 float qx= bbox.getHalfSize().x/2; 00491 float qy= bbox.getHalfSize().y/2; 00492 float qz= bbox.getHalfSize().z/2; 00493 // No OverSampling => just copy. 00494 if(lightDesc.OverSampling==0) 00495 overSamples[0]= shapeCenterPos; 00496 else if(lightDesc.OverSampling==2) 00497 { 00498 // Prefer Z Axis. 00499 overSamples[0]= shapeCenterPos + CVector(0, 0, qz); 00500 overSamples[1]= shapeCenterPos - CVector(0, 0, qz); 00501 } 00502 else if(lightDesc.OverSampling==4) 00503 { 00504 // Apply an overSampling such that we see 4 points if we look on each side of the bbox. 00505 overSamples[0]= shapeCenterPos + CVector(-qx, -qy, -qz); 00506 overSamples[1]= shapeCenterPos + CVector(+qx, -qy, +qz); 00507 overSamples[2]= shapeCenterPos + CVector(-qx, +qy, +qz); 00508 overSamples[3]= shapeCenterPos + CVector(+qx, +qy, -qz); 00509 } 00510 else if(lightDesc.OverSampling==8 || lightDesc.OverSampling==16) 00511 { 00512 // 8x is the best overSampling shceme for bbox 00513 overSamples[0]= shapeCenterPos + CVector(-qx, -qy, -qz); 00514 overSamples[1]= shapeCenterPos + CVector(+qx, -qy, -qz); 00515 overSamples[2]= shapeCenterPos + CVector(-qx, +qy, -qz); 00516 overSamples[3]= shapeCenterPos + CVector(+qx, +qy, -qz); 00517 overSamples[4]= shapeCenterPos + CVector(-qx, -qy, +qz); 00518 overSamples[5]= shapeCenterPos + CVector(+qx, -qy, +qz); 00519 overSamples[6]= shapeCenterPos + CVector(-qx, +qy, +qz); 00520 overSamples[7]= shapeCenterPos + CVector(+qx, +qy, +qz); 00521 00522 // 16x => use this setup, and decal from 1/8 00523 if(lightDesc.OverSampling==16) 00524 { 00525 CVector decal(qx/2, qy/2, qz/2); 00526 for(uint sample=0; sample<8; sample++) 00527 { 00528 // Copy and decal 00529 overSamples[sample+8]= overSamples[sample] + decal; 00530 // neg decal me 00531 overSamples[sample]-= decal; 00532 } 00533 } 00534 } 00535 } 00536 00537 00538 // Compute pos of the instance 00539 //------------ 00540 CMatrix matInst; 00541 matInst.setPos(_Instances[i].Pos); 00542 matInst.setRot(_Instances[i].Rot); 00543 matInst.scale(_Instances[i].Scale); 00544 _InstanceInfos[i].CenterPos= matInst * shapeCenterPos; 00545 // Apply matInst to samples. 00546 uint nSamples= max(1U, lightDesc.OverSampling); 00547 for(uint sample=0; sample<nSamples; sample++) 00548 { 00549 _InstanceInfos[i].OverSamples[sample]= matInst * overSamples[sample]; 00550 } 00551 } 00552 00553 // Clean Up shapes. 00554 //----------- 00555 std::map<string, IShape*>::iterator iteMap; 00556 iteMap= shapeMap.begin(); 00557 while(iteMap!= shapeMap.end()) 00558 { 00559 // delte shape 00560 delete iteMap->second; 00561 // delete entry in map 00562 shapeMap.erase(iteMap); 00563 // next 00564 iteMap= shapeMap.begin(); 00565 } 00566 00567 // Build all obstacles plane. 00568 //----------- 00569 for(i=0; i<(sint)obstacles.size();i++) 00570 { 00571 CInstanceLighter::CTriangle& triangle=obstacles[i]; 00572 // Calc the plane 00573 triangle.Plane.make (triangle.Triangle.V0, triangle.Triangle.V1, triangle.Triangle.V2); 00574 } 00575 00576 00577 // Lighting 00578 //======== 00579 // Light With Sun: build the grid, and do it on all _Instances, using _InstanceInfos 00580 // Compute also Lighting on surface. 00581 computeSunContribution(lightDesc, obstacles, landscape); 00582 00583 // Light With PointLights 00584 // build the cubeGrids 00585 compilePointLightRT(lightDesc.GridSize, lightDesc.GridCellSize, obstacles, lightDesc.Shadow); 00586 // kill pointLightList, because will use mine. 00587 pointLightList.clear(); 00588 // Light for all _Instances, using _InstanceInfos 00589 // Compute also Lighting on surface. 00590 processIGPointLightRT(pointLightList); 00591 00592 // If _IGSurfaceLightBuild, then dilate lighting 00593 if(_IGSurfaceLightBuild) 00594 { 00595 dilateLightingOnSurfaceCells(); 00596 } 00597 00598 00599 // Build result. 00600 //======== 00601 if(_IGSurfaceLightBuild) 00602 { 00603 // build with IGSurfaceLight lighting 00604 igOut.build(outGlobalPos, _Instances, outClusters, outPortals, pointLightList, 00605 &_IGRetrieverGridMap, _IGSurfaceLightBuild->CellSize); 00606 } 00607 else 00608 { 00609 // build without IGSurfaceLight lighting 00610 igOut.build(outGlobalPos, _Instances, outClusters, outPortals, pointLightList); 00611 } 00612 00613 } |
|
Tool method which take a single IG, and do all the god job to light this one, with no other dependencies NB: it uses instLighter passed, init() ing it. It use lightDesc.UserShapeMap or it load Shape in directory lightDesc.ShapePath Definition at line 1502 of file instance_lighter.cpp. References addStaticPointLight(), NL3D::CInstanceGroup::getInstance(), NL3D::CInstanceGroup::getInstancePos(), NL3D::CInstanceGroup::getInstanceRot(), NL3D::CInstanceGroup::getInstanceScale(), NL3D::CInstanceGroup::getNumInstance(), NL3D::CInstanceGroup::getPointLightList(), NL3D::CInstanceGroup::getShapeName(), NL3D::CShapeStream::getShapePointer(), init(), light(), nlwarning, NLMISC::CIFile::open(), progress(), NLMISC::CMatrix::scale(), NL3D::CShapeStream::serial(), NLMISC::CMatrix::setPos(), NLMISC::CMatrix::setRot(), NL3D::CInstanceLighter::CLightDesc::Shadow, sint, and NL3D::CInstanceLighter::CLightDesc::UserShapeMap.
01503 { 01504 sint i; 01505 01506 01507 // Setup. 01508 //======= 01509 // Init 01510 instLighter.init(); 01511 01512 // Add obstacles. 01513 std::vector<CInstanceLighter::CTriangle> obstacles; 01514 // only if Shadowing On. 01515 if(lightDesc.Shadow) 01516 { 01517 // Map of shape to load 01518 std::map<string, IShape*> shapeMap; 01519 01520 // For all instances of igIn. 01521 for(i=0; i<(sint)igIn.getNumInstance();i++) 01522 { 01523 // progress 01524 instLighter.progress("Loading Shapes obstacles", float(i)/igIn.getNumInstance()); 01525 01526 // Skip it?? 01527 if(igIn.getInstance(i).DontCastShadow) 01528 continue; 01529 01530 // Get the instance shape name 01531 string name= igIn.getShapeName(i); 01532 bool shapeFound= true; 01533 01534 // Try to find the shape in the UseShapeMap. 01535 std::map<string, IShape*>::const_iterator iteMap= lightDesc.UserShapeMap.find (name); 01536 01537 // If not found in userShape map, try to load it from the temp loaded ShapeBank. 01538 if( iteMap == lightDesc.UserShapeMap.end() ) 01539 { 01540 // Add a .shape at the end ? 01541 if (name.find('.') == std::string::npos) 01542 name += ".shape"; 01543 01544 // Get the instance shape name 01545 string nameLookup = CPath::lookup (name, false, false); 01546 if (!nameLookup.empty()) 01547 name = nameLookup; 01548 01549 // Find the shape in the bank 01550 iteMap= shapeMap.find (name); 01551 if (iteMap==shapeMap.end()) 01552 { 01553 // Input file 01554 CIFile inputFile; 01555 01556 if (!name.empty() && inputFile.open (name)) 01557 { 01558 // Load it 01559 CShapeStream stream; 01560 stream.serial (inputFile); 01561 01562 // Get the pointer 01563 iteMap=shapeMap.insert (std::map<string, IShape*>::value_type (name, stream.getShapePointer ())).first; 01564 } 01565 else 01566 { 01567 // Error 01568 nlwarning ("WARNING can't load shape %s\n", name.c_str()); 01569 shapeFound= false; 01570 } 01571 } 01572 } 01573 01574 if(shapeFound) 01575 { 01576 CMatrix matInst; 01577 matInst.setPos(igIn.getInstancePos(i)); 01578 matInst.setRot(igIn.getInstanceRot(i)); 01579 matInst.scale(igIn.getInstanceScale(i)); 01580 // Add triangles of this shape 01581 CInstanceLighter::addTriangles(*iteMap->second, matInst, obstacles, i); 01582 } 01583 01584 } 01585 01586 // Clean Up shapes. 01587 //----------- 01588 std::map<string, IShape*>::iterator iteMap; 01589 iteMap= shapeMap.begin(); 01590 while(iteMap!= shapeMap.end()) 01591 { 01592 // delte shape 01593 delete iteMap->second; 01594 // delete entry in map 01595 shapeMap.erase(iteMap); 01596 // next 01597 iteMap= shapeMap.begin(); 01598 } 01599 } 01600 01601 // Add pointLights of the IG. 01602 for(i=0; i<(sint)igIn.getPointLightList().size();i++) 01603 { 01604 instLighter.addStaticPointLight( igIn.getPointLightList()[i], igName ); 01605 } 01606 01607 01608 // Run. 01609 //======= 01610 instLighter.light(igIn, igOut, lightDesc, obstacles); 01611 01612 } |
|
Definition at line 1663 of file instance_lighter.cpp. References _IGRetrieverGridMap, _IGSurfaceLightBuild, _IsEndCell, _ItCellId, _ItCurrentCellNumber, _ItRetriever, _ItRetrieverInfo, _ItSurfId, isEndCell(), nlassert, and NL3D::CIGSurfaceLightBuild::RetrieverGridMap. Referenced by computeSunContribution(), dilateLightingOnSurfaceCells(), and processIGPointLightRT().
01664 { 01665 nlassert(!isEndCell()); 01666 01667 // Next Cell. 01668 _ItCellId++; 01669 _ItCurrentCellNumber++; 01670 01671 // If end of Cells, next surface. 01672 if(_ItCellId >= _ItRetriever->second.Grids[_ItSurfId].Cells.size() ) 01673 { 01674 _ItCellId= 0; 01675 _ItSurfId ++; 01676 } 01677 01678 // If end of surface, next retriever. 01679 if(_ItSurfId >= _ItRetriever->second.Grids.size() ) 01680 { 01681 _ItSurfId= 0; 01682 _ItRetriever++; 01683 if(_ItRetriever != _IGRetrieverGridMap.end()) 01684 { 01685 // Get info. 01686 _ItRetrieverInfo= _IGSurfaceLightBuild->RetrieverGridMap.find(_ItRetriever->first); 01687 nlassert(_ItRetrieverInfo != _IGSurfaceLightBuild->RetrieverGridMap.end() ); 01688 } 01689 } 01690 01691 // If end of retreiver, End. 01692 if(_ItRetriever == _IGRetrieverGridMap.end()) 01693 { 01694 _IsEndCell= true; 01695 } 01696 } |
|
Process the IG, ie process _InstanceInfos. Also process SurfaceLightGrid MultiCPU: not done for now. Be aware of CPointLightRT::RefCount!!!! Definition at line 1161 of file instance_lighter.cpp. References _CurrentInstanceComputed, _IGSurfaceLightBuild, _InstanceInfos, _StaticPointLightQuadGrid, _StaticPointLights, NL3D::CQuadGrid< CPointLightRT * >::begin(), beginCell(), NL3D::CInstanceLighter::CPointLightRT::BSphere, NLMISC::CBSphere::Center, NL3D::CIGSurfaceLightBuild::CCellCorner::CenterPos, NL3D::CInstanceLighter::CInstanceInfo::CenterPos, NL3D::CInstanceLighter::CPointLightRT::DstId, NL3D::CQuadGrid< CPointLightRT * >::end(), getCurrentCell(), getCurrentCellInfo(), NL3D::CPointLight::getType(), NL3D::CIGSurfaceLightBuild::CCellCorner::InSurface, isEndCell(), NL3D::CSurfaceLightGrid::CCellCorner::Light, NL3D::CInstanceGroup::CInstance::Light, NL3D::CInstanceLighter::CInstanceInfo::Light, NL3D::CIGSurfaceLightBuild::CCellCorner::LightInfo, NL3D::CSurfaceLightGrid::CCellCorner::LocalAmbientId, NL3D::CInstanceGroup::CInstance::LocalAmbientId, NL3D::CIGSurfaceLightBuild::CCellCorner::LocalAmbientLight, NL3D::CInstanceLighter::CInstanceInfo::LocalAmbientLight, min, nextCell(), nlctassert, nlwarning, NL3D::CInstanceLighter::CPredPointLightToPoint::Point, NL3D::CInstanceLighter::CPointLightRT::PointLight, progress(), progressCell(), NLMISC::CBSphere::Radius, NL3D::CInstanceLighter::CPointLightRT::RefCount, NL3D::CQuadGrid< CPointLightRT * >::select(), NL3D::CInstanceLighter::CPointLightRT::testRaytrace(), and uint. Referenced by light().
01162 { 01163 uint i; 01164 vector<CPointLightRT*> lightInfs; 01165 lightInfs.reserve(1024); 01166 01167 // clear result list 01168 listPointLight.clear(); 01169 01170 01171 // Compute each Instance 01172 //=========== 01173 for(i=0; i<_InstanceInfos.size(); i++) 01174 { 01175 // If staticLight not enabled, skip. 01176 if( !_Instances[i].StaticLightEnabled ) 01177 continue; 01178 01179 CInstanceInfo &inst= _InstanceInfos[i]; 01180 // Avoid autoShadowing 01181 _CurrentInstanceComputed= i; 01182 01183 // progress 01184 progress ("Compute Influences of PointLights 2/2", i / (float)_InstanceInfos.size()); 01185 01186 // get the point of the instance. 01187 CVector pos= inst.CenterPos; 01188 01189 // Default: takes no LocalAmbientLight; 01190 inst.LocalAmbientLight= NULL; 01191 float furtherAmbLight= 0; 01192 01193 // Compute Which light influences him. 01194 //--------- 01195 lightInfs.clear(); 01196 // Search possible lights around the position. 01197 _StaticPointLightQuadGrid.select(pos, pos); 01198 // For all of them, get the ones which touch this point. 01199 CQuadGrid<CPointLightRT*>::CIterator it= _StaticPointLightQuadGrid.begin(); 01200 while(it != _StaticPointLightQuadGrid.end()) 01201 { 01202 CPointLightRT *pl= *it; 01203 01204 // Test if really in the radius of the light, no occlusion, not an ambient, and in Spot Angle setup 01205 if( pl->testRaytrace(pos, _CurrentInstanceComputed) ) 01206 { 01207 // Ok, add the light to the lights which influence the instance 01208 lightInfs.push_back(pl); 01209 } 01210 01211 // Ambient Light ?? 01212 if( pl->PointLight.getType() == CPointLight::AmbientLight ) 01213 { 01214 // If the instance is in radius of the ambiant light. 01215 float dRadius= pl->BSphere.Radius - (pl->BSphere.Center - pos).norm(); 01216 if(dRadius>0) 01217 { 01218 // Take the best ambient light: the one which is further from the circumference 01219 if(dRadius > furtherAmbLight) 01220 { 01221 furtherAmbLight= dRadius; 01222 inst.LocalAmbientLight= pl; 01223 } 01224 } 01225 } 01226 01227 // next 01228 it++; 01229 } 01230 01231 // If ambientLight chosen, inc Ref count of it 01232 if(inst.LocalAmbientLight) 01233 inst.LocalAmbientLight->RefCount++; 01234 01235 // Choose the Best ones. 01236 //--------- 01237 CPredPointLightToPoint predPLTP; 01238 predPLTP.Point= pos; 01239 // sort. 01240 sort(lightInfs.begin(), lightInfs.end(), predPLTP); 01241 // truncate. 01242 lightInfs.resize( min((uint)lightInfs.size(), (uint)CInstanceGroup::NumStaticLightPerInstance) ); 01243 01244 01245 // For each of them, fill instance 01246 //--------- 01247 uint lightInfId; 01248 for(lightInfId=0; lightInfId<lightInfs.size(); lightInfId++) 01249 { 01250 CPointLightRT *pl= lightInfs[lightInfId]; 01251 01252 // copy light. 01253 inst.Light[lightInfId]= pl; 01254 01255 // Inc RefCount of the light. 01256 pl->RefCount++; 01257 } 01258 // Reset any empty slot to NULL. 01259 for(; lightInfId<CInstanceGroup::NumStaticLightPerInstance; lightInfId++) 01260 { 01261 inst.Light[lightInfId]= NULL; 01262 } 01263 01264 } 01265 01266 01267 // Compute Lighting on SurfaceLightGrid 01268 //=========== 01269 // Must do it before compression !! 01270 // NB: big copy/Past from above 01271 if(_IGSurfaceLightBuild) 01272 { 01273 // No instance currenlty computed, since we compute surface cells. 01274 _CurrentInstanceComputed= -1; 01275 01276 // Begin cell iteration 01277 beginCell(); 01278 // For all surface cell corners 01279 while( !isEndCell() ) 01280 { 01281 progressCell("Compute PointLights on Surfaces"); 01282 01283 // get the current cellInfo iterated. 01284 CIGSurfaceLightBuild::CCellCorner &cellInfo= getCurrentCellInfo(); 01285 01286 // if the cell corner lies in the polygon surface. 01287 if(cellInfo.InSurface) 01288 { 01289 // get the point of the cell. 01290 CVector pos= cellInfo.CenterPos; 01291 01292 // Default: takes no LocalAmbientLight; 01293 cellInfo.LocalAmbientLight= NULL; 01294 float furtherAmbLight= 0; 01295 01296 // Compute Which light influences him. 01297 //--------- 01298 lightInfs.clear(); 01299 // Search possible lights around the position. 01300 _StaticPointLightQuadGrid.select(pos, pos); 01301 // For all of them, get the ones which touch this point. 01302 CQuadGrid<CPointLightRT*>::CIterator it= _StaticPointLightQuadGrid.begin(); 01303 while(it != _StaticPointLightQuadGrid.end()) 01304 { 01305 CPointLightRT *pl= *it; 01306 01307 // Test if really in the radius of the light, no occlusion, not an ambient, and in Spot Angle setup 01308 if( pl->testRaytrace(pos, _CurrentInstanceComputed) ) 01309 { 01310 // Ok, add the light to the lights which influence the cell 01311 lightInfs.push_back(pl); 01312 } 01313 01314 // Ambient Light ?? 01315 if( pl->PointLight.getType() == CPointLight::AmbientLight ) 01316 { 01317 // If the instance is in radius of the ambiant light. 01318 float dRadius= pl->BSphere.Radius - (pl->BSphere.Center - pos).norm(); 01319 if(dRadius>0) 01320 { 01321 // Take the best ambient light: the one which is further from the circumference 01322 if(dRadius > furtherAmbLight) 01323 { 01324 furtherAmbLight= dRadius; 01325 cellInfo.LocalAmbientLight= pl; 01326 } 01327 } 01328 } 01329 01330 // next 01331 it++; 01332 } 01333 01334 // If ambientLight chosen, inc Ref count of it 01335 if(cellInfo.LocalAmbientLight) 01336 ((CPointLightRT*)cellInfo.LocalAmbientLight)->RefCount++; 01337 01338 01339 // Choose the Best ones. 01340 //--------- 01341 CPredPointLightToPoint predPLTP; 01342 predPLTP.Point= pos; 01343 // sort. 01344 sort(lightInfs.begin(), lightInfs.end(), predPLTP); 01345 // truncate. 01346 lightInfs.resize( min((uint)lightInfs.size(), (uint)CSurfaceLightGrid::NumLightPerCorner) ); 01347 01348 01349 // For each of them, fill cellInfo 01350 //--------- 01351 uint lightInfId; 01352 for(lightInfId=0; lightInfId<lightInfs.size(); lightInfId++) 01353 { 01354 CPointLightRT *pl= lightInfs[lightInfId]; 01355 01356 // copy light. 01357 cellInfo.LightInfo[lightInfId]= pl; 01358 01359 // Inc RefCount of the light. 01360 pl->RefCount++; 01361 } 01362 // Reset any empty slot to NULL. 01363 for(; lightInfId<CSurfaceLightGrid::NumLightPerCorner; lightInfId++) 01364 { 01365 cellInfo.LightInfo[lightInfId]= NULL; 01366 } 01367 01368 } 01369 01370 // next cell 01371 nextCell(); 01372 } 01373 } 01374 01375 01376 01377 // Compress and setup _Instances with compressed data. 01378 //=========== 01379 uint plId= 0; 01380 // Process each pointLights 01381 for(i=0; i<_StaticPointLights.size(); i++) 01382 { 01383 CPointLightRT &plRT= _StaticPointLights[i]; 01384 // If this light is used. 01385 if(plRT.RefCount > 0) 01386 { 01387 // Valid light ? 01388 if (plId <=0xFF) 01389 { 01390 // Must Copy it into Ig. 01391 listPointLight.push_back(plRT.PointLight); 01392 plRT.DstId= plId++; 01393 // If index >= 255, too many lights (NB: => because 255 is a NULL code). 01394 } 01395 else 01396 { 01397 nlwarning("ERROR: Too many Static Point Lights influence the IG!!"); 01398 // Set 0xFF. Special code indicating that the light CAN'T BE USED => any instance using 01399 // it is buggy (won't be lighted by this light). 01400 plRT.DstId= plId++; 01401 } 01402 } 01403 } 01404 01405 // For each instance, compress Point light info 01406 for(i=0; i<_Instances.size(); i++) 01407 { 01408 // If staticLight not enabled, skip. 01409 if( !_Instances[i].StaticLightEnabled ) 01410 continue; 01411 01412 CInstanceInfo &instSrc= _InstanceInfos[i]; 01413 CInstanceGroup::CInstance &instDst= _Instances[i]; 01414 01415 // Do it for PointLights 01416 for(uint lightId= 0; lightId<CInstanceGroup::NumStaticLightPerInstance; lightId++) 01417 { 01418 if(instSrc.Light[lightId] == NULL) 01419 { 01420 // Mark as unused. 01421 instDst.Light[lightId]= 0xFF; 01422 } 01423 else 01424 { 01425 // Get index. NB: may still be 0xFF if 'Too many static light' bug. 01426 instDst.Light[lightId]= instSrc.Light[lightId]->DstId; 01427 } 01428 } 01429 01430 // Ensure that all FF are at end of the list (possible because of the TooManyStaticLight bug). 01431 // But don't do a full sort, to preserve order due to influence... 01432 nlctassert(CInstanceGroup::NumStaticLightPerInstance==2); 01433 if(instDst.Light[0] == 0xFF) swap(instDst.Light[0], instDst.Light[1]); 01434 01435 // Do it for Ambientlight 01436 if(instSrc.LocalAmbientLight == NULL) 01437 instDst.LocalAmbientId= 0xFF; 01438 else 01439 // NB: may still be 0xFF if 'Too many static light' bug. 01440 instDst.LocalAmbientId= instSrc.LocalAmbientLight->DstId; 01441 } 01442 01443 // For each cell, compress Point light info 01444 if(_IGSurfaceLightBuild) 01445 { 01446 // Begin cell iteration 01447 beginCell(); 01448 // For all surface cell corners 01449 while( !isEndCell() ) 01450 { 01451 // get the current cell and cellInfo iterated. 01452 CIGSurfaceLightBuild::CCellCorner &cellInfo= getCurrentCellInfo(); 01453 CSurfaceLightGrid::CCellCorner &cell= getCurrentCell(); 01454 01455 if(cellInfo.InSurface) 01456 { 01457 // Do it for PointLights 01458 for(uint lightId= 0; lightId<CSurfaceLightGrid::NumLightPerCorner; lightId++) 01459 { 01460 if(cellInfo.LightInfo[lightId] == NULL) 01461 { 01462 // Mark as unused. 01463 cell.Light[lightId]= 0xFF; 01464 } 01465 else 01466 { 01467 // Get index. NB: may still be 0xFF if 'Too many static light' bug. 01468 cell.Light[lightId]= reinterpret_cast<CPointLightRT*>(cellInfo.LightInfo[lightId])->DstId; 01469 } 01470 } 01471 01472 // Ensure that all FF are at end of the list (possible because of the TooManyStaticLight bug). 01473 // But don't do a full sort, to preserve order due to influence... 01474 nlctassert(CInstanceGroup::NumStaticLightPerInstance==2); 01475 if(cell.Light[0] == 0xFF) swap(cell.Light[0], cell.Light[1]); 01476 01477 // Do it for Ambientlight 01478 if(cellInfo.LocalAmbientLight == NULL) 01479 cell.LocalAmbientId= 0xFF; 01480 else 01481 // NB: may still be 0xFF if 'Too many static light' bug. 01482 cell.LocalAmbientId= ((CPointLightRT*)cellInfo.LocalAmbientLight)->DstId; 01483 } 01484 01485 // next cell 01486 nextCell(); 01487 } 01488 } 01489 01490 01491 } |
|
Definition at line 159 of file instance_lighter.h. Referenced by compilePointLightRT(), computeSunContribution(), lightIgSimple(), processIGPointLightRT(), and progressCell().
00159 {}; |
|
Definition at line 1623 of file instance_lighter.cpp. References _LastCellProgress, getCurrentCellNumber(), getTotalCellNumber(), and progress(). Referenced by computeSunContribution(), dilateLightingOnSurfaceCells(), and processIGPointLightRT().
01624 { 01625 float cp= getCurrentCellNumber() / float(getTotalCellNumber()); 01626 if( cp > _LastCellProgress+0.05f) 01627 { 01628 progress(message, cp); 01629 _LastCellProgress= cp; 01630 } 01631 } |
|
Definition at line 210 of file instance_lighter.h. Referenced by computeSunContribution(), and processIGPointLightRT(). |
|
Definition at line 214 of file instance_lighter.h. Referenced by beginCell(), light(), and nextCell(). |
|
Definition at line 212 of file instance_lighter.h. Referenced by beginCell(), CInstanceLighter(), computeSunContribution(), light(), nextCell(), and processIGPointLightRT(). |
|
Definition at line 208 of file instance_lighter.h. Referenced by computeSunContribution(), light(), and processIGPointLightRT(). |
|
Definition at line 206 of file instance_lighter.h. |
|
Definition at line 293 of file instance_lighter.h. Referenced by beginCell(), isEndCell(), light(), and nextCell(). |
|
Definition at line 292 of file instance_lighter.h. Referenced by beginCell(), getCurrentCell(), getCurrentCellInfo(), getCurrentNeighborCell(), getCurrentNeighborCellInfo(), isCurrentNeighborCellInSurface(), and nextCell(). |
|
Definition at line 294 of file instance_lighter.h. Referenced by beginCell(), getCurrentCellNumber(), and nextCell(). |
|
Definition at line 289 of file instance_lighter.h. Referenced by beginCell(), getCurrentCell(), getCurrentNeighborCell(), isCurrentNeighborCellInSurface(), and nextCell(). |
|
Definition at line 290 of file instance_lighter.h. Referenced by beginCell(), getCurrentCellInfo(), getCurrentNeighborCellInfo(), isCurrentNeighborCellInSurface(), and nextCell(). |
|
Definition at line 291 of file instance_lighter.h. Referenced by beginCell(), getCurrentCell(), getCurrentCellInfo(), getCurrentNeighborCell(), getCurrentNeighborCellInfo(), isCurrentNeighborCellInSurface(), and nextCell(). |
|
Definition at line 296 of file instance_lighter.h. Referenced by beginCell(), and progressCell(). |
|
QuadGrid of PointLights. Builded from _StaticPointLights.
Definition at line 255 of file instance_lighter.h. Referenced by compilePointLightRT(), and processIGPointLightRT(). |
|
List of PointLights.
Definition at line 253 of file instance_lighter.h. Referenced by addStaticPointLight(), compilePointLightRT(), and processIGPointLightRT(). |
|
Definition at line 295 of file instance_lighter.h. Referenced by getTotalCellNumber(), and light(). |