#include <shadow_poly_receiver.h>
Nevrax France
Definition at line 57 of file shadow_poly_receiver.h.
Public Member Functions | |
| uint | addTriangle (const NLMISC::CTriangle &tri) |
| Append a triangle to the poly receiver. | |
| CShadowPolyReceiver (uint quadGridSize=32, float quadGridCellSize=4.f) | |
| Constructor. | |
| float | getCameraCollision (const CVector &start, const CVector &end, float radius, bool cone) |
| void | removeTriangle (uint id) |
| remove a triangle from the poly receiver. | |
| void | render (IDriver *drv, CMaterial &shadowMat, const CShadowMap *shadowMap, const CVector &casterPos, const CVector &vertDelta) |
Private Types | |
| typedef CQuadGrid< CTriangleId > | TTriangleGrid |
| typedef std::map< CVector, uint > | TVertexMap |
Private Member Functions | |
| uint | allocateVertex (const CVector &v) |
| void | incVertexRefCount (uint id) |
| void | releaseVertex (uint id) |
Private Attributes | |
| std::vector< uint > | _FreeTriangles |
| std::vector< uint > | _FreeVertices |
| std::vector< uint32 > | _RenderTriangles |
| TTriangleGrid | _TriangleGrid |
| std::vector< TTriangleGrid::CIterator > | _Triangles |
| CVertexBuffer | _VB |
| TVertexMap | _VertexMap |
| std::vector< CVectorId > | _Vertices |
|
|
Definition at line 105 of file shadow_poly_receiver.h. |
|
|
Definition at line 97 of file shadow_poly_receiver.h. |
|
||||||||||||
|
Constructor.
Definition at line 43 of file shadow_poly_receiver.cpp. References _FreeTriangles, _FreeVertices, _TriangleGrid, NL3D::CQuadGrid< T >::create(), NL3D::CVertexBuffer::setVertexFormat(), and uint.
00044 {
00045 _Vertices.reserve(64);
00046 _FreeVertices.reserve(64);
00047 _FreeTriangles.reserve(64);
00048 _Triangles.reserve(64);
00049
00050 _TriangleGrid.create(quadGridSize, quadGridCellSize);
00051
00052 _VB.setVertexFormat(CVertexBuffer::PositionFlag);
00053 }
|
|
|
Append a triangle to the poly receiver.
Definition at line 57 of file shadow_poly_receiver.cpp. References _FreeTriangles, _RenderTriangles, _TriangleGrid, _VertexMap, allocateVertex(), NLMISC::CAABBox::extend(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), incVertexRefCount(), NL3D::CQuadGrid< T >::insert(), NLMISC::CAABBox::setCenter(), uint, v, NLMISC::CTriangle::V0, NLMISC::CTriangle::V1, NLMISC::CTriangle::V2, and NL3D::CShadowPolyReceiver::CTriangleId::Vertex. Referenced by NL3D::CLandscape::appendToShadowPolyReceiver().
00058 {
00059 uint id;
00060
00061 // Look for a free triangle entry.
00062 if(_FreeTriangles.empty())
00063 {
00064 _Triangles.push_back(TTriangleGrid::CIterator());
00065 id= _Triangles.size()-1;
00066 // enlarge render size.
00067 _RenderTriangles.resize(_Triangles.size() * 3);
00068 }
00069 else
00070 {
00071 id= _FreeTriangles.back();
00072 _FreeTriangles.pop_back();
00073 }
00074
00075 // Allocate vertices, reusing same ones.
00076 CTriangleId triId;
00077 CVector v[3];
00078 v[0]= tri.V0;
00079 v[1]= tri.V1;
00080 v[2]= tri.V2;
00081 for(uint i=0;i<3;i++)
00082 {
00083 // Find the vertex in the map.
00084 TVertexMap::iterator it;
00085 it= _VertexMap.find(v[i]);
00086 // if not found, allocate it
00087 if(it==_VertexMap.end())
00088 {
00089 triId.Vertex[i]= allocateVertex(v[i]);
00090 }
00091 // else get its id
00092 else
00093 {
00094 triId.Vertex[i]= it->second;
00095 }
00096
00097 // increment the reference of this vertex
00098 incVertexRefCount(triId.Vertex[i]);
00099 }
00100
00101 // Insert the triangle in the quadGrid.
00102 CAABBox bb;
00103 bb.setCenter(tri.V0);
00104 bb.extend(tri.V1);
00105 bb.extend(tri.V2);
00106 // insert in QuadGrid and store iterator for future remove
00107 _Triangles[id]= _TriangleGrid.insert(bb.getMin(), bb.getMax(), triId);
00108
00109 return id;
00110 }
|
|
|
Definition at line 134 of file shadow_poly_receiver.cpp. References _FreeVertices, _VertexMap, NL3D::CVertexBuffer::setNumVertices(), uint, and v. Referenced by addTriangle().
00135 {
00136 uint id;
00137
00138 // Look for a free vertex entry.
00139 if(_FreeVertices.empty())
00140 {
00141 // Add the vertex, and init refCount to 0.
00142 _Vertices.push_back(v);
00143 id= _Vertices.size()-1;
00144
00145 // Resize the VBuffer at max possible
00146 _VB.setNumVertices(_Vertices.size());
00147 }
00148 else
00149 {
00150 id= _FreeVertices.back();
00151 _FreeVertices.pop_back();
00152 // init entry
00153 _Vertices[id]= v;
00154 _Vertices[id].RefCount= 0;
00155 }
00156
00157 // insert in the map (should not be here)
00158 _VertexMap.insert( make_pair(v, id) );
00159
00160 return id;
00161 }
|
|
||||||||||||||||||||
|
Use the triangles added for camera 3rd person collision return a [0,1] value. 0 => collision at start. 1 => no collision.
Definition at line 308 of file shadow_poly_receiver.cpp. References _TriangleGrid, NL3D::CCameraCol::BBox, NL3D::CQuadGrid< T >::begin(), NL3D::CCameraCol::build(), NL3D::CQuadGrid< T >::end(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), min, NL3D::CCameraCol::minimizeDistanceAgainstTri(), NL3D::CQuadGrid< T >::select(), and NL3D::CShadowPolyReceiver::CTriangleId::Vertex. Referenced by NL3D::CLandscape::getCameraCollision().
00309 {
00310 // **** build the camera collision info
00311 CCameraCol camCol;
00312 camCol.build(start, end, radius, cone);
00313
00314 // select with quadGrid
00315 _TriangleGrid.select(camCol.BBox.getMin(), camCol.BBox.getMax());
00316
00317 // **** For all triangles, test if intersect the camera collision
00318 TTriangleGrid::CIterator it;
00319 float sqrMinDist= FLT_MAX;
00320 for(it=_TriangleGrid.begin();it!=_TriangleGrid.end();it++)
00321 {
00322 CTriangleId &triId= *it;
00323 camCol.minimizeDistanceAgainstTri(
00324 _Vertices[triId.Vertex[0]],
00325 _Vertices[triId.Vertex[1]],
00326 _Vertices[triId.Vertex[2]],
00327 sqrMinDist);
00328 }
00329
00330 // **** return the collision found, between [0,1]
00331 if(sqrMinDist == FLT_MAX)
00332 return 1;
00333 else
00334 {
00335 float f= 1;
00336 float d= (end-start).norm();
00337 if(d>0)
00338 {
00339 f= sqrtf(sqrMinDist) / d;
00340 f= min(f, 1.f);
00341 }
00342 return f;
00343 }
00344
00345 }
|
|
|
Definition at line 183 of file shadow_poly_receiver.cpp. References NL3D_SPR_MAX_REF_COUNT, nlassert, and uint. Referenced by addTriangle().
|
|
|
Definition at line 164 of file shadow_poly_receiver.cpp. References _FreeVertices, _VertexMap, nlassert, and uint. Referenced by removeTriangle().
00165 {
00166 nlassert(id<_Vertices.size());
00167 // dec ref
00168 nlassert(_Vertices[id].RefCount>0);
00169 _Vertices[id].RefCount--;
00170 // no more used?
00171 if(_Vertices[id].RefCount==0)
00172 {
00173 // Free it.
00174 _FreeVertices.push_back(id);
00175 // Remove it from map.
00176 TVertexMap::iterator it= _VertexMap.find(_Vertices[id]);
00177 nlassert(it!=_VertexMap.end());
00178 _VertexMap.erase(it);
00179 }
00180 }
|
|
|
remove a triangle from the poly receiver.
Definition at line 113 of file shadow_poly_receiver.cpp. References _FreeTriangles, _TriangleGrid, NL3D::CQuadGrid< T >::end(), NL3D::CQuadGrid< T >::erase(), nlassert, releaseVertex(), uint, and NL3D::CShadowPolyReceiver::CTriangleId::Vertex. Referenced by NL3D::CLandscape::removeFromShadowPolyReceiver().
00114 {
00115 nlassert(id<_Triangles.size());
00116 // Must not be NULL iterator.
00117 nlassert(_Triangles[id]!=_TriangleGrid.end());
00118
00119 // Release Vertices
00120 const CTriangleId &triId= *_Triangles[id];
00121 releaseVertex(triId.Vertex[0]);
00122 releaseVertex(triId.Vertex[1]);
00123 releaseVertex(triId.Vertex[2]);
00124
00125 // Delete Triangle.
00126 _TriangleGrid.erase(_Triangles[id]);
00127 _Triangles[id]= _TriangleGrid.end();
00128 // Append to free list.
00129 _FreeTriangles.push_back(id);
00130 }
|
|
||||||||||||||||||||||||
|
clip, and render with a shadow map. Matrix setup should be OK.
Definition at line 192 of file shadow_poly_receiver.cpp. References _RenderTriangles, _TriangleGrid, NL3D::IDriver::activeVertexBuffer(), NL3D::CQuadGrid< T >::begin(), NL3D::CQuadGrid< T >::end(), NLMISC::CAABBox::getCenter(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), NL3D::CShadowMap::LocalBoundingBox, NL3D::CShadowMap::LocalClipPlanes, min, NL3D_SPR_NUM_CLIP_PLANE, NL3D_SPR_NUM_CLIP_PLANE_MASK, NL3D_SPR_NUM_CLIP_PLANE_SHIFT, NL3D::IDriver::renderTriangles(), NL3D::CQuadGrid< T >::select(), NLMISC::CAABBox::setCenter(), NLMISC::CMatrix::setPos(), NL3D::CVertexBuffer::setVertexCoord(), sint, uint, and NL3D::CShadowPolyReceiver::CTriangleId::Vertex. Referenced by NL3D::CLandscape::receiveShadowMap().
00193 {
00194 uint i, j;
00195
00196 // **** Fill Triangles that are hit by the Caster
00197 // First select with quadGrid
00198 CAABBox worldBB;
00199 worldBB= shadowMap->LocalBoundingBox;
00200 worldBB.setCenter(worldBB.getCenter() + casterPos);
00201 _TriangleGrid.select(worldBB.getMin(), worldBB.getMax());
00202
00203 // For all triangles, reset vertices flags.
00204 TTriangleGrid::CIterator it;
00205 for(it=_TriangleGrid.begin();it!=_TriangleGrid.end();it++)
00206 {
00207 CTriangleId &triId= *it;
00208 for(i=0;i<3;i++)
00209 {
00210 _Vertices[triId.Vertex[i]].Flags= 0;
00211 _Vertices[triId.Vertex[i]].VBIdx= -1;
00212 }
00213 }
00214
00215 // Copute the world Clip Volume
00216 static std::vector<CPlane> worldClipPlanes;
00217 CMatrix worldMat;
00218 // set -casterPos, because to transform a plane, we must do plane * M-1
00219 worldMat.setPos(-casterPos);
00220 // Allow max bits of planes clip.
00221 worldClipPlanes.resize(min((uint)shadowMap->LocalClipPlanes.size(), (uint)NL3D_SPR_NUM_CLIP_PLANE));
00222 // Transform into world
00223 for(i=0;i<worldClipPlanes.size();i++)
00224 {
00225 worldClipPlanes[i]= shadowMap->LocalClipPlanes[i] * worldMat;
00226 }
00227
00228 // For All triangles, clip them.
00229 uint currentTriIdx= 0;
00230 uint currentVbIdx= 0;
00231 for(it=_TriangleGrid.begin();it!=_TriangleGrid.end();it++)
00232 {
00233 CTriangleId &triId= *it;
00234 uint triFlag= NL3D_SPR_NUM_CLIP_PLANE_MASK;
00235
00236 // for all vertices, clip them
00237 for(i=0;i<3;i++)
00238 {
00239 uint vid= triId.Vertex[i];
00240 uint vertexFlags= _Vertices[vid].Flags;
00241
00242 // if this vertex is still not computed
00243 if(!vertexFlags)
00244 {
00245 // For all planes of the Clip Volume, clip this vertex.
00246 for(j=0;j<worldClipPlanes.size();j++)
00247 {
00248 // out if in front
00249 bool out= worldClipPlanes[j]*_Vertices[vid] > 0;
00250
00251 vertexFlags|= ((uint)out)<<j;
00252 }
00253
00254 // add the bit flag to say "computed".
00255 vertexFlags|= NL3D_SPR_NUM_CLIP_PLANE_SHIFT;
00256
00257 // store
00258 _Vertices[vid].Flags= vertexFlags;
00259 }
00260
00261 // And all vertex bits.
00262 triFlag&= vertexFlags;
00263 }
00264
00265 // if triangle not clipped, add the triangle
00266 if( (triFlag & NL3D_SPR_NUM_CLIP_PLANE_MASK)==0 )
00267 {
00268 // Add the 3 vertices to the VB, and to the index buffer.
00269 for(i=0;i<3;i++)
00270 {
00271 uint vid= triId.Vertex[i];
00272 sint vbId= _Vertices[vid].VBIdx;
00273
00274 // if not yet inserted in the VB, do it.
00275 if(vbId==-1)
00276 {
00277 // allocate a new place in the VBuffer
00278 vbId= currentVbIdx++;
00279 _Vertices[vid].VBIdx= vbId;
00280 // set the coord
00281 _VB.setVertexCoord(vbId, _Vertices[vid]+vertDelta);
00282 }
00283
00284 // add the index to the tri list.
00285 _RenderTriangles[currentTriIdx++]= vbId;
00286 }
00287 }
00288 }
00289
00290
00291 // **** Render
00292 drv->activeVertexBuffer(_VB);
00293 drv->renderTriangles(shadowMat, &_RenderTriangles[0], currentTriIdx/3);
00294 // TestYoyo. Show in Red triangles selected
00295 /*static CMaterial tam;
00296 tam.initUnlit();
00297 tam.setColor(CRGBA(255,0,0,128));
00298 tam.setZFunc(CMaterial::always);
00299 tam.setZWrite(false);
00300 tam.setBlend(true);
00301 tam.setBlendFunc(CMaterial::srcalpha, CMaterial::invsrcalpha);
00302 tam.setDoubleSided(true);
00303 drv->renderTriangles(tam, &_RenderTriangles[0], currentTriIdx/3);*/
00304 }
|
|
|
Definition at line 108 of file shadow_poly_receiver.h. Referenced by addTriangle(), CShadowPolyReceiver(), and removeTriangle(). |
|
|
Definition at line 96 of file shadow_poly_receiver.h. Referenced by allocateVertex(), CShadowPolyReceiver(), and releaseVertex(). |
|
|
Definition at line 113 of file shadow_poly_receiver.h. Referenced by addTriangle(), and render(). |
|
|
Definition at line 106 of file shadow_poly_receiver.h. Referenced by addTriangle(), CShadowPolyReceiver(), getCameraCollision(), removeTriangle(), and render(). |
|
|
Definition at line 107 of file shadow_poly_receiver.h. |
|
|
Definition at line 112 of file shadow_poly_receiver.h. |
|
|
Definition at line 98 of file shadow_poly_receiver.h. Referenced by addTriangle(), allocateVertex(), and releaseVertex(). |
|
|
Definition at line 95 of file shadow_poly_receiver.h. |
1.3.6