Moved pointers from dtMeshHeader to dtMeshTile, allows mixing build/use 32/64 bit builds. Bumbed Detour version number.

This commit is contained in:
Mikko Mononen 2010-03-02 09:24:24 +00:00
parent b50aecfa51
commit 359f15b11c
8 changed files with 708 additions and 348 deletions

View File

@ -37,7 +37,7 @@ static float distancePtLine2d(const float* pt, const float* p, const float* q)
return dx*dx + dz*dz;
}
static void drawPolyBoundaries(duDebugDraw* dd, const dtMeshHeader* header,
static void drawPolyBoundaries(duDebugDraw* dd, const dtMeshTile* tile,
const unsigned int col, const float linew,
bool inner)
{
@ -45,13 +45,13 @@ static void drawPolyBoundaries(duDebugDraw* dd, const dtMeshHeader* header,
dd->begin(DU_DRAW_LINES, linew);
for (int i = 0; i < header->polyCount; ++i)
for (int i = 0; i < tile->header->polyCount; ++i)
{
const dtPoly* p = &header->polys[i];
const dtPoly* p = &tile->polys[i];
if (p->type == DT_POLYTYPE_OFFMESH_CONNECTION) continue;
const dtPolyDetail* pd = &header->detailMeshes[i];
const dtPolyDetail* pd = &tile->detailMeshes[i];
for (int j = 0, nj = (int)p->vertCount; j < nj; ++j)
{
@ -62,9 +62,9 @@ static void drawPolyBoundaries(duDebugDraw* dd, const dtMeshHeader* header,
if (p->neis[j] & DT_EXT_LINK)
{
bool con = false;
for (unsigned int k = p->firstLink; k != DT_NULL_LINK; k = header->links[k].next)
for (unsigned int k = p->firstLink; k != DT_NULL_LINK; k = tile->links[k].next)
{
if (header->links[k].edge == j)
if (tile->links[k].edge == j)
{
con = true;
break;
@ -83,21 +83,21 @@ static void drawPolyBoundaries(duDebugDraw* dd, const dtMeshHeader* header,
if (p->neis[j] != 0) continue;
}
const float* v0 = &header->verts[p->verts[j]*3];
const float* v1 = &header->verts[p->verts[(j+1) % nj]*3];
const float* v0 = &tile->verts[p->verts[j]*3];
const float* v1 = &tile->verts[p->verts[(j+1) % nj]*3];
// Draw detail mesh edges which align with the actual poly edge.
// This is really slow.
for (int k = 0; k < pd->triCount; ++k)
{
const unsigned char* t = &header->detailTris[(pd->triBase+k)*4];
const unsigned char* t = &tile->detailTris[(pd->triBase+k)*4];
const float* tv[3];
for (int m = 0; m < 3; ++m)
{
if (t[m] < p->vertCount)
tv[m] = &header->verts[p->verts[t[m]]*3];
tv[m] = &tile->verts[p->verts[t[m]]*3];
else
tv[m] = &header->detailVerts[(pd->vertBase+(t[m]-p->vertCount))*3];
tv[m] = &tile->detailVerts[(pd->vertBase+(t[m]-p->vertCount))*3];
}
for (int m = 0, n = 2; m < 3; n=m++)
{
@ -117,19 +117,18 @@ static void drawPolyBoundaries(duDebugDraw* dd, const dtMeshHeader* header,
static void drawMeshTile(duDebugDraw* dd, const dtNavMesh* mesh, const dtMeshTile* tile, unsigned char flags)
{
const dtMeshHeader* header = tile->header;
dtPolyRef base = mesh->getTileId(tile);
dd->depthMask(false);
dd->begin(DU_DRAW_TRIS);
for (int i = 0; i < header->polyCount; ++i)
for (int i = 0; i < tile->header->polyCount; ++i)
{
const dtPoly* p = &header->polys[i];
const dtPoly* p = &tile->polys[i];
if (p->type == DT_POLYTYPE_OFFMESH_CONNECTION) // Skip off-mesh links.
continue;
const dtPolyDetail* pd = &header->detailMeshes[i];
const dtPolyDetail* pd = &tile->detailMeshes[i];
unsigned int col;
if ((flags & DU_DRAWNAVMESH_CLOSEDLIST) && mesh->isInClosedList(base | (dtPolyRef)i))
@ -144,30 +143,30 @@ static void drawMeshTile(duDebugDraw* dd, const dtNavMesh* mesh, const dtMeshTil
for (int j = 0; j < pd->triCount; ++j)
{
const unsigned char* t = &header->detailTris[(pd->triBase+j)*4];
const unsigned char* t = &tile->detailTris[(pd->triBase+j)*4];
for (int k = 0; k < 3; ++k)
{
if (t[k] < p->vertCount)
dd->vertex(&header->verts[p->verts[t[k]]*3], col);
dd->vertex(&tile->verts[p->verts[t[k]]*3], col);
else
dd->vertex(&header->detailVerts[(pd->vertBase+t[k]-p->vertCount)*3], col);
dd->vertex(&tile->detailVerts[(pd->vertBase+t[k]-p->vertCount)*3], col);
}
}
}
dd->end();
// Draw inter poly boundaries
drawPolyBoundaries(dd, header, duRGBA(0,48,64,32), 1.5f, true);
drawPolyBoundaries(dd, tile, duRGBA(0,48,64,32), 1.5f, true);
// Draw outer poly boundaries
drawPolyBoundaries(dd, header, duRGBA(0,48,64,220), 2.5f, false);
drawPolyBoundaries(dd, tile, duRGBA(0,48,64,220), 2.5f, false);
if (flags & DU_DRAWNAVMESH_OFFMESHCONS)
{
dd->begin(DU_DRAW_LINES, 2.0f);
for (int i = 0; i < header->polyCount; ++i)
for (int i = 0; i < tile->header->polyCount; ++i)
{
const dtPoly* p = &header->polys[i];
const dtPoly* p = &tile->polys[i];
if (p->type != DT_POLYTYPE_OFFMESH_CONNECTION) // Skip regular polys.
continue;
@ -177,18 +176,18 @@ static void drawMeshTile(duDebugDraw* dd, const dtNavMesh* mesh, const dtMeshTil
else
col = duDarkenColor(duIntToCol(p->area, 220));
const dtOffMeshConnection* con = &header->offMeshCons[i - header->offMeshBase];
const float* va = &header->verts[p->verts[0]*3];
const float* vb = &header->verts[p->verts[1]*3];
const dtOffMeshConnection* con = &tile->offMeshCons[i - tile->header->offMeshBase];
const float* va = &tile->verts[p->verts[0]*3];
const float* vb = &tile->verts[p->verts[1]*3];
// Check to see if start and end end-points have links.
bool startSet = false;
bool endSet = false;
for (unsigned int k = p->firstLink; k != DT_NULL_LINK; k = header->links[k].next)
for (unsigned int k = p->firstLink; k != DT_NULL_LINK; k = tile->links[k].next)
{
if (header->links[k].edge == 0)
if (tile->links[k].edge == 0)
startSet = true;
if (header->links[k].edge == 1)
if (tile->links[k].edge == 1)
endSet = true;
}
@ -223,9 +222,9 @@ static void drawMeshTile(duDebugDraw* dd, const dtNavMesh* mesh, const dtMeshTil
const unsigned int vcol = duRGBA(0,0,0,196);
dd->begin(DU_DRAW_POINTS, 3.0f);
for (int i = 0; i < header->vertCount; ++i)
for (int i = 0; i < tile->header->vertCount; ++i)
{
const float* v = &header->verts[i*3];
const float* v = &tile->verts[i*3];
dd->vertex(v[0], v[1], v[2], vcol);
}
dd->end();
@ -330,22 +329,20 @@ void duDebugDrawNavMesh(duDebugDraw* dd, const dtNavMesh* mesh, unsigned char fl
static void drawMeshTileBVTree(duDebugDraw* dd, const dtNavMesh* mesh, const dtMeshTile* tile)
{
const dtMeshHeader* header = tile->header;
// Draw BV nodes.
const float cs = 1.0f / header->bvQuantFactor;
const float cs = 1.0f / tile->header->bvQuantFactor;
dd->begin(DU_DRAW_LINES, 1.0f);
for (int i = 0; i < header->bvNodeCount; ++i)
for (int i = 0; i < tile->header->bvNodeCount; ++i)
{
const dtBVNode* n = &header->bvTree[i];
const dtBVNode* n = &tile->bvTree[i];
if (n->i < 0) // Leaf indices are positive.
continue;
duAppendBoxWire(dd, header->bmin[0] + n->bmin[0]*cs,
header->bmin[1] + n->bmin[1]*cs,
header->bmin[2] + n->bmin[2]*cs,
header->bmin[0] + n->bmax[0]*cs,
header->bmin[1] + n->bmax[1]*cs,
header->bmin[2] + n->bmax[2]*cs,
duAppendBoxWire(dd, tile->header->bmin[0] + n->bmin[0]*cs,
tile->header->bmin[1] + n->bmin[1]*cs,
tile->header->bmin[2] + n->bmin[2]*cs,
tile->header->bmin[0] + n->bmax[0]*cs,
tile->header->bmin[1] + n->bmax[1]*cs,
tile->header->bmin[2] + n->bmax[2]*cs,
duRGBA(255,255,255,128));
}
dd->end();
@ -450,8 +447,7 @@ void duDebugDrawNavMeshPoly(duDebugDraw* dd, const dtNavMesh* mesh, dtPolyRef re
const dtMeshTile* tile = mesh->getTileByRef(ref, &ip);
if (!tile)
return;
const dtMeshHeader* header = tile->header;
const dtPoly* p = &header->polys[ip];
const dtPoly* p = &tile->polys[ip];
dd->depthMask(false);
@ -459,7 +455,7 @@ void duDebugDrawNavMeshPoly(duDebugDraw* dd, const dtNavMesh* mesh, dtPolyRef re
if (p->type == DT_POLYTYPE_OFFMESH_CONNECTION)
{
dtOffMeshConnection* con = &header->offMeshCons[ip - header->offMeshBase];
dtOffMeshConnection* con = &tile->offMeshCons[ip - tile->header->offMeshBase];
dd->begin(DU_DRAW_LINES, 2.0f);
@ -472,18 +468,18 @@ void duDebugDrawNavMeshPoly(duDebugDraw* dd, const dtNavMesh* mesh, dtPolyRef re
}
else
{
const dtPolyDetail* pd = &header->detailMeshes[ip];
const dtPolyDetail* pd = &tile->detailMeshes[ip];
dd->begin(DU_DRAW_TRIS);
for (int i = 0; i < pd->triCount; ++i)
{
const unsigned char* t = &header->detailTris[(pd->triBase+i)*4];
const unsigned char* t = &tile->detailTris[(pd->triBase+i)*4];
for (int j = 0; j < 3; ++j)
{
if (t[j] < p->vertCount)
dd->vertex(&header->verts[p->verts[t[j]]*3], c);
dd->vertex(&tile->verts[p->verts[t[j]]*3], c);
else
dd->vertex(&header->detailVerts[(pd->vertBase+t[j]-p->vertCount)*3], c);
dd->vertex(&tile->detailVerts[(pd->vertBase+t[j]-p->vertCount)*3], c);
}
}
dd->end();

View File

@ -26,7 +26,7 @@ typedef unsigned int dtPolyRef;
static const int DT_VERTS_PER_POLYGON = 6;
static const int DT_NAVMESH_MAGIC = 'D'<<24 | 'N'<<16 | 'A'<<8 | 'V'; //'DNAV';
static const int DT_NAVMESH_VERSION = 2;
static const int DT_NAVMESH_VERSION = 3;
static const unsigned short DT_EXT_LINK = 0x8000;
static const unsigned int DT_NULL_LINK = 0xffffffff;
@ -106,7 +106,6 @@ struct dtMeshHeader
{
int magic; // Magic number, used to identify the data.
int version; // Data version number.
int polyCount; // Number of polygons in the tile.
int vertCount; // Number of vertices in the tile.
int maxLinkCount; // Number of allocated links.
@ -116,12 +115,20 @@ struct dtMeshHeader
int bvNodeCount; // Number of BVtree nodes.
int offMeshConCount; // Number of Off-Mesh links.
int offMeshBase; // Index to first polygon which is Off-Mesh link.
unsigned int linksFreeList; // Index to next free link.
float walkableHeight; // Height of the agent.
float walkableRadius; // Radius of the agent
float walkableClimb; // Max climb height of the agent.
float bmin[3], bmax[3]; // Bounding box of the tile.
float bvQuantFactor; // BVtree quantization factor (world to bvnode coords)
};
struct dtMeshTile
{
unsigned int salt; // Counter describing modifications to the tile.
int x,y; // Grid location of the tile.
unsigned int linksFreeList; // Index to next free link.
dtMeshHeader* header; // Pointer to tile header.
dtPoly* polys; // Pointer to the polygons (will be updated when tile is added).
float* verts; // Pointer to the vertices (will be updated when tile added).
dtLink* links; // Pointer to the links (will be updated when tile added).
@ -130,13 +137,7 @@ struct dtMeshHeader
unsigned char* detailTris; // Pointer to detail triangles (will be updated when tile added).
dtBVNode* bvTree; // Pointer to BVtree nodes (will be updated when tile added).
dtOffMeshConnection* offMeshCons; // Pointer to Off-Mesh links. (will be updated when tile added).
};
struct dtMeshTile
{
unsigned int salt; // Counter describing modifications to the tile.
int x,y; // Grid location of the tile.
dtMeshHeader* header; // Pointer to tile header.
unsigned char* data; // Pointer to tile data.
int dataSize; // Size of the tile data.
bool ownsData; // Flag indicating of the navmesh should release the data.
@ -383,13 +384,13 @@ public:
void setPolyFlags(dtPolyRef ref, unsigned short flags);
// Return polygon flags.
unsigned short getPolyFlags(dtPolyRef ref);
unsigned short getPolyFlags(dtPolyRef ref) const;
// Set polygon type.
void setPolyArea(dtPolyRef ref, unsigned char area);
// Return polygon type.
unsigned char getPolyArea(dtPolyRef ref);
unsigned char getPolyArea(dtPolyRef ref) const;
// Returns pointer to a polygon based on ref.
const dtPoly* getPolyByRef(dtPolyRef ref) const;
@ -463,14 +464,14 @@ private:
// Returns portal points between two polygons.
bool getPortalPoints(dtPolyRef from, dtPolyRef to, float* left, float* right,
unsigned char& fromType, unsigned char& toType) const;
bool getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dtMeshHeader* fromHeader,
dtPolyRef to, const dtPoly* toPoly, const dtMeshHeader* toHeader,
bool getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dtMeshTile* fromTile,
dtPolyRef to, const dtPoly* toPoly, const dtMeshTile* toTile,
float* left, float* right) const;
// Returns edge mid point between two polygons.
bool getEdgeMidPoint(dtPolyRef from, dtPolyRef to, float* mid) const;
bool getEdgeMidPoint(dtPolyRef from, const dtPoly* fromPoly, const dtMeshHeader* fromHeader,
dtPolyRef to, const dtPoly* toPoly, const dtMeshHeader* toHeader,
bool getEdgeMidPoint(dtPolyRef from, const dtPoly* fromPoly, const dtMeshTile* fromTile,
dtPolyRef to, const dtPoly* toPoly, const dtMeshTile* toTile,
float* mid) const;
float m_orig[3]; // Origin of the tile (0,0)

View File

@ -76,17 +76,17 @@ inline int computeTileHash(int x, int y, const int mask)
inline unsigned int allocLink(dtMeshTile* tile)
{
if (tile->header->linksFreeList == DT_NULL_LINK)
if (tile->linksFreeList == DT_NULL_LINK)
return DT_NULL_LINK;
unsigned int link = tile->header->linksFreeList;
tile->header->linksFreeList = tile->header->links[link].next;
unsigned int link = tile->linksFreeList;
tile->linksFreeList = tile->links[link].next;
return link;
}
inline void freeLink(dtMeshTile* tile, unsigned int link)
{
tile->header->links[link].next = tile->header->linksFreeList;
tile->header->linksFreeList = link;
tile->links[link].next = tile->linksFreeList;
tile->linksFreeList = link;
}
@ -213,10 +213,9 @@ int dtNavMesh::findConnectingPolys(const float* va, const float* vb,
dtPolyRef* con, float* conarea, int maxcon)
{
if (!tile) return 0;
dtMeshHeader* h = tile->header;
float amin[2], amax[2];
calcRect(va,vb, amin,amax, side, 0.01f, h->walkableClimb);
calcRect(va,vb, amin,amax, side, 0.01f, tile->header->walkableClimb);
// Remove links pointing to 'side' and compact the links array.
float bmin[2], bmax[2];
@ -225,18 +224,18 @@ int dtNavMesh::findConnectingPolys(const float* va, const float* vb,
dtPolyRef base = getTileId(tile);
for (int i = 0; i < h->polyCount; ++i)
for (int i = 0; i < tile->header->polyCount; ++i)
{
dtPoly* poly = &h->polys[i];
dtPoly* poly = &tile->polys[i];
const int nv = poly->vertCount;
for (int j = 0; j < nv; ++j)
{
// Skip edges which do not point to the right side.
if (poly->neis[j] != m) continue;
// Check if the segments touch.
const float* vc = &h->verts[poly->verts[j]*3];
const float* vd = &h->verts[poly->verts[(j+1) % nv]*3];
calcRect(vc,vd, bmin,bmax, side, 0.01f, h->walkableClimb);
const float* vc = &tile->verts[poly->verts[j]*3];
const float* vd = &tile->verts[poly->verts[(j+1) % nv]*3];
calcRect(vc,vd, bmin,bmax, side, 0.01f, tile->header->walkableClimb);
if (!overlapRects(amin,amax, bmin,bmax)) continue;
// Add return value.
if (n < maxcon)
@ -255,23 +254,22 @@ int dtNavMesh::findConnectingPolys(const float* va, const float* vb,
void dtNavMesh::unconnectExtLinks(dtMeshTile* tile, int side)
{
if (!tile) return;
dtMeshHeader* header = tile->header;
for (int i = 0; i < header->polyCount; ++i)
for (int i = 0; i < tile->header->polyCount; ++i)
{
dtPoly* poly = &header->polys[i];
dtPoly* poly = &tile->polys[i];
unsigned int j = poly->firstLink;
unsigned int pj = DT_NULL_LINK;
while (j != DT_NULL_LINK)
{
if (header->links[j].side == side)
if (tile->links[j].side == side)
{
// Revove link.
unsigned int nj = header->links[j].next;
unsigned int nj = tile->links[j].next;
if (pj == DT_NULL_LINK)
poly->firstLink = nj;
else
header->links[pj].next = nj;
tile->links[pj].next = nj;
freeLink(tile, j);
j = nj;
}
@ -279,7 +277,7 @@ void dtNavMesh::unconnectExtLinks(dtMeshTile* tile, int side)
{
// Advance
pj = j;
j = header->links[j].next;
j = tile->links[j].next;
}
}
}
@ -288,12 +286,11 @@ void dtNavMesh::unconnectExtLinks(dtMeshTile* tile, int side)
void dtNavMesh::connectExtLinks(dtMeshTile* tile, dtMeshTile* target, int side)
{
if (!tile) return;
dtMeshHeader* header = tile->header;
// Connect border links.
for (int i = 0; i < header->polyCount; ++i)
for (int i = 0; i < tile->header->polyCount; ++i)
{
dtPoly* poly = &header->polys[i];
dtPoly* poly = &tile->polys[i];
// Create new links.
unsigned short m = DT_EXT_LINK | (unsigned short)side;
@ -304,8 +301,8 @@ void dtNavMesh::connectExtLinks(dtMeshTile* tile, dtMeshTile* target, int side)
if (poly->neis[j] != m) continue;
// Create new links
const float* va = &header->verts[poly->verts[j]*3];
const float* vb = &header->verts[poly->verts[(j+1) % nv]*3];
const float* va = &tile->verts[poly->verts[j]*3];
const float* vb = &tile->verts[poly->verts[(j+1) % nv]*3];
dtPolyRef nei[4];
float neia[4*2];
int nnei = findConnectingPolys(va,vb, target, opposite(side), nei,neia,4);
@ -314,7 +311,7 @@ void dtNavMesh::connectExtLinks(dtMeshTile* tile, dtMeshTile* target, int side)
unsigned int idx = allocLink(tile);
if (idx != DT_NULL_LINK)
{
dtLink* link = &header->links[idx];
dtLink* link = &tile->links[idx];
link->ref = nei[k];
link->edge = (unsigned char)j;
link->side = (unsigned char)side;
@ -346,23 +343,21 @@ void dtNavMesh::connectExtLinks(dtMeshTile* tile, dtMeshTile* target, int side)
void dtNavMesh::connectExtOffMeshLinks(dtMeshTile* tile, dtMeshTile* target, int side)
{
if (!tile) return;
dtMeshHeader* header = tile->header;
// Connect off-mesh links.
// We are interested on links which land from target tile to this tile.
dtMeshHeader* targetHeader = target->header;
const unsigned char oppositeSide = (unsigned char)opposite(side);
dtQueryFilter defaultFilter;
for (int i = 0; i < targetHeader->offMeshConCount; ++i)
for (int i = 0; i < target->header->offMeshConCount; ++i)
{
dtOffMeshConnection* targetCon = &targetHeader->offMeshCons[i];
dtOffMeshConnection* targetCon = &target->offMeshCons[i];
if (targetCon->side != oppositeSide)
continue;
dtPoly* targetPoly = &targetHeader->polys[targetCon->poly];
dtPoly* targetPoly = &target->polys[targetCon->poly];
const float ext[3] = { targetCon->rad, targetHeader->walkableClimb, targetCon->rad };
const float ext[3] = { targetCon->rad, target->header->walkableClimb, targetCon->rad };
// Find polygon to connect to.
const float* p = &targetCon->pos[3];
@ -373,14 +368,14 @@ void dtNavMesh::connectExtOffMeshLinks(dtMeshTile* tile, dtMeshTile* target, int
if (sqr(nearestPt[0]-p[0])+sqr(nearestPt[2]-p[2]) > sqr(targetCon->rad))
continue;
// Make sure the location is on current mesh.
float* v = &targetHeader->verts[targetPoly->verts[1]*3];
float* v = &target->verts[targetPoly->verts[1]*3];
vcopy(v, nearestPt);
// Link off-mesh connection to target poly.
unsigned int idx = allocLink(target);
if (idx != DT_NULL_LINK)
{
dtLink* link = &targetHeader->links[idx];
dtLink* link = &target->links[idx];
link->ref = ref;
link->edge = (unsigned char)1;
link->side = oppositeSide;
@ -397,8 +392,8 @@ void dtNavMesh::connectExtOffMeshLinks(dtMeshTile* tile, dtMeshTile* target, int
if (idx != DT_NULL_LINK)
{
unsigned short landPolyIdx = decodePolyIdPoly(ref);
dtPoly* landPoly = &header->polys[landPolyIdx];
dtLink* link = &header->links[idx];
dtPoly* landPoly = &tile->polys[landPolyIdx];
dtLink* link = &tile->links[idx];
link->ref = getTileId(target) | (unsigned int)(targetCon->poly);
link->edge = 0;
link->side = side;
@ -415,13 +410,12 @@ void dtNavMesh::connectExtOffMeshLinks(dtMeshTile* tile, dtMeshTile* target, int
void dtNavMesh::connectIntLinks(dtMeshTile* tile)
{
if (!tile) return;
dtMeshHeader* header = tile->header;
dtPolyRef base = getTileId(tile);
for (int i = 0; i < header->polyCount; ++i)
for (int i = 0; i < tile->header->polyCount; ++i)
{
dtPoly* poly = &header->polys[i];
dtPoly* poly = &tile->polys[i];
poly->firstLink = DT_NULL_LINK;
if (poly->type == DT_POLYTYPE_OFFMESH_CONNECTION)
@ -437,7 +431,7 @@ void dtNavMesh::connectIntLinks(dtMeshTile* tile)
unsigned int idx = allocLink(tile);
if (idx != DT_NULL_LINK)
{
dtLink* link = &header->links[idx];
dtLink* link = &tile->links[idx];
link->ref = base | (unsigned int)(poly->neis[j]-1);
link->edge = (unsigned char)j;
link->side = 0xff;
@ -453,18 +447,17 @@ void dtNavMesh::connectIntLinks(dtMeshTile* tile)
void dtNavMesh::connectIntOffMeshLinks(dtMeshTile* tile)
{
if (!tile) return;
dtMeshHeader* header = tile->header;
dtPolyRef base = getTileId(tile);
// Find Off-mesh connection end points.
for (int i = 0; i < header->offMeshConCount; ++i)
for (int i = 0; i < tile->header->offMeshConCount; ++i)
{
dtOffMeshConnection* con = &header->offMeshCons[i];
dtPoly* poly = &header->polys[con->poly];
dtOffMeshConnection* con = &tile->offMeshCons[i];
dtPoly* poly = &tile->polys[con->poly];
dtQueryFilter defaultFilter;
const float ext[3] = { con->rad, header->walkableClimb, con->rad };
const float ext[3] = { con->rad, tile->header->walkableClimb, con->rad };
for (int j = 0; j < 2; ++j)
{
@ -481,14 +474,14 @@ void dtNavMesh::connectIntOffMeshLinks(dtMeshTile* tile)
if (sqr(nearestPt[0]-p[0])+sqr(nearestPt[2]-p[2]) > sqr(con->rad))
continue;
// Make sure the location is on current mesh.
float* v = &header->verts[poly->verts[j]*3];
float* v = &tile->verts[poly->verts[j]*3];
vcopy(v, nearestPt);
// Link off-mesh connection to target poly.
unsigned int idx = allocLink(tile);
if (idx != DT_NULL_LINK)
{
dtLink* link = &header->links[idx];
dtLink* link = &tile->links[idx];
link->ref = ref;
link->edge = (unsigned char)j;
link->side = 0xff;
@ -507,8 +500,8 @@ void dtNavMesh::connectIntOffMeshLinks(dtMeshTile* tile)
if (idx != DT_NULL_LINK)
{
unsigned short landPolyIdx = decodePolyIdPoly(ref);
dtPoly* landPoly = &header->polys[landPolyIdx];
dtLink* link = &header->links[idx];
dtPoly* landPoly = &tile->polys[landPolyIdx];
dtLink* link = &tile->links[idx];
link->ref = base | (unsigned int)(con->poly);
link->edge = 0;
link->side = 0xff;
@ -560,20 +553,20 @@ bool dtNavMesh::addTileAt(int x, int y, unsigned char* data, int dataSize, bool
const int offMeshLinksSize = align4(sizeof(dtOffMeshConnection)*header->offMeshConCount);
unsigned char* d = data + headerSize;
header->verts = (float*)d; d += vertsSize;
header->polys = (dtPoly*)d; d += polysSize;
header->links = (dtLink*)d; d += linksSize;
header->detailMeshes = (dtPolyDetail*)d; d += detailMeshesSize;
header->detailVerts = (float*)d; d += detailVertsSize;
header->detailTris = (unsigned char*)d; d += detailTrisSize;
header->bvTree = (dtBVNode*)d; d += bvtreeSize;
header->offMeshCons = (dtOffMeshConnection*)d; d += offMeshLinksSize;
tile->verts = (float*)d; d += vertsSize;
tile->polys = (dtPoly*)d; d += polysSize;
tile->links = (dtLink*)d; d += linksSize;
tile->detailMeshes = (dtPolyDetail*)d; d += detailMeshesSize;
tile->detailVerts = (float*)d; d += detailVertsSize;
tile->detailTris = (unsigned char*)d; d += detailTrisSize;
tile->bvTree = (dtBVNode*)d; d += bvtreeSize;
tile->offMeshCons = (dtOffMeshConnection*)d; d += offMeshLinksSize;
// Build links freelist
header->linksFreeList = 0;
header->links[header->maxLinkCount-1].next = DT_NULL_LINK;
tile->linksFreeList = 0;
tile->links[header->maxLinkCount-1].next = DT_NULL_LINK;
for (int i = 0; i < header->maxLinkCount-1; ++i)
header->links[i].next = i+1;
tile->links[i].next = i+1;
// Init tile.
tile->header = header;
@ -705,6 +698,16 @@ bool dtNavMesh::removeTileAt(int x, int y, unsigned char** data, int* dataSize)
if (dataSize) *dataSize = tile->dataSize;
}
tile->header = 0;
tile->linksFreeList = 0;
tile->polys = 0;
tile->verts = 0;
tile->links = 0;
tile->detailMeshes = 0;
tile->detailVerts = 0;
tile->detailTris = 0;
tile->bvTree = 0;
tile->offMeshCons = 0;
tile->x = tile->y = 0;
tile->salt++;
@ -737,22 +740,21 @@ bool dtNavMesh::closestPointOnPoly(dtPolyRef ref, const float* pos, float* close
bool dtNavMesh::closestPointOnPolyInTile(const dtMeshTile* tile, unsigned int ip, const float* pos, float* closest) const
{
const dtMeshHeader* header = tile->header;
const dtPoly* poly = &header->polys[ip];
const dtPoly* poly = &tile->polys[ip];
float closestDistSqr = FLT_MAX;
const dtPolyDetail* pd = &header->detailMeshes[ip];
const dtPolyDetail* pd = &tile->detailMeshes[ip];
for (int j = 0; j < pd->triCount; ++j)
{
const unsigned char* t = &header->detailTris[(pd->triBase+j)*4];
const unsigned char* t = &tile->detailTris[(pd->triBase+j)*4];
const float* v[3];
for (int k = 0; k < 3; ++k)
{
if (t[k] < poly->vertCount)
v[k] = &header->verts[poly->verts[t[k]]*3];
v[k] = &tile->verts[poly->verts[t[k]]*3];
else
v[k] = &header->detailVerts[(pd->vertBase+(t[k]-poly->vertCount))*3];
v[k] = &tile->detailVerts[(pd->vertBase+(t[k]-poly->vertCount))*3];
}
float pt[3];
closestPtPointTriangle(pt, pos, v[0], v[1], v[2]);
@ -773,10 +775,10 @@ bool dtNavMesh::closestPointOnPolyBoundary(dtPolyRef ref, const float* pos, floa
decodePolyId(ref, salt, it, ip);
if (it >= (unsigned int)m_maxTiles) return false;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
const dtMeshHeader* header = m_tiles[it].header;
const dtMeshTile* tile = &m_tiles[it];
if (ip >= (unsigned int)header->polyCount) return false;
const dtPoly* poly = &header->polys[ip];
if (ip >= (unsigned int)tile->header->polyCount) return false;
const dtPoly* poly = &tile->polys[ip];
// Collect vertices.
float verts[DT_VERTS_PER_POLYGON*3];
@ -785,7 +787,7 @@ bool dtNavMesh::closestPointOnPolyBoundary(dtPolyRef ref, const float* pos, floa
int nv = 0;
for (int i = 0; i < (int)poly->vertCount; ++i)
{
vcopy(&verts[nv*3], &header->verts[poly->verts[i]*3]);
vcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]);
nv++;
}
@ -825,9 +827,9 @@ bool dtNavMesh::getOffMeshConnectionPolyEndPoints(dtPolyRef prevRef, dtPolyRef p
decodePolyId(polyRef, salt, it, ip);
if (it >= (unsigned int)m_maxTiles) return false;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
const dtMeshHeader* header = m_tiles[it].header;
if (ip >= (unsigned int)header->polyCount) return false;
const dtPoly* poly = &header->polys[ip];
const dtMeshTile* tile = &m_tiles[it];
if (ip >= (unsigned int)tile->header->polyCount) return false;
const dtPoly* poly = &tile->polys[ip];
// Make sure that the current poly is indeed off-mesh link.
if (poly->type != DT_POLYTYPE_OFFMESH_CONNECTION)
@ -837,11 +839,11 @@ bool dtNavMesh::getOffMeshConnectionPolyEndPoints(dtPolyRef prevRef, dtPolyRef p
int idx0 = 0, idx1 = 1;
// Find link that points to first vertex.
for (unsigned int i = poly->firstLink; i != DT_NULL_LINK; i = header->links[i].next)
for (unsigned int i = poly->firstLink; i != DT_NULL_LINK; i = tile->links[i].next)
{
if (header->links[i].edge == 0)
if (tile->links[i].edge == 0)
{
if (header->links[i].ref != prevRef)
if (tile->links[i].ref != prevRef)
{
idx0 = 1;
idx1 = 0;
@ -850,8 +852,8 @@ bool dtNavMesh::getOffMeshConnectionPolyEndPoints(dtPolyRef prevRef, dtPolyRef p
}
}
vcopy(startPos, &header->verts[poly->verts[idx0]*3]);
vcopy(endPos, &header->verts[poly->verts[idx1]*3]);
vcopy(startPos, &tile->verts[poly->verts[idx0]*3]);
vcopy(endPos, &tile->verts[poly->verts[idx1]*3]);
return true;
}
@ -863,15 +865,15 @@ bool dtNavMesh::getPolyHeight(dtPolyRef ref, const float* pos, float* height) co
decodePolyId(ref, salt, it, ip);
if (it >= (unsigned int)m_maxTiles) return false;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
const dtMeshHeader* header = m_tiles[it].header;
const dtMeshTile* tile = &m_tiles[it];
if (ip >= (unsigned int)header->polyCount) return false;
const dtPoly* poly = &header->polys[ip];
if (ip >= (unsigned int)tile->header->polyCount) return false;
const dtPoly* poly = &tile->polys[ip];
if (poly->type == DT_POLYTYPE_OFFMESH_CONNECTION)
{
const float* v0 = &header->verts[poly->verts[0]*3];
const float* v1 = &header->verts[poly->verts[1]*3];
const float* v0 = &tile->verts[poly->verts[0]*3];
const float* v1 = &tile->verts[poly->verts[1]*3];
const float d0 = vdist(pos, v0);
const float d1 = vdist(pos, v1);
const float u = d0 / (d0+d1);
@ -881,17 +883,17 @@ bool dtNavMesh::getPolyHeight(dtPolyRef ref, const float* pos, float* height) co
}
else
{
const dtPolyDetail* pd = &header->detailMeshes[ip];
const dtPolyDetail* pd = &tile->detailMeshes[ip];
for (int j = 0; j < pd->triCount; ++j)
{
const unsigned char* t = &header->detailTris[(pd->triBase+j)*4];
const unsigned char* t = &tile->detailTris[(pd->triBase+j)*4];
const float* v[3];
for (int k = 0; k < 3; ++k)
{
if (t[k] < poly->vertCount)
v[k] = &header->verts[poly->verts[t[k]]*3];
v[k] = &tile->verts[poly->verts[t[k]]*3];
else
v[k] = &header->detailVerts[(pd->vertBase+(t[k]-poly->vertCount))*3];
v[k] = &tile->detailVerts[(pd->vertBase+(t[k]-poly->vertCount))*3];
}
float h;
if (closestHeightPointTriangle(pos, v[0], v[1], v[2], h))
@ -984,28 +986,30 @@ int dtNavMesh::queryPolygonsInTile(dtMeshTile* tile, const float* qmin, const fl
dtQueryFilter* filter,
dtPolyRef* polys, const int maxPolys)
{
const dtMeshHeader* header = tile->header;
if (header->bvTree)
if (tile->bvTree)
{
const dtBVNode* node = &header->bvTree[0];
const dtBVNode* end = &header->bvTree[header->bvNodeCount];
const dtBVNode* node = &tile->bvTree[0];
const dtBVNode* end = &tile->bvTree[tile->header->bvNodeCount];
const float* tbmin = tile->header->bmin;
const float* tbmax = tile->header->bmax;
const float qfac = tile->header->bvQuantFactor;
// Calculate quantized box
unsigned short bmin[3], bmax[3];
// Clamp query box to world box.
float minx = clamp(qmin[0], header->bmin[0], header->bmax[0]) - header->bmin[0];
float miny = clamp(qmin[1], header->bmin[1], header->bmax[1]) - header->bmin[1];
float minz = clamp(qmin[2], header->bmin[2], header->bmax[2]) - header->bmin[2];
float maxx = clamp(qmax[0], header->bmin[0], header->bmax[0]) - header->bmin[0];
float maxy = clamp(qmax[1], header->bmin[1], header->bmax[1]) - header->bmin[1];
float maxz = clamp(qmax[2], header->bmin[2], header->bmax[2]) - header->bmin[2];
float minx = clamp(qmin[0], tbmin[0], tbmax[0]) - tbmin[0];
float miny = clamp(qmin[1], tbmin[1], tbmax[1]) - tbmin[1];
float minz = clamp(qmin[2], tbmin[2], tbmax[2]) - tbmin[2];
float maxx = clamp(qmax[0], tbmin[0], tbmax[0]) - tbmin[0];
float maxy = clamp(qmax[1], tbmin[1], tbmax[1]) - tbmin[1];
float maxz = clamp(qmax[2], tbmin[2], tbmax[2]) - tbmin[2];
// Quantize
bmin[0] = (unsigned short)(header->bvQuantFactor * minx) & 0xfffe;
bmin[1] = (unsigned short)(header->bvQuantFactor * miny) & 0xfffe;
bmin[2] = (unsigned short)(header->bvQuantFactor * minz) & 0xfffe;
bmax[0] = (unsigned short)(header->bvQuantFactor * maxx + 1) | 1;
bmax[1] = (unsigned short)(header->bvQuantFactor * maxy + 1) | 1;
bmax[2] = (unsigned short)(header->bvQuantFactor * maxz + 1) | 1;
bmin[0] = (unsigned short)(qfac * minx) & 0xfffe;
bmin[1] = (unsigned short)(qfac * miny) & 0xfffe;
bmin[2] = (unsigned short)(qfac * minz) & 0xfffe;
bmax[0] = (unsigned short)(qfac * maxx + 1) | 1;
bmax[1] = (unsigned short)(qfac * maxy + 1) | 1;
bmax[2] = (unsigned short)(qfac * maxz + 1) | 1;
// Traverse tree
dtPolyRef base = getTileId(tile);
@ -1017,7 +1021,7 @@ int dtNavMesh::queryPolygonsInTile(dtMeshTile* tile, const float* qmin, const fl
if (isLeafNode && overlap)
{
if (passFilter(filter, header->polys[node->i].flags))
if (passFilter(filter, tile->polys[node->i].flags))
{
if (n < maxPolys)
polys[n++] = base | (dtPolyRef)node->i;
@ -1038,19 +1042,18 @@ int dtNavMesh::queryPolygonsInTile(dtMeshTile* tile, const float* qmin, const fl
else
{
float bmin[3], bmax[3];
const dtMeshHeader* header = tile->header;
int n = 0;
dtPolyRef base = getTileId(tile);
for (int i = 0; i < header->polyCount; ++i)
for (int i = 0; i < tile->header->polyCount; ++i)
{
// Calc polygon bounds.
dtPoly* p = &header->polys[i];
const float* v = &header->verts[p->verts[0]*3];
dtPoly* p = &tile->polys[i];
const float* v = &tile->verts[p->verts[0]*3];
vcopy(bmin, v);
vcopy(bmax, v);
for (int j = 1; j < p->vertCount; ++j)
{
v = &header->verts[p->verts[j]*3];
v = &tile->verts[p->verts[j]*3];
vmin(bmin, v);
vmax(bmax, v);
}
@ -1157,12 +1160,12 @@ int dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef,
const dtPolyRef bestRef = bestNode->id;
it = decodePolyIdTile(bestRef);
ip = decodePolyIdPoly(bestRef);
const dtMeshHeader* bestHeader = m_tiles[it].header;
const dtPoly* bestPoly = &bestHeader->polys[ip];
const dtMeshTile* bestTile = &m_tiles[it];
const dtPoly* bestPoly = &bestTile->polys[ip];
// Get parent poly and tile.
dtPolyRef parentRef = 0;
const dtMeshHeader* parentHeader = 0;
const dtMeshTile* parentTile = 0;
const dtPoly* parentPoly = 0;
if (bestNode->pidx)
parentRef = m_nodePool->getNodeAtIdx(bestNode->pidx)->id;
@ -1170,20 +1173,20 @@ int dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef,
{
it = decodePolyIdTile(parentRef);
ip = decodePolyIdPoly(parentRef);
parentHeader = m_tiles[it].header;
parentPoly = &parentHeader->polys[ip];
parentTile = &m_tiles[it];
parentPoly = &parentTile->polys[ip];
getEdgeMidPoint(parentRef, parentPoly, parentHeader,
bestRef, bestPoly, bestHeader, previousEdgeMidPoint);
getEdgeMidPoint(parentRef, parentPoly, parentTile,
bestRef, bestPoly, bestTile, previousEdgeMidPoint);
}
else
{
vcopy(previousEdgeMidPoint, startPos);
}
for (unsigned int i = bestPoly->firstLink; i != DT_NULL_LINK; i = bestHeader->links[i].next)
for (unsigned int i = bestPoly->firstLink; i != DT_NULL_LINK; i = bestTile->links[i].next)
{
dtPolyRef neighbourRef = bestHeader->links[i].ref;
dtPolyRef neighbourRef = bestTile->links[i].ref;
// Skip invalid ids and do not expand back to where we came from.
if (!neighbourRef || neighbourRef == bestRef)
@ -1193,8 +1196,8 @@ int dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef,
// The API input has been cheked already, skip checking internal data.
it = decodePolyIdTile(neighbourRef);
ip = decodePolyIdPoly(neighbourRef);
const dtMeshHeader* neighbourHeader = m_tiles[it].header;
const dtPoly* neighbourPoly = &neighbourHeader->polys[ip];
const dtMeshTile* neighbourTile = &m_tiles[it];
const dtPoly* neighbourPoly = &neighbourTile->polys[ip];
if (!passFilter(filter, neighbourPoly->flags))
continue;
@ -1206,8 +1209,8 @@ int dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef,
// Calculate cost.
float edgeMidPoint[3];
getEdgeMidPoint(bestRef, bestPoly, bestHeader,
neighbourRef, neighbourPoly, neighbourHeader, edgeMidPoint);
getEdgeMidPoint(bestRef, bestPoly, bestTile,
neighbourRef, neighbourPoly, neighbourTile, edgeMidPoint);
// Special case for last node.
float h = 0;
@ -1542,8 +1545,8 @@ int dtNavMesh::moveAlongPathCorridor(const float* startPos, const float* endPos,
if (it >= (unsigned int)m_maxTiles) return n;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return n;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return n;
const dtMeshHeader* header = m_tiles[it].header;
const dtPoly* poly = &header->polys[ip];
const dtMeshTile* tile = &m_tiles[it];
const dtPoly* poly = &tile->polys[ip];
// In case of Off-Mesh link, just snap to the end location and advance over it.
if (poly->type == DT_POLYTYPE_OFFMESH_CONNECTION)
@ -1563,7 +1566,7 @@ int dtNavMesh::moveAlongPathCorridor(const float* startPos, const float* endPos,
int nv = 0;
for (int i = 0; i < (int)poly->vertCount; ++i)
{
vcopy(&verts[nv*3], &header->verts[poly->verts[i]*3]);
vcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]);
nv++;
}
@ -1594,6 +1597,7 @@ int dtNavMesh::moveAlongPathCorridor(const float* startPos, const float* endPos,
// Check to see if the point is on the portal edge to the next polygon.
if (n+1 >= pathSize)
return n;
// TODO: optimize
float left[3], right[3];
unsigned char fromType, toType;
if (!getPortalPoints(path[n], path[n+1], left, right, fromType, toType))
@ -1617,36 +1621,36 @@ bool dtNavMesh::getPortalPoints(dtPolyRef from, dtPolyRef to, float* left, float
decodePolyId(from, salt, it, ip);
if (it >= (unsigned int)m_maxTiles) return false;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return false;
const dtMeshHeader* fromHeader = m_tiles[it].header;
const dtPoly* fromPoly = &fromHeader->polys[ip];
const dtMeshTile* fromTile = &m_tiles[it];
if (ip >= (unsigned int)fromTile->header->polyCount) return false;
const dtPoly* fromPoly = &fromTile->polys[ip];
fromType = fromPoly->type;
decodePolyId(to, salt, it, ip);
if (it >= (unsigned int)m_maxTiles) return false;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return false;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return false;
const dtMeshHeader* toHeader = m_tiles[it].header;
const dtPoly* toPoly = &toHeader->polys[ip];
const dtMeshTile* toTile = &m_tiles[it];
if (ip >= (unsigned int)toTile->header->polyCount) return false;
const dtPoly* toPoly = &toTile->polys[ip];
toType = toPoly->type;
return getPortalPoints(from, fromPoly, fromHeader,
to, toPoly, toHeader,
return getPortalPoints(from, fromPoly, fromTile,
to, toPoly, toTile,
left, right);
}
// Returns portal points between two polygons.
bool dtNavMesh::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dtMeshHeader* fromHeader,
dtPolyRef to, const dtPoly* toPoly, const dtMeshHeader* toHeader,
bool dtNavMesh::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dtMeshTile* fromTile,
dtPolyRef to, const dtPoly* toPoly, const dtMeshTile* toTile,
float* left, float* right) const
{
// Find the link that points to the 'to' polygon.
const dtLink* link = 0;
for (unsigned int i = fromPoly->firstLink; i != DT_NULL_LINK; i = fromHeader->links[i].next)
for (unsigned int i = fromPoly->firstLink; i != DT_NULL_LINK; i = fromTile->links[i].next)
{
if (fromHeader->links[i].ref == to)
if (fromTile->links[i].ref == to)
{
link = &fromHeader->links[i];
link = &fromTile->links[i];
break;
}
}
@ -1657,13 +1661,13 @@ bool dtNavMesh::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dt
if (fromPoly->type == DT_POLYTYPE_OFFMESH_CONNECTION)
{
// Find link that points to first vertex.
for (unsigned int i = fromPoly->firstLink; i != DT_NULL_LINK; i = fromHeader->links[i].next)
for (unsigned int i = fromPoly->firstLink; i != DT_NULL_LINK; i = fromTile->links[i].next)
{
if (fromHeader->links[i].ref == to)
if (fromTile->links[i].ref == to)
{
const int v = fromHeader->links[i].edge;
vcopy(left, &fromHeader->verts[fromPoly->verts[v]*3]);
vcopy(right, &fromHeader->verts[fromPoly->verts[v]*3]);
const int v = fromTile->links[i].edge;
vcopy(left, &fromTile->verts[fromPoly->verts[v]*3]);
vcopy(right, &fromTile->verts[fromPoly->verts[v]*3]);
return true;
}
}
@ -1672,13 +1676,13 @@ bool dtNavMesh::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dt
if (toPoly->type == DT_POLYTYPE_OFFMESH_CONNECTION)
{
for (unsigned int i = toPoly->firstLink; i != DT_NULL_LINK; i = toHeader->links[i].next)
for (unsigned int i = toPoly->firstLink; i != DT_NULL_LINK; i = toTile->links[i].next)
{
if (toHeader->links[i].ref == from)
if (toTile->links[i].ref == from)
{
const int v = toHeader->links[i].edge;
vcopy(left, &toHeader->verts[toPoly->verts[v]*3]);
vcopy(right, &toHeader->verts[toPoly->verts[v]*3]);
const int v = toTile->links[i].edge;
vcopy(left, &toTile->verts[toPoly->verts[v]*3]);
vcopy(right, &toTile->verts[toPoly->verts[v]*3]);
return true;
}
}
@ -1688,8 +1692,8 @@ bool dtNavMesh::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dt
// Find portal vertices.
const int v0 = fromPoly->verts[link->edge];
const int v1 = fromPoly->verts[(link->edge+1) % (int)fromPoly->vertCount];
vcopy(left, &fromHeader->verts[v0*3]);
vcopy(right, &fromHeader->verts[v1*3]);
vcopy(left, &fromTile->verts[v0*3]);
vcopy(right, &fromTile->verts[v1*3]);
// If the link is at tile boundary, clamp the vertices to
// the link width.
@ -1735,12 +1739,12 @@ bool dtNavMesh::getEdgeMidPoint(dtPolyRef from, dtPolyRef to, float* mid) const
return true;
}
bool dtNavMesh::getEdgeMidPoint(dtPolyRef from, const dtPoly* fromPoly, const dtMeshHeader* fromHeader,
dtPolyRef to, const dtPoly* toPoly, const dtMeshHeader* toHeader,
bool dtNavMesh::getEdgeMidPoint(dtPolyRef from, const dtPoly* fromPoly, const dtMeshTile* fromTile,
dtPolyRef to, const dtPoly* toPoly, const dtMeshTile* toTile,
float* mid) const
{
float left[3], right[3];
if (!getPortalPoints(from, fromPoly, fromHeader, to, toPoly, toHeader, left, right))
if (!getPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, left, right))
return false;
mid[0] = (left[0]+right[0])*0.5f;
mid[1] = (left[1]+right[1])*0.5f;
@ -1754,22 +1758,22 @@ void dtNavMesh::setPolyFlags(dtPolyRef ref, unsigned short flags)
decodePolyId(ref, salt, it, ip);
if (it >= (unsigned int)m_maxTiles) return;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return;
dtMeshHeader* header = m_tiles[it].header;
dtPoly* poly = &header->polys[ip];
dtMeshTile* tile = &m_tiles[it];
if (ip >= (unsigned int)tile->header->polyCount) return;
dtPoly* poly = &tile->polys[ip];
// Change flags.
poly->flags = flags;
}
unsigned short dtNavMesh::getPolyFlags(dtPolyRef ref)
unsigned short dtNavMesh::getPolyFlags(dtPolyRef ref) const
{
unsigned int salt, it, ip;
decodePolyId(ref, salt, it, ip);
if (it >= (unsigned int)m_maxTiles) return 0;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return 0;
const dtMeshHeader* header = m_tiles[it].header;
const dtPoly* poly = &header->polys[ip];
const dtMeshTile* tile = &m_tiles[it];
if (ip >= (unsigned int)tile->header->polyCount) return 0;
const dtPoly* poly = &tile->polys[ip];
return poly->flags;
}
@ -1779,21 +1783,21 @@ void dtNavMesh::setPolyArea(dtPolyRef ref, unsigned char area)
decodePolyId(ref, salt, it, ip);
if (it >= (unsigned int)m_maxTiles) return;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return;
dtMeshHeader* header = m_tiles[it].header;
dtPoly* poly = &header->polys[ip];
dtMeshTile* tile = &m_tiles[it];
if (ip >= (unsigned int)tile->header->polyCount) return;
dtPoly* poly = &tile->polys[ip];
poly->area = area;
}
unsigned char dtNavMesh::getPolyArea(dtPolyRef ref)
unsigned char dtNavMesh::getPolyArea(dtPolyRef ref) const
{
unsigned int salt, it, ip;
decodePolyId(ref, salt, it, ip);
if (it >= (unsigned int)m_maxTiles) return 0;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return 0;
const dtMeshHeader* header = m_tiles[it].header;
const dtPoly* poly = &header->polys[ip];
const dtMeshTile* tile = &m_tiles[it];
if (ip >= (unsigned int)tile->header->polyCount) return 0;
const dtPoly* poly = &tile->polys[ip];
return poly->area;
}
@ -1820,14 +1824,14 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float*
// The API input has been cheked already, skip checking internal data.
unsigned int it = decodePolyIdTile(curRef);
unsigned int ip = decodePolyIdPoly(curRef);
const dtMeshHeader* header = m_tiles[it].header;
const dtPoly* poly = &header->polys[ip];
const dtMeshTile* tile = &m_tiles[it];
const dtPoly* poly = &tile->polys[ip];
// Collect vertices.
int nv = 0;
for (int i = 0; i < (int)poly->vertCount; ++i)
{
vcopy(&verts[nv*3], &header->verts[poly->verts[i]*3]);
vcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]);
nv++;
}
@ -1848,9 +1852,9 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float*
// Follow neighbours.
dtPolyRef nextRef = 0;
for (unsigned int i = poly->firstLink; i != DT_NULL_LINK; i = header->links[i].next)
for (unsigned int i = poly->firstLink; i != DT_NULL_LINK; i = tile->links[i].next)
{
const dtLink* link = &header->links[i];
const dtLink* link = &tile->links[i];
if ((int)link->edge == segMax)
{
// If the link is internal, just return the ref.
@ -1863,8 +1867,8 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float*
// If the link is at tile boundary,
const int v0 = poly->verts[link->edge];
const int v1 = poly->verts[(link->edge+1) % poly->vertCount];
const float* left = &header->verts[v0*3];
const float* right = &header->verts[v1*3];
const float* left = &tile->verts[v0*3];
const float* right = &tile->verts[v1*3];
// Check that the intersection lies inside the link portal.
if (link->side == 0 || link->side == 4)
@ -1974,12 +1978,12 @@ int dtNavMesh::findPolysAround(dtPolyRef centerRef, const float* centerPos, floa
const dtPolyRef bestRef = bestNode->id;
it = decodePolyIdTile(bestRef);
ip = decodePolyIdPoly(bestRef);
const dtMeshHeader* bestHeader = m_tiles[it].header;
const dtPoly* bestPoly = &bestHeader->polys[ip];
const dtMeshTile* bestTile = &m_tiles[it];
const dtPoly* bestPoly = &bestTile->polys[ip];
// Get parent poly and tile.
dtPolyRef parentRef = 0;
const dtMeshHeader* parentHeader = 0;
const dtMeshTile* parentTile = 0;
const dtPoly* parentPoly = 0;
if (bestNode->pidx)
parentRef = m_nodePool->getNodeAtIdx(bestNode->pidx)->id;
@ -1987,28 +1991,28 @@ int dtNavMesh::findPolysAround(dtPolyRef centerRef, const float* centerPos, floa
{
it = decodePolyIdTile(parentRef);
ip = decodePolyIdPoly(parentRef);
parentHeader = m_tiles[it].header;
parentPoly = &parentHeader->polys[ip];
parentTile = &m_tiles[it];
parentPoly = &parentTile->polys[ip];
getEdgeMidPoint(parentRef, parentPoly, parentHeader,
bestRef, bestPoly, bestHeader, previousEdgeMidPoint);
getEdgeMidPoint(parentRef, parentPoly, parentTile,
bestRef, bestPoly, bestTile, previousEdgeMidPoint);
}
else
{
vcopy(previousEdgeMidPoint, centerPos);
}
for (unsigned int i = bestPoly->firstLink; i != DT_NULL_LINK; i = bestHeader->links[i].next)
for (unsigned int i = bestPoly->firstLink; i != DT_NULL_LINK; i = bestTile->links[i].next)
{
const dtLink* link = &bestHeader->links[i];
const dtLink* link = &bestTile->links[i];
dtPolyRef neighbourRef = link->ref;
// Skip invalid neighbours and do not follow back to parent.
if (!neighbourRef || neighbourRef == parentRef)
continue;
// Calc distance to the edge.
const float* va = &bestHeader->verts[bestPoly->verts[link->edge]*3];
const float* vb = &bestHeader->verts[bestPoly->verts[(link->edge+1) % bestPoly->vertCount]*3];
const float* va = &bestTile->verts[bestPoly->verts[link->edge]*3];
const float* vb = &bestTile->verts[bestPoly->verts[(link->edge+1) % bestPoly->vertCount]*3];
float tseg;
float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg);
@ -2019,8 +2023,8 @@ int dtNavMesh::findPolysAround(dtPolyRef centerRef, const float* centerPos, floa
// Expand to neighbour
it = decodePolyIdTile(neighbourRef);
ip = decodePolyIdPoly(neighbourRef);
const dtMeshHeader* neighbourHeader = m_tiles[it].header;
const dtPoly* neighbourPoly = &neighbourHeader->polys[ip];
const dtMeshTile* neighbourTile = &m_tiles[it];
const dtPoly* neighbourPoly = &neighbourTile->polys[ip];
if (!passFilter(filter, neighbourPoly->flags))
continue;
@ -2031,8 +2035,8 @@ int dtNavMesh::findPolysAround(dtPolyRef centerRef, const float* centerPos, floa
// Cost
float edgeMidPoint[3];
getEdgeMidPoint(bestRef, bestPoly, bestHeader,
neighbourRef, neighbourPoly, neighbourHeader, edgeMidPoint);
getEdgeMidPoint(bestRef, bestPoly, bestTile,
neighbourRef, neighbourPoly, neighbourTile, edgeMidPoint);
newNode.total = bestNode->total + vdist(previousEdgeMidPoint, edgeMidPoint);
@ -2106,12 +2110,12 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos,
const dtPolyRef bestRef = bestNode->id;
it = decodePolyIdTile(bestRef);
ip = decodePolyIdPoly(bestRef);
const dtMeshHeader* bestHeader = m_tiles[it].header;
const dtPoly* bestPoly = &bestHeader->polys[ip];
const dtMeshTile* bestTile = &m_tiles[it];
const dtPoly* bestPoly = &bestTile->polys[ip];
// Get parent poly and tile.
dtPolyRef parentRef = 0;
const dtMeshHeader* parentHeader = 0;
const dtMeshTile* parentTile = 0;
const dtPoly* parentPoly = 0;
if (bestNode->pidx)
parentRef = m_nodePool->getNodeAtIdx(bestNode->pidx)->id;
@ -2119,11 +2123,11 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos,
{
it = decodePolyIdTile(parentRef);
ip = decodePolyIdPoly(parentRef);
parentHeader = m_tiles[it].header;
parentPoly = &parentHeader->polys[ip];
parentTile = &m_tiles[it];
parentPoly = &parentTile->polys[ip];
getEdgeMidPoint(parentRef, parentPoly, parentHeader,
bestRef, bestPoly, bestHeader, previousEdgeMidPoint);
getEdgeMidPoint(parentRef, parentPoly, parentTile,
bestRef, bestPoly, bestTile, previousEdgeMidPoint);
}
else
{
@ -2138,9 +2142,9 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos,
{
// Tile border.
bool solid = true;
for (unsigned int k = bestPoly->firstLink; k != DT_NULL_LINK; k = bestHeader->links[k].next)
for (unsigned int k = bestPoly->firstLink; k != DT_NULL_LINK; k = bestTile->links[k].next)
{
const dtLink* link = &bestHeader->links[k];
const dtLink* link = &bestTile->links[k];
if (link->edge == j)
{
if (link->ref != 0 && passFilter(filter, getPolyFlags(link->ref)))
@ -2150,15 +2154,15 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos,
}
if (!solid) continue;
}
else if (bestPoly->neis[j] && passFilter(filter, bestHeader->polys[bestPoly->neis[j]].flags))
else if (bestPoly->neis[j] && passFilter(filter, bestTile->polys[bestPoly->neis[j]].flags))
{
// Internal edge
continue;
}
// Calc distance to the edge.
const float* vj = &bestHeader->verts[bestPoly->verts[j]*3];
const float* vi = &bestHeader->verts[bestPoly->verts[i]*3];
const float* vj = &bestTile->verts[bestPoly->verts[j]*3];
const float* vi = &bestTile->verts[bestPoly->verts[i]*3];
float tseg;
float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg);
@ -2174,17 +2178,17 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos,
hitPos[2] = vj[2] + (vi[2] - vj[2])*tseg;
}
for (unsigned int i = bestPoly->firstLink; i != DT_NULL_LINK; i = bestHeader->links[i].next)
for (unsigned int i = bestPoly->firstLink; i != DT_NULL_LINK; i = bestTile->links[i].next)
{
const dtLink* link = &bestHeader->links[i];
const dtLink* link = &bestTile->links[i];
dtPolyRef neighbourRef = link->ref;
// Skip invalid neighbours and do not follow back to parent.
if (!neighbourRef || neighbourRef == parentRef)
continue;
// Calc distance to the edge.
const float* va = &bestHeader->verts[bestPoly->verts[link->edge]*3];
const float* vb = &bestHeader->verts[bestPoly->verts[(link->edge+1) % bestPoly->vertCount]*3];
const float* va = &bestTile->verts[bestPoly->verts[link->edge]*3];
const float* vb = &bestTile->verts[bestPoly->verts[(link->edge+1) % bestPoly->vertCount]*3];
float tseg;
float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg);
@ -2195,8 +2199,8 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos,
// Expand to neighbour.
it = decodePolyIdTile(neighbourRef);
ip = decodePolyIdPoly(neighbourRef);
const dtMeshHeader* neighbourHeader = m_tiles[it].header;
const dtPoly* neighbourPoly = &neighbourHeader->polys[ip];
const dtMeshTile* neighbourTile = &m_tiles[it];
const dtPoly* neighbourPoly = &neighbourTile->polys[ip];
if (!passFilter(filter, neighbourPoly->flags))
continue;
@ -2207,8 +2211,8 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos,
// Cost
float edgeMidPoint[3];
getEdgeMidPoint(bestRef, bestPoly, bestHeader,
neighbourRef, neighbourPoly, neighbourHeader, edgeMidPoint);
getEdgeMidPoint(bestRef, bestPoly, bestTile,
neighbourRef, neighbourPoly, neighbourTile, edgeMidPoint);
newNode.total = bestNode->total + vdist(previousEdgeMidPoint, edgeMidPoint);
@ -2250,7 +2254,7 @@ const dtPoly* dtNavMesh::getPolyByRef(dtPolyRef ref) const
if (it >= (unsigned int)m_maxTiles) return 0;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return 0;
return &m_tiles[it].header->polys[ip];
return &m_tiles[it].polys[ip];
}
const float* dtNavMesh::getPolyVertsByRef(dtPolyRef ref) const
@ -2260,7 +2264,7 @@ const float* dtNavMesh::getPolyVertsByRef(dtPolyRef ref) const
if (it >= (unsigned int)m_maxTiles) return 0;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return 0;
return m_tiles[it].header->verts;
return m_tiles[it].verts;
}
const dtLink* dtNavMesh::getPolyLinksByRef(dtPolyRef ref) const
@ -2270,7 +2274,7 @@ const dtLink* dtNavMesh::getPolyLinksByRef(dtPolyRef ref) const
if (it >= (unsigned int)m_maxTiles) return 0;
if (m_tiles[it].salt != salt || m_tiles[it].header == 0) return 0;
if (ip >= (unsigned int)m_tiles[it].header->polyCount) return 0;
return m_tiles[it].header->links;
return m_tiles[it].links;
}
bool dtNavMesh::isInClosedList(dtPolyRef ref) const

View File

@ -16,10 +16,10 @@
8D1107260486CEB800E47090 /* Recast */,
);
breakpoints = (
6B84BDF5110DF38D007D997B /* DetourNavMesh.cpp:254 */,
6B84BDF5110DF38D007D997B /* DetourNavMesh.cpp:253 */,
6B84BE1D110DF6C6007D997B /* Sample_TileMesh.cpp:481 */,
6B324BE6111C511800EBD2FD /* BoxVolumeTool.cpp:27 */,
6BE91065112A84B700F5C17A /* DetourNavMesh.cpp:1353 */,
6BE91065112A84B700F5C17A /* DetourNavMesh.cpp:1356 */,
);
codeSenseManager = 6B8632AA0F78115100E2684A /* Code sense */;
executables = (
@ -245,6 +245,37 @@
6B8036EF113BB180005ED67B /* PBXTextBookmark */ = 6B8036EF113BB180005ED67B /* PBXTextBookmark */;
6B8036F0113BB180005ED67B /* PBXTextBookmark */ = 6B8036F0113BB180005ED67B /* PBXTextBookmark */;
6B8036F1113BB180005ED67B /* PBXTextBookmark */ = 6B8036F1113BB180005ED67B /* PBXTextBookmark */;
6B8036F6113BB746005ED67B /* PBXTextBookmark */ = 6B8036F6113BB746005ED67B /* PBXTextBookmark */;
6B8036F7113BB746005ED67B /* PBXTextBookmark */ = 6B8036F7113BB746005ED67B /* PBXTextBookmark */;
6B8036F8113BB746005ED67B /* PBXTextBookmark */ = 6B8036F8113BB746005ED67B /* PBXTextBookmark */;
6B8036F9113BB746005ED67B /* PBXTextBookmark */ = 6B8036F9113BB746005ED67B /* PBXTextBookmark */;
6B8036FA113BB746005ED67B /* PBXTextBookmark */ = 6B8036FA113BB746005ED67B /* PBXTextBookmark */;
6B8036FB113BB746005ED67B /* PBXTextBookmark */ = 6B8036FB113BB746005ED67B /* PBXTextBookmark */;
6B8036FC113BB746005ED67B /* PBXTextBookmark */ = 6B8036FC113BB746005ED67B /* PBXTextBookmark */;
6B8036FD113BB746005ED67B /* PBXTextBookmark */ = 6B8036FD113BB746005ED67B /* PBXTextBookmark */;
6B8036FE113BB746005ED67B /* PBXTextBookmark */ = 6B8036FE113BB746005ED67B /* PBXTextBookmark */;
6B8036FF113BB746005ED67B /* PBXTextBookmark */ = 6B8036FF113BB746005ED67B /* PBXTextBookmark */;
6B803700113BB746005ED67B /* PBXTextBookmark */ = 6B803700113BB746005ED67B /* PBXTextBookmark */;
6B803701113BB746005ED67B /* PBXTextBookmark */ = 6B803701113BB746005ED67B /* PBXTextBookmark */;
6B803728113D1079005ED67B /* PBXTextBookmark */ = 6B803728113D1079005ED67B /* PBXTextBookmark */;
6B803729113D1079005ED67B /* PBXTextBookmark */ = 6B803729113D1079005ED67B /* PBXTextBookmark */;
6B80372A113D1079005ED67B /* PBXTextBookmark */ = 6B80372A113D1079005ED67B /* PBXTextBookmark */;
6B80372B113D1079005ED67B /* PBXTextBookmark */ = 6B80372B113D1079005ED67B /* PBXTextBookmark */;
6B80372C113D1079005ED67B /* PBXTextBookmark */ = 6B80372C113D1079005ED67B /* PBXTextBookmark */;
6B80372D113D1079005ED67B /* PBXTextBookmark */ = 6B80372D113D1079005ED67B /* PBXTextBookmark */;
6B80372E113D1079005ED67B /* PBXTextBookmark */ = 6B80372E113D1079005ED67B /* PBXTextBookmark */;
6B80372F113D1079005ED67B /* PBXTextBookmark */ = 6B80372F113D1079005ED67B /* PBXTextBookmark */;
6B803730113D1079005ED67B /* PBXTextBookmark */ = 6B803730113D1079005ED67B /* PBXTextBookmark */;
6B803731113D1079005ED67B /* PBXTextBookmark */ = 6B803731113D1079005ED67B /* PBXTextBookmark */;
6B803732113D1079005ED67B /* PBXTextBookmark */ = 6B803732113D1079005ED67B /* PBXTextBookmark */;
6B803733113D1079005ED67B /* PBXTextBookmark */ = 6B803733113D1079005ED67B /* PBXTextBookmark */;
6B803734113D1079005ED67B /* PBXTextBookmark */ = 6B803734113D1079005ED67B /* PBXTextBookmark */;
6B803735113D1079005ED67B /* PBXTextBookmark */ = 6B803735113D1079005ED67B /* PBXTextBookmark */;
6B803736113D1079005ED67B /* PBXTextBookmark */ = 6B803736113D1079005ED67B /* PBXTextBookmark */;
6B803737113D1079005ED67B /* PBXTextBookmark */ = 6B803737113D1079005ED67B /* PBXTextBookmark */;
6B803738113D1079005ED67B /* PBXTextBookmark */ = 6B803738113D1079005ED67B /* PBXTextBookmark */;
6B803739113D1079005ED67B /* PBXTextBookmark */ = 6B803739113D1079005ED67B /* PBXTextBookmark */;
6B80373A113D1079005ED67B /* PBXTextBookmark */ = 6B80373A113D1079005ED67B /* PBXTextBookmark */;
6B8DE70D10B01BBF00DF20FB = 6B8DE70D10B01BBF00DF20FB /* PBXTextBookmark */;
6BB700C310FA3AB1006DA0A6 = 6BB700C310FA3AB1006DA0A6 /* PBXTextBookmark */;
6BB7FDC010F37703006DA0A6 = 6BB7FDC010F37703006DA0A6 /* PBXTextBookmark */;
@ -374,9 +405,9 @@
};
6B1185F61006896B0018F96F /* DetourNode.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {815, 2176}}";
sepNavIntBoundsRect = "{{0, 0}, {815, 2016}}";
sepNavSelRange = "{1084, 0}";
sepNavVisRange = "{391, 852}";
sepNavVisRange = "{317, 973}";
};
};
6B1185FC10068B040018F96F /* DetourCommon.h */ = {
@ -530,14 +561,14 @@
};
6B25B6180FFA62BE004F1BC4 /* main.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {815, 14272}}";
sepNavSelRange = "{1353, 0}";
sepNavVisRange = "{516, 887}";
sepNavIntBoundsRect = "{{0, 0}, {815, 14448}}";
sepNavSelRange = "{8787, 0}";
sepNavVisRange = "{8599, 680}";
};
};
6B2AEC510FFB8946005BE9CC /* Sample_TileMesh.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {815, 1216}}";
sepNavIntBoundsRect = "{{0, 0}, {815, 1136}}";
sepNavSelRange = "{982, 117}";
sepNavVisRange = "{0, 1254}";
sepNavWindowFrame = "{{15, 78}, {1011, 695}}";
@ -545,9 +576,9 @@
};
6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {815, 14704}}";
sepNavSelRange = "{3747, 0}";
sepNavVisRange = "{3540, 552}";
sepNavIntBoundsRect = "{{0, 0}, {1223, 15120}}";
sepNavSelRange = "{12492, 13}";
sepNavVisRange = "{15543, 880}";
sepNavWindowFrame = "{{38, 30}, {1214, 722}}";
};
};
@ -1095,7 +1126,7 @@
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 532";
rLen = 0;
rLoc = 11502;
rLoc = 11512;
rType = 0;
vrLen = 681;
vrLoc = 12261;
@ -1105,7 +1136,7 @@
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 532";
rLen = 0;
rLoc = 11502;
rLoc = 11512;
rType = 0;
vrLen = 681;
vrLoc = 12261;
@ -1115,7 +1146,7 @@
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 532";
rLen = 0;
rLoc = 11502;
rLoc = 11512;
rType = 0;
vrLen = 681;
vrLoc = 12261;
@ -1125,7 +1156,7 @@
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 532";
rLen = 0;
rLoc = 11502;
rLoc = 11512;
rType = 0;
vrLen = 777;
vrLoc = 4081;
@ -1142,7 +1173,7 @@
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 532";
rLen = 0;
rLoc = 11502;
rLoc = 11512;
rType = 0;
vrLen = 777;
vrLoc = 4081;
@ -1202,7 +1233,7 @@
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 467";
rLen = 0;
rLoc = 11502;
rLoc = 11512;
rType = 0;
vrLen = 704;
vrLoc = 10946;
@ -1332,7 +1363,7 @@
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 467";
rLen = 0;
rLoc = 11502;
rLoc = 11512;
rType = 0;
vrLen = 704;
vrLoc = 10946;
@ -1446,7 +1477,7 @@
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 700";
rLen = 0;
rLoc = 16223;
rLoc = 16243;
rType = 0;
vrLen = 807;
vrLoc = 15747;
@ -1808,7 +1839,317 @@
vrLen = 1092;
vrLoc = 14776;
};
6B84BDF5110DF38D007D997B /* DetourNavMesh.cpp:254 */ = {
6B8036F6113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */;
name = "Sample_SoloMeshSimple.cpp: 501";
rLen = 0;
rLoc = 15545;
rType = 0;
vrLen = 974;
vrLoc = 14896;
};
6B8036F7113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6BB93CF410CFEC4500F74F2B /* RecastDump.h */;
name = "RecastDump.h: 16";
rLen = 0;
rLoc = 884;
rType = 0;
vrLen = 1324;
vrLoc = 0;
};
6B8036F8113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B2AEC510FFB8946005BE9CC /* Sample_TileMesh.h */;
name = "Sample_TileMesh.h: 22";
rLen = 117;
rLoc = 982;
rType = 0;
vrLen = 1254;
vrLoc = 0;
};
6B8036F9113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */;
name = "Sample_TileMesh.cpp: 518";
rLen = 13;
rLoc = 12492;
rType = 0;
vrLen = 880;
vrLoc = 15543;
};
6B8036FA113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */;
name = "Sample_SoloMeshTiled.cpp: 801";
rLen = 0;
rLoc = 23810;
rType = 0;
vrLen = 1088;
vrLoc = 23487;
};
6B8036FB113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 41";
rLen = 0;
rLoc = 1353;
rType = 0;
vrLen = 886;
vrLoc = 516;
};
6B8036FC113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */;
name = "Sample_SoloMeshSimple.cpp: 501";
rLen = 0;
rLoc = 15545;
rType = 0;
vrLen = 974;
vrLoc = 14896;
};
6B8036FD113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6BB93CF410CFEC4500F74F2B /* RecastDump.h */;
name = "RecastDump.h: 16";
rLen = 0;
rLoc = 884;
rType = 0;
vrLen = 1324;
vrLoc = 0;
};
6B8036FE113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B2AEC510FFB8946005BE9CC /* Sample_TileMesh.h */;
name = "Sample_TileMesh.h: 22";
rLen = 117;
rLoc = 982;
rType = 0;
vrLen = 1254;
vrLoc = 0;
};
6B8036FF113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */;
name = "Sample_TileMesh.cpp: 518";
rLen = 13;
rLoc = 12492;
rType = 0;
vrLen = 880;
vrLoc = 15543;
};
6B803700113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */;
name = "Sample_SoloMeshTiled.cpp: 801";
rLen = 0;
rLoc = 23810;
rType = 0;
vrLen = 1088;
vrLoc = 23487;
};
6B803701113BB746005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 304";
rLen = 0;
rLoc = 6784;
rType = 0;
vrLen = 676;
vrLoc = 8599;
};
6B803728113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 381";
rLen = 0;
rLoc = 8787;
rType = 0;
vrLen = 680;
vrLoc = 8599;
};
6B803729113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B1185F61006896B0018F96F /* DetourNode.h */;
name = "DetourNode.h: 32";
rLen = 0;
rLoc = 1084;
rType = 0;
vrLen = 973;
vrLoc = 317;
};
6B80372A113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 2131";
rLen = 0;
rLoc = 57960;
rType = 0;
vrLen = 975;
vrLoc = 56923;
};
6B80372B113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6BB93C7B10CFE1D500F74F2B /* DetourDebugDraw.cpp */;
name = "DetourDebugDraw.cpp: 468";
rLen = 0;
rLoc = 14205;
rType = 0;
vrLen = 756;
vrLoc = 13905;
};
6B80372C113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 393";
rLen = 0;
rLoc = 17252;
rType = 0;
vrLen = 1034;
vrLoc = 16661;
};
6B80372D113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */;
name = "main.cpp: 381";
rLen = 0;
rLoc = 8787;
rType = 0;
vrLen = 680;
vrLoc = 8599;
};
6B80372E113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B1185F61006896B0018F96F /* DetourNode.h */;
name = "DetourNode.h: 32";
rLen = 0;
rLoc = 1084;
rType = 0;
vrLen = 973;
vrLoc = 317;
};
6B80372F113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 139";
rLen = 0;
rLoc = 5771;
rType = 0;
vrLen = 1993;
vrLoc = 4032;
};
6B803730113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 573";
rLen = 0;
rLoc = 16342;
rType = 0;
vrLen = 1466;
vrLoc = 15532;
};
6B803731113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 131";
rLen = 0;
rLoc = 4994;
rType = 0;
vrLen = 1938;
vrLoc = 3931;
};
6B803732113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 708";
rLen = 0;
rLoc = 19277;
rType = 0;
vrLen = 605;
vrLoc = 19041;
};
6B803733113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 130";
rLen = 835;
rLoc = 4934;
rType = 0;
vrLen = 1938;
vrLoc = 3931;
};
6B803734113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 1171";
rLen = 1;
rLoc = 31412;
rType = 0;
vrLen = 894;
vrLoc = 30824;
};
6B803735113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 467";
rLen = 15;
rLoc = 20016;
rType = 0;
vrLen = 1726;
vrLoc = 19511;
};
6B803736113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 1770";
rLen = 0;
rLoc = 47952;
rType = 0;
vrLen = 919;
vrLoc = 47803;
};
6B803737113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 393";
rLen = 0;
rLoc = 17252;
rType = 0;
vrLen = 1034;
vrLoc = 16661;
};
6B803738113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 2131";
rLen = 0;
rLoc = 57960;
rType = 0;
vrLen = 975;
vrLoc = 56923;
};
6B803739113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6BB93C7B10CFE1D500F74F2B /* DetourDebugDraw.cpp */;
name = "DetourDebugDraw.cpp: 468";
rLen = 0;
rLoc = 14205;
rType = 0;
vrLen = 756;
vrLoc = 13905;
};
6B80373A113D1079005ED67B /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 36";
rLen = 0;
rLoc = 1449;
rType = 0;
vrLen = 1224;
vrLoc = 706;
};
6B84BDF5110DF38D007D997B /* DetourNavMesh.cpp:253 */ = {
isa = PBXFileBreakpoint;
actions = (
);
@ -1820,7 +2161,7 @@
functionName = "dtNavMesh::checkLinks(dtMeshTile* tile)";
hitCount = 0;
ignoreCount = 0;
lineNumber = 254;
lineNumber = 253;
location = Recast;
modificationTime = 289124310.659572;
state = 1;
@ -1910,9 +2251,9 @@
};
6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {817, 36224}}";
sepNavSelRange = "{31872, 0}";
sepNavVisRange = "{31353, 1135}";
sepNavIntBoundsRect = "{{0, 0}, {971, 36416}}";
sepNavSelRange = "{57960, 0}";
sepNavVisRange = "{56923, 975}";
sepNavWindowFrame = "{{15, 51}, {1214, 722}}";
};
};
@ -1925,9 +2266,9 @@
};
6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {845, 7952}}";
sepNavSelRange = "{17660, 0}";
sepNavVisRange = "{3977, 2045}";
sepNavIntBoundsRect = "{{0, 0}, {845, 7904}}";
sepNavSelRange = "{1449, 0}";
sepNavVisRange = "{706, 1224}";
};
};
6B8DE88C10B69E4C00DF20FB /* DetourNavMeshBuilder.h */ = {
@ -1942,7 +2283,7 @@
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = detail;
rLen = 0;
rLoc = 17751;
rLoc = 17764;
rType = 0;
vrLen = 1182;
vrLoc = 9676;
@ -1950,15 +2291,15 @@
6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {908, 10976}}";
sepNavSelRange = "{15421, 0}";
sepNavVisRange = "{14776, 1092}";
sepNavSelRange = "{15545, 0}";
sepNavVisRange = "{14896, 974}";
};
};
6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {815, 19372}}";
sepNavSelRange = "{2109, 0}";
sepNavVisRange = "{1871, 528}";
sepNavIntBoundsRect = "{{0, 0}, {1006, 19360}}";
sepNavSelRange = "{23810, 0}";
sepNavVisRange = "{23487, 1088}";
};
};
6BA1E88E10C7BFD3008007F6 /* Sample_SoloMeshSimple.h */ = {
@ -2127,9 +2468,9 @@
};
6BB93C7B10CFE1D500F74F2B /* DetourDebugDraw.cpp */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {815, 7984}}";
sepNavSelRange = "{14462, 0}";
sepNavVisRange = "{14041, 759}";
sepNavIntBoundsRect = "{{0, 0}, {815, 7872}}";
sepNavSelRange = "{14205, 0}";
sepNavVisRange = "{13905, 756}";
};
};
6BB93C7C10CFE1D500F74F2B /* RecastDebugDraw.cpp */ = {
@ -2142,7 +2483,7 @@
6BB93CF410CFEC4500F74F2B /* RecastDump.h */ = {
uiCtxt = {
sepNavIntBoundsRect = "{{0, 0}, {815, 555}}";
sepNavSelRange = "{1162, 20}";
sepNavSelRange = "{884, 0}";
sepNavVisRange = "{0, 1324}";
sepNavWindowFrame = "{{38, 15}, {1174, 737}}";
};
@ -2293,7 +2634,7 @@
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 406";
rLen = 62;
rLoc = 17660;
rLoc = 17673;
rType = 0;
vrLen = 1097;
vrLoc = 17341;
@ -2393,9 +2734,9 @@
fRef = 6BB93C7B10CFE1D500F74F2B /* DetourDebugDraw.cpp */;
name = "DetourDebugDraw.cpp: 479";
rLen = 0;
rLoc = 14462;
rLoc = 14352;
rType = 0;
vrLen = 759;
vrLen = 736;
vrLoc = 14041;
};
6BE91033112A7D9600F5C17A /* PBXTextBookmark */ = {
@ -2413,12 +2754,12 @@
fRef = 6BB93C7B10CFE1D500F74F2B /* DetourDebugDraw.cpp */;
name = "DetourDebugDraw.cpp: 479";
rLen = 0;
rLoc = 14462;
rLoc = 14352;
rType = 0;
vrLen = 759;
vrLen = 736;
vrLoc = 14041;
};
6BE91065112A84B700F5C17A /* DetourNavMesh.cpp:1353 */ = {
6BE91065112A84B700F5C17A /* DetourNavMesh.cpp:1356 */ = {
isa = PBXFileBreakpoint;
actions = (
);
@ -2430,7 +2771,7 @@
functionName = "dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef, const float* startPos, const float* endPos, dtQueryFilter* filter, dtPolyRef* path, const int maxPathSize)";
hitCount = 0;
ignoreCount = 0;
lineNumber = 1353;
lineNumber = 1356;
location = Recast;
modificationTime = 289124310.660328;
state = 1;
@ -2450,7 +2791,7 @@
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 406";
rLen = 0;
rLoc = 17660;
rLoc = 17673;
rType = 0;
vrLen = 2045;
vrLoc = 3977;
@ -2472,7 +2813,7 @@
rLen = 0;
rLoc = 2673;
rType = 0;
vrLen = 486;
vrLen = 264;
vrLoc = 2714;
};
6BE9108C112A898E00F5C17A /* PBXTextBookmark */ = {
@ -2480,7 +2821,7 @@
fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */;
name = "DetourNavMesh.h: 406";
rLen = 0;
rLoc = 17660;
rLoc = 17673;
rType = 0;
vrLen = 2045;
vrLoc = 3977;
@ -2510,7 +2851,7 @@
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 1168";
rLen = 0;
rLoc = 31682;
rLoc = 31254;
rType = 0;
vrLen = 846;
vrLoc = 31074;
@ -2620,7 +2961,7 @@
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 1294";
rLen = 0;
rLoc = 35472;
rLoc = 35006;
rType = 0;
vrLen = 990;
vrLoc = 34714;
@ -2850,7 +3191,7 @@
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 1167";
rLen = 0;
rLoc = 31794;
rLoc = 31362;
rType = 0;
vrLen = 1167;
vrLoc = 31321;
@ -2880,7 +3221,7 @@
fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */;
name = "DetourNavMesh.cpp: 1169";
rLen = 0;
rLoc = 31872;
rLoc = 31440;
rType = 0;
vrLen = 1135;
vrLoc = 31353;

View File

@ -281,14 +281,14 @@
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
<integer>39</integer>
<integer>35</integer>
<integer>13</integer>
<integer>12</integer>
<integer>1</integer>
<integer>0</integer>
</array>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
<string>{{0, 370}, {358, 643}}</string>
<string>{{0, 99}, {358, 643}}</string>
</dict>
<key>PBXTopSmartGroupGIDs</key>
<array/>
@ -323,7 +323,7 @@
<key>PBXProjectModuleGUID</key>
<string>6B8632A30F78115100E2684A</string>
<key>PBXProjectModuleLabel</key>
<string>Sample_SoloMeshSimple.cpp</string>
<string>DetourNavMesh.h</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@ -331,11 +331,11 @@
<key>PBXProjectModuleGUID</key>
<string>6B8632A40F78115100E2684A</string>
<key>PBXProjectModuleLabel</key>
<string>Sample_SoloMeshSimple.cpp</string>
<string>DetourNavMesh.h</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>6B8036F1113BB180005ED67B</string>
<string>6B80373A113D1079005ED67B</string>
<key>history</key>
<array>
<string>6B8DE70D10B01BBF00DF20FB</string>
@ -361,7 +361,6 @@
<string>6B324E3B11255BA700EBD2FD</string>
<string>6B324E7011256D1000EBD2FD</string>
<string>6B324E7111256D1000EBD2FD</string>
<string>6B324E7311256D1000EBD2FD</string>
<string>6B324F1311257F9A00EBD2FD</string>
<string>6B324F1E1125818400EBD2FD</string>
<string>6B324F1F1125818400EBD2FD</string>
@ -372,11 +371,8 @@
<string>6B324FCD1125A7BB00EBD2FD</string>
<string>6BE90FDE112A770600F5C17A</string>
<string>6BE90FDF112A770600F5C17A</string>
<string>6BE91032112A7D9600F5C17A</string>
<string>6BE91033112A7D9600F5C17A</string>
<string>6BE91085112A898E00F5C17A</string>
<string>6BE91087112A898E00F5C17A</string>
<string>6BE91095112A8AC800F5C17A</string>
<string>6BE910BA112A91D900F5C17A</string>
<string>6BE910BB112A91D900F5C17A</string>
<string>6BE910C2112A92A300F5C17A</string>
@ -385,22 +381,26 @@
<string>6BE910F11130617300F5C17A</string>
<string>6BE910F21130617300F5C17A</string>
<string>6BE910F31130617300F5C17A</string>
<string>6BE911011130618A00F5C17A</string>
<string>6BE9113A11379F5000F5C17A</string>
<string>6BE9113C11379F5000F5C17A</string>
<string>6B803699113BAA82005ED67B</string>
<string>6B80369C113BAA82005ED67B</string>
<string>6B8036B8113BAF47005ED67B</string>
<string>6B8036B9113BAF47005ED67B</string>
<string>6B8036BA113BAF47005ED67B</string>
<string>6B8036BB113BAF47005ED67B</string>
<string>6B8036BC113BAF47005ED67B</string>
<string>6B8036BE113BAF47005ED67B</string>
<string>6B8036CF113BAF79005ED67B</string>
<string>6B8036D0113BAF79005ED67B</string>
<string>6B8036EA113BB055005ED67B</string>
<string>6B8036EE113BB180005ED67B</string>
<string>6B8036EF113BB180005ED67B</string>
<string>6B8036F6113BB746005ED67B</string>
<string>6B8036F7113BB746005ED67B</string>
<string>6B8036F8113BB746005ED67B</string>
<string>6B8036F9113BB746005ED67B</string>
<string>6B8036FA113BB746005ED67B</string>
<string>6B803728113D1079005ED67B</string>
<string>6B803729113D1079005ED67B</string>
<string>6B80372A113D1079005ED67B</string>
<string>6B80372B113D1079005ED67B</string>
<string>6B80372C113D1079005ED67B</string>
</array>
<key>prevStack</key>
<array>
@ -476,6 +476,24 @@
<string>6B8036D4113BAF79005ED67B</string>
<string>6B8036D5113BAF79005ED67B</string>
<string>6B8036F0113BB180005ED67B</string>
<string>6B8036FC113BB746005ED67B</string>
<string>6B8036FD113BB746005ED67B</string>
<string>6B8036FE113BB746005ED67B</string>
<string>6B8036FF113BB746005ED67B</string>
<string>6B803700113BB746005ED67B</string>
<string>6B80372D113D1079005ED67B</string>
<string>6B80372E113D1079005ED67B</string>
<string>6B80372F113D1079005ED67B</string>
<string>6B803730113D1079005ED67B</string>
<string>6B803731113D1079005ED67B</string>
<string>6B803732113D1079005ED67B</string>
<string>6B803733113D1079005ED67B</string>
<string>6B803734113D1079005ED67B</string>
<string>6B803735113D1079005ED67B</string>
<string>6B803736113D1079005ED67B</string>
<string>6B803737113D1079005ED67B</string>
<string>6B803738113D1079005ED67B</string>
<string>6B803739113D1079005ED67B</string>
</array>
</dict>
<key>SplitCount</key>

View File

@ -797,8 +797,8 @@ bool Sample_SoloMeshTiled::handleBuild()
tbmin[1] = tileCfg.bmin[2];
tbmax[0] = tileCfg.bmax[0];
tbmax[1] = tileCfg.bmax[2];
int cid[256];// TODO: Make grow when returning too many items.
const int ncid = rcGetChunksInRect(chunkyMesh, tbmin, tbmax, cid, 256);
int cid[512];// TODO: Make grow when returning too many items.
const int ncid = rcGetChunksInRect(chunkyMesh, tbmin, tbmax, cid, 512);
if (!ncid)
continue;

View File

@ -299,7 +299,7 @@ int main(int argc, char *argv[])
bmin = sample->getBoundsMin();
bmax = sample->getBoundsMax();
}
else
else if (geom)
{
bmin = geom->getMeshBoundsMin();
bmax = geom->getMeshBoundsMax();
@ -694,7 +694,7 @@ int main(int argc, char *argv[])
bmin = sample->getBoundsMin();
bmax = sample->getBoundsMax();
}
else
else if (geom)
{
bmin = geom->getMeshBoundsMin();
bmax = geom->getMeshBoundsMax();
@ -811,7 +811,7 @@ int main(int argc, char *argv[])
bmin = sample->getBoundsMin();
bmax = sample->getBoundsMax();
}
else
else if (geom)
{
bmin = geom->getMeshBoundsMin();
bmax = geom->getMeshBoundsMax();