#include <cube_grid.h>
Lionel Berenguier
Nevrax France
Definition at line 52 of file cube_grid.h.
Public Member Functions | |
| CCubeGrid () | |
| void | compile () |
| compile the container, storing in CStaticQuadGrid. | |
| void | create (const CVector ¢er, int nSize) |
| TCell | getSel () |
| void | insert (const NLMISC::CTriangle &tri, const TCell &cell) |
| bool | isEndSel () |
| void | nextSel () |
| void | select (const NLMISC::CVector &v) |
| ~CCubeGrid () | |
Private Types | |
| enum | gridPos { kUp = 0, kDown, kLeft, kRight, kFront, kBack } |
Private Member Functions | |
| void | project (const NLMISC::CTriangle &tri, NLMISC::CPlane pyr[4], NLMISC::CPlane &gridPlane, sint32 nGridNb, const TCell &cell) |
Private Attributes | |
| NLMISC::CVector | _Center |
| bool | _Compiled |
| uint | _CurSel |
| NL3D::CQuadGrid< TCell > | _Grids [6] |
| uint | _NumSels |
| const TCell * | _Selection |
| NL3D::CStaticQuadGrid< TCell > | _StaticGrids [6] |
|
|||||
|
Definition at line 78 of file cube_grid.h.
|
|
|||||||||
|
Definition at line 109 of file cube_grid.h. References NL3D::CCubeGrid< TCell >::_Compiled, NL3D::CCubeGrid< TCell >::_Grids, NL3D::CQuadGrid< TCell >::changeBase(), NLMISC::CMatrix::identity(), NL3D::CCubeGrid< TCell >::kBack, NL3D::CCubeGrid< TCell >::kDown, NL3D::CCubeGrid< TCell >::kFront, NL3D::CCubeGrid< TCell >::kLeft, NL3D::CCubeGrid< TCell >::kRight, and NLMISC::CMatrix::setRot().
00110 {
00111 NLMISC::CMatrix tmp;
00112 NLMISC::CVector I, J, K;
00113
00114 // grids[kUp].changeBase( );
00115 I = NLMISC::CVector( 1, 0, 0 );
00116 J = NLMISC::CVector( 0, -1, 0 );
00117 K = NLMISC::CVector( 0, 0, -1 );
00118 tmp.identity(); tmp.setRot( I, J, K, true );
00119 _Grids[kDown].changeBase( tmp );
00120
00121 I = NLMISC::CVector( 0, 0, 1 );
00122 J = NLMISC::CVector( 0, 1, 0 );
00123 K = NLMISC::CVector( -1, 0, 0 );
00124 tmp.identity(); tmp.setRot( I, J, K, true);
00125 _Grids[kLeft].changeBase( tmp );
00126
00127 I = NLMISC::CVector( 0, 0, -1 );
00128 J = NLMISC::CVector( 0, 1, 0 );
00129 K = NLMISC::CVector( 1, 0, 0 );
00130 tmp.identity(); tmp.setRot( I, J, K, true);
00131 _Grids[kRight].changeBase( tmp );
00132
00133 I = NLMISC::CVector( 1, 0, 0 );
00134 J = NLMISC::CVector( 0, 0, 1 );
00135 K = NLMISC::CVector( 0, -1, 0 );
00136 tmp.identity(); tmp.setRot( I, J, K, true);
00137 _Grids[kFront].changeBase( tmp );
00138
00139 I = NLMISC::CVector( 1, 0, 0 );
00140 J = NLMISC::CVector( 0, 0, -1 );
00141 K = NLMISC::CVector( 0, 1, 0 );
00142 tmp.identity(); tmp.setRot( I, J, K, true);
00143 _Grids[kBack].changeBase( tmp );
00144
00145
00146 _Compiled= false;
00147 }
|
|
|||||||||
|
Definition at line 151 of file cube_grid.h.
00152 {
00153 }
|
|
|||||||||
|
compile the container, storing in CStaticQuadGrid.
Definition at line 229 of file cube_grid.h. References NL3D::CCubeGrid< TCell >::_Compiled, NL3D::CCubeGrid< TCell >::_CurSel, NL3D::CCubeGrid< TCell >::_Grids, NL3D::CCubeGrid< TCell >::_NumSels, NL3D::CCubeGrid< TCell >::_StaticGrids, NL3D::CStaticQuadGrid< TCell >::build(), nlassert, and uint.
00230 {
00231 nlassert(!_Compiled);
00232 // For all Grids.
00233 uint i;
00234 for(i=0; i<6; i++)
00235 {
00236 // build the _StaticGrid
00237 _StaticGrids[i].build(_Grids[i]);
00238 // And reset the grid. contReset is necessary to clean the CBlockMemory.
00239 contReset(_Grids[i]);
00240 }
00241
00242 // done
00243 _Compiled= true;
00244
00245 // Clear the Selection
00246 _Selection= NULL;
00247 _CurSel= 0;
00248 _NumSels= 0;
00249 }
|
|
||||||||||||||||
|
Create the cubeGrid, specifying center of this one, and number of Cells per side. Definition at line 157 of file cube_grid.h. References NL3D::CCubeGrid< TCell >::_Center, NL3D::CCubeGrid< TCell >::_Compiled, NL3D::CCubeGrid< TCell >::_Grids, NL3D::CQuadGrid< TCell >::create(), NL3D::CCubeGrid< TCell >::kBack, NL3D::CCubeGrid< TCell >::kDown, NL3D::CCubeGrid< TCell >::kFront, NL3D::CCubeGrid< TCell >::kLeft, NL3D::CCubeGrid< TCell >::kRight, NL3D::CCubeGrid< TCell >::kUp, and nlassert.
00158 {
00159 nlassert(!_Compiled);
00160 _Center= center;
00161
00162 _Grids[kUp].create ( nSize, 1.0f / ((float)nSize) );
00163 _Grids[kDown].create ( nSize, 1.0f / ((float)nSize) );
00164 _Grids[kLeft].create ( nSize, 1.0f / ((float)nSize) );
00165 _Grids[kRight].create ( nSize, 1.0f / ((float)nSize) );
00166 _Grids[kFront].create ( nSize, 1.0f / ((float)nSize) );
00167 _Grids[kBack].create ( nSize, 1.0f / ((float)nSize) );
00168 }
|
|
|||||||||
|
Definition at line 313 of file cube_grid.h. References NL3D::CCubeGrid< TCell >::_Compiled, NL3D::CCubeGrid< TCell >::_CurSel, and nlassert.
00314 {
00315 nlassert(_Compiled);
00316 return _Selection[_CurSel];
00317 }
|
|
||||||||||||||||
|
Definition at line 172 of file cube_grid.h. References NL3D::CCubeGrid< TCell >::_Center, NL3D::CCubeGrid< TCell >::_Compiled, NL3D::CCubeGrid< TCell >::kBack, NL3D::CCubeGrid< TCell >::kDown, NL3D::CCubeGrid< TCell >::kFront, NL3D::CCubeGrid< TCell >::kLeft, NL3D::CCubeGrid< TCell >::kRight, NL3D::CCubeGrid< TCell >::kUp, NLMISC::CPlane::make(), nlassert, NL3D::CCubeGrid< TCell >::project(), NLMISC::CTriangle::V0, NLMISC::CTriangle::V1, and NLMISC::CTriangle::V2.
00173 {
00174 nlassert(!_Compiled);
00175 // Center triangle on _Center.
00176 NLMISC::CTriangle tri= triIn;
00177 tri.V0-= _Center;
00178 tri.V1-= _Center;
00179 tri.V2-= _Center;
00180
00181 NLMISC::CPlane p[4], gp;
00182 // Construct clip pyramid for grid : UP
00183 p[0].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,-1,+1 ), NLMISC::CVector( +1,-1,+1 ) );
00184 p[1].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,-1,+1 ), NLMISC::CVector( +1,+1,+1 ) );
00185 p[2].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,+1,+1 ), NLMISC::CVector( -1,+1,+1 ) );
00186 p[3].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,+1,+1 ), NLMISC::CVector( -1,-1,+1 ) );
00187 gp.make( NLMISC::CVector(0,0,1), NLMISC::CVector(0,0,0.5) );
00188 project( tri, p, gp, kUp, cell );
00189 // Construct clip pyramid for grid : DOWN
00190 p[0].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,-1,-1 ), NLMISC::CVector( -1,-1,-1 ) );
00191 p[1].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,-1,-1 ), NLMISC::CVector( -1,+1,-1 ) );
00192 p[2].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,+1,-1 ), NLMISC::CVector( +1,+1,-1 ) );
00193 p[3].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,+1,-1 ), NLMISC::CVector( +1,-1,-1 ) );
00194 gp.make( NLMISC::CVector(0,0,-1), NLMISC::CVector(0,0,-0.5) );
00195 project( tri, p, gp, kDown, cell );
00196 // Construct clip pyramid for grid : LEFT
00197 p[0].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,-1,-1 ), NLMISC::CVector( -1,-1,+1 ) );
00198 p[1].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,-1,+1 ), NLMISC::CVector( -1,+1,+1 ) );
00199 p[2].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,+1,+1 ), NLMISC::CVector( -1,+1,-1 ) );
00200 p[3].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,+1,-1 ), NLMISC::CVector( -1,-1,-1 ) );
00201 gp.make( NLMISC::CVector(-1,0,0), NLMISC::CVector(-0.5,0,0) );
00202 project( tri, p, gp, kLeft, cell );
00203 // Construct clip pyramid for grid : RIGHT
00204 p[0].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,-1,+1 ), NLMISC::CVector( +1,-1,-1 ) );
00205 p[1].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,-1,-1 ), NLMISC::CVector( +1,+1,-1 ) );
00206 p[2].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,+1,-1 ), NLMISC::CVector( +1,+1,+1 ) );
00207 p[3].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,+1,+1 ), NLMISC::CVector( +1,-1,+1 ) );
00208 gp.make( NLMISC::CVector(1,0,0), NLMISC::CVector(0.5,0,0) );
00209 project( tri, p, gp, kRight, cell );
00210 // Construct clip pyramid for grid : FRONT
00211 p[0].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,-1,-1 ), NLMISC::CVector( +1,-1,-1 ) );
00212 p[1].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,-1,-1 ), NLMISC::CVector( +1,-1,+1 ) );
00213 p[2].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,-1,+1 ), NLMISC::CVector( -1,-1,+1 ) );
00214 p[3].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,-1,+1 ), NLMISC::CVector( -1,-1,-1 ) );
00215 gp.make( NLMISC::CVector(0,-1,0), NLMISC::CVector(0,-0.5,0) );
00216 project( tri, p, gp, kFront, cell );
00217 // Construct clip pyramid for grid : BACK
00218 p[0].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,+1,+1 ), NLMISC::CVector( +1,+1,-1 ) );
00219 p[1].make( NLMISC::CVector(0,0,0), NLMISC::CVector( +1,+1,-1 ), NLMISC::CVector( -1,+1,-1 ) );
00220 p[2].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,+1,-1 ), NLMISC::CVector( -1,+1,+1 ) );
00221 p[3].make( NLMISC::CVector(0,0,0), NLMISC::CVector( -1,+1,+1 ), NLMISC::CVector( +1,+1,+1 ) );
00222 gp.make( NLMISC::CVector(0,1,0), NLMISC::CVector(0,0.5,0) );
00223 project( tri, p, gp, kBack, cell );
00224 }
|
|
|||||||||
|
Definition at line 329 of file cube_grid.h. References NL3D::CCubeGrid< TCell >::_Compiled, NL3D::CCubeGrid< TCell >::_CurSel, NL3D::CCubeGrid< TCell >::_NumSels, and nlassert.
|
|
|||||||||
|
Definition at line 321 of file cube_grid.h. References NL3D::CCubeGrid< TCell >::_Compiled, NL3D::CCubeGrid< TCell >::_CurSel, and nlassert.
|
|
||||||||||||||||||||||||||||
|
Definition at line 337 of file cube_grid.h. References NL3D::CCubeGrid< TCell >::_Grids, NLMISC::CPlane::clipPolygonFront(), NL3D::CQuadGrid< TCell >::insert(), NLMISC::CPlane::intersect(), sint32, NLMISC::CTriangle::V0, NLMISC::CTriangle::V1, NLMISC::CTriangle::V2, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by NL3D::CCubeGrid< TCell >::insert().
00338 {
00339 NLMISC::CVector vIn[7], vOut[7];
00340 sint32 i, nOut;
00341 vIn[0] = tri.V0; vIn[1] = tri.V1; vIn[2] = tri.V2;
00342 nOut = pyr[0].clipPolygonFront( vIn, vOut, 3 );
00343 if( nOut == 0 ) return;
00344 for( i = 0; i < nOut; ++i ) vIn[i] = vOut[i];
00345 nOut = pyr[1].clipPolygonFront( vIn, vOut, nOut );
00346 if( nOut == 0 ) return;
00347 for( i = 0; i < nOut; ++i ) vIn[i] = vOut[i];
00348 nOut = pyr[2].clipPolygonFront( vIn, vOut, nOut );
00349 if( nOut == 0 ) return;
00350 for( i = 0; i < nOut; ++i ) vIn[i] = vOut[i];
00351 nOut = pyr[3].clipPolygonFront( vIn, vOut, nOut );
00352 if( nOut >= 3 )
00353 {
00354 NLMISC::CVector vMin(1, 1, 1), vMax(-1, -1, -1);
00355 for( i = 0; i < nOut; ++i )
00356 {
00357 vOut[i] = gridPlane.intersect( NLMISC::CVector(0, 0, 0), vOut[i] );
00358 if( vMin.x > vOut[i].x ) vMin.x = vOut[i].x;
00359 if( vMin.y > vOut[i].y ) vMin.y = vOut[i].y;
00360 if( vMin.z > vOut[i].z ) vMin.z = vOut[i].z;
00361 if( vMax.x < vOut[i].x ) vMax.x = vOut[i].x;
00362 if( vMax.y < vOut[i].y ) vMax.y = vOut[i].y;
00363 if( vMax.z < vOut[i].z ) vMax.z = vOut[i].z;
00364 }
00365 // Create the bbox
00366 _Grids[nGridNb].insert( vMin, vMax, cell );
00367 }
00368 }
|
|
||||||||||
|
Definition at line 253 of file cube_grid.h. References NL3D::CCubeGrid< TCell >::_Center, NL3D::CCubeGrid< TCell >::_Compiled, NL3D::CCubeGrid< TCell >::_CurSel, NL3D::CCubeGrid< TCell >::_NumSels, NL3D::CCubeGrid< TCell >::_StaticGrids, NLMISC::CPlane::intersect(), NL3D::CCubeGrid< TCell >::kBack, NL3D::CCubeGrid< TCell >::kDown, NL3D::CCubeGrid< TCell >::kFront, NL3D::CCubeGrid< TCell >::kLeft, NL3D::CCubeGrid< TCell >::kRight, NL3D::CCubeGrid< TCell >::kUp, NLMISC::CPlane::make(), nlassert, NL3D::CStaticQuadGrid< TCell >::select(), sint, and v.
00254 {
00255 nlassert(_Compiled);
00256 // Center triangle on _Center.
00257 NLMISC::CVector v= vIn-_Center;
00258
00259
00260 sint nSelGrid= -1;
00261 NLMISC::CPlane gp;
00262 // Get the plane
00263 if( ( -v.z <= v.x ) && ( v.x <= v.z ) &&
00264 ( -v.z <= v.y ) && ( v.y <= v.z ) &&
00265 ( 0.0f <= v.z ) )
00266 {
00267 nSelGrid = kUp;
00268 gp.make( NLMISC::CVector(0,0,1), NLMISC::CVector(0,0,0.5) );
00269 }
00270 if( ( v.z <= v.x ) && ( v.x <= -v.z ) &&
00271 ( v.z <= v.y ) && ( v.y <= -v.z ) &&
00272 ( v.z <= 0.0f ) )
00273 {
00274 nSelGrid = kDown;
00275 gp.make( NLMISC::CVector(0,0,-1), NLMISC::CVector(0,0,-0.5) );
00276 }
00277 if( ( v.x <= 0.0f ) &&
00278 ( v.x <= v.y ) && ( v.y <= -v.x ) &&
00279 ( v.x <= v.z ) && ( v.z <= -v.x ) )
00280 {
00281 nSelGrid = kLeft;
00282 gp.make( NLMISC::CVector(-1,0,0), NLMISC::CVector(-0.5,0,0) );
00283 }
00284 if( ( 0.0f <= v.x ) &&
00285 ( -v.x <= v.y ) && ( v.y <= v.x ) &&
00286 ( -v.x <= v.z ) && ( v.z <= v.x ) )
00287 {
00288 nSelGrid = kRight;
00289 gp.make( NLMISC::CVector(1,0,0), NLMISC::CVector(0.5,0,0) );
00290 }
00291 if( ( v.y <= v.x ) && ( v.x <= -v.y ) &&
00292 ( v.y <= 0.0f ) &&
00293 ( v.y <= v.z ) && ( v.z <= -v.y ) )
00294 {
00295 nSelGrid = kFront;
00296 gp.make( NLMISC::CVector(0,-1,0), NLMISC::CVector(0,-0.5,0) );
00297 }
00298 if( ( -v.y <= v.x ) && ( v.x <= v.y ) &&
00299 ( 0.0f <= v.y ) &&
00300 ( -v.y <= v.z ) && ( v.z <= v.y ) )
00301 {
00302 nSelGrid = kBack;
00303 gp.make( NLMISC::CVector(0,1,0), NLMISC::CVector(0,0.5,0) );
00304 }
00305 nlassert(nSelGrid!=-1);
00306 NLMISC::CVector newV = gp.intersect( NLMISC::CVector(0,0,0), v );
00307 _Selection= _StaticGrids[nSelGrid].select(newV, _NumSels);
00308 _CurSel = 0;
00309 }
|
|
|||||
|
Definition at line 76 of file cube_grid.h. Referenced by NL3D::CCubeGrid< TCell >::create(), NL3D::CCubeGrid< TCell >::insert(), and NL3D::CCubeGrid< TCell >::select(). |
|
|||||
|
|||||
|
Definition at line 89 of file cube_grid.h. Referenced by NL3D::CCubeGrid< TCell >::compile(), NL3D::CCubeGrid< TCell >::getSel(), NL3D::CCubeGrid< TCell >::isEndSel(), NL3D::CCubeGrid< TCell >::nextSel(), and NL3D::CCubeGrid< TCell >::select(). |
|
|||||
|
Definition at line 80 of file cube_grid.h. Referenced by NL3D::CCubeGrid< TCell >::CCubeGrid(), NL3D::CCubeGrid< TCell >::compile(), NL3D::CCubeGrid< TCell >::create(), and NL3D::CCubeGrid< TCell >::project(). |
|
|||||
|
Definition at line 90 of file cube_grid.h. Referenced by NL3D::CCubeGrid< TCell >::compile(), NL3D::CCubeGrid< TCell >::isEndSel(), and NL3D::CCubeGrid< TCell >::select(). |
|
|||||
|
Definition at line 88 of file cube_grid.h. |
|
|||||
|
Definition at line 82 of file cube_grid.h. Referenced by NL3D::CCubeGrid< TCell >::compile(), and NL3D::CCubeGrid< TCell >::select(). |
1.3.6