#include <landscape_collision_grid.h>
Nevrax France
Definition at line 55 of file landscape_collision_grid.h.
Public Member Functions | |
| void | build (const std::vector< CPatchQuadBlock * > &quadBlocks, const CVector &delta) |
| CLandscapeCollisionGrid (CVisualCollisionManager *owner) | |
| Constructor. | |
| void | clear () |
| clear the chainlist in the quadgrid. | |
| CVisualTileDescNode * | select (const NLMISC::CVector &pos) |
| select one entry in the chainQuad. pos is a position in World. | |
| ~CLandscapeCollisionGrid () | |
Private Member Functions | |
| void | addQuadToGrid (uint16 paBlockId, uint16 quadId, sint minx, sint maxx, sint miny, sint maxy) |
Private Attributes | |
| bool | _Cleared |
| Array of list of CVisualTileDescNode. | |
| CVector | _Delta |
| CVisualTileDescNode * | _Grid [32 *32] |
| CVisualCollisionManager * | _Owner |
| uint | _SizePower |
|
|
Constructor.
Definition at line 40 of file landscape_collision_grid.cpp. References _Cleared, _Grid, _SizePower, NLMISC::getPowerOf2(), NLMISC::isPowerOf2(), NL_COLGRID_SIZE, and nlassert.
00041 {
00042 _Owner= owner;
00043 // reset list to NULL.
00044 memset(_Grid, 0, NL_COLGRID_SIZE*NL_COLGRID_SIZE * sizeof(CVisualTileDescNode*));
00045 _Cleared= true;
00046
00047 // sizepower.
00048 nlassert(isPowerOf2(NL_COLGRID_SIZE));
00049 _SizePower= getPowerOf2(NL_COLGRID_SIZE);
00050 }
|
|
|
Definition at line 53 of file landscape_collision_grid.cpp. References clear().
00054 {
00055 clear();
00056 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 213 of file landscape_collision_grid.cpp. References _Grid, _SizePower, NL3D::CVisualCollisionManager::newVisualTileDescNode(), NL3D::CVisualTileDescNode::Next, NL_COLGRID_SIZE, nlassert, NL3D::CVisualTileDescNode::PatchQuadBlocId, NL3D::CVisualTileDescNode::QuadId, sint, uint16, x, and y. Referenced by build().
00214 {
00215 // coordinate should be positive.
00216 nlassert(x0>=0 && x1>=x0);
00217 nlassert(y0>=0 && y1>=y0);
00218
00219 // first, transform coordinate (in meters) in quadgrid eltSize (ie 2 meters).
00220 x0= (x0>>1); // floor().
00221 x1= (x1>>1) + 1; // equivalent of ceil().
00222 y0= (y0>>1); // floor().
00223 y1= (y1>>1) + 1; // equivalent of ceil().
00224
00225 // setup bounds in quadgrid coordinate.
00226 if(x1-x0>=NL_COLGRID_SIZE)
00227 x0=0, x1= NL_COLGRID_SIZE;
00228 else
00229 {
00230 x0&= NL_COLGRID_SIZE-1;
00231 x1&= NL_COLGRID_SIZE-1;
00232 if(x1<=x0)
00233 x1+=NL_COLGRID_SIZE;
00234 }
00235 if(y1-y0>=NL_COLGRID_SIZE)
00236 y0=0, y1= NL_COLGRID_SIZE;
00237 else
00238 {
00239 y0&= NL_COLGRID_SIZE-1;
00240 y1&= NL_COLGRID_SIZE-1;
00241 if(y1<=y0)
00242 y1+=NL_COLGRID_SIZE;
00243 }
00244
00245 // fill all cases with element.
00246 sint x,y;
00247 for(y= y0;y<y1;y++)
00248 {
00249 sint xe,ye;
00250 ye= y &(NL_COLGRID_SIZE-1);
00251 for(x= x0;x<x1;x++)
00252 {
00253 xe= x &(NL_COLGRID_SIZE-1);
00254 // which case we add the element.
00255 sint gridId= (ye<<_SizePower)+xe;
00256
00257 // allocate element.
00258 CVisualTileDescNode *elt= _Owner->newVisualTileDescNode();
00259
00260 // fill elt.
00261 elt->PatchQuadBlocId= paBlockId;
00262 elt->QuadId= quadId;
00263
00264 // bind elt to the list.
00265 elt->Next= _Grid[gridId];
00266 _Grid[gridId]= elt;
00267 }
00268 }
00269 }
|
|
||||||||||||
|
Build the quadgrid with a array of patchblock. delta is the vector to apply to tiles coordinate, before insertion in the quadgrid (for precision consideration). Definition at line 147 of file landscape_collision_grid.cpp. References _Cleared, _Delta, addQuadToGrid(), clear(), NL3D::fastFloor(), NL3D::fastFloorBegin(), NL3D::fastFloorEnd(), min, NL_PATCH_BLOCK_MAX_QUAD, NL_PATCH_BLOCK_MAX_VERTEX, NL3D::CPatchQuadBlock::PatchBlockId, NL3D::CPatchBlockIdent::S0, NL3D::CPatchBlockIdent::S1, sint, NL3D::CPatchBlockIdent::T0, NL3D::CPatchBlockIdent::T1, NL3D::CPatchQuadBlock::Vertices, NLMISC::CVector::x, NL3D::CVector2i::x, x, NLMISC::CVector::y, NL3D::CVector2i::y, and y. Referenced by NL3D::CVisualCollisionEntity::doComputeLandscape().
00148 {
00149 sint x,y;
00150 static CVector2i floorVals[NL_PATCH_BLOCK_MAX_VERTEX*NL_PATCH_BLOCK_MAX_VERTEX];
00151
00152 // first clear
00153 clear();
00154
00155 // init for fast floor.
00156 fastFloorBegin();
00157
00158 // then fill.
00159 _Cleared= false;
00160 _Delta= delta;
00161 // parse all quad blocks.
00162 for(sint i=0; i<(sint)quadBlocks.size();i++)
00163 {
00164 CPatchQuadBlock &qb= *quadBlocks[i];
00165 sint lenS= qb.PatchBlockId.S1 - qb.PatchBlockId.S0;
00166 sint lenT= qb.PatchBlockId.T1 - qb.PatchBlockId.T0;
00167
00168 // First, floor all vertices of interest.
00169 for(y=0; y<lenT+1; y++)
00170 {
00171 for(x=0; x<lenS+1; x++)
00172 {
00173 sint id= y*NL_PATCH_BLOCK_MAX_VERTEX + x;
00174 // Add delta, and floor to sint.
00175 floorVals[id].x= fastFloor(qb.Vertices[id].x + delta.x);
00176 floorVals[id].y= fastFloor(qb.Vertices[id].y + delta.y);
00177 }
00178 }
00179
00180 // Then compute min max for all quads, and insert quad id in the quadGrid.
00181 for(y=0; y<lenT; y++)
00182 {
00183 for(x=0; x<lenS; x++)
00184 {
00185 sint minx, maxx, miny, maxy;
00186 sint id= y*NL_PATCH_BLOCK_MAX_VERTEX + x;
00187 // Compute min max of the 4 vertices.
00188 minx= floorVals[id].x; maxx= floorVals[id].x;
00189 miny= floorVals[id].y; maxy= floorVals[id].y;
00190 id++;
00191 minx= min(minx, floorVals[id].x); maxx= max(maxx, floorVals[id].x);
00192 miny= min(miny, floorVals[id].y); maxy= max(maxy, floorVals[id].y);
00193 id+= NL_PATCH_BLOCK_MAX_VERTEX;
00194 minx= min(minx, floorVals[id].x); maxx= max(maxx, floorVals[id].x);
00195 miny= min(miny, floorVals[id].y); maxy= max(maxy, floorVals[id].y);
00196 id--;
00197 minx= min(minx, floorVals[id].x); maxx= max(maxx, floorVals[id].x);
00198 miny= min(miny, floorVals[id].y); maxy= max(maxy, floorVals[id].y);
00199
00200 // store minmax in the quad.
00201 sint quadId= y*NL_PATCH_BLOCK_MAX_QUAD + x;
00202 addQuadToGrid(i, quadId, minx, maxx, miny, maxy);
00203 }
00204 }
00205 }
00206
00207 // init for fast floor.
00208 fastFloorEnd();
00209 }
|
|
|
clear the chainlist in the quadgrid.
Definition at line 59 of file landscape_collision_grid.cpp. References _Cleared, _Grid, NL3D::CVisualCollisionManager::deleteVisualTileDescNode(), NL3D::CVisualTileDescNode::Next, NL_COLGRID_SIZE, and sint. Referenced by build(), ~CLandscapeCollisionGrid(), and NL3D::CVisualCollisionEntity::~CVisualCollisionEntity().
00060 {
00061 // already cleared? do nothing.
00062 if(_Cleared)
00063 return;
00064
00065 // Parse all quads.
00066 sint i;
00067 for(i=0;i<NL_COLGRID_SIZE*NL_COLGRID_SIZE;i++)
00068 {
00069 CVisualTileDescNode *ptr, *next;
00070 ptr= _Grid[i];
00071
00072 // delete list of node.
00073 while(ptr)
00074 {
00075 next= ptr->Next;
00076 _Owner->deleteVisualTileDescNode(ptr);
00077 ptr= next;
00078 }
00079
00080 // reset root.
00081 _Grid[i]= NULL;
00082 }
00083
00084 _Cleared= true;
00085 }
|
|
|
select one entry in the chainQuad. pos is a position in World.
Definition at line 273 of file landscape_collision_grid.cpp. References _Delta, _Grid, NL_COLGRID_SIZE, sint, NLMISC::CVector::x, x, NLMISC::CVector::y, and y. Referenced by NL3D::CVisualCollisionEntity::getPatchTriangleUnderUs().
00274 {
00275 // compute pos in the quadgrid.
00276 CVector localPos;
00277 localPos= pos + _Delta;
00278 // cases are 2x2 meters.
00279 localPos/=2;
00280
00281 // floor, bound in quadgrid coordinate.
00282 sint x,y;
00283 x= (sint)floor(localPos.x);
00284 y= (sint)floor(localPos.y);
00285 x&= NL_COLGRID_SIZE-1;
00286 y&= NL_COLGRID_SIZE-1;
00287
00288 return _Grid[y*NL_COLGRID_SIZE+x];
00289 }
|
|
|
Array of list of CVisualTileDescNode.
Definition at line 82 of file landscape_collision_grid.h. Referenced by build(), CLandscapeCollisionGrid(), and clear(). |
|
|
Definition at line 85 of file landscape_collision_grid.h. |
|
|
Definition at line 83 of file landscape_collision_grid.h. Referenced by addQuadToGrid(), CLandscapeCollisionGrid(), clear(), and select(). |
|
|
Definition at line 78 of file landscape_collision_grid.h. |
|
|
Definition at line 84 of file landscape_collision_grid.h. Referenced by addQuadToGrid(), and CLandscapeCollisionGrid(). |
1.3.6