Public Member Functions | |
void | add (uint16 id, const NLMISC::CAABBox &bbox) |
void | compile () |
void | create (uint nbQuads, uint nbElts, const NLMISC::CAABBox &gridBBox) |
uint | select (const NLMISC::CAABBox &bbox, std::vector< uint16 > &res) |
Private Attributes | |
NLMISC::CObjectVector< CEltBuild, false > | _EltBuild |
NLMISC::CObjectVector< CCase, false > | _Grid |
NLMISC::CObjectVector< uint16, false > | _GridData |
uint32 | _GridDataSize |
CVector | _GridPos |
CVector | _GridScale |
uint32 | _GridSize |
uint32 | _GridSizePower |
uint32 | _ItSession |
NLMISC::CObjectVector< uint32, false > | _Sessions |
|
Definition at line 200 of file visual_collision_manager.cpp. References _EltBuild, _GridDataSize, _GridPos, _GridScale, _GridSize, _GridSizePower, NLMISC::clamp(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), sint, uint, uint16, x, NLMISC::CVector::x, y, and NLMISC::CVector::y. Referenced by NL3D::CVisualCollisionManager::CMeshCol::build().
00201 { 00202 CVector minp= bbox.getMin() - _GridPos; 00203 CVector maxp= bbox.getMax() - _GridPos; 00204 00205 // compute the 2D bbox 00206 sint xmin= (sint)floorf(minp.x*_GridScale.x); 00207 sint ymin= (sint)floorf(minp.y*_GridScale.y); 00208 sint xmax= (sint)ceilf(maxp.x*_GridScale.x); 00209 sint ymax= (sint)ceilf(maxp.y*_GridScale.y); 00210 clamp(xmin, 0, (sint)_GridSize-1); 00211 clamp(ymin, 0, (sint)_GridSize-1); 00212 clamp(xmax, 0, (sint)_GridSize); 00213 clamp(ymax, 0, (sint)_GridSize); 00214 00215 // set in the elt build 00216 _EltBuild[id].X0= xmin; 00217 _EltBuild[id].Y0= ymin; 00218 _EltBuild[id].X1= xmax; 00219 _EltBuild[id].Y1= ymax; 00220 00221 // for each case touched, increment NumElts 00222 for(uint y=ymin;y<(uint)ymax;y++) 00223 { 00224 for(uint x=xmin;x<(uint)xmax;x++) 00225 { 00226 _Grid[(y<<_GridSizePower)+x].NumElts++; 00227 _GridDataSize++; 00228 } 00229 } 00230 } |
|
Definition at line 233 of file visual_collision_manager.cpp. References _EltBuild, _GridData, _GridDataSize, _GridSizePower, _Sessions, NLMISC::CObjectVector< CEltBuild, false >::clear(), NLMISC::CObjectVector< uint32, false >::fill(), nlassert, NL3D::CVisualCollisionManager::CStaticGrid::CCase::NumElts, NLMISC::CObjectVector< uint32, false >::resize(), NLMISC::CObjectVector< uint16, false >::resize(), NLMISC::CObjectVector< CEltBuild, false >::size(), NLMISC::CObjectVector< CCase, false >::size(), NL3D::CVisualCollisionManager::CStaticGrid::CCase::Start, uint, x, NL3D::CVisualCollisionManager::CStaticGrid::CEltBuild::X0, NL3D::CVisualCollisionManager::CStaticGrid::CEltBuild::X1, y, NL3D::CVisualCollisionManager::CStaticGrid::CEltBuild::Y0, and NL3D::CVisualCollisionManager::CStaticGrid::CEltBuild::Y1. Referenced by NL3D::CVisualCollisionManager::CMeshCol::build().
00234 { 00235 uint i; 00236 00237 // create the data 00238 _GridData.resize(_GridDataSize); 00239 00240 // Init Start ptr for each case 00241 uint idx= 0; 00242 for(i=0;i<_Grid.size();i++) 00243 { 00244 _Grid[i].Start= idx; 00245 idx+= _Grid[i].NumElts; 00246 // reset NumElts, because use it like an index below 00247 _Grid[i].NumElts= 0; 00248 } 00249 nlassert(_GridDataSize==idx); 00250 00251 // For each element, fill the grid and grid data 00252 for(i=0;i<_EltBuild.size();i++) 00253 { 00254 CEltBuild &eb= _EltBuild[i]; 00255 00256 for(uint y=eb.Y0;y<eb.Y1;y++) 00257 { 00258 for(uint x=eb.X0;x<eb.X1;x++) 00259 { 00260 CCase &gcase= _Grid[(y<<_GridSizePower)+x]; 00261 uint idx= gcase.Start + gcase.NumElts; 00262 // store the idx 00263 _GridData[idx]= i; 00264 // increment the number of elements for this case 00265 gcase.NumElts++; 00266 } 00267 } 00268 } 00269 00270 // create the temp array used for intersection test 00271 _Sessions.resize(_EltBuild.size()); 00272 _Sessions.fill(0); 00273 00274 // clear no more needed data 00275 _EltBuild.clear(); 00276 } |
|
|
Definition at line 279 of file visual_collision_manager.cpp. References _GridData, _GridPos, _GridScale, _GridSize, _GridSizePower, _ItSession, _Sessions, NLMISC::clamp(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), NL3D::CVisualCollisionManager::CStaticGrid::CCase::NumElts, res, sint, NLMISC::CObjectVector< uint32, false >::size(), NL3D::CVisualCollisionManager::CStaticGrid::CCase::Start, uint, x, NLMISC::CVector::x, y, and NLMISC::CVector::y. Referenced by NL3D::CVisualCollisionManager::CMeshCol::getCameraCollision().
00280 { 00281 // increment the intersection session 00282 _ItSession++; 00283 // enlarge the result array as needed 00284 if(res.size()<_Sessions.size()) 00285 res.resize(_Sessions.size()); 00286 // the number of selected element 00287 uint numSel= 0; 00288 00289 // compute the 2D bbox 00290 CVector minp= bbox.getMin() - _GridPos; 00291 CVector maxp= bbox.getMax() - _GridPos; 00292 sint xmin= (sint)floorf(minp.x*_GridScale.x); 00293 sint ymin= (sint)floorf(minp.y*_GridScale.y); 00294 sint xmax= (sint)ceilf(maxp.x*_GridScale.x); 00295 sint ymax= (sint)ceilf(maxp.y*_GridScale.y); 00296 clamp(xmin, 0, (sint)_GridSize-1); 00297 clamp(ymin, 0, (sint)_GridSize-1); 00298 clamp(xmax, 0, (sint)_GridSize); 00299 clamp(ymax, 0, (sint)_GridSize); 00300 00301 // for each case touched, increment NumElts 00302 for(uint y=ymin;y<(uint)ymax;y++) 00303 { 00304 for(uint x=xmin;x<(uint)xmax;x++) 00305 { 00306 CCase &gcase= _Grid[(y<<_GridSizePower)+x]; 00307 // for each element in this case 00308 for(uint i= gcase.Start;i<gcase.Start + gcase.NumElts;i++) 00309 { 00310 uint elt= _GridData[i]; 00311 00312 // if not alread inserted in the dest 00313 if(_Sessions[elt]!=_ItSession) 00314 { 00315 // mark as intersected 00316 _Sessions[elt]= _ItSession; 00317 // append 00318 res[numSel++]= elt; 00319 } 00320 } 00321 } 00322 } 00323 00324 // return the number of selected elements 00325 return numSel; 00326 } |
|
Definition at line 172 of file visual_collision_manager.h. |
|
Definition at line 168 of file visual_collision_manager.h. |
|
Definition at line 170 of file visual_collision_manager.h. |
|
Definition at line 173 of file visual_collision_manager.h. |
|
Definition at line 165 of file visual_collision_manager.h. |
|
Definition at line 166 of file visual_collision_manager.h. |
|
Definition at line 164 of file visual_collision_manager.h. |
|
Definition at line 163 of file visual_collision_manager.h. |
|
Definition at line 176 of file visual_collision_manager.h. |
|
Definition at line 178 of file visual_collision_manager.h. |