diff --git a/Detour/Include/DetourCommon.h b/Detour/Include/DetourCommon.h index 1881d80..5486098 100644 --- a/Detour/Include/DetourCommon.h +++ b/Detour/Include/DetourCommon.h @@ -113,7 +113,7 @@ inline bool vequal(const float* p0, const float* p1) return d < thr; } -inline int nextPow2(int v) +inline unsigned int nextPow2(unsigned int v) { v--; v |= v >> 1; @@ -125,6 +125,18 @@ inline int nextPow2(int v) return v; } +inline unsigned int ilog2(unsigned int v) +{ + unsigned int r; + unsigned int shift; + r = (v > 0xffff) << 4; v >>= r; + shift = (v > 0xff) << 3; v >>= shift; r |= shift; + shift = (v > 0xf) << 2; v >>= shift; r |= shift; + shift = (v > 0x3) << 1; v >>= shift; r |= shift; + r |= (v >> 1); + return r; +} + inline int align4(int x) { return (x+3) & ~3; } inline float vdot2D(const float* u, const float* v) diff --git a/Detour/Include/DetourDebugDraw.h b/Detour/Include/DetourDebugDraw.h index 8e1cfe4..6c46208 100755 --- a/Detour/Include/DetourDebugDraw.h +++ b/Detour/Include/DetourDebugDraw.h @@ -21,6 +21,7 @@ #include "DetourStatNavMesh.h" #include "DetourTileNavMesh.h" +#include "DetourNavMesh.h" void dtDebugDrawStatNavMeshPoly(const dtStatNavMesh* mesh, dtStatPolyRef ref, const float* col); void dtDebugDrawStatNavMeshBVTree(const dtStatNavMesh* mesh); @@ -29,4 +30,7 @@ void dtDebugDrawStatNavMesh(const dtStatNavMesh* mesh, bool drawClosedList = fal void dtDebugDrawTiledNavMesh(const dtTiledNavMesh* mesh); void dtDebugDrawTiledNavMeshPoly(const dtTiledNavMesh* mesh, dtTilePolyRef ref, const float* col); +void dtDebugDrawNavMesh(const dtNavMesh* mesh); +void dtDebugDrawNavMeshPoly(const dtNavMesh* mesh, dtPolyRef ref, const float* col); + #endif // DETOURDEBUGDRAW_H \ No newline at end of file diff --git a/Detour/Include/DetourNavMesh.h b/Detour/Include/DetourNavMesh.h new file mode 100644 index 0000000..e275709 --- /dev/null +++ b/Detour/Include/DetourNavMesh.h @@ -0,0 +1,343 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef DETOURNAVMESH_H +#define DETOURNAVMESH_H + +// Reference to navigation polygon. +typedef unsigned int dtPolyRef; + +// The bits used in the poly ref. +/*static const int DT_REF_SALT_BITS = 12; +static const int DT_REF_TILE_BITS = 12; +static const int DT_REF_POLY_BITS = 8; +static const int DT_REF_SALT_MASK = (1<> (m_polyBits+m_tileBits)) & ((1<> m_polyBits) - 1) & ((1<npolys; ++i) + { + const dtPoly* p = &header->polys[i]; + const dtPolyDetail* pd = &header->dmeshes[i]; + + for (int j = 0, nj = (int)p->nv; j < nj; ++j) + { + if (inner) + { + if (p->n[j] == 0) continue; + if (p->n[j] & 0x8000) + { + bool con = false; + for (int k = 0; k < p->nlinks; ++k) + { + if (header->links[p->links+k].e == j) + { + con = true; + break; + } + } + if (con) + glColor4ub(255,255,255,128); + else + glColor4ub(0,0,0,128); + } + else + glColor4ub(0,48,64,32); + } + else + { + if (p->n[j] != 0) continue; + } + + const float* v0 = &header->verts[p->v[j]*3]; + const float* v1 = &header->verts[p->v[(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->ntris; ++k) + { + const unsigned char* t = &header->dtris[(pd->tbase+k)*4]; + const float* tv[3]; + for (int m = 0; m < 3; ++m) + { + if (t[m] < p->nv) + tv[m] = &header->verts[p->v[t[m]]*3]; + else + tv[m] = &header->dverts[(pd->vbase+(t[m]-p->nv))*3]; + } + for (int m = 0, n = 2; m < 3; n=m++) + { + if (((t[3] >> (n*2)) & 0x3) == 0) continue; // Skip inner detail edges. + if (distancePtLine2d(tv[n],v0,v1) < thr && + distancePtLine2d(tv[m],v0,v1) < thr) + { + glVertex3fv(tv[n]); + glVertex3fv(tv[m]); + } + } + } + } + } + glEnd(); +} + +static void drawMeshTile(const dtMeshHeader* header) +{ + glBegin(GL_TRIANGLES); + for (int i = 0; i < header->npolys; ++i) + { + const dtPoly* p = &header->polys[i]; + const dtPolyDetail* pd = &header->dmeshes[i]; + + glColor4ub(0,196,255,64); + + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = &header->dtris[(pd->tbase+j)*4]; + for (int k = 0; k < 3; ++k) + { + if (t[k] < p->nv) + glVertex3fv(&header->verts[p->v[t[k]]*3]); + else + glVertex3fv(&header->dverts[(pd->vbase+t[k]-p->nv)*3]); + } + } + } + glEnd(); + + // Draw inter poly boundaries + glColor4ub(0,48,64,32); + glLineWidth(1.5f); + + drawPolyBoundaries(header, true); + + // Draw outer poly boundaries + glLineWidth(2.5f); + glColor4ub(0,48,64,220); + + drawPolyBoundaries(header, false); + + glLineWidth(1.0f); + + glPointSize(3.0f); + glColor4ub(0,0,0,196); + glBegin(GL_POINTS); + for (int i = 0; i < header->nverts; ++i) + { + const float* v = &header->verts[i*3]; + glVertex3f(v[0], v[1], v[2]); + } + glEnd(); + glPointSize(1.0f); + +/* + // Draw BV nodes. + const float col[] = { 1,1,1,0.5f }; + const float cs = 1.0f / header->bvquant; + glBegin(GL_LINES); + for (int i = 0; i < header->nbvtree; ++i) + { + const dtBVNode* n = &header->bvtree[i]; + if (n->i < 0) // Leaf indices are positive. + continue; + drawBoxWire(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, col); + } + glEnd(); +*/ + + // Draw portals + /* glBegin(GL_LINES); + + for (int i = 0; i < header->nportals[0]; ++i) + { + const dtTilePortal* p = &header->portals[0][i]; + if (p->ncon) + glColor4ub(255,255,255,192); + else + glColor4ub(255,0,0,64); + glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmin[0]); + glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmin[0]); + + glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmin[0]); + glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmax[0]); + + glVertex3f(header->bmax[0]-0.1f, p->bmax[1], p->bmax[0]); + glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmax[0]); + + glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmax[0]); + glVertex3f(header->bmax[0]-0.1f, p->bmin[1], p->bmin[0]); + } + for (int i = 0; i < header->nportals[1]; ++i) + { + const dtTilePortal* p = &header->portals[1][i]; + if (p->ncon) + glColor4ub(255,255,255,192); + else + glColor4ub(255,0,0,64); + glVertex3f(p->bmin[0], p->bmin[1], header->bmax[2]-0.1f); + glVertex3f(p->bmin[0], p->bmax[1], header->bmax[2]-0.1f); + + glVertex3f(p->bmin[0], p->bmax[1], header->bmax[2]-0.1f); + glVertex3f(p->bmax[0], p->bmax[1], header->bmax[2]-0.1f); + + glVertex3f(p->bmax[0], p->bmax[1], header->bmax[2]-0.1f); + glVertex3f(p->bmax[0], p->bmin[1], header->bmax[2]-0.1f); + + glVertex3f(p->bmax[0], p->bmin[1], header->bmax[2]-0.1f); + glVertex3f(p->bmin[0], p->bmin[1], header->bmax[2]-0.1f); + } + for (int i = 0; i < header->nportals[2]; ++i) + { + const dtTilePortal* p = &header->portals[2][i]; + if (p->ncon) + glColor4ub(255,255,255,192); + else + glColor4ub(255,0,0,64); + glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmin[0]); + glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmin[0]); + + glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmin[0]); + glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmax[0]); + + glVertex3f(header->bmin[0]+0.1f, p->bmax[1], p->bmax[0]); + glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmax[0]); + + glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmax[0]); + glVertex3f(header->bmin[0]+0.1f, p->bmin[1], p->bmin[0]); + } + for (int i = 0; i < header->nportals[3]; ++i) + { + const dtTilePortal* p = &header->portals[3][i]; + if (p->ncon) + glColor4ub(255,255,255,192); + else + glColor4ub(255,0,0,64); + glVertex3f(p->bmin[0], p->bmin[1], header->bmin[2]+0.1f); + glVertex3f(p->bmin[0], p->bmax[1], header->bmin[2]+0.1f); + + glVertex3f(p->bmin[0], p->bmax[1], header->bmin[2]+0.1f); + glVertex3f(p->bmax[0], p->bmax[1], header->bmin[2]+0.1f); + + glVertex3f(p->bmax[0], p->bmax[1], header->bmin[2]+0.1f); + glVertex3f(p->bmax[0], p->bmin[1], header->bmin[2]+0.1f); + + glVertex3f(p->bmax[0], p->bmin[1], header->bmin[2]+0.1f); + glVertex3f(p->bmin[0], p->bmin[1], header->bmin[2]+0.1f); + } + glEnd();*/ +} + +void dtDebugDrawNavMesh(const dtNavMesh* mesh) +{ + if (!mesh) return; + + for (int i = 0; i < mesh->getMaxTiles(); ++i) + { + const dtMeshTile* tile = mesh->getTile(i); + if (!tile->header) continue; + drawMeshTile(tile->header); + } +} + + + +void dtDebugDrawNavMeshPoly(const dtNavMesh* mesh, dtPolyRef ref, const float* col) +{ + int ip = 0; + const dtMeshTile* tile = mesh->getTileByRef(ref, &ip); + if (!tile) + return; + const dtMeshHeader* header = tile->header; + const dtPoly* p = &header->polys[ip]; + const dtPolyDetail* pd = &header->dmeshes[ip]; + + glColor4f(col[0],col[1],col[2],0.25f); + + glBegin(GL_TRIANGLES); + for (int i = 0; i < pd->ntris; ++i) + { + const unsigned char* t = &header->dtris[(pd->tbase+i)*4]; + for (int j = 0; j < 3; ++j) + { + if (t[j] < p->nv) + glVertex3fv(&header->verts[p->v[t[j]]*3]); + else + glVertex3fv(&header->dverts[(pd->vbase+t[j]-p->nv)*3]); + } + } + glEnd(); +} + diff --git a/Detour/Source/DetourNavMesh.cpp b/Detour/Source/DetourNavMesh.cpp new file mode 100644 index 0000000..29a0e9d --- /dev/null +++ b/Detour/Source/DetourNavMesh.cpp @@ -0,0 +1,1530 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#include +#include +#include +#include "DetourNavMesh.h" +#include "DetourNode.h" +#include "DetourCommon.h" + + +static const unsigned short EXT_LINK = 0x8000; + +inline int opposite(int side) { return (side+2) & 0x3; } + +inline bool overlapBoxes(const float* amin, const float* amax, + const float* bmin, const float* bmax) +{ + bool overlap = true; + overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap; + overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap; + overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap; + return overlap; +} + +inline bool overlapRects(const float* amin, const float* amax, + const float* bmin, const float* bmax) +{ + bool overlap = true; + overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap; + overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap; + return overlap; +} + +static void calcRect(const float* va, const float* vb, + float* bmin, float* bmax, + int side, float padx, float pady) +{ + if ((side&1) == 0) + { + bmin[0] = min(va[2],vb[2]) + padx; + bmin[1] = min(va[1],vb[1]) - pady; + bmax[0] = max(va[2],vb[2]) - padx; + bmax[1] = max(va[1],vb[1]) + pady; + } + else + { + bmin[0] = min(va[0],vb[0]) + padx; + bmin[1] = min(va[1],vb[1]) - pady; + bmax[0] = max(va[0],vb[0]) - padx; + bmax[1] = max(va[1],vb[1]) + pady; + } +} + +inline int computeTileHash(int x, int y, const int mask) +{ + const unsigned int h1 = 0x8da6b343; // Large multiplicative constants; + const unsigned int h2 = 0xd8163841; // here arbitrarily chosen primes + unsigned int n = h1 * x + h2 * y; + return (int)(n & mask); +} + +////////////////////////////////////////////////////////////////////////////////////////// +dtNavMesh::dtNavMesh() : + m_tileSize(0), + m_portalHeight(0), + m_nextFree(0), + m_tmpLinks(0), + m_ntmpLinks(0), + m_nodePool(0), + m_openList(0), + m_posLookup(0), + m_tiles(0) +{ +} + +dtNavMesh::~dtNavMesh() +{ + for (int i = 0; i < m_maxTiles; ++i) + { + if (m_tiles[i].data && m_tiles[i].ownsData) + { + delete [] m_tiles[i].data; + m_tiles[i].data = 0; + m_tiles[i].dataSize = 0; + } + } + delete [] m_tmpLinks; + delete m_nodePool; + delete m_openList; + delete [] m_posLookup; + delete [] m_tiles; +} + +bool dtNavMesh::init(const float* orig, float tileSize, float portalHeight, + int maxTiles, int maxPolys, int maxNodes) +{ + vcopy(m_orig, orig); + m_tileSize = tileSize; + m_portalHeight = portalHeight; + + // Init tiles + m_maxTiles = maxTiles; + m_tileLutSize = nextPow2(maxTiles/4); + if (!m_tileLutSize) m_tileLutSize = 1; + m_tileLutMask = m_tileLutSize-1; + + m_tiles = new dtMeshTile[m_maxTiles]; + if (!m_tiles) + return false; + m_posLookup = new dtMeshTile*[m_tileLutSize]; + if (!m_posLookup) + return false; + memset(m_tiles, 0, sizeof(dtMeshTile)*m_maxTiles); + memset(m_posLookup, 0, sizeof(dtMeshTile*)*m_tileLutSize); + m_nextFree = 0; + for (int i = m_maxTiles-1; i >= 0; --i) + { + m_tiles[i].next = m_nextFree; + m_nextFree = &m_tiles[i]; + } + + if (!m_nodePool) + { + m_nodePool = new dtNodePool(maxNodes, nextPow2(maxNodes/4)); + if (!m_nodePool) + return false; + } + + if (!m_openList) + { + m_openList = new dtNodeQueue(maxNodes); + if (!m_openList) + return false; + } + + // Init ID generator values. + m_tileBits = max((unsigned int)1,ilog2(nextPow2((unsigned int)maxTiles))); + m_polyBits = max((unsigned int)1,ilog2(nextPow2((unsigned int)maxPolys))); + m_saltBits = 32 - m_tileBits - m_polyBits; + if (m_saltBits < 10) + return false; + + return true; +} + +////////////////////////////////////////////////////////////////////////////////////////// +int dtNavMesh::findConnectingPolys(const float* va, const float* vb, + dtMeshTile* tile, int side, + 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, m_portalHeight); + + // Remove links pointing to 'side' and compact the links array. + float bmin[2], bmax[2]; + unsigned short m = EXT_LINK | (unsigned short)side; + int n = 0; + + dtPolyRef base = getTileId(tile); + + for (int i = 0; i < h->npolys; ++i) + { + dtPoly* poly = &h->polys[i]; + for (int j = 0; j < poly->nv; ++j) + { + // Skip edges which do not point to the right side. + if (poly->n[j] != m) continue; + // Check if the segments touch. + const float* vc = &h->verts[poly->v[j]*3]; + const float* vd = &h->verts[poly->v[(j+1) % (int)poly->nv]*3]; + calcRect(vc,vd, bmin,bmax, side, 0.01f, m_portalHeight); + if (!overlapRects(amin,amax, bmin,bmax)) continue; + // Add return value. + if (n < maxcon) + { + conarea[n*2+0] = max(amin[0], bmin[0]); + conarea[n*2+1] = min(amax[0], bmax[0]); + con[n] = base | (unsigned int)i; + n++; + } + break; + } + } + return n; +} + +void dtNavMesh::removeExtLinks(dtMeshTile* tile, int side) +{ + if (!tile) return; + dtMeshHeader* h = tile->header; + + // Remove links pointing to 'side' and compact the links array. + dtLink* pool = m_tmpLinks; + int nlinks = 0; + for (int i = 0; i < h->npolys; ++i) + { + dtPoly* poly = &h->polys[i]; + int plinks = nlinks; + int nplinks = 0; + for (int j = 0; j < poly->nlinks; ++j) + { + dtLink* link = &h->links[poly->links+j]; + if ((int)link->side != side) + { + if (nlinks < h->maxlinks) + { + dtLink* dst = &pool[nlinks++]; + memcpy(dst, link, sizeof(dtLink)); + nplinks++; + } + } + } + poly->links = plinks; + poly->nlinks = nplinks; + } + h->nlinks = nlinks; + if (h->nlinks) + memcpy(h->links, m_tmpLinks, sizeof(dtLink)*nlinks); +} + +void dtNavMesh::buildExtLinks(dtMeshTile* tile, dtMeshTile* target, int side) +{ + if (!tile) return; + dtMeshHeader* h = tile->header; + + // Remove links pointing to 'side' and compact the links array. + dtLink* pool = m_tmpLinks; + int nlinks = 0; + for (int i = 0; i < h->npolys; ++i) + { + dtPoly* poly = &h->polys[i]; + int plinks = nlinks; + int nplinks = 0; + // Copy internal and other external links. + for (int j = 0; j < poly->nlinks; ++j) + { + dtLink* link = &h->links[poly->links+j]; + if ((int)link->side != side) + { + if (nlinks < h->maxlinks) + { + dtLink* dst = &pool[nlinks++]; + memcpy(dst, link, sizeof(dtLink)); + nplinks++; + } + } + } + // Create new links. + unsigned short m = EXT_LINK | (unsigned short)side; + for (int j = 0; j < poly->nv; ++j) + { + // Skip edges which do not point to the right side. + if (poly->n[j] != m) continue; + + // Create new links + const float* va = &h->verts[poly->v[j]*3]; + const float* vb = &h->verts[poly->v[(j+1)%(int)poly->nv]*3]; + dtPolyRef nei[4]; + float neia[4*2]; + int nnei = findConnectingPolys(va,vb, target, opposite(side), nei,neia,4); + for (int k = 0; k < nnei; ++k) + { + if (nlinks < h->maxlinks) + { + dtLink* link = &pool[nlinks++]; + link->ref = nei[k]; + link->p = (unsigned short)i; + link->e = (unsigned char)j; + link->side = (unsigned char)side; + + // Compress portal limits to a byte value. + if (side == 0 || side == 2) + { + const float lmin = min(va[2], vb[2]); + const float lmax = max(va[2], vb[2]); + link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + } + else + { + const float lmin = min(va[0], vb[0]); + const float lmax = max(va[0], vb[0]); + link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + } + nplinks++; + } + } + } + + poly->links = plinks; + poly->nlinks = nplinks; + } + h->nlinks = nlinks; + if (h->nlinks) + memcpy(h->links, m_tmpLinks, sizeof(dtLink)*nlinks); +} + +void dtNavMesh::buildIntLinks(dtMeshTile* tile) +{ + if (!tile) return; + dtMeshHeader* h = tile->header; + + dtPolyRef base = getTileId(tile); + dtLink* pool = h->links; + int nlinks = 0; + for (int i = 0; i < h->npolys; ++i) + { + dtPoly* poly = &h->polys[i]; + poly->links = nlinks; + poly->nlinks = 0; + for (int j = 0; j < poly->nv; ++j) + { + // Skip hard and non-internal edges. + if (poly->n[j] == 0 || (poly->n[j] & EXT_LINK)) continue; + + if (nlinks < h->maxlinks) + { + dtLink* link = &pool[nlinks++]; + link->ref = base | (unsigned int)(poly->n[j]-1); + link->p = (unsigned short)i; + link->e = (unsigned char)j; + link->side = 0xff; + link->bmin = link->bmax = 0; + poly->nlinks++; + } + } + } + h->nlinks = nlinks; +} + +bool dtNavMesh::addTileAt(int x, int y, unsigned char* data, int dataSize, bool ownsData) +{ + if (getTileAt(x,y)) + return false; + // Make sure there is enough space for new tile. + if (!m_nextFree) + return false; + // Make sure the data is in right format. + dtMeshHeader* header = (dtMeshHeader*)data; + if (header->magic != DT_NAVMESH_MAGIC) + return false; + if (header->version != DT_NAVMESH_VERSION) + return false; + + // Make sure the tmp link array is large enough. + if (header->maxlinks > m_ntmpLinks) + { + m_ntmpLinks = header->maxlinks; + delete [] m_tmpLinks; + m_tmpLinks = 0; + m_tmpLinks = new dtLink[m_ntmpLinks]; + } + if (!m_tmpLinks) + return false; + + // Allocate a tile. + dtMeshTile* tile = m_nextFree; + m_nextFree = tile->next; + tile->next = 0; + + // Insert tile into the position lut. + int h = computeTileHash(x,y,m_tileLutMask); + tile->next = m_posLookup[h]; + m_posLookup[h] = tile; + + // Patch header pointers. + const int headerSize = align4(sizeof(dtMeshHeader)); + const int vertsSize = align4(sizeof(float)*3*header->nverts); + const int polysSize = align4(sizeof(dtPoly)*header->npolys); + const int linksSize = align4(sizeof(dtLink)*(header->maxlinks)); + const int detailMeshesSize = align4(sizeof(dtPolyDetail)*header->ndmeshes); + const int detailVertsSize = align4(sizeof(float)*3*header->ndverts); + const int detailTrisSize = align4(sizeof(unsigned char)*4*header->ndtris); + const int bvtreeSize = header->nbvtree ? align4(sizeof(dtBVNode)*header->npolys*2) : 0; + + unsigned char* d = data + headerSize; + header->verts = (float*)d; d += vertsSize; + header->polys = (dtPoly*)d; d += polysSize; + header->links = (dtLink*)d; d += linksSize; + header->dmeshes = (dtPolyDetail*)d; d += detailMeshesSize; + header->dverts = (float*)d; d += detailVertsSize; + header->dtris = (unsigned char*)d; d += detailTrisSize; + header->bvtree = header->nbvtree ? (dtBVNode*)d : 0; d += bvtreeSize; + + // Init tile. + tile->header = header; + tile->x = x; + tile->y = y; + tile->data = data; + tile->dataSize = dataSize; + tile->ownsData = ownsData; + + buildIntLinks(tile); + + // Create connections connections. + for (int i = 0; i < 4; ++i) + { + dtMeshTile* nei = getNeighbourTileAt(x,y,i); + if (nei) + { + buildExtLinks(tile, nei, i); + buildExtLinks(nei, tile, opposite(i)); + } + } + + return true; +} + +dtMeshTile* dtNavMesh::getTileAt(int x, int y) +{ + // Find tile based on hash. + int h = computeTileHash(x,y,m_tileLutMask); + dtMeshTile* tile = m_posLookup[h]; + while (tile) + { + if (tile->x == x && tile->y == y) + return tile; + tile = tile->next; + } + return 0; +} + +int dtNavMesh::getMaxTiles() const +{ + return m_maxTiles; +} + +dtMeshTile* dtNavMesh::getTile(int i) +{ + return &m_tiles[i]; +} + +const dtMeshTile* dtNavMesh::getTile(int i) const +{ + return &m_tiles[i]; +} + +const dtMeshTile* dtNavMesh::getTileByRef(dtPolyRef ref, int* polyIndex) const +{ + unsigned int salt, it, ip; + dtDecodePolyId(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->npolys) return 0; + if (polyIndex) *polyIndex = (int)ip; + return &m_tiles[it]; +} + +dtMeshTile* dtNavMesh::getNeighbourTileAt(int x, int y, int side) +{ + switch (side) + { + case 0: x++; break; + case 1: y++; break; + case 2: x--; break; + case 3: y--; break; + }; + return getTileAt(x,y); +} + +bool dtNavMesh::removeTileAt(int x, int y, unsigned char** data, int* dataSize) +{ + // Remove tile from hash lookup. + int h = computeTileHash(x,y,m_tileLutMask); + dtMeshTile* prev = 0; + dtMeshTile* tile = m_posLookup[h]; + while (tile) + { + if (tile->x == x && tile->y == y) + { + if (prev) + prev->next = tile->next; + else + m_posLookup[h] = tile->next; + break; + } + prev = tile; + tile = tile->next; + } + if (!tile) + return false; + + // Remove connections to neighbour tiles. + for (int i = 0; i < 4; ++i) + { + dtMeshTile* nei = getNeighbourTileAt(x,y,i); + if (!nei) continue; + removeExtLinks(nei, opposite(i)); + } + + + // Reset tile. + if (tile->ownsData) + { + // Owns data + delete [] tile->data; + tile->data = 0; + tile->dataSize = 0; + if (data) *data = 0; + if (dataSize) *dataSize = 0; + } + else + { + if (data) *data = tile->data; + if (dataSize) *dataSize = tile->dataSize; + } + tile->header = 0; + tile->x = tile->y = 0; + tile->salt++; + + // Add to free list. + tile->next = m_nextFree; + m_nextFree = tile; + + return true; +} + + + +bool dtNavMesh::closestPointToPoly(dtPolyRef ref, const float* pos, float* closest) const +{ + unsigned int salt, it, ip; + dtDecodePolyId(ref, salt, it, ip); + if (it >= 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->npolys) return false; + const dtPoly* poly = &header->polys[ip]; + + float closestDistSqr = FLT_MAX; + const dtPolyDetail* pd = &header->dmeshes[ip]; + + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = &header->dtris[(pd->tbase+j)*4]; + const float* v[3]; + for (int k = 0; k < 3; ++k) + { + if (t[k] < poly->nv) + v[k] = &header->verts[poly->v[t[k]]*3]; + else + v[k] = &header->dverts[(pd->vbase+(t[k]-poly->nv))*3]; + } + float pt[3]; + closestPtPointTriangle(pt, pos, v[0], v[1], v[2]); + float d = vdistSqr(pos, pt); + if (d < closestDistSqr) + { + vcopy(closest, pt); + closestDistSqr = d; + } + } + + return true; +} + +bool dtNavMesh::getPolyHeight(dtPolyRef ref, const float* pos, float* height) const +{ + unsigned int salt, it, ip; + dtDecodePolyId(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; + + if (ip >= (unsigned int)header->npolys) return false; + const dtPoly* poly = &header->polys[ip]; + + const dtPolyDetail* pd = &header->dmeshes[ip]; + for (int j = 0; j < pd->ntris; ++j) + { + const unsigned char* t = &header->dtris[(pd->tbase+j)*4]; + const float* v[3]; + for (int k = 0; k < 3; ++k) + { + if (t[k] < poly->nv) + v[k] = &header->verts[poly->v[t[k]]*3]; + else + v[k] = &header->dverts[(pd->vbase+(t[k]-poly->nv))*3]; + } + float h; + if (closestHeightPointTriangle(pos, v[0], v[1], v[2], h)) + { + if (height) + *height = h; + return true; + } + } + + return false; +} + + +dtPolyRef dtNavMesh::findNearestPoly(const float* center, const float* extents) +{ + // Get nearby polygons from proximity grid. + dtPolyRef polys[128]; + int npolys = queryPolygons(center, extents, polys, 128); + + // Find nearest polygon amongst the nearby polygons. + dtPolyRef nearest = 0; + float nearestDistanceSqr = FLT_MAX; + for (int i = 0; i < npolys; ++i) + { + dtPolyRef ref = polys[i]; + float closest[3]; + if (!closestPointToPoly(ref, center, closest)) + continue; + float d = vdistSqr(center, closest); + if (d < nearestDistanceSqr) + { + nearestDistanceSqr = d; + nearest = ref; + } + } + + return nearest; +} + +dtPolyRef dtNavMesh::getTileId(dtMeshTile* tile) +{ + if (!tile) return 0; + const unsigned int it = tile - m_tiles; + return dtEncodePolyId(tile->salt, it, 0); +} + +int dtNavMesh::queryTilePolygons(dtMeshTile* tile, + const float* qmin, const float* qmax, + dtPolyRef* polys, const int maxPolys) +{ + const dtMeshHeader* header = tile->header; + if (header->bvtree) + { + const dtBVNode* node = &header->bvtree[0]; + const dtBVNode* end = &header->bvtree[header->nbvtree]; + + // 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]; + // Quantize + bmin[0] = (unsigned short)(header->bvquant * minx) & 0xfffe; + bmin[1] = (unsigned short)(header->bvquant * miny) & 0xfffe; + bmin[2] = (unsigned short)(header->bvquant * minz) & 0xfffe; + bmax[0] = (unsigned short)(header->bvquant * maxx + 1) | 1; + bmax[1] = (unsigned short)(header->bvquant * maxy + 1) | 1; + bmax[2] = (unsigned short)(header->bvquant * maxz + 1) | 1; + + // Traverse tree + dtPolyRef base = getTileId(tile); + int n = 0; + while (node < end) + { + bool overlap = checkOverlapBox(bmin, bmax, node->bmin, node->bmax); + bool isLeafNode = node->i >= 0; + + if (isLeafNode && overlap) + { + if (n < maxPolys) + polys[n++] = base | (dtPolyRef)node->i; + } + + if (overlap || isLeafNode) + node++; + else + { + const int escapeIndex = -node->i; + node += escapeIndex; + } + } + + return n; + } + else + { + float bmin[3], bmax[3]; + const dtMeshHeader* header = tile->header; + int n = 0; + dtPolyRef base = getTileId(tile); + for (int i = 0; i < header->npolys; ++i) + { + // Calc polygon bounds. + dtPoly* p = &header->polys[i]; + const float* v = &header->verts[p->v[0]*3]; + vcopy(bmin, v); + vcopy(bmax, v); + for (int j = 1; j < p->nv; ++j) + { + v = &header->verts[p->v[j]*3]; + vmin(bmin, v); + vmax(bmax, v); + } + if (overlapBoxes(qmin,qmax, bmin,bmax)) + { + if (n < maxPolys) + polys[n++] = base | (dtPolyRef)i; + } + } + return n; + } +} + +int dtNavMesh::queryPolygons(const float* center, const float* extents, + dtPolyRef* polys, const int maxPolys) +{ + float bmin[3], bmax[3]; + bmin[0] = center[0] - extents[0]; + bmin[1] = center[1] - extents[1]; + bmin[2] = center[2] - extents[2]; + + bmax[0] = center[0] + extents[0]; + bmax[1] = center[1] + extents[1]; + bmax[2] = center[2] + extents[2]; + + // Find tiles the query touches. + const int minx = (int)floorf((bmin[0]-m_orig[0]) / m_tileSize); + const int maxx = (int)ceilf((bmax[0]-m_orig[0]) / m_tileSize); + + const int miny = (int)floorf((bmin[2]-m_orig[2]) / m_tileSize); + const int maxy = (int)ceilf((bmax[2]-m_orig[2]) / m_tileSize); + + int n = 0; + for (int y = miny; y < maxy; ++y) + { + for (int x = minx; x < maxx; ++x) + { + dtMeshTile* tile = getTileAt(x,y); + if (!tile) continue; + n += queryTilePolygons(tile, bmin, bmax, polys+n, maxPolys-n); + if (n >= maxPolys) return n; + } + } + + printf("---\n"); + for (int i = 0; i < n; ++i) + { + unsigned int salt, it, ip; + dtDecodePolyId(polys[i], salt, it, ip); + printf("0x%08x s:%d t:%d p:%d\n", (unsigned int)polys[i], salt, it, ip); + } + + return n; +} + +int dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef, + const float* startPos, const float* endPos, + dtPolyRef* path, const int maxPathSize) +{ + if (!startRef || !endRef) + return 0; + + if (!maxPathSize) + return 0; + + if (!getPolyByRef(startRef) || !getPolyByRef(endRef)) + return 0; + + if (startRef == endRef) + { + path[0] = startRef; + return 1; + } + + if (!m_nodePool || !m_openList) + return 0; + + m_nodePool->clear(); + m_openList->clear(); + + static const float H_SCALE = 1.1f; // Heuristic scale. + + dtNode* startNode = m_nodePool->getNode(startRef); + startNode->pidx = 0; + startNode->cost = 0; + startNode->total = vdist(startPos, endPos) * H_SCALE; + startNode->id = startRef; + startNode->flags = DT_NODE_OPEN; + m_openList->push(startNode); + + dtNode* lastBestNode = startNode; + float lastBestNodeCost = startNode->total; + while (!m_openList->empty()) + { + dtNode* bestNode = m_openList->pop(); + + if (bestNode->id == endRef) + { + lastBestNode = bestNode; + break; + } + + // Get poly and tile. + unsigned int salt, it, ip; + dtDecodePolyId(bestNode->id, salt, it, ip); + // The API input has been cheked already, skip checking internal data. + const dtMeshHeader* header = m_tiles[it].header; + const dtPoly* poly = &header->polys[ip]; + + for (int i = 0; i < poly->nlinks; ++i) + { + dtPolyRef neighbour = header->links[poly->links+i].ref; + if (neighbour) + { + // Skip parent node. + if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour) + continue; + + dtNode* parent = bestNode; + dtNode newNode; + newNode.pidx = m_nodePool->getNodeIdx(parent); + newNode.id = neighbour; + + // Calculate cost. + float p0[3], p1[3]; + if (!parent->pidx) + vcopy(p0, startPos); + else + getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0); + getEdgeMidPoint(parent->id, newNode.id, p1); + newNode.cost = parent->cost + vdist(p0,p1); + // Special case for last node. + if (newNode.id == endRef) + newNode.cost += vdist(p1, endPos); + + // Heuristic + const float h = vdist(p1,endPos)*H_SCALE; + newNode.total = newNode.cost + h; + + dtNode* actualNode = m_nodePool->getNode(newNode.id); + if (!actualNode) + continue; + + if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) && + !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total)) + { + actualNode->flags &= ~DT_NODE_CLOSED; + actualNode->pidx = newNode.pidx; + actualNode->cost = newNode.cost; + actualNode->total = newNode.total; + + if (h < lastBestNodeCost) + { + lastBestNodeCost = h; + lastBestNode = actualNode; + } + + if (actualNode->flags & DT_NODE_OPEN) + { + m_openList->modify(actualNode); + } + else + { + actualNode->flags |= DT_NODE_OPEN; + m_openList->push(actualNode); + } + } + } + } + bestNode->flags |= DT_NODE_CLOSED; + } + + // Reverse the path. + dtNode* prev = 0; + dtNode* node = lastBestNode; + do + { + dtNode* next = m_nodePool->getNodeAtIdx(node->pidx); + node->pidx = m_nodePool->getNodeIdx(prev); + prev = node; + node = next; + } + while (node); + + // Store path + node = prev; + int n = 0; + do + { + path[n++] = node->id; + node = m_nodePool->getNodeAtIdx(node->pidx); + } + while (node && n < maxPathSize); + + return n; +} + +int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, + const dtPolyRef* path, const int pathSize, + float* straightPath, const int maxStraightPathSize) +{ + if (!maxStraightPathSize) + return 0; + + if (!path[0]) + return 0; + + int straightPathSize = 0; + + float closestStartPos[3]; + if (!closestPointToPoly(path[0], startPos, closestStartPos)) + return 0; + + // Add start point. + vcopy(&straightPath[straightPathSize*3], closestStartPos); + straightPathSize++; + if (straightPathSize >= maxStraightPathSize) + return straightPathSize; + + float closestEndPos[3]; + if (!closestPointToPoly(path[pathSize-1], endPos, closestEndPos)) + return 0; + + float portalApex[3], portalLeft[3], portalRight[3]; + + if (pathSize > 1) + { + vcopy(portalApex, closestStartPos); + vcopy(portalLeft, portalApex); + vcopy(portalRight, portalApex); + int apexIndex = 0; + int leftIndex = 0; + int rightIndex = 0; + + for (int i = 0; i < pathSize; ++i) + { + float left[3], right[3]; + if (i < pathSize-1) + { + // Next portal. + if (!getPortalPoints(path[i], path[i+1], left, right)) + { + if (!closestPointToPoly(path[i], endPos, closestEndPos)) + return 0; + vcopy(&straightPath[straightPathSize*3], closestEndPos); + straightPathSize++; + return straightPathSize; + } + } + else + { + // End of the path. + vcopy(left, closestEndPos); + vcopy(right, closestEndPos); + } + + // Right vertex. + if (vequal(portalApex, portalRight)) + { + vcopy(portalRight, right); + rightIndex = i; + } + else + { + if (triArea2D(portalApex, portalRight, right) <= 0.0f) + { + if (triArea2D(portalApex, portalLeft, right) > 0.0f) + { + vcopy(portalRight, right); + rightIndex = i; + } + else + { + vcopy(portalApex, portalLeft); + apexIndex = leftIndex; + + if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex)) + { + vcopy(&straightPath[straightPathSize*3], portalApex); + straightPathSize++; + if (straightPathSize >= maxStraightPathSize) + return straightPathSize; + } + + vcopy(portalLeft, portalApex); + vcopy(portalRight, portalApex); + leftIndex = apexIndex; + rightIndex = apexIndex; + + // Restart + i = apexIndex; + + continue; + } + } + } + + // Left vertex. + if (vequal(portalApex, portalLeft)) + { + vcopy(portalLeft, left); + leftIndex = i; + } + else + { + if (triArea2D(portalApex, portalLeft, left) >= 0.0f) + { + if (triArea2D(portalApex, portalRight, left) < 0.0f) + { + vcopy(portalLeft, left); + leftIndex = i; + } + else + { + vcopy(portalApex, portalRight); + apexIndex = rightIndex; + + if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex)) + { + vcopy(&straightPath[straightPathSize*3], portalApex); + straightPathSize++; + if (straightPathSize >= maxStraightPathSize) + return straightPathSize; + } + + vcopy(portalLeft, portalApex); + vcopy(portalRight, portalApex); + leftIndex = apexIndex; + rightIndex = apexIndex; + + // Restart + i = apexIndex; + + continue; + } + } + } + } + } + + // Add end point. + vcopy(&straightPath[straightPathSize*3], closestEndPos); + straightPathSize++; + + return straightPathSize; +} + +// Returns portal points between two polygons. +bool dtNavMesh::getPortalPoints(dtPolyRef from, dtPolyRef to, float* left, float* right) const +{ + unsigned int salt, it, ip; + dtDecodePolyId(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->npolys) return false; + const dtMeshHeader* fromHeader = m_tiles[it].header; + const dtPoly* fromPoly = &fromHeader->polys[ip]; + + for (int i = 0; i < fromPoly->nlinks; ++i) + { + const dtLink* link = &fromHeader->links[fromPoly->links+i]; + if (link->ref == to) + { + // Find portal vertices. + const int v0 = fromPoly->v[link->e]; + const int v1 = fromPoly->v[(link->e+1) % fromPoly->nv]; + vcopy(left, &fromHeader->verts[v0*3]); + vcopy(right, &fromHeader->verts[v1*3]); + // If the link is at tile boundary, clamp the vertices to + // the link width. + if (link->side == 0 || link->side == 2) + { + // Unpack portal limits. + const float smin = min(left[2],right[2]); + const float smax = max(left[2],right[2]); + const float s = (smax-smin) / 255.0f; + const float lmin = smin + link->bmin*s; + const float lmax = smin + link->bmax*s; + left[2] = max(left[2],lmin); + left[2] = min(left[2],lmax); + right[2] = max(right[2],lmin); + right[2] = min(right[2],lmax); + } + else if (link->side == 1 || link->side == 3) + { + // Unpack portal limits. + const float smin = min(left[0],right[0]); + const float smax = max(left[0],right[0]); + const float s = (smax-smin) / 255.0f; + const float lmin = smin + link->bmin*s; + const float lmax = smin + link->bmax*s; + left[0] = max(left[0],lmin); + left[0] = min(left[0],lmax); + right[0] = max(right[0],lmin); + right[0] = min(right[0],lmax); + } + return true; + } + } + return false; +} + +// Returns edge mid point between two polygons. +bool dtNavMesh::getEdgeMidPoint(dtPolyRef from, dtPolyRef to, float* mid) const +{ + float left[3], right[3]; + if (!getPortalPoints(from, to, left,right)) return false; + mid[0] = (left[0]+right[0])*0.5f; + mid[1] = (left[1]+right[1])*0.5f; + mid[2] = (left[2]+right[2])*0.5f; + return true; +} + +int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float* endPos, + float& t, dtPolyRef* path, const int pathSize) +{ + t = 0; + + if (!centerRef || !getPolyByRef(centerRef)) + return 0; + + dtPolyRef curRef = centerRef; + float verts[DT_VERTS_PER_POLYGON*3]; + int n = 0; + + while (curRef) + { + // Cast ray against current polygon. + + // The API input has been cheked already, skip checking internal data. + unsigned int salt, it, ip; + dtDecodePolyId(curRef, salt, it, ip); + const dtMeshHeader* header = m_tiles[it].header; + const dtPoly* poly = &header->polys[ip]; + + // Collect vertices. + int nv = 0; + for (int i = 0; i < (int)poly->nv; ++i) + { + vcopy(&verts[nv*3], &header->verts[poly->v[i]*3]); + nv++; + } + if (nv < 3) + { + // Hit bad polygon, report hit. + return n; + } + + float tmin, tmax; + int segMin, segMax; + if (!intersectSegmentPoly2D(startPos, endPos, verts, nv, tmin, tmax, segMin, segMax)) + { + // Could not hit the polygon, keep the old t and report hit. + return n; + } + // Keep track of furthest t so far. + if (tmax > t) + t = tmax; + + if (n < pathSize) + path[n++] = curRef; + + // Follow neighbours. + dtPolyRef nextRef = 0; + for (int i = 0; i < poly->nlinks; ++i) + { + const dtLink* link = &header->links[poly->links+i]; + if ((int)link->e == segMax) + { + // If the link is internal, just return the ref. + if (link->side == 0xff) + { + nextRef = link->ref; + break; + } + + // If the link is at tile boundary, + const int v0 = poly->v[link->e]; + const int v1 = poly->v[(link->e+1) % poly->nv]; + const float* left = &header->verts[v0*3]; + const float* right = &header->verts[v1*3]; + + // Check that the intersection lies inside the link portal. + if (link->side == 0 || link->side == 2) + { + // Calculate link size. + const float smin = min(left[2],right[2]); + const float smax = max(left[2],right[2]); + const float s = (smax-smin) / 255.0f; + const float lmin = smin + link->bmin*s; + const float lmax = smin + link->bmax*s; + // Find Z intersection. + float z = startPos[2] + (endPos[2]-startPos[2])*tmax; + if (z >= lmin && z <= lmax) + { + nextRef = link->ref; + break; + } + } + else if (link->side == 1 || link->side == 3) + { + // Calculate link size. + const float smin = min(left[0],right[0]); + const float smax = max(left[0],right[0]); + const float s = (smax-smin) / 255.0f; + const float lmin = smin + link->bmin*s; + const float lmax = smin + link->bmax*s; + // Find X intersection. + float x = startPos[0] + (endPos[0]-startPos[0])*tmax; + if (x >= lmin && x <= lmax) + { + nextRef = link->ref; + break; + } + } + } + } + + if (!nextRef) + { + // No neighbour, we hit a wall. + return n; + } + + // No hit, advance to neighbour polygon. + curRef = nextRef; + } + + return n; +} + +int dtNavMesh::findPolysAround(dtPolyRef centerRef, const float* centerPos, float radius, + dtPolyRef* resultRef, dtPolyRef* resultParent, float* resultCost, + const int maxResult) +{ + if (!centerRef) return 0; + if (!getPolyByRef(centerRef)) return 0; + if (!m_nodePool || !m_openList) return 0; + + m_nodePool->clear(); + m_openList->clear(); + + dtNode* startNode = m_nodePool->getNode(centerRef); + startNode->pidx = 0; + startNode->cost = 0; + startNode->total = 0; + startNode->id = centerRef; + startNode->flags = DT_NODE_OPEN; + m_openList->push(startNode); + + int n = 0; + if (n < maxResult) + { + if (resultRef) + resultRef[n] = startNode->id; + if (resultParent) + resultParent[n] = 0; + if (resultCost) + resultCost[n] = 0; + ++n; + } + + const float radiusSqr = sqr(radius); + + while (!m_openList->empty()) + { + dtNode* bestNode = m_openList->pop(); + + // Get poly and tile. + unsigned int salt, it, ip; + dtDecodePolyId(bestNode->id, salt, it, ip); + // The API input has been cheked already, skip checking internal data. + const dtMeshHeader* header = m_tiles[it].header; + const dtPoly* poly = &header->polys[ip]; + + for (int i = 0; i < poly->nlinks; ++i) + { + const dtLink* link = &header->links[poly->links+i]; + dtPolyRef neighbour = link->ref; + if (neighbour) + { + // Skip parent node. + if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour) + continue; + + // Calc distance to the edge. + const float* va = &header->verts[poly->v[link->e]*3]; + const float* vb = &header->verts[poly->v[(link->e+1)%poly->nv]*3]; + float tseg; + float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg); + + // If the circle is not touching the next polygon, skip it. + if (distSqr > radiusSqr) + continue; + + dtNode* parent = bestNode; + dtNode newNode; + newNode.pidx = m_nodePool->getNodeIdx(parent); + newNode.id = neighbour; + + // Cost + float p0[3], p1[3]; + if (!parent->pidx) + vcopy(p0, centerPos); + else + getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0); + getEdgeMidPoint(parent->id, newNode.id, p1); + newNode.total = parent->total + vdist(p0,p1); + + dtNode* actualNode = m_nodePool->getNode(newNode.id); + if (!actualNode) + continue; + + if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) && + !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total)) + { + actualNode->flags &= ~DT_NODE_CLOSED; + actualNode->pidx = newNode.pidx; + actualNode->total = newNode.total; + + if (actualNode->flags & DT_NODE_OPEN) + { + m_openList->modify(actualNode); + } + else + { + if (n < maxResult) + { + if (resultRef) + resultRef[n] = actualNode->id; + if (resultParent) + resultParent[n] = m_nodePool->getNodeAtIdx(actualNode->pidx)->id; + if (resultCost) + resultCost[n] = actualNode->total; + ++n; + } + actualNode->flags = DT_NODE_OPEN; + m_openList->push(actualNode); + } + } + } + } + } + + return n; +} + +float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos, float maxRadius, + float* hitPos, float* hitNormal) +{ + if (!centerRef) return 0; + if (!getPolyByRef(centerRef)) return 0; + if (!m_nodePool || !m_openList) return 0; + + m_nodePool->clear(); + m_openList->clear(); + + dtNode* startNode = m_nodePool->getNode(centerRef); + startNode->pidx = 0; + startNode->cost = 0; + startNode->total = 0; + startNode->id = centerRef; + startNode->flags = DT_NODE_OPEN; + m_openList->push(startNode); + + float radiusSqr = sqr(maxRadius); + + while (!m_openList->empty()) + { + dtNode* bestNode = m_openList->pop(); + + // Get poly and tile. + unsigned int salt, it, ip; + dtDecodePolyId(bestNode->id, salt, it, ip); + // The API input has been cheked already, skip checking internal data. + const dtMeshHeader* header = m_tiles[it].header; + const dtPoly* poly = &header->polys[ip]; + + // Hit test walls. + for (int i = 0, j = (int)poly->nv-1; i < (int)poly->nv; j = i++) + { + // Skip non-solid edges. + if (poly->n[j] & EXT_LINK) + { + // Tile border. + bool solid = true; + for (int i = 0; i < poly->nlinks; ++i) + { + const dtLink* link = &header->links[poly->links+i]; + if (link->e == j && link->ref != 0) + { + solid = false; + break; + } + } + if (!solid) continue; + } + else if (poly->n[j]) + { + // Internal edge + continue; + } + + // Calc distance to the edge. + const float* vj = &header->verts[poly->v[j]*3]; + const float* vi = &header->verts[poly->v[i]*3]; + float tseg; + float distSqr = distancePtSegSqr2D(centerPos, vj, vi, tseg); + + // Edge is too far, skip. + if (distSqr > radiusSqr) + continue; + + // Hit wall, update radius. + radiusSqr = distSqr; + // Calculate hit pos. + hitPos[0] = vj[0] + (vi[0] - vj[0])*tseg; + hitPos[1] = vj[1] + (vi[1] - vj[1])*tseg; + hitPos[2] = vj[2] + (vi[2] - vj[2])*tseg; + } + + for (int i = 0; i < poly->nlinks; ++i) + { + const dtLink* link = &header->links[poly->links+i]; + dtPolyRef neighbour = link->ref; + if (neighbour) + { + // Skip parent node. + if (bestNode->pidx && m_nodePool->getNodeAtIdx(bestNode->pidx)->id == neighbour) + continue; + + // Calc distance to the edge. + const float* va = &header->verts[poly->v[link->e]*3]; + const float* vb = &header->verts[poly->v[(link->e+1)%poly->nv]*3]; + float tseg; + float distSqr = distancePtSegSqr2D(centerPos, va, vb, tseg); + + // If the circle is not touching the next polygon, skip it. + if (distSqr > radiusSqr) + continue; + + dtNode* parent = bestNode; + dtNode newNode; + newNode.pidx = m_nodePool->getNodeIdx(parent); + newNode.id = neighbour; + + float p0[3], p1[3]; + if (!parent->pidx) + vcopy(p0, centerPos); + else + getEdgeMidPoint(m_nodePool->getNodeAtIdx(parent->pidx)->id, parent->id, p0); + getEdgeMidPoint(parent->id, newNode.id, p1); + newNode.total = parent->total + vdist(p0,p1); + + dtNode* actualNode = m_nodePool->getNode(newNode.id); + if (!actualNode) + continue; + + if (!((actualNode->flags & DT_NODE_OPEN) && newNode.total > actualNode->total) && + !((actualNode->flags & DT_NODE_CLOSED) && newNode.total > actualNode->total)) + { + actualNode->flags &= ~DT_NODE_CLOSED; + actualNode->pidx = newNode.pidx; + actualNode->total = newNode.total; + + if (actualNode->flags & DT_NODE_OPEN) + { + m_openList->modify(actualNode); + } + else + { + actualNode->flags = DT_NODE_OPEN; + m_openList->push(actualNode); + } + } + } + } + } + + // Calc hit normal. + vsub(hitNormal, centerPos, hitPos); + vnormalize(hitNormal); + + return sqrtf(radiusSqr); +} + +const dtPoly* dtNavMesh::getPolyByRef(dtPolyRef ref) const +{ + unsigned int salt, it, ip; + dtDecodePolyId(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->npolys) return 0; + return &m_tiles[it].header->polys[ip]; +} + +const float* dtNavMesh::getPolyVertsByRef(dtPolyRef ref) const +{ + unsigned int salt, it, ip; + dtDecodePolyId(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->npolys) return 0; + return m_tiles[it].header->verts; +} + +const dtLink* dtNavMesh::getPolyLinksByRef(dtPolyRef ref) const +{ + unsigned int salt, it, ip; + dtDecodePolyId(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->npolys) return 0; + return m_tiles[it].header->links; +} diff --git a/Detour/Source/DetourNavMeshBuilder.cpp b/Detour/Source/DetourNavMeshBuilder.cpp new file mode 100644 index 0000000..c5d92e8 --- /dev/null +++ b/Detour/Source/DetourNavMeshBuilder.cpp @@ -0,0 +1,408 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#include +#include +#include +#include "DetourNavMesh.h" +#include "DetourCommon.h" + + + +struct BVItem +{ + unsigned short bmin[3]; + unsigned short bmax[3]; + int i; +}; + +static int compareItemX(const void* va, const void* vb) +{ + const BVItem* a = (const BVItem*)va; + const BVItem* b = (const BVItem*)vb; + if (a->bmin[0] < b->bmin[0]) + return -1; + if (a->bmin[0] > b->bmin[0]) + return 1; + return 0; +} + +static int compareItemY(const void* va, const void* vb) +{ + const BVItem* a = (const BVItem*)va; + const BVItem* b = (const BVItem*)vb; + if (a->bmin[1] < b->bmin[1]) + return -1; + if (a->bmin[1] > b->bmin[1]) + return 1; + return 0; +} + +static int compareItemZ(const void* va, const void* vb) +{ + const BVItem* a = (const BVItem*)va; + const BVItem* b = (const BVItem*)vb; + if (a->bmin[2] < b->bmin[2]) + return -1; + if (a->bmin[2] > b->bmin[2]) + return 1; + return 0; +} + +static void calcExtends(BVItem* items, int nitems, int imin, int imax, + unsigned short* bmin, unsigned short* bmax) +{ + bmin[0] = items[imin].bmin[0]; + bmin[1] = items[imin].bmin[1]; + bmin[2] = items[imin].bmin[2]; + + bmax[0] = items[imin].bmax[0]; + bmax[1] = items[imin].bmax[1]; + bmax[2] = items[imin].bmax[2]; + + for (int i = imin+1; i < imax; ++i) + { + const BVItem& it = items[i]; + if (it.bmin[0] < bmin[0]) bmin[0] = it.bmin[0]; + if (it.bmin[1] < bmin[1]) bmin[1] = it.bmin[1]; + if (it.bmin[2] < bmin[2]) bmin[2] = it.bmin[2]; + + if (it.bmax[0] > bmax[0]) bmax[0] = it.bmax[0]; + if (it.bmax[1] > bmax[1]) bmax[1] = it.bmax[1]; + if (it.bmax[2] > bmax[2]) bmax[2] = it.bmax[2]; + } +} + +inline int longestAxis(unsigned short x, unsigned short y, unsigned short z) +{ + int axis = 0; + unsigned short maxVal = x; + if (y > maxVal) + { + axis = 1; + maxVal = y; + } + if (z > maxVal) + { + axis = 2; + maxVal = z; + } + return axis; +} + +static void subdivide(BVItem* items, int nitems, int imin, int imax, int& curNode, dtBVNode* nodes) +{ + int inum = imax - imin; + int icur = curNode; + + dtBVNode& node = nodes[curNode++]; + + if (inum == 1) + { + // Leaf + node.bmin[0] = items[imin].bmin[0]; + node.bmin[1] = items[imin].bmin[1]; + node.bmin[2] = items[imin].bmin[2]; + + node.bmax[0] = items[imin].bmax[0]; + node.bmax[1] = items[imin].bmax[1]; + node.bmax[2] = items[imin].bmax[2]; + + node.i = items[imin].i; + } + else + { + // Split + calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); + + int axis = longestAxis(node.bmax[0] - node.bmin[0], + node.bmax[1] - node.bmin[1], + node.bmax[2] - node.bmin[2]); + + if (axis == 0) + { + // Sort along x-axis + qsort(items+imin, inum, sizeof(BVItem), compareItemX); + } + else if (axis == 1) + { + // Sort along y-axis + qsort(items+imin, inum, sizeof(BVItem), compareItemY); + } + else + { + // Sort along z-axis + qsort(items+imin, inum, sizeof(BVItem), compareItemZ); + } + + int isplit = imin+inum/2; + + // Left + subdivide(items, nitems, imin, isplit, curNode, nodes); + // Right + subdivide(items, nitems, isplit, imax, curNode, nodes); + + int iescape = curNode - icur; + // Negative index means escape. + node.i = -iescape; + } +} + +static int createBVTree(const unsigned short* verts, const int nverts, + const unsigned short* polys, const int npolys, const int nvp, + float cs, float ch, + int nnodes, dtBVNode* nodes) +{ + // Build tree + BVItem* items = new BVItem[npolys]; + for (int i = 0; i < npolys; i++) + { + BVItem& it = items[i]; + it.i = i; + // Calc polygon bounds. + const unsigned short* p = &polys[i*nvp*2]; + it.bmin[0] = it.bmax[0] = verts[p[0]*3+0]; + it.bmin[1] = it.bmax[1] = verts[p[0]*3+1]; + it.bmin[2] = it.bmax[2] = verts[p[0]*3+2]; + + for (int j = 1; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + unsigned short x = verts[p[j]*3+0]; + unsigned short y = verts[p[j]*3+1]; + unsigned short z = verts[p[j]*3+2]; + + if (x < it.bmin[0]) it.bmin[0] = x; + if (y < it.bmin[1]) it.bmin[1] = y; + if (z < it.bmin[2]) it.bmin[2] = z; + + if (x > it.bmax[0]) it.bmax[0] = x; + if (y > it.bmax[1]) it.bmax[1] = y; + if (z > it.bmax[2]) it.bmax[2] = z; + } + // Remap y + it.bmin[1] = (unsigned short)floorf((float)it.bmin[1]*ch/cs); + it.bmax[1] = (unsigned short)ceilf((float)it.bmax[1]*ch/cs); + } + + int curNode = 0; + subdivide(items, npolys, 0, npolys, curNode, nodes); + + delete [] items; + + return curNode; +} + + +bool dtCreateNavMeshData(const unsigned short* verts, const int nverts, + const unsigned short* polys, const int npolys, const int nvp, + const unsigned short* dmeshes, const float* dverts, const int ndverts, + const unsigned char* dtris, const int ndtris, + const float* bmin, const float* bmax, float cs, float ch, int tileSize, int walkableClimb, + unsigned char** outData, int* outDataSize) +{ + if (nvp != DT_VERTS_PER_POLYGON) + return false; + if (nverts >= 0xffff) + return false; + + if (!nverts) + return false; + if (!npolys) + return false; + if (!dmeshes || !dverts || ! dtris) + return false; + + // Find portal edges which are at tile borders. + int nedges = 0; + int nportals = 0; + for (int i = 0; i < npolys; ++i) + { + const unsigned short* p = &polys[i*2*nvp]; + for (int j = 0; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + int nj = j+1; + if (nj >= nvp || p[nj] == 0xffff) nj = 0; + const unsigned short* va = &verts[p[j]*3]; + const unsigned short* vb = &verts[p[nj]*3]; + + nedges++; + + if (va[0] == tileSize && vb[0] == tileSize) + nportals++; // x+ + else if (va[2] == tileSize && vb[2] == tileSize) + nportals++; // z+ + else if (va[0] == 0 && vb[0] == 0) + nportals++; // x- + else if (va[2] == 0 && vb[2] == 0) + nportals++; // z- + } + } + + const int maxLinks = nedges + nportals*2; + + + // Find unique detail vertices. + int uniqueDetailVerts = 0; + if (dmeshes) + { + for (int i = 0; i < npolys; ++i) + { + const unsigned short* p = &polys[i*nvp*2]; + int ndv = dmeshes[i*4+1]; + int nv = 0; + for (int j = 0; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + nv++; + } + ndv -= nv; + uniqueDetailVerts += ndv; + } + } + + // Calculate data size + const int headerSize = align4(sizeof(dtMeshHeader)); + const int vertsSize = align4(sizeof(float)*3*nverts); + const int polysSize = align4(sizeof(dtPoly)*npolys); + const int linksSize = align4(sizeof(dtLink)*maxLinks); + const int detailMeshesSize = align4(sizeof(dtPolyDetail)*npolys); + const int detailVertsSize = align4(sizeof(float)*3*uniqueDetailVerts); + const int detailTrisSize = align4(sizeof(unsigned char)*4*ndtris); + const int bvtreeSize = align4(sizeof(dtBVNode)*npolys*2); + + const int dataSize = headerSize + vertsSize + polysSize + linksSize + + detailMeshesSize + detailVertsSize + detailTrisSize + bvtreeSize; + unsigned char* data = new unsigned char[dataSize]; + if (!data) + return false; + memset(data, 0, dataSize); + + unsigned char* d = data; + dtMeshHeader* header = (dtMeshHeader*)d; d += headerSize; + float* navVerts = (float*)d; d += vertsSize; + dtPoly* navPolys = (dtPoly*)d; d += polysSize; + d += linksSize; + dtPolyDetail* navDMeshes = (dtPolyDetail*)d; d += detailMeshesSize; + float* navDVerts = (float*)d; d += detailVertsSize; + unsigned char* navDTris = (unsigned char*)d; d += detailTrisSize; + dtBVNode* navBvtree = (dtBVNode*)d; d += bvtreeSize; + + + // Store header + header->magic = DT_NAVMESH_MAGIC; + header->version = DT_NAVMESH_VERSION; + header->npolys = npolys; + header->nverts = nverts; + header->maxlinks = maxLinks; + header->bmin[0] = bmin[0]; + header->bmin[1] = bmin[1]; + header->bmin[2] = bmin[2]; + header->bmax[0] = bmax[0]; + header->bmax[1] = bmax[1]; + header->bmax[2] = bmax[2]; + header->ndmeshes = npolys; + header->ndverts = uniqueDetailVerts; + header->ndtris = ndtris; + header->bvquant = 1.0f/cs; + + // Store vertices + for (int i = 0; i < nverts; ++i) + { + const unsigned short* iv = &verts[i*3]; + float* v = &navVerts[i*3]; + v[0] = bmin[0] + iv[0] * cs; + v[1] = bmin[1] + iv[1] * ch; + v[2] = bmin[2] + iv[2] * cs; + } + + // Store polygons + const unsigned short* src = polys; + for (int i = 0; i < npolys; ++i) + { + dtPoly* p = &navPolys[i]; + p->nv = 0; + for (int j = 0; j < nvp; ++j) + { + if (src[j] == 0xffff) break; + p->v[j] = src[j]; + p->n[j] = (src[nvp+j]+1) & 0xffff; + p->nv++; + } + src += nvp*2; + } + + // Store portal edges. + for (int i = 0; i < npolys; ++i) + { + dtPoly* poly = &navPolys[i]; + for (int j = 0; j < poly->nv; ++j) + { + int nj = j+1; + if (nj >= poly->nv) nj = 0; + + const unsigned short* va = &verts[poly->v[j]*3]; + const unsigned short* vb = &verts[poly->v[nj]*3]; + + if (va[0] == tileSize && vb[0] == tileSize) // x+ + poly->n[j] = 0x8000 | 0; + else if (va[2] == tileSize && vb[2] == tileSize) // z+ + poly->n[j] = 0x8000 | 1; + else if (va[0] == 0 && vb[0] == 0) // x- + poly->n[j] = 0x8000 | 2; + else if (va[2] == 0 && vb[2] == 0) // z- + poly->n[j] = 0x8000 | 3; + } + } + + // Store detail meshes and vertices. + // The nav polygon vertices are stored as the first vertices on each mesh. + // We compress the mesh data by skipping them and using the navmesh coordinates. + unsigned short vbase = 0; + for (int i = 0; i < npolys; ++i) + { + dtPolyDetail& dtl = navDMeshes[i]; + const int vb = dmeshes[i*4+0]; + const int ndv = dmeshes[i*4+1]; + const int nv = navPolys[i].nv; + dtl.vbase = vbase; + dtl.nverts = ndv-nv; + dtl.tbase = dmeshes[i*4+2]; + dtl.ntris = dmeshes[i*4+3]; + // Copy vertices except the first 'nv' verts which are equal to nav poly verts. + if (ndv-nv) + { + memcpy(&navDVerts[vbase*3], &dverts[(vb+nv)*3], sizeof(float)*3*(ndv-nv)); + vbase += ndv-nv; + } + } + // Store triangles. + memcpy(navDTris, dtris, sizeof(unsigned char)*4*ndtris); + + // Store and create BVtree. + // TODO: take detail mesh into account! use byte per bbox extent? + header->nbvtree = createBVTree(verts, nverts, polys, npolys, nvp, + cs, ch, npolys*2, navBvtree); + + *outData = data; + *outDataSize = dataSize; + + return true; +} diff --git a/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast b/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast index 79c9ca9..17cc4e7 100755 Binary files a/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast and b/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast differ diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser index bf37f1f..d3925dd 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser @@ -428,9 +428,359 @@ 6B8DE87F10B68A7500DF20FB /* PBXTextBookmark */ = 6B8DE87F10B68A7500DF20FB /* PBXTextBookmark */; 6B8DE88010B68A7500DF20FB /* PBXTextBookmark */ = 6B8DE88010B68A7500DF20FB /* PBXTextBookmark */; 6B8DE88110B68A7500DF20FB /* PBXTextBookmark */ = 6B8DE88110B68A7500DF20FB /* PBXTextBookmark */; + 6B8DE89910B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE89910B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE89A10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE89A10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE89B10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE89B10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE89C10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE89C10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE89D10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE89D10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE89E10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE89E10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE89F10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE89F10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A010B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A010B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A110B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A110B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A210B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A210B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A310B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A310B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A410B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A410B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A510B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A510B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A610B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A610B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A710B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A710B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A810B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A810B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8A910B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8A910B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8AA10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8AA10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8AB10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8AB10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8AC10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8AC10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8AD10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8AD10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8AE10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8AE10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8AF10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8AF10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B010B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B010B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B110B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B110B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B210B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B210B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B310B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B310B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B410B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B410B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B510B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B510B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B610B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B610B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B710B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B710B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B810B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B810B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8B910B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8B910B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8BA10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8BA10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8BB10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8BB10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8BC10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8BC10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8BD10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8BD10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8BE10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8BE10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8BF10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8BF10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C010B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C010B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C110B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C110B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C210B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C210B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C310B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C310B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C410B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C410B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C510B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C510B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C610B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C610B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C710B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C710B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C810B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C810B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8C910B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8C910B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8CA10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8CA10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8CB10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8CB10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8CC10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8CC10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8CD10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8CD10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8CE10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8CE10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8CF10B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8CF10B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D010B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D010B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D110B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D110B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D210B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D210B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D310B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D310B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D410B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D410B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D510B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D510B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D610B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D610B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D710B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D710B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D810B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D810B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8D910B6B3F800DF20FB /* PBXTextBookmark */ = 6B8DE8D910B6B3F800DF20FB /* PBXTextBookmark */; + 6B8DE8E610B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8E610B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8E710B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8E710B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8E810B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8E810B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8E910B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8E910B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8EA10B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8EA10B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8EB10B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8EB10B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8EC10B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8EC10B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8ED10B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8ED10B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8EE10B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8EE10B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8EF10B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8EF10B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8F010B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8F010B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8F110B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8F110B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8F210B6B59A00DF20FB /* PBXTextBookmark */ = 6B8DE8F210B6B59A00DF20FB /* PBXTextBookmark */; + 6B8DE8FB10B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE8FB10B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE8FC10B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE8FC10B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE8FD10B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE8FD10B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE8FE10B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE8FE10B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE8FF10B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE8FF10B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90010B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE90010B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90110B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE90110B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90210B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE90210B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90310B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE90310B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90410B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE90410B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90510B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE90510B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90610B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE90610B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90710B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE90710B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90810B6B76800DF20FB /* PBXTextBookmark */ = 6B8DE90810B6B76800DF20FB /* PBXTextBookmark */; + 6B8DE90910B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE90910B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE90A10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE90A10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE90B10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE90B10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE90C10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE90C10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE90D10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE90D10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE90E10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE90E10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE90F10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE90F10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91010B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91010B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91110B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91110B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91210B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91210B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91310B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91310B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91410B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91410B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91510B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91510B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91610B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91610B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91710B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91710B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91810B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91810B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91910B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91910B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91A10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91A10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91B10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91B10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91C10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91C10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91D10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91D10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91E10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91E10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE91F10B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE91F10B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE92010B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE92010B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE92110B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE92110B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE92210B6BAD500DF20FB /* PBXTextBookmark */ = 6B8DE92210B6BAD500DF20FB /* PBXTextBookmark */; + 6B8DE92310B6BBCC00DF20FB /* PBXTextBookmark */ = 6B8DE92310B6BBCC00DF20FB /* PBXTextBookmark */; + 6B8DE92410B6BC3B00DF20FB /* PBXTextBookmark */ = 6B8DE92410B6BC3B00DF20FB /* PBXTextBookmark */; + 6B8DE92B10B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE92B10B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE92C10B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE92C10B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE92D10B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE92D10B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE92E10B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE92E10B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE92F10B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE92F10B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE93010B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE93010B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE93110B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE93110B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE93210B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE93210B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE93310B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE93310B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE93410B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE93410B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE93510B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE93510B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE93610B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE93610B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE93710B6BCDA00DF20FB /* PBXTextBookmark */ = 6B8DE93710B6BCDA00DF20FB /* PBXTextBookmark */; + 6B8DE93810B6BCDD00DF20FB /* PBXTextBookmark */ = 6B8DE93810B6BCDD00DF20FB /* PBXTextBookmark */; + 6B8DE93910B6BD1300DF20FB /* PBXTextBookmark */ = 6B8DE93910B6BD1300DF20FB /* PBXTextBookmark */; + 6B8DE93A10B6BD1300DF20FB /* PBXTextBookmark */ = 6B8DE93A10B6BD1300DF20FB /* PBXTextBookmark */; + 6B8DE93B10B6BD1E00DF20FB /* PBXTextBookmark */ = 6B8DE93B10B6BD1E00DF20FB /* PBXTextBookmark */; + 6B8DE93C10B6BD1E00DF20FB /* PBXTextBookmark */ = 6B8DE93C10B6BD1E00DF20FB /* PBXTextBookmark */; + 6B8DE93D10B6BD1E00DF20FB /* PBXTextBookmark */ = 6B8DE93D10B6BD1E00DF20FB /* PBXTextBookmark */; + 6B8DE93E10B6BD1E00DF20FB /* PBXTextBookmark */ = 6B8DE93E10B6BD1E00DF20FB /* PBXTextBookmark */; + 6B8DE94610B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94610B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE94710B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94710B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE94810B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94810B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE94910B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94910B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE94A10B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94A10B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE94B10B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94B10B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE94C10B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94C10B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE94D10B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94D10B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE94E10B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94E10B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE94F10B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE94F10B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE95010B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE95010B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE95110B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE95110B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE95210B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE95210B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE95310B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE95310B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE95410B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE95410B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE95510B6BEDB00DF20FB /* PBXTextBookmark */ = 6B8DE95510B6BEDB00DF20FB /* PBXTextBookmark */; + 6B8DE95D10B6BF0100DF20FB /* PBXTextBookmark */ = 6B8DE95D10B6BF0100DF20FB /* PBXTextBookmark */; + 6B8DE95E10B6BF0100DF20FB /* PBXTextBookmark */ = 6B8DE95E10B6BF0100DF20FB /* PBXTextBookmark */; + 6B8DE95F10B6BF0100DF20FB /* PBXTextBookmark */ = 6B8DE95F10B6BF0100DF20FB /* PBXTextBookmark */; + 6B8DE96010B6BF0100DF20FB /* PBXTextBookmark */ = 6B8DE96010B6BF0100DF20FB /* PBXTextBookmark */; + 6B8DE96110B6BF0100DF20FB /* PBXTextBookmark */ = 6B8DE96110B6BF0100DF20FB /* PBXTextBookmark */; + 6B8DE96610B6BF2A00DF20FB /* PBXTextBookmark */ = 6B8DE96610B6BF2A00DF20FB /* PBXTextBookmark */; + 6B8DE96910B6BF6100DF20FB /* PBXTextBookmark */ = 6B8DE96910B6BF6100DF20FB /* PBXTextBookmark */; + 6B8DE96A10B6BF6100DF20FB /* PBXTextBookmark */ = 6B8DE96A10B6BF6100DF20FB /* PBXTextBookmark */; + 6B8DE96B10B6BF6100DF20FB /* PBXTextBookmark */ = 6B8DE96B10B6BF6100DF20FB /* PBXTextBookmark */; + 6B8DE96C10B6BF6100DF20FB /* PBXTextBookmark */ = 6B8DE96C10B6BF6100DF20FB /* PBXTextBookmark */; + 6B8DE96F10B6BF6900DF20FB /* PBXTextBookmark */ = 6B8DE96F10B6BF6900DF20FB /* PBXTextBookmark */; + 6B8DE97310B6C04900DF20FB /* PBXTextBookmark */ = 6B8DE97310B6C04900DF20FB /* PBXTextBookmark */; + 6B8DE97410B6C04900DF20FB /* PBXTextBookmark */ = 6B8DE97410B6C04900DF20FB /* PBXTextBookmark */; + 6B8DE97510B6C04900DF20FB /* PBXTextBookmark */ = 6B8DE97510B6C04900DF20FB /* PBXTextBookmark */; + 6B8DE97610B6C04900DF20FB /* PBXTextBookmark */ = 6B8DE97610B6C04900DF20FB /* PBXTextBookmark */; + 6B8DE97710B6C04900DF20FB /* PBXTextBookmark */ = 6B8DE97710B6C04900DF20FB /* PBXTextBookmark */; + 6B8DE97810B6C04900DF20FB /* PBXTextBookmark */ = 6B8DE97810B6C04900DF20FB /* PBXTextBookmark */; + 6B8DE97910B6C04900DF20FB /* PBXTextBookmark */ = 6B8DE97910B6C04900DF20FB /* PBXTextBookmark */; + 6B8DE97E10B6C08700DF20FB /* PBXTextBookmark */ = 6B8DE97E10B6C08700DF20FB /* PBXTextBookmark */; + 6B8DE97F10B6C0A100DF20FB /* PBXTextBookmark */ = 6B8DE97F10B6C0A100DF20FB /* PBXTextBookmark */; + 6B8DE98010B6C0A600DF20FB /* PBXTextBookmark */ = 6B8DE98010B6C0A600DF20FB /* PBXTextBookmark */; + 6B8DE98110B6C0A600DF20FB /* PBXTextBookmark */ = 6B8DE98110B6C0A600DF20FB /* PBXTextBookmark */; + 6B8DE98B10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE98B10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE98C10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE98C10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE98D10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE98D10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE98E10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE98E10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE98F10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE98F10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99010B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99010B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99110B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99110B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99210B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99210B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99310B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99310B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99410B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99410B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99510B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99510B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99610B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99610B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99710B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99710B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99810B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99810B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99910B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99910B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99A10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99A10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99B10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99B10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99C10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99C10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99D10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99D10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99E10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99E10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE99F10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE99F10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A010B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A010B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A110B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A110B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A210B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A210B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A310B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A310B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A410B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A410B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A510B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A510B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A610B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A610B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A710B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A710B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A810B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A810B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9A910B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9A910B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9AA10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9AA10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9AB10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9AB10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9AC10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9AC10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9AD10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9AD10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9AE10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9AE10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9AF10B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9AF10B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9B010B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9B010B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9B110B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9B110B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9B210B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9B210B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9B310B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9B310B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9B410B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9B410B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9B510B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9B510B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9B610B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9B610B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9B710B6C53B00DF20FB /* PBXTextBookmark */ = 6B8DE9B710B6C53B00DF20FB /* PBXTextBookmark */; + 6B8DE9BB10B6C61D00DF20FB /* PBXTextBookmark */ = 6B8DE9BB10B6C61D00DF20FB /* PBXTextBookmark */; + 6B8DE9BC10B6C61D00DF20FB /* PBXTextBookmark */ = 6B8DE9BC10B6C61D00DF20FB /* PBXTextBookmark */; + 6B8DE9BD10B6C61D00DF20FB /* PBXTextBookmark */ = 6B8DE9BD10B6C61D00DF20FB /* PBXTextBookmark */; + 6B8DE9BE10B6C61D00DF20FB /* PBXTextBookmark */ = 6B8DE9BE10B6C61D00DF20FB /* PBXTextBookmark */; + 6B8DE9C310B6C64100DF20FB /* PBXTextBookmark */ = 6B8DE9C310B6C64100DF20FB /* PBXTextBookmark */; + 6B8DE9C410B6C64100DF20FB /* PBXTextBookmark */ = 6B8DE9C410B6C64100DF20FB /* PBXTextBookmark */; + 6B8DE9C510B6C64100DF20FB /* PBXTextBookmark */ = 6B8DE9C510B6C64100DF20FB /* PBXTextBookmark */; + 6B8DE9C610B6C64100DF20FB /* PBXTextBookmark */ = 6B8DE9C610B6C64100DF20FB /* PBXTextBookmark */; + 6B8DE9CE10B6C75600DF20FB /* PBXTextBookmark */ = 6B8DE9CE10B6C75600DF20FB /* PBXTextBookmark */; + 6B8DE9CF10B6C75600DF20FB /* PBXTextBookmark */ = 6B8DE9CF10B6C75600DF20FB /* PBXTextBookmark */; + 6B8DE9D010B6C75600DF20FB /* PBXTextBookmark */ = 6B8DE9D010B6C75600DF20FB /* PBXTextBookmark */; + 6B8DE9D110B6C75600DF20FB /* PBXTextBookmark */ = 6B8DE9D110B6C75600DF20FB /* PBXTextBookmark */; + 6B8DE9D410B6C7DD00DF20FB /* PBXTextBookmark */ = 6B8DE9D410B6C7DD00DF20FB /* PBXTextBookmark */; + 6B8DE9D510B6C7DD00DF20FB /* PBXTextBookmark */ = 6B8DE9D510B6C7DD00DF20FB /* PBXTextBookmark */; + 6B8DE9D610B6C7DD00DF20FB /* PBXTextBookmark */ = 6B8DE9D610B6C7DD00DF20FB /* PBXTextBookmark */; + 6B8DE9D710B6C7DD00DF20FB /* PBXTextBookmark */ = 6B8DE9D710B6C7DD00DF20FB /* PBXTextBookmark */; + 6B8DE9DA10B6C83E00DF20FB /* PBXTextBookmark */ = 6B8DE9DA10B6C83E00DF20FB /* PBXTextBookmark */; + 6B8DE9DB10B6C83E00DF20FB /* PBXTextBookmark */ = 6B8DE9DB10B6C83E00DF20FB /* PBXTextBookmark */; + 6B8DE9DC10B6C83E00DF20FB /* PBXTextBookmark */ = 6B8DE9DC10B6C83E00DF20FB /* PBXTextBookmark */; + 6B8DE9E110B6C8BE00DF20FB /* PBXTextBookmark */ = 6B8DE9E110B6C8BE00DF20FB /* PBXTextBookmark */; + 6B8DE9E210B6C8BE00DF20FB /* PBXTextBookmark */ = 6B8DE9E210B6C8BE00DF20FB /* PBXTextBookmark */; + 6B8DE9E310B6C8BE00DF20FB /* PBXTextBookmark */ = 6B8DE9E310B6C8BE00DF20FB /* PBXTextBookmark */; + 6B8DE9E410B6C8BE00DF20FB /* PBXTextBookmark */ = 6B8DE9E410B6C8BE00DF20FB /* PBXTextBookmark */; + 6B8DE9E510B6C8BE00DF20FB /* PBXTextBookmark */ = 6B8DE9E510B6C8BE00DF20FB /* PBXTextBookmark */; + 6B8DE9E610B6C8BE00DF20FB /* PBXTextBookmark */ = 6B8DE9E610B6C8BE00DF20FB /* PBXTextBookmark */; + 6B8DE9EA10B6C97B00DF20FB /* PBXTextBookmark */ = 6B8DE9EA10B6C97B00DF20FB /* PBXTextBookmark */; + 6B8DE9EB10B6C97B00DF20FB /* PBXTextBookmark */ = 6B8DE9EB10B6C97B00DF20FB /* PBXTextBookmark */; + 6B8DE9EC10B6C97B00DF20FB /* PBXTextBookmark */ = 6B8DE9EC10B6C97B00DF20FB /* PBXTextBookmark */; + 6B8DE9ED10B6C97B00DF20FB /* PBXTextBookmark */ = 6B8DE9ED10B6C97B00DF20FB /* PBXTextBookmark */; + 6B8DE9EE10B6C97B00DF20FB /* PBXTextBookmark */ = 6B8DE9EE10B6C97B00DF20FB /* PBXTextBookmark */; + 6B8DE9EF10B6C97B00DF20FB /* PBXTextBookmark */ = 6B8DE9EF10B6C97B00DF20FB /* PBXTextBookmark */; + 6B8DE9F010B6C98D00DF20FB /* PBXTextBookmark */ = 6B8DE9F010B6C98D00DF20FB /* PBXTextBookmark */; + 6B8DE9F110B6C9A400DF20FB /* PBXTextBookmark */ = 6B8DE9F110B6C9A400DF20FB /* PBXTextBookmark */; + 6B8DE9F510B6C9B700DF20FB /* PBXTextBookmark */ = 6B8DE9F510B6C9B700DF20FB /* PBXTextBookmark */; + 6B8DE9F610B6C9B700DF20FB /* PBXTextBookmark */ = 6B8DE9F610B6C9B700DF20FB /* PBXTextBookmark */; + 6B8DE9F710B6C9B700DF20FB /* PBXTextBookmark */ = 6B8DE9F710B6C9B700DF20FB /* PBXTextBookmark */; + 6B8DE9F810B6C9B700DF20FB /* PBXTextBookmark */ = 6B8DE9F810B6C9B700DF20FB /* PBXTextBookmark */; + 6B8DE9F910B6C9B700DF20FB /* PBXTextBookmark */ = 6B8DE9F910B6C9B700DF20FB /* PBXTextBookmark */; + 6B8DE9FC10B6C9BD00DF20FB /* PBXTextBookmark */ = 6B8DE9FC10B6C9BD00DF20FB /* PBXTextBookmark */; + 6B8DEA0110B6CA1500DF20FB /* PBXTextBookmark */ = 6B8DEA0110B6CA1500DF20FB /* PBXTextBookmark */; + 6B8DEA0210B6CA1500DF20FB /* PBXTextBookmark */ = 6B8DEA0210B6CA1500DF20FB /* PBXTextBookmark */; + 6B8DEA0310B6CA1500DF20FB /* PBXTextBookmark */ = 6B8DEA0310B6CA1500DF20FB /* PBXTextBookmark */; + 6B8DEA0410B6CA1500DF20FB /* PBXTextBookmark */ = 6B8DEA0410B6CA1500DF20FB /* PBXTextBookmark */; + 6B8DEA0510B6CA1500DF20FB /* PBXTextBookmark */ = 6B8DEA0510B6CA1500DF20FB /* PBXTextBookmark */; + 6B8DEA0610B6CA1500DF20FB /* PBXTextBookmark */ = 6B8DEA0610B6CA1500DF20FB /* PBXTextBookmark */; + 6B8DEA0710B6CA1500DF20FB /* PBXTextBookmark */ = 6B8DEA0710B6CA1500DF20FB /* PBXTextBookmark */; + 6B8DEA0810B6CA1500DF20FB /* PBXTextBookmark */ = 6B8DEA0810B6CA1500DF20FB /* PBXTextBookmark */; + 6B8DEA0910B6CA1500DF20FB /* PBXTextBookmark */ = 6B8DEA0910B6CA1500DF20FB /* PBXTextBookmark */; + 6B8DEA0A10B6CA6E00DF20FB /* PBXTextBookmark */ = 6B8DEA0A10B6CA6E00DF20FB /* PBXTextBookmark */; + 6B8DEA0B10B6CA7500DF20FB /* PBXTextBookmark */ = 6B8DEA0B10B6CA7500DF20FB /* PBXTextBookmark */; + 6B8DEA0C10B6CA8700DF20FB /* PBXTextBookmark */ = 6B8DEA0C10B6CA8700DF20FB /* PBXTextBookmark */; + 6B8DEA0F10B6CAAD00DF20FB /* PBXTextBookmark */ = 6B8DEA0F10B6CAAD00DF20FB /* PBXTextBookmark */; + 6B8DEA1010B6CAAD00DF20FB /* PBXTextBookmark */ = 6B8DEA1010B6CAAD00DF20FB /* PBXTextBookmark */; + 6B8DEA1110B6CAAD00DF20FB /* PBXTextBookmark */ = 6B8DEA1110B6CAAD00DF20FB /* PBXTextBookmark */; + 6B8DEA1510B6CAF600DF20FB /* PBXTextBookmark */ = 6B8DEA1510B6CAF600DF20FB /* PBXTextBookmark */; + 6B8DEA1610B6CAF600DF20FB /* PBXTextBookmark */ = 6B8DEA1610B6CAF600DF20FB /* PBXTextBookmark */; + 6B8DEA1710B6CAF600DF20FB /* PBXTextBookmark */ = 6B8DEA1710B6CAF600DF20FB /* PBXTextBookmark */; + 6B8DEA1810B6CAF600DF20FB /* PBXTextBookmark */ = 6B8DEA1810B6CAF600DF20FB /* PBXTextBookmark */; + 6B8DEA1910B6CAF600DF20FB /* PBXTextBookmark */ = 6B8DEA1910B6CAF600DF20FB /* PBXTextBookmark */; + 6B8DEA1A10B6CB0600DF20FB /* PBXTextBookmark */ = 6B8DEA1A10B6CB0600DF20FB /* PBXTextBookmark */; + 6B8DEA1B10B6CB0D00DF20FB /* PBXTextBookmark */ = 6B8DEA1B10B6CB0D00DF20FB /* PBXTextBookmark */; + 6B8DEA1C10B6CB1100DF20FB /* PBXTextBookmark */ = 6B8DEA1C10B6CB1100DF20FB /* PBXTextBookmark */; + 6B8DEA1D10B6CB1100DF20FB /* PBXTextBookmark */ = 6B8DEA1D10B6CB1100DF20FB /* PBXTextBookmark */; + 6B8DEA1E10B6CB1300DF20FB /* PBXTextBookmark */ = 6B8DEA1E10B6CB1300DF20FB /* PBXTextBookmark */; + 6B8DEA1F10B6CB2E00DF20FB /* PBXTextBookmark */ = 6B8DEA1F10B6CB2E00DF20FB /* PBXTextBookmark */; + 6B8DEA2110B6CB3000DF20FB /* PBXTextBookmark */ = 6B8DEA2110B6CB3000DF20FB /* PBXTextBookmark */; + 6B8DEA2210B6CB3000DF20FB /* PBXTextBookmark */ = 6B8DEA2210B6CB3000DF20FB /* PBXTextBookmark */; + 6B8DEA2310B6CB3000DF20FB /* PBXTextBookmark */ = 6B8DEA2310B6CB3000DF20FB /* PBXTextBookmark */; + 6B8DEA2410B6CB3000DF20FB /* PBXTextBookmark */ = 6B8DEA2410B6CB3000DF20FB /* PBXTextBookmark */; + 6B8DEA2A10B6CB8A00DF20FB /* PBXTextBookmark */ = 6B8DEA2A10B6CB8A00DF20FB /* PBXTextBookmark */; + 6B8DEA2B10B6CB8A00DF20FB /* PBXTextBookmark */ = 6B8DEA2B10B6CB8A00DF20FB /* PBXTextBookmark */; + 6B8DEA2C10B6CB8A00DF20FB /* PBXTextBookmark */ = 6B8DEA2C10B6CB8A00DF20FB /* PBXTextBookmark */; + 6B8DEA2D10B6CB8A00DF20FB /* PBXTextBookmark */ = 6B8DEA2D10B6CB8A00DF20FB /* PBXTextBookmark */; + 6B8DEA2E10B6CB8A00DF20FB /* PBXTextBookmark */ = 6B8DEA2E10B6CB8A00DF20FB /* PBXTextBookmark */; + 6B8DEA2F10B6CB8A00DF20FB /* PBXTextBookmark */ = 6B8DEA2F10B6CB8A00DF20FB /* PBXTextBookmark */; + 6B8DEA3010B6CB8A00DF20FB /* PBXTextBookmark */ = 6B8DEA3010B6CB8A00DF20FB /* PBXTextBookmark */; + 6B8DEA3610B6CBC200DF20FB /* PBXTextBookmark */ = 6B8DEA3610B6CBC200DF20FB /* PBXTextBookmark */; + 6B8DEA3710B6CBC200DF20FB /* PBXTextBookmark */ = 6B8DEA3710B6CBC200DF20FB /* PBXTextBookmark */; + 6B8DEA3810B6CBC200DF20FB /* PBXTextBookmark */ = 6B8DEA3810B6CBC200DF20FB /* PBXTextBookmark */; + 6B8DEA3910B6CBC200DF20FB /* PBXTextBookmark */ = 6B8DEA3910B6CBC200DF20FB /* PBXTextBookmark */; + 6B8DEA3A10B6CBC200DF20FB /* PBXTextBookmark */ = 6B8DEA3A10B6CBC200DF20FB /* PBXTextBookmark */; + 6B8DEA3B10B6CBC200DF20FB /* PBXTextBookmark */ = 6B8DEA3B10B6CBC200DF20FB /* PBXTextBookmark */; + 6B8DEA3C10B6CBC200DF20FB /* PBXTextBookmark */ = 6B8DEA3C10B6CBC200DF20FB /* PBXTextBookmark */; + 6B8DEA3D10B6CBC200DF20FB /* PBXTextBookmark */ = 6B8DEA3D10B6CBC200DF20FB /* PBXTextBookmark */; + 6B8DEA3E10B6CBC200DF20FB /* PBXTextBookmark */ = 6B8DEA3E10B6CBC200DF20FB /* PBXTextBookmark */; + 6B8DEA4010B6CC0400DF20FB /* PBXTextBookmark */ = 6B8DEA4010B6CC0400DF20FB /* PBXTextBookmark */; + 6B8DEA4110B6CC0400DF20FB /* PBXTextBookmark */ = 6B8DEA4110B6CC0400DF20FB /* PBXTextBookmark */; + 6B8DEA4210B6CC0400DF20FB /* PBXTextBookmark */ = 6B8DEA4210B6CC0400DF20FB /* PBXTextBookmark */; + 6B8DEA4310B6CC0400DF20FB /* PBXTextBookmark */ = 6B8DEA4310B6CC0400DF20FB /* PBXTextBookmark */; + 6B8DEA4410B6CC0400DF20FB /* PBXTextBookmark */ = 6B8DEA4410B6CC0400DF20FB /* PBXTextBookmark */; + 6B8DEA4510B6CC0400DF20FB /* PBXTextBookmark */ = 6B8DEA4510B6CC0400DF20FB /* PBXTextBookmark */; + 6B8DEA4610B6CC0400DF20FB /* PBXTextBookmark */ = 6B8DEA4610B6CC0400DF20FB /* PBXTextBookmark */; + 6B8DEA4710B6CC0C00DF20FB /* PBXTextBookmark */ = 6B8DEA4710B6CC0C00DF20FB /* PBXTextBookmark */; + 6B8DEA4810B6CC0C00DF20FB /* PBXTextBookmark */ = 6B8DEA4810B6CC0C00DF20FB /* PBXTextBookmark */; + 6B8DEA4B10B6CC1600DF20FB /* PBXTextBookmark */ = 6B8DEA4B10B6CC1600DF20FB /* PBXTextBookmark */; + 6B8DEA4D10B6CC2600DF20FB /* PBXTextBookmark */ = 6B8DEA4D10B6CC2600DF20FB /* PBXTextBookmark */; + 6B8DEA4E10B6CC2600DF20FB /* PBXTextBookmark */ = 6B8DEA4E10B6CC2600DF20FB /* PBXTextBookmark */; + 6B8DEA4F10B6CC2600DF20FB /* PBXTextBookmark */ = 6B8DEA4F10B6CC2600DF20FB /* PBXTextBookmark */; + 6B8DEA5010B6CC5500DF20FB /* PBXTextBookmark */ = 6B8DEA5010B6CC5500DF20FB /* PBXTextBookmark */; + 6B8DEA5110B6CC5500DF20FB /* PBXTextBookmark */ = 6B8DEA5110B6CC5500DF20FB /* PBXTextBookmark */; + 6B8DEA5210B6CC5500DF20FB /* PBXTextBookmark */ = 6B8DEA5210B6CC5500DF20FB /* PBXTextBookmark */; + 6B8DEA5310B6CC5500DF20FB /* PBXTextBookmark */ = 6B8DEA5310B6CC5500DF20FB /* PBXTextBookmark */; + 6B8DEA5410B6CC6300DF20FB /* PBXTextBookmark */ = 6B8DEA5410B6CC6300DF20FB /* PBXTextBookmark */; + 6B8DEA5B10B6CD1D00DF20FB /* PBXTextBookmark */ = 6B8DEA5B10B6CD1D00DF20FB /* PBXTextBookmark */; + 6B8DEA5C10B6CD1D00DF20FB /* PBXTextBookmark */ = 6B8DEA5C10B6CD1D00DF20FB /* PBXTextBookmark */; + 6B8DEA6410B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6410B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6510B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6510B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6610B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6610B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6710B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6710B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6810B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6810B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6910B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6910B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6A10B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6A10B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6B10B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6B10B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6C10B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6C10B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6D10B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6D10B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6E10B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6E10B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA6F10B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA6F10B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA7010B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA7010B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA7110B6CF6400DF20FB /* PBXTextBookmark */ = 6B8DEA7110B6CF6400DF20FB /* PBXTextBookmark */; + 6B8DEA7410B6CF8400DF20FB /* PBXTextBookmark */ = 6B8DEA7410B6CF8400DF20FB /* PBXTextBookmark */; + 6B8DEA7710B6CFC900DF20FB /* PBXTextBookmark */ = 6B8DEA7710B6CFC900DF20FB /* PBXTextBookmark */; + 6B8DEA7810B6CFC900DF20FB /* PBXTextBookmark */ = 6B8DEA7810B6CFC900DF20FB /* PBXTextBookmark */; + 6B8DEA7910B6CFC900DF20FB /* PBXTextBookmark */ = 6B8DEA7910B6CFC900DF20FB /* PBXTextBookmark */; + 6B8DEA7A10B6CFC900DF20FB /* PBXTextBookmark */ = 6B8DEA7A10B6CFC900DF20FB /* PBXTextBookmark */; + 6B8DEA7B10B6CFC900DF20FB /* PBXTextBookmark */ = 6B8DEA7B10B6CFC900DF20FB /* PBXTextBookmark */; + 6B8DEA7C10B6CFC900DF20FB /* PBXTextBookmark */ = 6B8DEA7C10B6CFC900DF20FB /* PBXTextBookmark */; 6B9BE374107BC6A40036CC81 = 6B9BE374107BC6A40036CC81 /* PBXTextBookmark */; }; sourceControlManager = 6B8632A90F78115100E2684A /* Source Control */; + userBookmarkGroup = 6B8DE6F010A88F0500DF20FB /* PBXBookmarkGroup */; userBuildSettings = { }; }; @@ -455,7 +805,8 @@ hitCount = 0; ignoreCount = 0; lineNumber = 48; - modificationTime = 277989718.279558; + location = Recast; + modificationTime = 280415167.302964; state = 1; }; 6B0249ED10037C0A00CF7107 /* DetourTileNavMesh.cpp:1 */ = { @@ -471,7 +822,8 @@ hitCount = 0; ignoreCount = 0; lineNumber = 1; - modificationTime = 277989718.2777531; + location = Recast; + modificationTime = 280415167.303229; state = 1; }; 6B0249EF10037C0C00CF7107 /* DetourTileNavMesh.cpp:1 */ = { @@ -487,7 +839,8 @@ hitCount = 0; ignoreCount = 0; lineNumber = 1; - modificationTime = 277989718.27859; + location = Recast; + modificationTime = 280415167.303378; state = 1; }; 6B024AC01004AB3900CF7107 /* DetourTileNavMesh.cpp:1 */ = { @@ -503,7 +856,8 @@ hitCount = 0; ignoreCount = 0; lineNumber = 1; - modificationTime = 277989718.278908; + location = Recast; + modificationTime = 280415167.30352; state = 1; }; 6B092B920FFCC2AC0088D3A5 /* DetourTileNavMeshBuilder.h */ = { @@ -515,30 +869,30 @@ }; 6B092B930FFCC2BD0088D3A5 /* DetourTileNavMeshBuilder.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 3408}}"; - sepNavSelRange = "{995, 0}"; - sepNavVisRange = "{0, 1484}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 3568}}"; + sepNavSelRange = "{2809, 0}"; + sepNavVisRange = "{2502, 1013}"; }; }; 6B1185F41006895B0018F96F /* DetourNode.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {915, 2304}}"; sepNavSelRange = "{2972, 0}"; - sepNavVisRange = "{2826, 441}"; + sepNavVisRange = "{2683, 584}"; }; }; 6B1185F61006896B0018F96F /* DetourNode.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 2384}}"; - sepNavSelRange = "{1988, 0}"; - sepNavVisRange = "{1840, 386}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 2224}}"; + sepNavSelRange = "{2089, 0}"; + sepNavVisRange = "{1775, 492}"; }; }; 6B1185FC10068B040018F96F /* DetourCommon.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 2832}}"; - sepNavSelRange = "{3352, 6}"; - sepNavVisRange = "{3058, 508}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 2864}}"; + sepNavSelRange = "{3375, 0}"; + sepNavVisRange = "{3114, 675}"; }; }; 6B1185FD10068B150018F96F /* DetourCommon.cpp */ = { @@ -635,9 +989,9 @@ }; 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {922, 14512}}"; - sepNavSelRange = "{8474, 0}"; - sepNavVisRange = "{0, 1141}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 14608}}"; + sepNavSelRange = "{1401, 0}"; + sepNavVisRange = "{963, 932}"; }; }; 6B137C850F7FCC1100459200 /* RecastFilter.cpp */ = { @@ -706,16 +1060,16 @@ }; 6B25B6140FFA62BE004F1BC4 /* Sample.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 3120}}"; - sepNavSelRange = "{1280, 20}"; - sepNavVisRange = "{1158, 618}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 2832}}"; + sepNavSelRange = "{3158, 0}"; + sepNavVisRange = "{2145, 1081}"; }; }; 6B25B6150FFA62BE004F1BC4 /* Sample_StatMesh.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 5120}}"; - sepNavSelRange = "{8415, 0}"; - sepNavVisRange = "{7879, 892}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 5216}}"; + sepNavSelRange = "{6939, 0}"; + sepNavVisRange = "{6609, 726}"; }; }; 6B25B6160FFA62BE004F1BC4 /* Sample_StatMeshSimple.cpp */ = { @@ -727,24 +1081,24 @@ }; 6B25B6180FFA62BE004F1BC4 /* main.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 12560}}"; - sepNavSelRange = "{4378, 0}"; - sepNavVisRange = "{3996, 828}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 11888}}"; + sepNavSelRange = "{12743, 36}"; + sepNavVisRange = "{12381, 681}"; }; }; 6B2AEC510FFB8946005BE9CC /* Sample_TileMesh.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 1776}}"; - sepNavSelRange = "{2139, 16}"; - sepNavVisRange = "{441, 990}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 1840}}"; + sepNavSelRange = "{2447, 0}"; + sepNavVisRange = "{2084, 872}"; sepNavWindowFrame = "{{15, 78}, {1011, 695}}"; }; }; 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1223, 14672}}"; - sepNavSelRange = "{6334, 0}"; - sepNavVisRange = "{6103, 762}"; + sepNavIntBoundsRect = "{{0, 0}, {1111, 13952}}"; + sepNavSelRange = "{23237, 0}"; + sepNavVisRange = "{22586, 1458}"; }; }; 6B2AEC550FFB89E7005BE9CC /* Sample_StatMeshTiled.cpp */ = { @@ -757,22 +1111,22 @@ 6B2AEC570FFB89F4005BE9CC /* Sample_StatMeshTiled.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {915, 1568}}"; - sepNavSelRange = "{367, 0}"; - sepNavVisRange = "{484, 754}"; + sepNavSelRange = "{777, 0}"; + sepNavVisRange = "{270, 918}"; }; }; 6B2AEC580FFB8A68005BE9CC /* DetourTileNavMesh.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 5200}}"; - sepNavSelRange = "{4856, 0}"; - sepNavVisRange = "{4655, 1263}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 4976}}"; + sepNavSelRange = "{11301, 0}"; + sepNavVisRange = "{11793, 1250}"; }; }; 6B2AEC590FFB8A7A005BE9CC /* DetourTileNavMesh.cpp */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {915, 22304}}"; - sepNavSelRange = "{9687, 0}"; - sepNavVisRange = "{8764, 756}"; + sepNavSelRange = "{9271, 0}"; + sepNavVisRange = "{8764, 799}"; }; }; 6B3BFADD107A80E1006284CD /* PBXTextBookmark */ = { @@ -848,7 +1202,8 @@ hitCount = 0; ignoreCount = 0; lineNumber = 280; - modificationTime = 277989718.27825; + location = Recast; + modificationTime = 280415167.30428; state = 1; }; 6B555DAE100B211D00247EA3 /* imguiRenderGL.h */ = { @@ -885,7 +1240,8 @@ hitCount = 0; ignoreCount = 0; lineNumber = 622; - modificationTime = 277989718.27988; + location = Recast; + modificationTime = 280415167.304427; state = 1; }; 6B57D358108C66B200DDD053 /* PBXTextBookmark */ = { @@ -931,7 +1287,8 @@ hitCount = 0; ignoreCount = 0; lineNumber = 252; - modificationTime = 277989718.2803611; + location = Recast; + modificationTime = 280415167.304574; state = 1; }; 6B57D38F108C69E400DDD053 /* PBXTextBookmark */ = { @@ -956,7 +1313,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 55"; rLen = 0; - rLoc = 933; + rLoc = 961; rType = 0; vrLen = 562; vrLoc = 688; @@ -991,7 +1348,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 578"; rLen = 0; - rLoc = 12953; + rLoc = 13060; rType = 0; vrLen = 649; vrLoc = 12515; @@ -1305,6 +1662,13 @@ isa = PBXCodeSenseManager; indexTemplatePath = ""; }; + 6B8DE6F010A88F0500DF20FB /* PBXBookmarkGroup */ = { + isa = PBXBookmarkGroup; + children = ( + 6B8DE89210B6A4B900DF20FB /* PBXTextBookmark */, + ); + name = Root; + }; 6B8DE6FE10B01BBF00DF20FB /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 6B2AEC580FFB8A68005BE9CC /* DetourTileNavMesh.h */; @@ -1320,7 +1684,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 55"; rLen = 0; - rLoc = 933; + rLoc = 961; rType = 0; vrLen = 503; vrLoc = 688; @@ -1509,7 +1873,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 55"; rLen = 0; - rLoc = 933; + rLoc = 961; rType = 0; vrLen = 503; vrLoc = 688; @@ -2753,7 +3117,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 417"; rLen = 0; - rLoc = 11078; + rLoc = 11017; rType = 0; vrLen = 825; vrLoc = 10515; @@ -2763,7 +3127,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 609"; rLen = 7; - rLoc = 15904; + rLoc = 15843; rType = 0; vrLen = 1297; vrLoc = 15422; @@ -2780,7 +3144,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 609"; rLen = 7; - rLoc = 15904; + rLoc = 15843; rType = 0; vrLen = 1297; vrLoc = 15422; @@ -2870,7 +3234,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 256"; rLen = 0; - rLoc = 6334; + rLoc = 6313; rType = 0; vrLen = 762; vrLoc = 6103; @@ -3200,7 +3564,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 256"; rLen = 0; - rLoc = 6334; + rLoc = 6313; rType = 0; vrLen = 762; vrLoc = 6103; @@ -3270,7 +3634,7 @@ fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; name = "DetourDebugDraw.cpp: 330"; rLen = 28; - rLoc = 8312; + rLoc = 8370; rType = 0; vrLen = 566; vrLoc = 8078; @@ -3310,7 +3674,7 @@ fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; name = "DetourDebugDraw.cpp: 330"; rLen = 28; - rLoc = 8312; + rLoc = 8370; rType = 0; vrLen = 566; vrLoc = 8078; @@ -3700,7 +4064,7 @@ fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; name = "DetourCommon.h: 128"; rLen = 48; - rLoc = 3341; + rLoc = 3655; rType = 0; vrLen = 508; vrLoc = 3058; @@ -3710,7 +4074,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 55"; rLen = 0; - rLoc = 933; + rLoc = 961; rType = 0; vrLen = 487; vrLoc = 688; @@ -3750,7 +4114,7 @@ fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; name = "DetourCommon.h: 128"; rLen = 48; - rLoc = 3341; + rLoc = 3655; rType = 0; vrLen = 508; vrLoc = 3058; @@ -3760,7 +4124,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 216"; rLen = 0; - rLoc = 4378; + rLoc = 4486; rType = 0; vrLen = 634; vrLoc = 3996; @@ -3770,7 +4134,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 213"; rLen = 0; - rLoc = 4378; + rLoc = 4486; rType = 0; vrLen = 636; vrLoc = 3996; @@ -3780,7 +4144,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 213"; rLen = 0; - rLoc = 4378; + rLoc = 4486; rType = 0; vrLen = 242; vrLoc = 4273; @@ -3790,7 +4154,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 211"; rLen = 0; - rLoc = 4378; + rLoc = 4486; rType = 0; vrLen = 828; vrLoc = 3996; @@ -3800,7 +4164,7 @@ fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; name = "DetourCommon.h: 128"; rLen = 6; - rLoc = 3352; + rLoc = 3666; rType = 0; vrLen = 508; vrLoc = 3058; @@ -3838,7 +4202,7 @@ fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; name = "main.cpp: 211"; rLen = 0; - rLoc = 4378; + rLoc = 4486; rType = 0; vrLen = 828; vrLoc = 3996; @@ -3848,7 +4212,7 @@ fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; name = "DetourCommon.h: 128"; rLen = 6; - rLoc = 3352; + rLoc = 3666; rType = 0; vrLen = 508; vrLoc = 3058; @@ -3983,6 +4347,3523 @@ vrLen = 756; vrLoc = 8764; }; + 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1219, 24288}}"; + sepNavSelRange = "{18973, 0}"; + sepNavVisRange = "{18766, 208}"; + }; + }; + 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {915, 6384}}"; + sepNavSelRange = "{4582, 0}"; + sepNavVisRange = "{4585, 911}"; + }; + }; + 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1219, 5488}}"; + sepNavSelRange = "{11795, 0}"; + sepNavVisRange = "{11561, 491}"; + }; + }; + 6B8DE88C10B69E4C00DF20FB /* DetourNavMeshBuilder.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {915, 480}}"; + sepNavSelRange = "{646, 0}"; + sepNavVisRange = "{128, 1310}"; + }; + }; + 6B8DE89210B6A4B900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = detail; + rLen = 0; + rLoc = 10845; + rType = 0; + vrLen = 1182; + vrLoc = 9676; + }; + 6B8DE89910B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC590FFB8A7A005BE9CC /* DetourTileNavMesh.cpp */; + name = "DetourTileNavMesh.cpp: 341"; + rLen = 0; + rLoc = 9271; + rType = 0; + vrLen = 799; + vrLoc = 8764; + }; + 6B8DE89A10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B092B920FFCC2AC0088D3A5 /* DetourTileNavMeshBuilder.h */; + name = "DetourTileNavMeshBuilder.h: 29"; + rLen = 0; + rLoc = 1461; + rType = 0; + vrLen = 1461; + vrLoc = 0; + }; + 6B8DE89B10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B092B930FFCC2BD0088D3A5 /* DetourTileNavMeshBuilder.cpp */; + name = "DetourTileNavMeshBuilder.cpp: 94"; + rLen = 0; + rLoc = 2809; + rType = 0; + vrLen = 1013; + vrLoc = 2502; + }; + 6B8DE89C10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 163"; + rLen = 0; + rLoc = 6281; + rType = 0; + vrLen = 915; + vrLoc = 1051; + }; + 6B8DE89D10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC580FFB8A68005BE9CC /* DetourTileNavMesh.h */; + name = "DetourTileNavMesh.h: 266"; + rLen = 0; + rLoc = 11184; + rType = 0; + vrLen = 1319; + vrLoc = 10520; + }; + 6B8DE89E10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185F61006896B0018F96F /* DetourNode.h */; + name = "DetourNode.h: 84"; + rLen = 0; + rLoc = 2089; + rType = 0; + vrLen = 492; + vrLoc = 1775; + }; + 6B8DE89F10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 158"; + rLen = 0; + rLoc = 6210; + rType = 0; + vrLen = 1085; + vrLoc = 5466; + }; + 6B8DE8A010B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 443"; + rLen = 1; + rLoc = 12187; + rType = 0; + vrLen = 617; + vrLoc = 11471; + }; + 6B8DE8A110B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */; + name = "DetourDebugDraw.h: 22"; + rLen = 89; + rLoc = 972; + rType = 0; + vrLen = 1110; + vrLoc = 516; + }; + 6B8DE8A210B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: cannot convert 'dtPoly*' to 'const dtTilePoly*' in initialization"; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + rLen = 0; + rLoc = 744; + rType = 1; + }; + 6B8DE8A310B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC590FFB8A7A005BE9CC /* DetourTileNavMesh.cpp */; + name = "DetourTileNavMesh.cpp: 341"; + rLen = 0; + rLoc = 9271; + rType = 0; + vrLen = 799; + vrLoc = 8764; + }; + 6B8DE8A410B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B092B930FFCC2BD0088D3A5 /* DetourTileNavMeshBuilder.cpp */; + name = "DetourTileNavMeshBuilder.cpp: 18"; + rLen = 0; + rLoc = 918; + rType = 0; + vrLen = 1484; + vrLoc = 0; + }; + 6B8DE8A510B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B092B920FFCC2AC0088D3A5 /* DetourTileNavMeshBuilder.h */; + name = "DetourTileNavMeshBuilder.h: 29"; + rLen = 0; + rLoc = 1461; + rType = 0; + vrLen = 1461; + vrLoc = 0; + }; + 6B8DE8A610B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B092B930FFCC2BD0088D3A5 /* DetourTileNavMeshBuilder.cpp */; + name = "DetourTileNavMeshBuilder.cpp: 94"; + rLen = 0; + rLoc = 2809; + rType = 0; + vrLen = 1013; + vrLoc = 2502; + }; + 6B8DE8A710B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 163"; + rLen = 0; + rLoc = 6281; + rType = 0; + vrLen = 915; + vrLoc = 1051; + }; + 6B8DE8A810B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 109"; + rLen = 0; + rLoc = 2884; + rType = 0; + vrLen = 685; + vrLoc = 2783; + }; + 6B8DE8A910B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 109"; + rLen = 0; + rLoc = 2884; + rType = 0; + vrLen = 685; + vrLoc = 2783; + }; + 6B8DE8AA10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 105"; + rLen = 0; + rLoc = 2884; + rType = 0; + vrLen = 699; + vrLoc = 2783; + }; + 6B8DE8AB10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 104"; + rLen = 0; + rLoc = 2884; + rType = 0; + vrLen = 648; + vrLoc = 2521; + }; + 6B8DE8AC10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 115"; + rLen = 0; + rLoc = 2884; + rType = 0; + vrLen = 735; + vrLoc = 2813; + }; + 6B8DE8AD10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 122"; + rLen = 0; + rLoc = 2884; + rType = 0; + vrLen = 708; + vrLoc = 2815; + }; + 6B8DE8AE10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 121"; + rLen = 0; + rLoc = 2884; + rType = 0; + vrLen = 711; + vrLoc = 3084; + }; + 6B8DE8AF10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 166"; + rLen = 0; + rLoc = 2884; + rType = 0; + vrLen = 1087; + vrLoc = 3969; + }; + 6B8DE8B010B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 313"; + rLen = 0; + rLoc = 2884; + rType = 0; + vrLen = 803; + vrLoc = 8086; + }; + 6B8DE8B110B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 122"; + rLen = 0; + rLoc = 3569; + rType = 0; + vrLen = 729; + vrLoc = 3247; + }; + 6B8DE8B210B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 122"; + rLen = 0; + rLoc = 3569; + rType = 0; + vrLen = 729; + vrLoc = 3247; + }; + 6B8DE8B310B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1050"; + rLen = 0; + rLoc = 13948; + rType = 0; + vrLen = 834; + vrLoc = 25955; + }; + 6B8DE8B410B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 515"; + rLen = 0; + rLoc = 13948; + rType = 0; + vrLen = 764; + vrLoc = 12589; + }; + 6B8DE8B510B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 515"; + rLen = 0; + rLoc = 13974; + rType = 0; + vrLen = 727; + vrLoc = 12589; + }; + 6B8DE8B610B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 628"; + rLen = 0; + rLoc = 18288; + rType = 0; + vrLen = 807; + vrLoc = 15507; + }; + 6B8DE8B710B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 635"; + rLen = 0; + rLoc = 18288; + rType = 0; + vrLen = 807; + vrLoc = 15507; + }; + 6B8DE8B810B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */; + name = "DetourDebugDraw.h: 30"; + rLen = 23; + rLoc = 1312; + rType = 0; + vrLen = 1567; + vrLoc = 59; + }; + 6B8DE8B910B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 502"; + rLen = 0; + rLoc = 19352; + rType = 0; + vrLen = 829; + vrLoc = 12938; + }; + 6B8DE8BA10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1431"; + rLen = 0; + rLoc = 38950; + rType = 0; + vrLen = 1142; + vrLoc = 35716; + }; + 6B8DE8BB10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 513"; + rLen = 0; + rLoc = 19418; + rType = 0; + vrLen = 830; + vrLoc = 12936; + }; + 6B8DE8BC10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1431"; + rLen = 0; + rLoc = 38950; + rType = 0; + vrLen = 1118; + vrLoc = 35742; + }; + 6B8DE8BD10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1431"; + rLen = 0; + rLoc = 38950; + rType = 0; + vrLen = 1118; + vrLoc = 35742; + }; + 6B8DE8BE10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 514"; + rLen = 0; + rLoc = 19661; + rType = 0; + vrLen = 679; + vrLoc = 12849; + }; + 6B8DE8BF10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC580FFB8A68005BE9CC /* DetourTileNavMesh.h */; + name = "DetourTileNavMesh.h: 266"; + rLen = 0; + rLoc = 11184; + rType = 0; + vrLen = 1319; + vrLoc = 10520; + }; + 6B8DE8C010B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1431"; + rLen = 0; + rLoc = 38950; + rType = 0; + vrLen = 1093; + vrLoc = 36048; + }; + 6B8DE8C110B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1442"; + rLen = 0; + rLoc = 39640; + rType = 0; + vrLen = 1065; + vrLoc = 35716; + }; + 6B8DE8C210B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1433"; + rLen = 0; + rLoc = 38950; + rType = 0; + vrLen = 1082; + vrLoc = 35714; + }; + 6B8DE8C310B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1441"; + rLen = 0; + rLoc = 38950; + rType = 0; + vrLen = 1205; + vrLoc = 36192; + }; + 6B8DE8C410B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1440"; + rLen = 0; + rLoc = 38950; + rType = 0; + vrLen = 1208; + vrLoc = 36192; + }; + 6B8DE8C510B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 707"; + rLen = 0; + rLoc = 19007; + rType = 0; + vrLen = 741; + vrLoc = 18189; + }; + 6B8DE8C610B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 433"; + rLen = 0; + rLoc = 12047; + rType = 0; + vrLen = 521; + vrLoc = 11396; + }; + 6B8DE8C710B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 572"; + rLen = 0; + rLoc = 14626; + rType = 0; + vrLen = 810; + vrLoc = 14089; + }; + 6B8DE8C810B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 726"; + rLen = 0; + rLoc = 19217; + rType = 0; + vrLen = 834; + vrLoc = 18541; + }; + 6B8DE8C910B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185F61006896B0018F96F /* DetourNode.h */; + name = "DetourNode.h: 84"; + rLen = 0; + rLoc = 2089; + rType = 0; + vrLen = 492; + vrLoc = 1775; + }; + 6B8DE8CA10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 251"; + rLen = 0; + rLoc = 10794; + rType = 0; + vrLen = 1154; + vrLoc = 9966; + }; + 6B8DE8CB10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 446"; + rLen = 0; + rLoc = 12191; + rType = 0; + vrLen = 670; + vrLoc = 11491; + }; + 6B8DE8CC10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 150"; + rLen = 0; + rLoc = 5847; + rType = 0; + vrLen = 1311; + vrLoc = 4872; + }; + 6B8DE8CD10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 446"; + rLen = 0; + rLoc = 12191; + rType = 0; + vrLen = 690; + vrLoc = 11471; + }; + 6B8DE8CE10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 153"; + rLen = 0; + rLoc = 6210; + rType = 0; + vrLen = 1224; + vrLoc = 4912; + }; + 6B8DE8CF10B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 446"; + rLen = 79; + rLoc = 12191; + rType = 0; + vrLen = 689; + vrLoc = 11471; + }; + 6B8DE8D010B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 158"; + rLen = 0; + rLoc = 6160; + rType = 0; + vrLen = 1335; + vrLoc = 5266; + }; + 6B8DE8D110B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 446"; + rLen = 79; + rLoc = 12191; + rType = 0; + vrLen = 723; + vrLoc = 11471; + }; + 6B8DE8D210B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 723"; + rLen = 1; + rLoc = 19307; + rType = 0; + vrLen = 432; + vrLoc = 18504; + }; + 6B8DE8D310B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 158"; + rLen = 0; + rLoc = 6210; + rType = 0; + vrLen = 1085; + vrLoc = 5466; + }; + 6B8DE8D410B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 443"; + rLen = 1; + rLoc = 12187; + rType = 0; + vrLen = 617; + vrLoc = 11471; + }; + 6B8DE8D510B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 20"; + rLen = 0; + rLoc = 978; + rType = 0; + vrLen = 1042; + vrLoc = 244; + }; + 6B8DE8D610B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */; + name = "DetourDebugDraw.h: 30"; + rLen = 23; + rLoc = 1312; + rType = 0; + vrLen = 1110; + vrLoc = 516; + }; + 6B8DE8D710B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 20"; + rLen = 0; + rLoc = 948; + rType = 0; + vrLen = 1042; + vrLoc = 244; + }; + 6B8DE8D810B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */; + name = "DetourDebugDraw.h: 22"; + rLen = 89; + rLoc = 972; + rType = 0; + vrLen = 1110; + vrLoc = 516; + }; + 6B8DE8D910B6B3F800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 728"; + rLen = 0; + rLoc = 19440; + rType = 0; + vrLen = 582; + vrLoc = 18685; + }; + 6B8DE8E610B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 728"; + rLen = 1; + rLoc = 19440; + rType = 0; + vrLen = 580; + vrLoc = 18687; + }; + 6B8DE8E710B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88C10B69E4C00DF20FB /* DetourNavMeshBuilder.h */; + name = "DetourNavMeshBuilder.h: 12"; + rLen = 0; + rLoc = 646; + rType = 0; + vrLen = 1310; + vrLoc = 128; + }; + 6B8DE8E810B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 124"; + rLen = 0; + rLoc = 8275; + rType = 0; + vrLen = 743; + vrLoc = 3670; + }; + 6B8DE8E910B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC570FFB89F4005BE9CC /* Sample_StatMeshTiled.h */; + name = "Sample_StatMeshTiled.h: 32"; + rLen = 0; + rLoc = 777; + rType = 0; + vrLen = 918; + vrLoc = 270; + }; + 6B8DE8EA10B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC510FFB8946005BE9CC /* Sample_TileMesh.h */; + name = "Sample_TileMesh.h: 98"; + rLen = 0; + rLoc = 2447; + rType = 0; + vrLen = 872; + vrLoc = 2084; + }; + 6B8DE8EB10B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: 'dtCreateNavMeshTileData' was not declared in this scope"; + fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; + rLen = 1; + rLoc = 834; + rType = 1; + }; + 6B8DE8EC10B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 728"; + rLen = 1; + rLoc = 19440; + rType = 0; + vrLen = 580; + vrLoc = 18687; + }; + 6B8DE8ED10B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 23"; + rLen = 0; + rLoc = 1012; + rType = 0; + vrLen = 1271; + vrLoc = 59; + }; + 6B8DE8EE10B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88C10B69E4C00DF20FB /* DetourNavMeshBuilder.h */; + name = "DetourNavMeshBuilder.h: 12"; + rLen = 0; + rLoc = 646; + rType = 0; + vrLen = 1310; + vrLoc = 128; + }; + 6B8DE8EF10B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 124"; + rLen = 0; + rLoc = 8275; + rType = 0; + vrLen = 743; + vrLoc = 3670; + }; + 6B8DE8F010B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC570FFB89F4005BE9CC /* Sample_StatMeshTiled.h */; + name = "Sample_StatMeshTiled.h: 32"; + rLen = 0; + rLoc = 777; + rType = 0; + vrLen = 918; + vrLoc = 270; + }; + 6B8DE8F110B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC510FFB8946005BE9CC /* Sample_TileMesh.h */; + name = "Sample_TileMesh.h: 98"; + rLen = 0; + rLoc = 2447; + rType = 0; + vrLen = 872; + vrLoc = 2084; + }; + 6B8DE8F210B6B59A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; + name = "Sample_TileMesh.cpp: 842"; + rLen = 0; + rLoc = 23237; + rType = 0; + vrLen = 1451; + vrLoc = 22525; + }; + 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {915, 1872}}"; + sepNavSelRange = "{2247, 0}"; + sepNavVisRange = "{1496, 631}"; + }; + }; + 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1223, 15568}}"; + sepNavSelRange = "{13995, 0}"; + sepNavVisRange = "{13698, 605}"; + }; + }; + 6B8DE8FB10B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 31"; + rLen = 0; + rLoc = 1349; + rType = 0; + vrLen = 1061; + vrLoc = 667; + }; + 6B8DE8FC10B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 21"; + rLen = 0; + rLoc = 417; + rType = 0; + vrLen = 562; + vrLoc = 0; + }; + 6B8DE8FD10B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; + name = "Sample_TileMesh.cpp: 838"; + rLen = 0; + rLoc = 23237; + rType = 0; + vrLen = 1458; + vrLoc = 22586; + }; + 6B8DE8FE10B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */; + name = "Sample_DynMesh.h: 89"; + rLen = 0; + rLoc = 2247; + rType = 0; + vrLen = 589; + vrLoc = 1513; + }; + 6B8DE8FF10B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 34"; + rLen = 0; + rLoc = 1274; + rType = 0; + vrLen = 832; + vrLoc = 591; + }; + 6B8DE90010B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; + name = "Sample_TileMesh.cpp: 842"; + rLen = 0; + rLoc = 23237; + rType = 0; + vrLen = 1451; + vrLoc = 22525; + }; + 6B8DE90110B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 31"; + rLen = 0; + rLoc = 1349; + rType = 0; + vrLen = 1061; + vrLoc = 667; + }; + 6B8DE90210B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */; + name = "Sample_DynMesh.h: 114"; + rLen = 0; + rLoc = 2945; + rType = 0; + vrLen = 795; + vrLoc = 2154; + }; + 6B8DE90310B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 34"; + rLen = 0; + rLoc = 1274; + rType = 0; + vrLen = 832; + vrLoc = 591; + }; + 6B8DE90410B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 21"; + rLen = 0; + rLoc = 417; + rType = 0; + vrLen = 562; + vrLoc = 0; + }; + 6B8DE90510B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */; + name = "Sample_DynMesh.h: 114"; + rLen = 0; + rLoc = 2945; + rType = 0; + vrLen = 797; + vrLoc = 2152; + }; + 6B8DE90610B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; + name = "Sample_TileMesh.cpp: 838"; + rLen = 0; + rLoc = 23237; + rType = 0; + vrLen = 1458; + vrLoc = 22586; + }; + 6B8DE90710B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */; + name = "Sample_DynMesh.h: 89"; + rLen = 0; + rLoc = 2247; + rType = 0; + vrLen = 589; + vrLoc = 1513; + }; + 6B8DE90810B6B76800DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 24"; + rLen = 0; + rLoc = 1042; + rType = 0; + vrLen = 736; + vrLoc = 667; + }; + 6B8DE90910B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 28"; + rLen = 0; + rLoc = 1129; + rType = 0; + vrLen = 755; + vrLoc = 667; + }; + 6B8DE90A10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 325"; + rLen = 78; + rLoc = 13270; + rType = 0; + vrLen = 744; + vrLoc = 12565; + }; + 6B8DE90B10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 148"; + rLen = 0; + rLoc = 4130; + rType = 0; + vrLen = 656; + vrLoc = 3827; + }; + 6B8DE90C10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 128"; + rLen = 6; + rLoc = 3666; + rType = 0; + vrLen = 508; + vrLoc = 3058; + }; + 6B8DE90D10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 28"; + rLen = 0; + rLoc = 1129; + rType = 0; + vrLen = 755; + vrLoc = 667; + }; + 6B8DE90E10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 116"; + rLen = 12; + rLoc = 4452; + rType = 0; + vrLen = 1259; + vrLoc = 3970; + }; + 6B8DE90F10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 109"; + rLen = 0; + rLoc = 3151; + rType = 0; + vrLen = 653; + vrLoc = 2836; + }; + 6B8DE91010B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 26"; + rLen = 304; + rLoc = 1073; + rType = 0; + vrLen = 910; + vrLoc = 915; + }; + 6B8DE91110B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 157"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 827; + vrLoc = 3807; + }; + 6B8DE91210B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 26"; + rLen = 304; + rLoc = 1073; + rType = 0; + vrLen = 910; + vrLoc = 915; + }; + 6B8DE91310B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 157"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 827; + vrLoc = 3807; + }; + 6B8DE91410B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 117"; + rLen = 8; + rLoc = 4470; + rType = 0; + vrLen = 1222; + vrLoc = 3958; + }; + 6B8DE91510B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 112"; + rLen = 0; + rLoc = 3277; + rType = 0; + vrLen = 685; + vrLoc = 2901; + }; + 6B8DE91610B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 117"; + rLen = 8; + rLoc = 4470; + rType = 0; + vrLen = 1174; + vrLoc = 3958; + }; + 6B8DE91710B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 158"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 803; + vrLoc = 3827; + }; + 6B8DE91810B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 325"; + rLen = 0; + rLoc = 13284; + rType = 0; + vrLen = 951; + vrLoc = 12292; + }; + 6B8DE91910B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 158"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 803; + vrLoc = 3827; + }; + 6B8DE91A10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 326"; + rLen = 0; + rLoc = 13312; + rType = 0; + vrLen = 965; + vrLoc = 12292; + }; + 6B8DE91B10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 158"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 803; + vrLoc = 3827; + }; + 6B8DE91C10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 327"; + rLen = 0; + rLoc = 13347; + rType = 0; + vrLen = 940; + vrLoc = 12339; + }; + 6B8DE91D10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 158"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 803; + vrLoc = 3827; + }; + 6B8DE91E10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 326"; + rLen = 0; + rLoc = 13296; + rType = 0; + vrLen = 940; + vrLoc = 12339; + }; + 6B8DE91F10B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 158"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 803; + vrLoc = 3827; + }; + 6B8DE92010B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 325"; + rLen = 78; + rLoc = 13270; + rType = 0; + vrLen = 744; + vrLoc = 12565; + }; + 6B8DE92110B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 148"; + rLen = 0; + rLoc = 4130; + rType = 0; + vrLen = 656; + vrLoc = 3827; + }; + 6B8DE92210B6BAD500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 130"; + rLen = 0; + rLoc = 3403; + rType = 0; + vrLen = 487; + vrLoc = 3114; + }; + 6B8DE92310B6BBCC00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 132"; + rLen = 0; + rLoc = 3403; + rType = 0; + vrLen = 543; + vrLoc = 3195; + }; + 6B8DE92410B6BC3B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 133"; + rLen = 0; + rLoc = 3488; + rType = 0; + vrLen = 567; + vrLoc = 3195; + }; + 6B8DE92B10B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 128"; + rLen = 295; + rLoc = 3359; + rType = 0; + vrLen = 585; + vrLoc = 3195; + }; + 6B8DE92C10B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 233"; + rLen = 0; + rLoc = 4486; + rType = 0; + vrLen = 355; + vrLoc = 4709; + }; + 6B8DE92D10B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6150FFA62BE004F1BC4 /* Sample_StatMesh.cpp */; + name = "Sample_StatMesh.cpp: 280"; + rLen = 0; + rLoc = 6939; + rType = 0; + vrLen = 726; + vrLoc = 6609; + }; + 6B8DE92E10B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 326"; + rLen = 0; + rLoc = 13321; + rType = 0; + vrLen = 425; + vrLoc = 12880; + }; + 6B8DE92F10B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 158"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 705; + vrLoc = 4246; + }; + 6B8DE93010B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: no matching function for call to 'dtNavMesh::init(float [3], float, int, float)'"; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + rLen = 1; + rLoc = 540; + rType = 1; + }; + 6B8DE93110B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 128"; + rLen = 295; + rLoc = 3359; + rType = 0; + vrLen = 585; + vrLoc = 3195; + }; + 6B8DE93210B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 233"; + rLen = 0; + rLoc = 4486; + rType = 0; + vrLen = 355; + vrLoc = 4709; + }; + 6B8DE93310B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 31"; + rLen = 0; + rLoc = 1376; + rType = 0; + vrLen = 1030; + vrLoc = 441; + }; + 6B8DE93410B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6150FFA62BE004F1BC4 /* Sample_StatMesh.cpp */; + name = "Sample_StatMesh.cpp: 280"; + rLen = 0; + rLoc = 6939; + rType = 0; + vrLen = 726; + vrLoc = 6609; + }; + 6B8DE93510B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 326"; + rLen = 0; + rLoc = 13321; + rType = 0; + vrLen = 425; + vrLoc = 12880; + }; + 6B8DE93610B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 158"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 705; + vrLoc = 4246; + }; + 6B8DE93710B6BCDA00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 502"; + rLen = 0; + rLoc = 13889; + rType = 0; + vrLen = 436; + vrLoc = 12711; + }; + 6B8DE93810B6BCDD00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 490"; + rLen = 0; + rLoc = 13697; + rType = 0; + vrLen = 458; + vrLoc = 12711; + }; + 6B8DE93910B6BD1300DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 234"; + rLen = 0; + rLoc = 4486; + rType = 0; + vrLen = 363; + vrLoc = 4089; + }; + 6B8DE93A10B6BD1300DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 492"; + rLen = 0; + rLoc = 13725; + rType = 0; + vrLen = 137; + vrLoc = 12695; + }; + 6B8DE93B10B6BD1E00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 486"; + rLen = 0; + rLoc = 13643; + rType = 0; + vrLen = 385; + vrLoc = 12556; + }; + 6B8DE93C10B6BD1E00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 233"; + rLen = 0; + rLoc = 4486; + rType = 0; + vrLen = 450; + vrLoc = 4659; + }; + 6B8DE93D10B6BD1E00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 486"; + rLen = 0; + rLoc = 13643; + rType = 0; + vrLen = 385; + vrLoc = 12556; + }; + 6B8DE93E10B6BD1E00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 218"; + rLen = 0; + rLoc = 4451; + rType = 0; + vrLen = 493; + vrLoc = 4451; + }; + 6B8DE94610B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 212"; + rLen = 0; + rLoc = 4483; + rType = 0; + vrLen = 661; + vrLoc = 4089; + }; + 6B8DE94710B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 124"; + rLen = 0; + rLoc = 8275; + rType = 0; + vrLen = 701; + vrLoc = 3670; + }; + 6B8DE94810B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 268"; + rLen = 0; + rLoc = 11074; + rType = 0; + vrLen = 1247; + vrLoc = 10732; + }; + 6B8DE94910B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 155"; + rLen = 0; + rLoc = 4396; + rType = 0; + vrLen = 907; + vrLoc = 3953; + }; + 6B8DE94A10B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 212"; + rLen = 0; + rLoc = 4483; + rType = 0; + vrLen = 661; + vrLoc = 4089; + }; + 6B8DE94B10B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 160"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 705; + vrLoc = 4246; + }; + 6B8DE94C10B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 124"; + rLen = 0; + rLoc = 8275; + rType = 0; + vrLen = 701; + vrLoc = 3670; + }; + 6B8DE94D10B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 160"; + rLen = 0; + rLoc = 4314; + rType = 0; + vrLen = 1034; + vrLoc = 3953; + }; + 6B8DE94E10B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 326"; + rLen = 0; + rLoc = 13321; + rType = 0; + vrLen = 961; + vrLoc = 12344; + }; + 6B8DE94F10B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 152"; + rLen = 0; + rLoc = 4314; + rType = 0; + vrLen = 907; + vrLoc = 3953; + }; + 6B8DE95010B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 31"; + rLen = 0; + rLoc = 1376; + rType = 0; + vrLen = 1533; + vrLoc = 59; + }; + 6B8DE95110B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 166"; + rLen = 1; + rLoc = 4726; + rType = 0; + vrLen = 907; + vrLoc = 3953; + }; + 6B8DE95210B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 279"; + rLen = 0; + rLoc = 11522; + rType = 0; + vrLen = 1298; + vrLoc = 10681; + }; + 6B8DE95310B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 155"; + rLen = 0; + rLoc = 4396; + rType = 0; + vrLen = 907; + vrLoc = 3953; + }; + 6B8DE95410B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 268"; + rLen = 0; + rLoc = 11074; + rType = 0; + vrLen = 1247; + vrLoc = 10732; + }; + 6B8DE95510B6BEDB00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 155"; + rLen = 0; + rLoc = 4396; + rType = 0; + vrLen = 754; + vrLoc = 3912; + }; + 6B8DE95D10B6BF0100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 325"; + rLen = 0; + rLoc = 13270; + rType = 0; + vrLen = 920; + vrLoc = 12383; + }; + 6B8DE95E10B6BF0100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 154"; + rLen = 0; + rLoc = 4380; + rType = 0; + vrLen = 821; + vrLoc = 3912; + }; + 6B8DE95F10B6BF0100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 154"; + rLen = 0; + rLoc = 4380; + rType = 0; + vrLen = 821; + vrLoc = 3912; + }; + 6B8DE96010B6BF0100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 325"; + rLen = 0; + rLoc = 13270; + rType = 0; + vrLen = 920; + vrLoc = 12383; + }; + 6B8DE96110B6BF0100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 152"; + rLen = 0; + rLoc = 4302; + rType = 0; + vrLen = 782; + vrLoc = 3912; + }; + 6B8DE96610B6BF2A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 151"; + rLen = 0; + rLoc = 4199; + rType = 0; + vrLen = 782; + vrLoc = 3912; + }; + 6B8DE96910B6BF6100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 151"; + rLen = 0; + rLoc = 4238; + rType = 0; + vrLen = 849; + vrLoc = 3912; + }; + 6B8DE96A10B6BF6100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 486"; + rLen = 0; + rLoc = 13643; + rType = 0; + vrLen = 564; + vrLoc = 12500; + }; + 6B8DE96B10B6BF6100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 151"; + rLen = 0; + rLoc = 4238; + rType = 0; + vrLen = 849; + vrLoc = 3912; + }; + 6B8DE96C10B6BF6100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 505"; + rLen = 0; + rLoc = 14000; + rType = 0; + vrLen = 560; + vrLoc = 12586; + }; + 6B8DE96F10B6BF6900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 505"; + rLen = 0; + rLoc = 14000; + rType = 0; + vrLen = 560; + vrLoc = 12586; + }; + 6B8DE97310B6C04900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 505"; + rLen = 0; + rLoc = 14000; + rType = 0; + vrLen = 560; + vrLoc = 12586; + }; + 6B8DE97410B6C04900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 317"; + rLen = 0; + rLoc = 13088; + rType = 0; + vrLen = 1008; + vrLoc = 12315; + }; + 6B8DE97510B6C04900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 119"; + rLen = 0; + rLoc = 3399; + rType = 0; + vrLen = 780; + vrLoc = 2863; + }; + 6B8DE97610B6C04900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 505"; + rLen = 0; + rLoc = 14000; + rType = 0; + vrLen = 560; + vrLoc = 12586; + }; + 6B8DE97710B6C04900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 119"; + rLen = 0; + rLoc = 3399; + rType = 0; + vrLen = 780; + vrLoc = 2863; + }; + 6B8DE97810B6C04900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 317"; + rLen = 0; + rLoc = 13088; + rType = 0; + vrLen = 1008; + vrLoc = 12315; + }; + 6B8DE97910B6C04900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 123"; + rLen = 0; + rLoc = 3513; + rType = 0; + vrLen = 869; + vrLoc = 3043; + }; + 6B8DE97E10B6C08700DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 121"; + rLen = 0; + rLoc = 3478; + rType = 0; + vrLen = 797; + vrLoc = 3106; + }; + 6B8DE97F10B6C0A100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 122"; + rLen = 0; + rLoc = 3512; + rType = 0; + vrLen = 816; + vrLoc = 3106; + }; + 6B8DE98010B6C0A600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 492"; + rLen = 0; + rLoc = 13725; + rType = 0; + vrLen = 137; + vrLoc = 12695; + }; + 6B8DE98110B6C0A600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 122"; + rLen = 0; + rLoc = 3512; + rType = 0; + vrLen = 258; + vrLoc = 3327; + }; + 6B8DE98B10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E060F91112200904EEF /* DetourStatNavMeshBuilder.h */; + name = "DetourStatNavMeshBuilder.h: 15"; + rLen = 0; + rLoc = 822; + rType = 0; + vrLen = 1416; + vrLoc = 0; + }; + 6B8DE98C10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC580FFB8A68005BE9CC /* DetourTileNavMesh.h */; + name = "DetourTileNavMesh.h: 269"; + rLen = 0; + rLoc = 11301; + rType = 0; + vrLen = 1250; + vrLoc = 11793; + }; + 6B8DE98D10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 68"; + rLen = 6; + rLoc = 2120; + rType = 0; + vrLen = 521; + vrLoc = 1748; + }; + 6B8DE98E10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 315"; + rLen = 101; + rLoc = 8381; + rType = 0; + vrLen = 875; + vrLoc = 8055; + }; + 6B8DE98F10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 773"; + rLen = 0; + rLoc = 19594; + rType = 0; + vrLen = 1323; + vrLoc = 18667; + }; + 6B8DE99010B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 157"; + rLen = 15; + rLoc = 4063; + rType = 0; + vrLen = 1138; + vrLoc = 3432; + }; + 6B8DE99110B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 92"; + rLen = 0; + rLoc = 3326; + rType = 0; + vrLen = 1211; + vrLoc = 2859; + }; + 6B8DE99210B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 324"; + rLen = 7; + rLoc = 8627; + rType = 0; + vrLen = 781; + vrLoc = 8183; + }; + 6B8DE99310B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 657"; + rLen = 0; + rLoc = 16723; + rType = 0; + vrLen = 1332; + vrLoc = 16313; + }; + 6B8DE99410B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 156"; + rLen = 0; + rLoc = 4358; + rType = 0; + vrLen = 905; + vrLoc = 4024; + }; + 6B8DE99510B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E060F91112200904EEF /* DetourStatNavMeshBuilder.h */; + name = "DetourStatNavMeshBuilder.h: 15"; + rLen = 0; + rLoc = 822; + rType = 0; + vrLen = 1416; + vrLoc = 0; + }; + 6B8DE99610B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 25"; + rLen = 4237; + rLoc = 1035; + rType = 0; + vrLen = 1067; + vrLoc = 4651; + }; + 6B8DE99710B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 224"; + rLen = 0; + rLoc = 5789; + rType = 0; + vrLen = 842; + vrLoc = 5961; + }; + 6B8DE99810B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 48"; + rLen = 67; + rLoc = 1830; + rType = 0; + vrLen = 720; + vrLoc = 1436; + }; + 6B8DE99910B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 97"; + rLen = 0; + rLoc = 3651; + rType = 0; + vrLen = 1231; + vrLoc = 2486; + }; + 6B8DE99A10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC580FFB8A68005BE9CC /* DetourTileNavMesh.h */; + name = "DetourTileNavMesh.h: 269"; + rLen = 0; + rLoc = 11301; + rType = 0; + vrLen = 1250; + vrLoc = 11793; + }; + 6B8DE99B10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 68"; + rLen = 6; + rLoc = 2120; + rType = 0; + vrLen = 521; + vrLoc = 1748; + }; + 6B8DE99C10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 77"; + rLen = 0; + rLoc = 2837; + rType = 0; + vrLen = 1131; + vrLoc = 2125; + }; + 6B8DE99D10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 58"; + rLen = 70; + rLoc = 1845; + rType = 0; + vrLen = 1284; + vrLoc = 1334; + }; + 6B8DE99E10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 404"; + rLen = 0; + rLoc = 11326; + rType = 0; + vrLen = 1249; + vrLoc = 10287; + }; + 6B8DE99F10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 252"; + rLen = 62; + rLoc = 6416; + rType = 0; + vrLen = 1458; + vrLoc = 6216; + }; + 6B8DE9A010B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 404"; + rLen = 0; + rLoc = 11326; + rType = 0; + vrLen = 1249; + vrLoc = 10287; + }; + 6B8DE9A110B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 224"; + rLen = 0; + rLoc = 5789; + rType = 0; + vrLen = 796; + vrLoc = 5961; + }; + 6B8DE9A210B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 77"; + rLen = 0; + rLoc = 2837; + rType = 0; + vrLen = 1111; + vrLoc = 2145; + }; + 6B8DE9A310B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 395"; + rLen = 0; + rLoc = 10906; + rType = 0; + vrLen = 1250; + vrLoc = 10287; + }; + 6B8DE9A410B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 268"; + rLen = 60; + rLoc = 7132; + rType = 0; + vrLen = 1484; + vrLoc = 6218; + }; + 6B8DE9A510B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 224"; + rLen = 0; + rLoc = 5789; + rType = 0; + vrLen = 796; + vrLoc = 5961; + }; + 6B8DE9A610B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 404"; + rLen = 71; + rLoc = 11256; + rType = 0; + vrLen = 1250; + vrLoc = 10287; + }; + 6B8DE9A710B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 291"; + rLen = 0; + rLoc = 7626; + rType = 0; + vrLen = 1379; + vrLoc = 6981; + }; + 6B8DE9A810B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 395"; + rLen = 89; + rLoc = 10824; + rType = 0; + vrLen = 1252; + vrLoc = 10287; + }; + 6B8DE9A910B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 322"; + rLen = 0; + rLoc = 8591; + rType = 0; + vrLen = 1037; + vrLoc = 7841; + }; + 6B8DE9AA10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 315"; + rLen = 101; + rLoc = 8381; + rType = 0; + vrLen = 905; + vrLoc = 8055; + }; + 6B8DE9AB10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 322"; + rLen = 0; + rLoc = 8591; + rType = 0; + vrLen = 991; + vrLoc = 7887; + }; + 6B8DE9AC10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 315"; + rLen = 101; + rLoc = 8381; + rType = 0; + vrLen = 875; + vrLoc = 8055; + }; + 6B8DE9AD10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 397"; + rLen = 1; + rLoc = 10572; + rType = 0; + vrLen = 940; + vrLoc = 9887; + }; + 6B8DE9AE10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 98"; + rLen = 0; + rLoc = 3635; + rType = 0; + vrLen = 1111; + vrLoc = 2962; + }; + 6B8DE9AF10B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 294"; + rLen = 0; + rLoc = 7695; + rType = 0; + vrLen = 1299; + vrLoc = 6979; + }; + 6B8DE9B010B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 749"; + rLen = 1747; + rLoc = 18261; + rType = 0; + vrLen = 712; + vrLoc = 19754; + }; + 6B8DE9B110B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 679"; + rLen = 0; + rLoc = 16723; + rType = 0; + vrLen = 639; + vrLoc = 17746; + }; + 6B8DE9B210B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 773"; + rLen = 0; + rLoc = 19594; + rType = 0; + vrLen = 1323; + vrLoc = 18667; + }; + 6B8DE9B310B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 157"; + rLen = 15; + rLoc = 4063; + rType = 0; + vrLen = 1138; + vrLoc = 3432; + }; + 6B8DE9B410B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 657"; + rLen = 0; + rLoc = 16723; + rType = 0; + vrLen = 1332; + vrLoc = 16313; + }; + 6B8DE9B510B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 92"; + rLen = 0; + rLoc = 3326; + rType = 0; + vrLen = 1211; + vrLoc = 2859; + }; + 6B8DE9B610B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 324"; + rLen = 7; + rLoc = 8627; + rType = 0; + vrLen = 781; + vrLoc = 8183; + }; + 6B8DE9B710B6C53B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 681"; + rLen = 0; + rLoc = 16723; + rType = 0; + vrLen = 1395; + vrLoc = 16313; + }; + 6B8DE9BB10B6C61D00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 748"; + rLen = 0; + rLoc = 19553; + rType = 0; + vrLen = 806; + vrLoc = 18804; + }; + 6B8DE9BC10B6C61D00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 728"; + rLen = 1; + rLoc = 19440; + rType = 0; + vrLen = 674; + vrLoc = 18593; + }; + 6B8DE9BD10B6C61D00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 748"; + rLen = 0; + rLoc = 19553; + rType = 0; + vrLen = 806; + vrLoc = 18804; + }; + 6B8DE9BE10B6C61D00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 634"; + rLen = 0; + rLoc = 15924; + rType = 0; + vrLen = 683; + vrLoc = 15586; + }; + 6B8DE9C310B6C64100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 634"; + rLen = 0; + rLoc = 15924; + rType = 0; + vrLen = 698; + vrLoc = 15586; + }; + 6B8DE9C410B6C64100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 748"; + rLen = 0; + rLoc = 19553; + rType = 0; + vrLen = 804; + vrLoc = 18806; + }; + 6B8DE9C510B6C64100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 634"; + rLen = 0; + rLoc = 15924; + rType = 0; + vrLen = 698; + vrLoc = 15586; + }; + 6B8DE9C610B6C64100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 743"; + rLen = 0; + rLoc = 19376; + rType = 0; + vrLen = 1303; + vrLoc = 16262; + }; + 6B8DE9CE10B6C75600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 685"; + rLen = 0; + rLoc = 16723; + rType = 0; + vrLen = 577; + vrLoc = 17708; + }; + 6B8DE9CF10B6C75600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 324"; + rLen = 7; + rLoc = 8627; + rType = 0; + vrLen = 777; + vrLoc = 8187; + }; + 6B8DE9D010B6C75600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 685"; + rLen = 0; + rLoc = 16723; + rType = 0; + vrLen = 577; + vrLoc = 17708; + }; + 6B8DE9D110B6C75600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 177"; + rLen = 0; + rLoc = 4377; + rType = 0; + vrLen = 785; + vrLoc = 3990; + }; + 6B8DE9D410B6C7DD00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 182"; + rLen = 0; + rLoc = 4582; + rType = 0; + vrLen = 933; + vrLoc = 4342; + }; + 6B8DE9D510B6C7DD00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 685"; + rLen = 0; + rLoc = 16723; + rType = 0; + vrLen = 723; + vrLoc = 17565; + }; + 6B8DE9D610B6C7DD00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 182"; + rLen = 0; + rLoc = 4582; + rType = 0; + vrLen = 933; + vrLoc = 4342; + }; + 6B8DE9D710B6C7DD00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 697"; + rLen = 0; + rLoc = 18287; + rType = 0; + vrLen = 619; + vrLoc = 17884; + }; + 6B8DE9DA10B6C83E00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 699"; + rLen = 0; + rLoc = 18288; + rType = 0; + vrLen = 655; + vrLoc = 17884; + }; + 6B8DE9DB10B6C83E00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 699"; + rLen = 0; + rLoc = 18288; + rType = 0; + vrLen = 655; + vrLoc = 17884; + }; + 6B8DE9DC10B6C83E00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 288"; + rLen = 0; + rLoc = 11523; + rType = 0; + vrLen = 1209; + vrLoc = 10670; + }; + 6B8DE9E110B6C8BE00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 283"; + rLen = 0; + rLoc = 11271; + rType = 0; + vrLen = 1296; + vrLoc = 10670; + }; + 6B8DE9E210B6C8BE00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 699"; + rLen = 0; + rLoc = 18287; + rType = 0; + vrLen = 637; + vrLoc = 17884; + }; + 6B8DE9E310B6C8BE00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 634"; + rLen = 0; + rLoc = 15924; + rType = 0; + vrLen = 749; + vrLoc = 15573; + }; + 6B8DE9E410B6C8BE00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 283"; + rLen = 0; + rLoc = 11271; + rType = 0; + vrLen = 1296; + vrLoc = 10670; + }; + 6B8DE9E510B6C8BE00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 699"; + rLen = 0; + rLoc = 18287; + rType = 0; + vrLen = 637; + vrLoc = 17884; + }; + 6B8DE9E610B6C8BE00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 748"; + rLen = 0; + rLoc = 19438; + rType = 0; + vrLen = 704; + vrLoc = 19076; + }; + 6B8DE9EA10B6C97B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 743"; + rLen = 0; + rLoc = 19230; + rType = 0; + vrLen = 735; + vrLoc = 19045; + }; + 6B8DE9EB10B6C97B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + rLen = 0; + rLoc = 461; + rType = 1; + }; + 6B8DE9EC10B6C97B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 748"; + rLen = 0; + rLoc = 19438; + rType = 0; + vrLen = 704; + vrLoc = 19076; + }; + 6B8DE9ED10B6C97B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 644"; + rLen = 0; + rLoc = 16461; + rType = 0; + vrLen = 644; + vrLoc = 17941; + }; + 6B8DE9EE10B6C97B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 743"; + rLen = 0; + rLoc = 19230; + rType = 0; + vrLen = 735; + vrLoc = 19045; + }; + 6B8DE9EF10B6C97B00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 761"; + rLen = 0; + rLoc = 19960; + rType = 0; + vrLen = 826; + vrLoc = 19192; + }; + 6B8DE9F010B6C98D00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 761"; + rLen = 0; + rLoc = 19924; + rType = 0; + vrLen = 826; + vrLoc = 19192; + }; + 6B8DE9F110B6C9A400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 749"; + rLen = 0; + rLoc = 19634; + rType = 0; + vrLen = 348; + vrLoc = 19192; + }; + 6B8DE9F510B6C9B700DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 336"; + rLen = 10; + rLoc = 13310; + rType = 0; + vrLen = 865; + vrLoc = 12577; + }; + 6B8DE9F610B6C9B700DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 747"; + rLen = 0; + rLoc = 19592; + rType = 0; + vrLen = 930; + vrLoc = 18849; + }; + 6B8DE9F710B6C9B700DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 747"; + rLen = 0; + rLoc = 19592; + rType = 0; + vrLen = 930; + vrLoc = 18849; + }; + 6B8DE9F810B6C9B700DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 336"; + rLen = 10; + rLoc = 13310; + rType = 0; + vrLen = 865; + vrLoc = 12577; + }; + 6B8DE9F910B6C9B700DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 151"; + rLen = 0; + rLoc = 4130; + rType = 0; + vrLen = 746; + vrLoc = 3719; + }; + 6B8DE9FC10B6C9BD00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 151"; + rLen = 0; + rLoc = 4130; + rType = 0; + vrLen = 746; + vrLoc = 3719; + }; + 6B8DEA0110B6CA1500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185F41006895B0018F96F /* DetourNode.cpp */; + name = "DetourNode.cpp: 122"; + rLen = 0; + rLoc = 2972; + rType = 0; + vrLen = 584; + vrLoc = 2683; + }; + 6B8DEA0210B6CA1500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 157"; + rLen = 15; + rLoc = 4063; + rType = 0; + vrLen = 1582; + vrLoc = 0; + }; + 6B8DEA0310B6CA1500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 182"; + rLen = 0; + rLoc = 4582; + rType = 0; + vrLen = 911; + vrLoc = 4585; + }; + 6B8DEA0410B6CA1500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 154"; + rLen = 0; + rLoc = 4203; + rType = 0; + vrLen = 746; + vrLoc = 3719; + }; + 6B8DEA0510B6CA1500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 154"; + rLen = 0; + rLoc = 4203; + rType = 0; + vrLen = 746; + vrLoc = 3719; + }; + 6B8DEA0610B6CA1500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185F41006895B0018F96F /* DetourNode.cpp */; + name = "DetourNode.cpp: 122"; + rLen = 0; + rLoc = 2972; + rType = 0; + vrLen = 584; + vrLoc = 2683; + }; + 6B8DEA0710B6CA1500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 157"; + rLen = 15; + rLoc = 4063; + rType = 0; + vrLen = 1582; + vrLoc = 0; + }; + 6B8DEA0810B6CA1500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 182"; + rLen = 0; + rLoc = 4582; + rType = 0; + vrLen = 911; + vrLoc = 4585; + }; + 6B8DEA0910B6CA1500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 155"; + rLen = 0; + rLoc = 4279; + rType = 0; + vrLen = 788; + vrLoc = 3719; + }; + 6B8DEA0A10B6CA6E00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 149"; + rLen = 0; + rLoc = 4110; + rType = 0; + vrLen = 788; + vrLoc = 3719; + }; + 6B8DEA0B10B6CA7500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 149"; + rLen = 0; + rLoc = 4110; + rType = 0; + vrLen = 819; + vrLoc = 3796; + }; + 6B8DEA0C10B6CA8700DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 149"; + rLen = 0; + rLoc = 4110; + rType = 0; + vrLen = 374; + vrLoc = 4133; + }; + 6B8DEA0F10B6CAAD00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 144"; + rLen = 0; + rLoc = 4026; + rType = 0; + vrLen = 819; + vrLoc = 3796; + }; + 6B8DEA1010B6CAAD00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 144"; + rLen = 0; + rLoc = 4026; + rType = 0; + vrLen = 819; + vrLoc = 3796; + }; + 6B8DEA1110B6CAAD00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 330"; + rLen = 0; + rLoc = 13207; + rType = 0; + vrLen = 1308; + vrLoc = 10955; + }; + 6B8DEA1510B6CAF600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 744"; + rLen = 0; + rLoc = 19297; + rType = 0; + vrLen = 735; + vrLoc = 19045; + }; + 6B8DEA1610B6CAF600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + rLen = 0; + rLoc = 287; + rType = 1; + }; + 6B8DEA1710B6CAF600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 330"; + rLen = 0; + rLoc = 13207; + rType = 0; + vrLen = 1308; + vrLoc = 10955; + }; + 6B8DEA1810B6CAF600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 744"; + rLen = 0; + rLoc = 19297; + rType = 0; + vrLen = 735; + vrLoc = 19045; + }; + 6B8DEA1910B6CAF600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 289"; + rLen = 0; + rLoc = 11557; + rType = 0; + vrLen = 1307; + vrLoc = 10956; + }; + 6B8DEA1A10B6CB0600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 296"; + rLen = 0; + rLoc = 11795; + rType = 0; + vrLen = 1307; + vrLoc = 10956; + }; + 6B8DEA1B10B6CB0D00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 296"; + rLen = 0; + rLoc = 11795; + rType = 0; + vrLen = 1361; + vrLoc = 11190; + }; + 6B8DEA1C10B6CB1100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 149"; + rLen = 0; + rLoc = 4110; + rType = 0; + vrLen = 374; + vrLoc = 4133; + }; + 6B8DEA1D10B6CB1100DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 296"; + rLen = 0; + rLoc = 11795; + rType = 0; + vrLen = 442; + vrLoc = 11524; + }; + 6B8DEA1E10B6CB1300DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 293"; + rLen = 0; + rLoc = 11636; + rType = 0; + vrLen = 1461; + vrLoc = 11190; + }; + 6B8DEA1F10B6CB2E00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + rLen = 1; + rLoc = 741; + rType = 1; + }; + 6B8DEA2110B6CB3000DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 285"; + rLen = 0; + rLoc = 11327; + rType = 0; + vrLen = 1428; + vrLoc = 11074; + }; + 6B8DEA2210B6CB3000DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 744"; + rLen = 0; + rLoc = 19297; + rType = 0; + vrLen = 734; + vrLoc = 19045; + }; + 6B8DEA2310B6CB3000DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 285"; + rLen = 0; + rLoc = 11327; + rType = 0; + vrLen = 1428; + vrLoc = 11074; + }; + 6B8DEA2410B6CB3000DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 747"; + rLen = 0; + rLoc = 19390; + rType = 0; + vrLen = 674; + vrLoc = 19106; + }; + 6B8DEA2A10B6CB8A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 747"; + rLen = 0; + rLoc = 19390; + rType = 0; + vrLen = 674; + vrLoc = 19106; + }; + 6B8DEA2B10B6CB8A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 289"; + rLen = 0; + rLoc = 11557; + rType = 0; + vrLen = 1428; + vrLoc = 11074; + }; + 6B8DEA2C10B6CB8A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 461"; + rLen = 0; + rLoc = 12299; + rType = 0; + vrLen = 760; + vrLoc = 11947; + }; + 6B8DEA2D10B6CB8A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 747"; + rLen = 0; + rLoc = 19390; + rType = 0; + vrLen = 674; + vrLoc = 19106; + }; + 6B8DEA2E10B6CB8A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 461"; + rLen = 0; + rLoc = 12299; + rType = 0; + vrLen = 760; + vrLoc = 11947; + }; + 6B8DEA2F10B6CB8A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 289"; + rLen = 0; + rLoc = 11557; + rType = 0; + vrLen = 1428; + vrLoc = 11074; + }; + 6B8DEA3010B6CB8A00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 154"; + rLen = 0; + rLoc = 4203; + rType = 0; + vrLen = 968; + vrLoc = 4111; + }; + 6B8DEA3610B6CBC200DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 289"; + rLen = 0; + rLoc = 11557; + rType = 0; + vrLen = 1428; + vrLoc = 11074; + }; + 6B8DEA3710B6CBC200DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 154"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 897; + vrLoc = 4111; + }; + 6B8DEA3810B6CBC200DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185F61006896B0018F96F /* DetourNode.h */; + name = "DetourNode.h: 84"; + rLen = 0; + rLoc = 2089; + rType = 0; + vrLen = 492; + vrLoc = 1775; + }; + 6B8DEA3910B6CBC200DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 157"; + rLen = 15; + rLoc = 4063; + rType = 0; + vrLen = 1620; + vrLoc = 0; + }; + 6B8DEA3A10B6CBC200DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 154"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 1005; + vrLoc = 4111; + }; + 6B8DEA3B10B6CBC200DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 289"; + rLen = 0; + rLoc = 11557; + rType = 0; + vrLen = 1428; + vrLoc = 11074; + }; + 6B8DEA3C10B6CBC200DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 154"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 897; + vrLoc = 4111; + }; + 6B8DEA3D10B6CBC200DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185F61006896B0018F96F /* DetourNode.h */; + name = "DetourNode.h: 84"; + rLen = 0; + rLoc = 2089; + rType = 0; + vrLen = 492; + vrLoc = 1775; + }; + 6B8DEA3E10B6CBC200DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 128"; + rLen = 0; + rLoc = 3375; + rType = 0; + vrLen = 675; + vrLoc = 3114; + }; + 6B8DEA4010B6CC0400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 128"; + rLen = 0; + rLoc = 3375; + rType = 0; + vrLen = 675; + vrLoc = 3114; + }; + 6B8DEA4110B6CC0400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 743"; + rLen = 0; + rLoc = 19230; + rType = 0; + vrLen = 704; + vrLoc = 19076; + }; + 6B8DEA4210B6CC0400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + rLen = 0; + rLoc = 461; + rType = 1; + }; + 6B8DEA4310B6CC0400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 128"; + rLen = 0; + rLoc = 3375; + rType = 0; + vrLen = 675; + vrLoc = 3114; + }; + 6B8DEA4410B6CC0400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 154"; + rLen = 0; + rLoc = 4163; + rType = 0; + vrLen = 644; + vrLoc = 17983; + }; + 6B8DEA4510B6CC0400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 743"; + rLen = 0; + rLoc = 19230; + rType = 0; + vrLen = 704; + vrLoc = 19076; + }; + 6B8DEA4610B6CC0400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 727"; + rLen = 0; + rLoc = 18973; + rType = 0; + vrLen = 837; + vrLoc = 18332; + }; + 6B8DEA4710B6CC0C00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */; + name = "DetourNavMesh.h: 296"; + rLen = 0; + rLoc = 11795; + rType = 0; + vrLen = 491; + vrLoc = 11561; + }; + 6B8DEA4810B6CC0C00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 727"; + rLen = 0; + rLoc = 18973; + rType = 0; + vrLen = 357; + vrLoc = 18711; + }; + 6B8DEA4B10B6CC1600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 731"; + rLen = 0; + rLoc = 19103; + rType = 0; + vrLen = 703; + vrLoc = 18153; + }; + 6B8DEA4D10B6CC2600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 731"; + rLen = 0; + rLoc = 19103; + rType = 0; + vrLen = 727; + vrLoc = 12004; + }; + 6B8DEA4E10B6CC2600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 731"; + rLen = 0; + rLoc = 19103; + rType = 0; + vrLen = 727; + vrLoc = 12004; + }; + 6B8DEA4F10B6CC2600DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 743"; + rLen = 56; + rLoc = 19230; + rType = 0; + vrLen = 735; + vrLoc = 19045; + }; + 6B8DEA5010B6CC5500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 743"; + rLen = 56; + rLoc = 19230; + rType = 0; + vrLen = 735; + vrLoc = 19045; + }; + 6B8DEA5110B6CC5500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + rLen = 0; + rLoc = 701; + rType = 1; + }; + 6B8DEA5210B6CC5500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 743"; + rLen = 56; + rLoc = 19230; + rType = 0; + vrLen = 735; + vrLoc = 19045; + }; + 6B8DEA5310B6CC5500DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 702"; + rLen = 0; + rLoc = 18288; + rType = 0; + vrLen = 656; + vrLoc = 18034; + }; + 6B8DEA5410B6CC6300DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 702"; + rLen = 0; + rLoc = 18288; + rType = 0; + vrLen = 788; + vrLoc = 3719; + }; + 6B8DEA5B10B6CD1D00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: 'header' was not declared in this scope"; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + rLen = 1; + rLoc = 652; + rType = 1; + }; + 6B8DEA5C10B6CD1D00DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 407"; + rLen = 0; + rLoc = 11366; + rType = 0; + vrLen = 809; + vrLoc = 10915; + }; + 6B8DEA6410B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 413"; + rLen = 0; + rLoc = 11471; + rType = 0; + vrLen = 810; + vrLoc = 10915; + }; + 6B8DEA6510B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6140FFA62BE004F1BC4 /* Sample.cpp */; + name = "Sample.cpp: 152"; + rLen = 0; + rLoc = 3158; + rType = 0; + vrLen = 1081; + vrLoc = 2145; + }; + 6B8DEA6610B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 566"; + rLen = 36; + rLoc = 12743; + rType = 0; + vrLen = 681; + vrLoc = 12381; + }; + 6B8DEA6710B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */; + name = "Sample_DynMesh.h: 89"; + rLen = 0; + rLoc = 2247; + rType = 0; + vrLen = 631; + vrLoc = 1496; + }; + 6B8DEA6810B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "warning: missing whitespace after the macro name"; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + rLen = 1; + rLoc = 18; + rType = 1; + }; + 6B8DEA6910B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 413"; + rLen = 0; + rLoc = 11471; + rType = 0; + vrLen = 810; + vrLoc = 10915; + }; + 6B8DEA6A10B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 498"; + rLen = 0; + rLoc = 13799; + rType = 0; + vrLen = 585; + vrLoc = 12583; + }; + 6B8DEA6B10B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */; + name = "Sample_DynMesh.h: 89"; + rLen = 0; + rLoc = 2247; + rType = 0; + vrLen = 631; + vrLoc = 1496; + }; + 6B8DEA6C10B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 206"; + rLen = 0; + rLoc = 5246; + rType = 0; + vrLen = 803; + vrLoc = 4596; + }; + 6B8DEA6D10B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6140FFA62BE004F1BC4 /* Sample.cpp */; + name = "Sample.cpp: 152"; + rLen = 0; + rLoc = 3158; + rType = 0; + vrLen = 1081; + vrLoc = 2145; + }; + 6B8DEA6E10B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B25B6180FFA62BE004F1BC4 /* main.cpp */; + name = "main.cpp: 566"; + rLen = 36; + rLoc = 12743; + rType = 0; + vrLen = 681; + vrLoc = 12381; + }; + 6B8DEA6F10B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 221"; + rLen = 0; + rLoc = 6174; + rType = 0; + vrLen = 715; + vrLoc = 5571; + }; + 6B8DEA7010B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */; + name = "Sample_DynMesh.h: 89"; + rLen = 0; + rLoc = 2247; + rType = 0; + vrLen = 631; + vrLoc = 1496; + }; + 6B8DEA7110B6CF6400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 16"; + rLen = 0; + rLoc = 914; + rType = 0; + vrLen = 1074; + vrLoc = 56; + }; + 6B8DEA7410B6CF8400DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 541"; + rLen = 0; + rLoc = 13995; + rType = 0; + vrLen = 586; + vrLoc = 13698; + }; + 6B8DEA7710B6CFC900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 541"; + rLen = 0; + rLoc = 13995; + rType = 0; + vrLen = 605; + vrLoc = 13698; + }; + 6B8DEA7810B6CFC900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 37"; + rLen = 0; + rLoc = 1401; + rType = 0; + vrLen = 932; + vrLoc = 963; + }; + 6B8DEA7910B6CFC900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 743"; + rLen = 56; + rLoc = 19230; + rType = 0; + vrLen = 734; + vrLoc = 19045; + }; + 6B8DEA7A10B6CFC900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; + name = "Sample_DynMesh.cpp: 541"; + rLen = 0; + rLoc = 13995; + rType = 0; + vrLen = 605; + vrLoc = 13698; + }; + 6B8DEA7B10B6CFC900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 37"; + rLen = 0; + rLoc = 1401; + rType = 0; + vrLen = 932; + vrLoc = 963; + }; + 6B8DEA7C10B6CFC900DF20FB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 624"; + rLen = 0; + rLoc = 15631; + rType = 0; + vrLen = 726; + vrLoc = 15456; + }; 6B9301521032F08300F0C0DA /* Recast.cpp:280 */ = { isa = PBXFileBreakpoint; actions = ( @@ -3996,7 +7877,8 @@ hitCount = 0; ignoreCount = 0; lineNumber = 280; - modificationTime = 277989718.279228; + location = Recast; + modificationTime = 280415167.304094; state = 1; }; 6B93FEFF1030443300F0C0DA /* Recast.cpp:280 */ = { @@ -4013,7 +7895,7 @@ ignoreCount = 0; lineNumber = 280; location = Recast; - modificationTime = 277989520.8474849; + modificationTime = 280415167.30395; state = 2; }; 6B9BE374107BC6A40036CC81 /* PBXTextBookmark */ = { @@ -4047,8 +7929,8 @@ hitCount = 0; ignoreCount = 0; lineNumber = 301; - modificationTime = 277989520.846603; - state = 1; + modificationTime = 280415167.641139; + state = 0; }; 6B9D09921028542A009B1A6C /* RecastDebugDraw.cpp:29 */ = { isa = PBXFileBreakpoint; @@ -4064,7 +7946,7 @@ ignoreCount = 0; lineNumber = 29; location = Recast; - modificationTime = 277989520.847037; + modificationTime = 280415167.303804; state = 2; }; 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */ = { @@ -4083,44 +7965,44 @@ }; 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 512}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRange = "{0, 1279}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 576}}"; + sepNavSelRange = "{972, 89}"; + sepNavVisRange = "{516, 1110}"; }; }; 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 3520}}"; - sepNavSelRange = "{6281, 0}"; - sepNavVisRange = "{5757, 1175}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 4144}}"; + sepNavSelRange = "{2120, 6}"; + sepNavVisRange = "{1748, 521}"; }; }; 6BDD9E060F91112200904EEF /* DetourStatNavMeshBuilder.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 489}}"; - sepNavSelRange = "{917, 0}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 559}}"; + sepNavSelRange = "{822, 0}"; sepNavVisRange = "{0, 1416}"; }; }; 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 7648}}"; - sepNavSelRange = "{8312, 28}"; - sepNavVisRange = "{8078, 566}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 12272}}"; + sepNavSelRange = "{15631, 0}"; + sepNavVisRange = "{15456, 726}"; }; }; 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 13584}}"; - sepNavSelRange = "{1622, 0}"; - sepNavVisRange = "{1367, 1211}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 13488}}"; + sepNavSelRange = "{19594, 0}"; + sepNavVisRange = "{18667, 1323}"; }; }; 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {915, 5568}}"; - sepNavSelRange = "{1025, 0}"; - sepNavVisRange = "{0, 1113}"; + sepNavIntBoundsRect = "{{0, 0}, {915, 5200}}"; + sepNavSelRange = "{8381, 101}"; + sepNavVisRange = "{8055, 875}"; sepNavWindowFrame = "{{15, 78}, {1011, 695}}"; }; }; diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 index 1da5978..725570e 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 @@ -279,14 +279,14 @@ PBXSmartGroupTreeModuleOutlineStateSelectionKey - 11 + 9 3 1 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 35}, {282, 660}} + {{0, 39}, {282, 660}} PBXTopSmartGroupGIDs @@ -321,7 +321,7 @@ PBXProjectModuleGUID 6B8632A30F78115100E2684A PBXProjectModuleLabel - DetourTileNavMesh.cpp + DetourDebugDraw.cpp PBXSplitModuleInNavigatorKey Split0 @@ -329,11 +329,11 @@ PBXProjectModuleGUID 6B8632A40F78115100E2684A PBXProjectModuleLabel - DetourTileNavMesh.cpp + DetourDebugDraw.cpp _historyCapacity 0 bookmark - 6B8DE88110B68A7500DF20FB + 6B8DEA7C10B6CFC900DF20FB history 6B3BFADD107A80E1006284CD @@ -341,37 +341,45 @@ 6B57D358108C66B200DDD053 6B57D38F108C69E400DDD053 6B7FB74D1091EBDE001BA51A - 6B8DE6FE10B01BBF00DF20FB 6B8DE70110B01BBF00DF20FB - 6B8DE70310B01BBF00DF20FB - 6B8DE70410B01BBF00DF20FB - 6B8DE70710B01BBF00DF20FB 6B8DE70A10B01BBF00DF20FB 6B8DE70B10B01BBF00DF20FB 6B8DE70D10B01BBF00DF20FB 6B8DE76D10B0243500DF20FB 6B8DE7F110B0517A00DF20FB 6B8DE7F310B0517A00DF20FB - 6B8DE7F410B0517A00DF20FB - 6B8DE7F510B0517A00DF20FB - 6B8DE7F610B0517A00DF20FB 6B8DE7F710B0517A00DF20FB 6B8DE7F810B0517A00DF20FB - 6B8DE81F10B0528100DF20FB - 6B8DE82010B0528100DF20FB 6B8DE84910B0584400DF20FB 6B8DE84A10B0584400DF20FB - 6B8DE85110B6873400DF20FB 6B8DE85210B6873400DF20FB 6B8DE85C10B6899100DF20FB - 6B8DE86B10B68A1300DF20FB - 6B8DE86C10B68A1300DF20FB - 6B8DE86D10B68A1300DF20FB - 6B8DE86E10B68A1300DF20FB - 6B8DE87A10B68A7500DF20FB - 6B8DE87B10B68A7500DF20FB - 6B8DE87C10B68A7500DF20FB - 6B8DE87D10B68A7500DF20FB + 6B8DE89910B6B3F800DF20FB + 6B8DE89A10B6B3F800DF20FB + 6B8DE89B10B6B3F800DF20FB + 6B8DE8A110B6B3F800DF20FB + 6B8DE8E710B6B59A00DF20FB + 6B8DE8E910B6B59A00DF20FB + 6B8DE8EA10B6B59A00DF20FB + 6B8DE8FD10B6B76800DF20FB + 6B8DE92D10B6BCDA00DF20FB + 6B8DE98B10B6C53B00DF20FB + 6B8DE98C10B6C53B00DF20FB + 6B8DE98D10B6C53B00DF20FB + 6B8DE98E10B6C53B00DF20FB + 6B8DE98F10B6C53B00DF20FB + 6B8DEA0110B6CA1500DF20FB + 6B8DEA0310B6CA1500DF20FB + 6B8DEA3610B6CBC200DF20FB + 6B8DEA3810B6CBC200DF20FB + 6B8DEA4010B6CC0400DF20FB + 6B8DEA6410B6CF6400DF20FB + 6B8DEA6510B6CF6400DF20FB + 6B8DEA6610B6CF6400DF20FB + 6B8DEA6710B6CF6400DF20FB + 6B8DEA7710B6CFC900DF20FB + 6B8DEA7810B6CFC900DF20FB + 6B8DEA7910B6CFC900DF20FB prevStack @@ -506,6 +514,196 @@ 6B8DE87E10B68A7500DF20FB 6B8DE87F10B68A7500DF20FB 6B8DE88010B68A7500DF20FB + 6B8DE8A310B6B3F800DF20FB + 6B8DE8A410B6B3F800DF20FB + 6B8DE8A510B6B3F800DF20FB + 6B8DE8A610B6B3F800DF20FB + 6B8DE8A710B6B3F800DF20FB + 6B8DE8A810B6B3F800DF20FB + 6B8DE8A910B6B3F800DF20FB + 6B8DE8AA10B6B3F800DF20FB + 6B8DE8AB10B6B3F800DF20FB + 6B8DE8AC10B6B3F800DF20FB + 6B8DE8AD10B6B3F800DF20FB + 6B8DE8AE10B6B3F800DF20FB + 6B8DE8AF10B6B3F800DF20FB + 6B8DE8B010B6B3F800DF20FB + 6B8DE8B110B6B3F800DF20FB + 6B8DE8B210B6B3F800DF20FB + 6B8DE8B310B6B3F800DF20FB + 6B8DE8B410B6B3F800DF20FB + 6B8DE8B510B6B3F800DF20FB + 6B8DE8B610B6B3F800DF20FB + 6B8DE8B710B6B3F800DF20FB + 6B8DE8B810B6B3F800DF20FB + 6B8DE8B910B6B3F800DF20FB + 6B8DE8BA10B6B3F800DF20FB + 6B8DE8BB10B6B3F800DF20FB + 6B8DE8BC10B6B3F800DF20FB + 6B8DE8BD10B6B3F800DF20FB + 6B8DE8BE10B6B3F800DF20FB + 6B8DE8BF10B6B3F800DF20FB + 6B8DE8C010B6B3F800DF20FB + 6B8DE8C110B6B3F800DF20FB + 6B8DE8C210B6B3F800DF20FB + 6B8DE8C310B6B3F800DF20FB + 6B8DE8C410B6B3F800DF20FB + 6B8DE8C510B6B3F800DF20FB + 6B8DE8C610B6B3F800DF20FB + 6B8DE8C710B6B3F800DF20FB + 6B8DE8C810B6B3F800DF20FB + 6B8DE8C910B6B3F800DF20FB + 6B8DE8CA10B6B3F800DF20FB + 6B8DE8CB10B6B3F800DF20FB + 6B8DE8CC10B6B3F800DF20FB + 6B8DE8CD10B6B3F800DF20FB + 6B8DE8CE10B6B3F800DF20FB + 6B8DE8CF10B6B3F800DF20FB + 6B8DE8D010B6B3F800DF20FB + 6B8DE8D110B6B3F800DF20FB + 6B8DE8D210B6B3F800DF20FB + 6B8DE8D310B6B3F800DF20FB + 6B8DE8D410B6B3F800DF20FB + 6B8DE8D510B6B3F800DF20FB + 6B8DE8D610B6B3F800DF20FB + 6B8DE8D710B6B3F800DF20FB + 6B8DE8D810B6B3F800DF20FB + 6B8DE8EC10B6B59A00DF20FB + 6B8DE8ED10B6B59A00DF20FB + 6B8DE8EE10B6B59A00DF20FB + 6B8DE8EF10B6B59A00DF20FB + 6B8DE8F010B6B59A00DF20FB + 6B8DE8F110B6B59A00DF20FB + 6B8DE90010B6B76800DF20FB + 6B8DE90110B6B76800DF20FB + 6B8DE90210B6B76800DF20FB + 6B8DE90310B6B76800DF20FB + 6B8DE90410B6B76800DF20FB + 6B8DE90510B6B76800DF20FB + 6B8DE90610B6B76800DF20FB + 6B8DE90710B6B76800DF20FB + 6B8DE90D10B6BAD500DF20FB + 6B8DE90E10B6BAD500DF20FB + 6B8DE90F10B6BAD500DF20FB + 6B8DE91010B6BAD500DF20FB + 6B8DE91110B6BAD500DF20FB + 6B8DE91210B6BAD500DF20FB + 6B8DE91310B6BAD500DF20FB + 6B8DE91410B6BAD500DF20FB + 6B8DE91510B6BAD500DF20FB + 6B8DE91610B6BAD500DF20FB + 6B8DE91710B6BAD500DF20FB + 6B8DE91810B6BAD500DF20FB + 6B8DE91910B6BAD500DF20FB + 6B8DE91A10B6BAD500DF20FB + 6B8DE91B10B6BAD500DF20FB + 6B8DE91C10B6BAD500DF20FB + 6B8DE91D10B6BAD500DF20FB + 6B8DE91E10B6BAD500DF20FB + 6B8DE91F10B6BAD500DF20FB + 6B8DE92010B6BAD500DF20FB + 6B8DE92110B6BAD500DF20FB + 6B8DE93110B6BCDA00DF20FB + 6B8DE93210B6BCDA00DF20FB + 6B8DE93310B6BCDA00DF20FB + 6B8DE93410B6BCDA00DF20FB + 6B8DE93510B6BCDA00DF20FB + 6B8DE93610B6BCDA00DF20FB + 6B8DE93D10B6BD1E00DF20FB + 6B8DE94A10B6BEDB00DF20FB + 6B8DE94B10B6BEDB00DF20FB + 6B8DE94C10B6BEDB00DF20FB + 6B8DE94D10B6BEDB00DF20FB + 6B8DE94E10B6BEDB00DF20FB + 6B8DE94F10B6BEDB00DF20FB + 6B8DE95010B6BEDB00DF20FB + 6B8DE95110B6BEDB00DF20FB + 6B8DE95210B6BEDB00DF20FB + 6B8DE95310B6BEDB00DF20FB + 6B8DE95410B6BEDB00DF20FB + 6B8DE95F10B6BF0100DF20FB + 6B8DE96010B6BF0100DF20FB + 6B8DE96B10B6BF6100DF20FB + 6B8DE97610B6C04900DF20FB + 6B8DE97710B6C04900DF20FB + 6B8DE97810B6C04900DF20FB + 6B8DE99410B6C53B00DF20FB + 6B8DE99510B6C53B00DF20FB + 6B8DE99610B6C53B00DF20FB + 6B8DE99710B6C53B00DF20FB + 6B8DE99810B6C53B00DF20FB + 6B8DE99910B6C53B00DF20FB + 6B8DE99A10B6C53B00DF20FB + 6B8DE99B10B6C53B00DF20FB + 6B8DE99C10B6C53B00DF20FB + 6B8DE99D10B6C53B00DF20FB + 6B8DE99E10B6C53B00DF20FB + 6B8DE99F10B6C53B00DF20FB + 6B8DE9A010B6C53B00DF20FB + 6B8DE9A110B6C53B00DF20FB + 6B8DE9A210B6C53B00DF20FB + 6B8DE9A310B6C53B00DF20FB + 6B8DE9A410B6C53B00DF20FB + 6B8DE9A510B6C53B00DF20FB + 6B8DE9A610B6C53B00DF20FB + 6B8DE9A710B6C53B00DF20FB + 6B8DE9A810B6C53B00DF20FB + 6B8DE9A910B6C53B00DF20FB + 6B8DE9AA10B6C53B00DF20FB + 6B8DE9AB10B6C53B00DF20FB + 6B8DE9AC10B6C53B00DF20FB + 6B8DE9AD10B6C53B00DF20FB + 6B8DE9AE10B6C53B00DF20FB + 6B8DE9AF10B6C53B00DF20FB + 6B8DE9B010B6C53B00DF20FB + 6B8DE9B110B6C53B00DF20FB + 6B8DE9B210B6C53B00DF20FB + 6B8DE9B310B6C53B00DF20FB + 6B8DE9B410B6C53B00DF20FB + 6B8DE9B510B6C53B00DF20FB + 6B8DE9B610B6C53B00DF20FB + 6B8DE9BD10B6C61D00DF20FB + 6B8DE9C510B6C64100DF20FB + 6B8DE9D010B6C75600DF20FB + 6B8DE9D610B6C7DD00DF20FB + 6B8DE9DB10B6C83E00DF20FB + 6B8DE9E410B6C8BE00DF20FB + 6B8DE9E510B6C8BE00DF20FB + 6B8DE9EC10B6C97B00DF20FB + 6B8DE9ED10B6C97B00DF20FB + 6B8DE9EE10B6C97B00DF20FB + 6B8DE9F710B6C9B700DF20FB + 6B8DE9F810B6C9B700DF20FB + 6B8DEA0510B6CA1500DF20FB + 6B8DEA0610B6CA1500DF20FB + 6B8DEA0710B6CA1500DF20FB + 6B8DEA0810B6CA1500DF20FB + 6B8DEA1010B6CAAD00DF20FB + 6B8DEA1710B6CAF600DF20FB + 6B8DEA1810B6CAF600DF20FB + 6B8DEA2310B6CB3000DF20FB + 6B8DEA2D10B6CB8A00DF20FB + 6B8DEA2E10B6CB8A00DF20FB + 6B8DEA2F10B6CB8A00DF20FB + 6B8DEA3A10B6CBC200DF20FB + 6B8DEA3B10B6CBC200DF20FB + 6B8DEA3C10B6CBC200DF20FB + 6B8DEA3D10B6CBC200DF20FB + 6B8DEA4310B6CC0400DF20FB + 6B8DEA4410B6CC0400DF20FB + 6B8DEA4510B6CC0400DF20FB + 6B8DEA4E10B6CC2600DF20FB + 6B8DEA5210B6CC5500DF20FB + 6B8DEA6910B6CF6400DF20FB + 6B8DEA6A10B6CF6400DF20FB + 6B8DEA6B10B6CF6400DF20FB + 6B8DEA6C10B6CF6400DF20FB + 6B8DEA6D10B6CF6400DF20FB + 6B8DEA6E10B6CF6400DF20FB + 6B8DEA6F10B6CF6400DF20FB + 6B8DEA7010B6CF6400DF20FB + 6B8DEA7A10B6CFC900DF20FB + 6B8DEA7B10B6CFC900DF20FB SplitCount @@ -519,18 +717,18 @@ GeometryConfiguration Frame - {{0, 0}, {976, 521}} + {{0, 0}, {976, 548}} RubberWindowFrame 0 59 1280 719 0 0 1280 778 Module PBXNavigatorGroup Proportion - 521pt + 548pt Proportion - 152pt + 125pt Tabs @@ -544,7 +742,7 @@ GeometryConfiguration Frame - {{10, 27}, {976, -27}} + {{10, 27}, {976, 262}} Module XCDetailModule @@ -560,7 +758,9 @@ GeometryConfiguration Frame - {{10, 27}, {976, 175}} + {{10, 27}, {976, 98}} + RubberWindowFrame + 0 59 1280 719 0 0 1280 778 Module PBXProjectFindModule @@ -598,9 +798,7 @@ GeometryConfiguration Frame - {{10, 27}, {976, 125}} - RubberWindowFrame - 0 59 1280 719 0 0 1280 778 + {{10, 27}, {976, 90}} Module PBXBuildResultsModule @@ -681,12 +879,12 @@ GeometryConfiguration Frame - {{0, 0}, {1280, 305}} + {{0, 0}, {1280, 359}} Module PBXDebugCLIModule Proportion - 305pt + 359pt ContentConfiguration @@ -705,8 +903,8 @@ yes sizes - {{0, 0}, {620, 135}} - {{620, 0}, {660, 135}} + {{0, 0}, {620, 115}} + {{620, 0}, {660, 115}} VerticalSplitView @@ -721,8 +919,8 @@ yes sizes - {{0, 0}, {1280, 135}} - {{0, 135}, {1280, 233}} + {{0, 0}, {1280, 115}} + {{0, 115}, {1280, 199}} @@ -742,7 +940,7 @@ DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame - {{0, 310}, {1280, 368}} + {{0, 364}, {1280, 314}} PBXDebugSessionStackFrameViewKey DebugVariablesTableConfiguration @@ -755,13 +953,13 @@ 430 Frame - {{620, 0}, {660, 135}} + {{620, 0}, {660, 115}} Module PBXDebugSessionModule Proportion - 368pt + 314pt Name @@ -816,6 +1014,9 @@ 5 WindowOrderList + 6B8DE95710B6BEDB00DF20FB + 6B8DE95810B6BEDB00DF20FB + 6B8DE8DB10B6B3F800DF20FB /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/Recast.xcodeproj WindowString @@ -1465,22 +1666,40 @@ 100 100 700 500 0 0 1280 1002 + FirstTimeWindowDisplayed + Identifier windowTool.bookmarks + IsVertical + Layout Dock + ContentConfiguration + + PBXProjectModuleGUID + 6B8DE8DA10B6B3F800DF20FB + PBXProjectModuleLabel + Bookmarks + + GeometryConfiguration + + Frame + {{0, 0}, {401, 202}} + RubberWindowFrame + 21 533 401 222 0 0 1280 778 + Module PBXBookmarksModule Proportion - 166pt + 202pt Proportion - 166pt + 202pt Name @@ -1490,9 +1709,19 @@ PBXBookmarksModule StatusbarIsVisible - 0 + + TableOfContents + + 6B8DE8DB10B6B3F800DF20FB + 6B8DE8DC10B6B3F800DF20FB + 6B8DE8DA10B6B3F800DF20FB + WindowString - 538 42 401 187 0 0 1280 1002 + 21 533 401 222 0 0 1280 778 + WindowToolGUID + 6B8DE8DB10B6B3F800DF20FB + WindowToolIsVisible + Identifier diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj b/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj index 9af2ebb..4a279ea 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj @@ -35,6 +35,9 @@ 6B62416A103434880002E346 /* RecastMeshDetail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B624169103434880002E346 /* RecastMeshDetail.cpp */; }; 6B8632DA0F78122C00E2684A /* SDL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B8632D90F78122C00E2684A /* SDL.framework */; }; 6B8632DC0F78123E00E2684A /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B8632DB0F78123E00E2684A /* OpenGL.framework */; }; + 6B8DE88910B69E3E00DF20FB /* DetourNavMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; }; + 6B8DE88A10B69E3E00DF20FB /* DetourNavMeshBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; }; + 6B8DE8F810B6B70E00DF20FB /* Sample_DynMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */; }; 6BB788170FC0472B003C24DB /* ChunkyTriMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */; }; 6BDD9E0A0F91113800904EEF /* DetourDebugDraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; }; 6BDD9E0B0F91113800904EEF /* DetourStatNavMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; }; @@ -96,6 +99,12 @@ 6B624169103434880002E346 /* RecastMeshDetail.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RecastMeshDetail.cpp; path = ../../../Recast/Source/RecastMeshDetail.cpp; sourceTree = SOURCE_ROOT; }; 6B8632D90F78122C00E2684A /* SDL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL.framework; path = Library/Frameworks/SDL.framework; sourceTree = SDKROOT; }; 6B8632DB0F78123E00E2684A /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DetourNavMesh.cpp; path = ../../../Detour/Source/DetourNavMesh.cpp; sourceTree = SOURCE_ROOT; }; + 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DetourNavMeshBuilder.cpp; path = ../../../Detour/Source/DetourNavMeshBuilder.cpp; sourceTree = SOURCE_ROOT; }; + 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetourNavMesh.h; path = ../../../Detour/Include/DetourNavMesh.h; sourceTree = SOURCE_ROOT; }; + 6B8DE88C10B69E4C00DF20FB /* DetourNavMeshBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetourNavMeshBuilder.h; path = ../../../Detour/Include/DetourNavMeshBuilder.h; sourceTree = SOURCE_ROOT; }; + 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Sample_DynMesh.h; path = ../../Include/Sample_DynMesh.h; sourceTree = SOURCE_ROOT; }; + 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Sample_DynMesh.cpp; path = ../../Source/Sample_DynMesh.cpp; sourceTree = SOURCE_ROOT; }; 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ChunkyTriMesh.cpp; path = ../../Source/ChunkyTriMesh.cpp; sourceTree = SOURCE_ROOT; }; 6BB788180FC04753003C24DB /* ChunkyTriMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ChunkyTriMesh.h; path = ../../Include/ChunkyTriMesh.h; sourceTree = SOURCE_ROOT; }; 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetourDebugDraw.h; path = ../../../Detour/Include/DetourDebugDraw.h; sourceTree = SOURCE_ROOT; }; @@ -238,6 +247,8 @@ children = ( 6B25B6100FFA62AD004F1BC4 /* Sample.h */, 6B25B6140FFA62BE004F1BC4 /* Sample.cpp */, + 6B8DE8F610B6B70100DF20FB /* Sample_DynMesh.h */, + 6B8DE8F710B6B70E00DF20FB /* Sample_DynMesh.cpp */, 6B2AEC510FFB8946005BE9CC /* Sample_TileMesh.h */, 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */, 6B2AEC570FFB89F4005BE9CC /* Sample_StatMeshTiled.h */, @@ -253,6 +264,10 @@ 6BDD9E030F91110C00904EEF /* Detour */ = { isa = PBXGroup; children = ( + 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */, + 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */, + 6B8DE88C10B69E4C00DF20FB /* DetourNavMeshBuilder.h */, + 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */, 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */, 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */, 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */, @@ -355,6 +370,9 @@ 6B1185FE10068B150018F96F /* DetourCommon.cpp in Sources */, 6B555DB1100B212E00247EA3 /* imguiRenderGL.cpp in Sources */, 6B62416A103434880002E346 /* RecastMeshDetail.cpp in Sources */, + 6B8DE88910B69E3E00DF20FB /* DetourNavMesh.cpp in Sources */, + 6B8DE88A10B69E3E00DF20FB /* DetourNavMeshBuilder.cpp in Sources */, + 6B8DE8F810B6B70E00DF20FB /* Sample_DynMesh.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/RecastDemo/Include/Sample_DynMesh.h b/RecastDemo/Include/Sample_DynMesh.h new file mode 100644 index 0000000..b49f619 --- /dev/null +++ b/RecastDemo/Include/Sample_DynMesh.h @@ -0,0 +1,114 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef RECASTSAMPLEDYNMESH_H +#define RECASTSAMPLEDYNMESH_H + +#include "Sample.h" +#include "DetourNavMesh.h" +#include "Recast.h" +#include "RecastLog.h" +#include "ChunkyTriMesh.h" + +class Sample_DynMesh : public Sample +{ +protected: + + bool m_keepInterResults; + rcBuildTimes m_buildTimes; + + dtNavMesh* m_navMesh; + rcChunkyTriMesh* m_chunkyMesh; + unsigned char* m_triflags; + rcHeightfield* m_solid; + rcCompactHeightfield* m_chf; + rcContourSet* m_cset; + rcPolyMesh* m_pmesh; + rcPolyMeshDetail* m_dmesh; + rcConfig m_cfg; + + float m_tileSize; + + float m_spos[3]; + float m_epos[3]; + bool m_sposSet; + bool m_eposSet; + + float m_tileCol[4]; + float m_tileBmin[3]; + float m_tileBmax[3]; + float m_tileBuildTime; + float m_tileMemUsage; + int m_tileTriCount; + + enum ToolMode + { + TOOLMODE_CREATE_TILES, + TOOLMODE_PATHFIND, + TOOLMODE_RAYCAST, + TOOLMODE_DISTANCE_TO_WALL, + TOOLMODE_FIND_POLYS_AROUND, + }; + + dtPolyRef m_startRef; + dtPolyRef m_endRef; + float m_polyPickExt[3]; + + static const int MAX_POLYS = 256; + + dtPolyRef m_polys[MAX_POLYS]; + dtPolyRef m_parent[MAX_POLYS]; + int m_npolys; + float m_straightPath[MAX_POLYS*3]; + int m_nstraightPath; + float m_hitPos[3]; + float m_hitNormal[3]; + float m_distanceToWall; + + ToolMode m_toolMode; + + void toolRecalc(); + + void buildTile(const float* pos); + void removeTile(const float* pos); + + unsigned char* buildTileMesh(const float* bmin, const float* bmax, int& dataSize); + + void cleanup(); + +public: + Sample_DynMesh(); + virtual ~Sample_DynMesh(); + + virtual void handleSettings(); + virtual void handleTools(); + virtual void handleDebugMode(); + + virtual void setToolStartPos(const float* p); + virtual void setToolEndPos(const float* p); + + virtual void handleRender(); + virtual void handleRenderOverlay(double* proj, double* model, int* view); + virtual void handleMeshChanged(const float* verts, int nverts, + const int* tris, const float* trinorms, int ntris, + const float* bmin, const float* bmax); + virtual bool handleBuild(); +}; + + +#endif // RECASTSAMPLEDYNMESH_H diff --git a/RecastDemo/Source/Sample_DynMesh.cpp b/RecastDemo/Source/Sample_DynMesh.cpp new file mode 100644 index 0000000..67fdd79 --- /dev/null +++ b/RecastDemo/Source/Sample_DynMesh.cpp @@ -0,0 +1,931 @@ +// +// Copyright (c) 2009 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#define _USE_MATH_DEFINES +#include +#include +#include +#include "SDL.h" +#include "SDL_opengl.h" +#include "imgui.h" +#include "Sample.h" +#include "Sample_DynMesh.h" +#include "Recast.h" +#include "RecastTimer.h" +#include "RecastDebugDraw.h" +#include "DetourNavMesh.h" +#include "DetourNavMeshBuilder.h" +#include "DetourDebugDraw.h" + +#ifdef WIN32 +# define snprintf _snprintf +#endif + + +Sample_DynMesh::Sample_DynMesh() : + m_keepInterResults(false), + m_navMesh(0), + m_chunkyMesh(0), + m_triflags(0), + m_solid(0), + m_chf(0), + m_cset(0), + m_pmesh(0), + m_dmesh(0), + m_tileSize(32), + m_sposSet(false), + m_eposSet(false), + m_tileBuildTime(0), + m_tileMemUsage(0), + m_tileTriCount(0), + m_startRef(0), + m_endRef(0), + m_npolys(0), + m_nstraightPath(0), + m_distanceToWall(0), + m_toolMode(TOOLMODE_CREATE_TILES) +{ + resetCommonSettings(); + memset(m_tileBmin, 0, sizeof(m_tileBmin)); + memset(m_tileBmax, 0, sizeof(m_tileBmax)); + m_polyPickExt[0] = 2; + m_polyPickExt[1] = 4; + m_polyPickExt[2] = 2; +} + +Sample_DynMesh::~Sample_DynMesh() +{ + cleanup(); + delete m_navMesh; + delete m_chunkyMesh; +} + +void Sample_DynMesh::cleanup() +{ + delete [] m_triflags; + m_triflags = 0; + delete m_solid; + m_solid = 0; + delete m_chf; + m_chf = 0; + delete m_cset; + m_cset = 0; + delete m_pmesh; + m_pmesh = 0; + delete m_dmesh; + m_dmesh = 0; +} + +void Sample_DynMesh::handleSettings() +{ + Sample::handleCommonSettings(); + + imguiLabel("Tiling"); + imguiSlider("TileSize", &m_tileSize, 16.0f, 1024.0f, 16.0f); + + char text[64]; + int gw = 0, gh = 0; + rcCalcGridSize(m_bmin, m_bmax, m_cellSize, &gw, &gh); + const int ts = (int)m_tileSize; + const int tw = (gw + ts-1) / ts; + const int th = (gh + ts-1) / ts; + snprintf(text, 64, "Tiles %d x %d", tw, th); + imguiValue(text); +} + +void Sample_DynMesh::toolRecalc() +{ + m_startRef = 0; + if (m_sposSet) + m_startRef = m_navMesh->findNearestPoly(m_spos, m_polyPickExt); + + m_endRef = 0; + if (m_eposSet) + m_endRef = m_navMesh->findNearestPoly(m_epos, m_polyPickExt); + + if (m_toolMode == TOOLMODE_PATHFIND) + { + if (m_sposSet && m_eposSet && m_startRef && m_endRef) + { + m_npolys = m_navMesh->findPath(m_startRef, m_endRef, m_spos, m_epos, m_polys, MAX_POLYS); + if (m_npolys) + m_nstraightPath = m_navMesh->findStraightPath(m_spos, m_epos, m_polys, m_npolys, m_straightPath, MAX_POLYS); + } + else + { + m_npolys = 0; + m_nstraightPath = 0; + } + } + else if (m_toolMode == TOOLMODE_RAYCAST) + { + m_nstraightPath = 0; + if (m_sposSet && m_eposSet && m_startRef) + { + float t = 0; + m_npolys = 0; + m_nstraightPath = 2; + m_straightPath[0] = m_spos[0]; + m_straightPath[1] = m_spos[1]; + m_straightPath[2] = m_spos[2]; + m_npolys = m_navMesh->raycast(m_startRef, m_spos, m_epos, t, m_polys, MAX_POLYS); + if (m_npolys && t < 1) + { + m_straightPath[3] = m_spos[0] + (m_epos[0] - m_spos[0]) * t; + m_straightPath[4] = m_spos[1] + (m_epos[1] - m_spos[1]) * t; + m_straightPath[5] = m_spos[2] + (m_epos[2] - m_spos[2]) * t; + } + else + { + m_straightPath[3] = m_epos[0]; + m_straightPath[4] = m_epos[1]; + m_straightPath[5] = m_epos[2]; + } + } + } + else if (m_toolMode == TOOLMODE_DISTANCE_TO_WALL) + { + m_distanceToWall = 0; + if (m_sposSet && m_startRef) + m_distanceToWall = m_navMesh->findDistanceToWall(m_startRef, m_spos, 100.0f, m_hitPos, m_hitNormal); + } + else if (m_toolMode == TOOLMODE_FIND_POLYS_AROUND) + { + if (m_sposSet && m_startRef && m_eposSet) + { + const float dx = m_epos[0] - m_spos[0]; + const float dz = m_epos[2] - m_spos[2]; + float dist = sqrtf(dx*dx + dz*dz); + m_npolys = m_navMesh->findPolysAround(m_startRef, m_spos, dist, m_polys, m_parent, 0, MAX_POLYS); + } + } + +} + +void Sample_DynMesh::handleTools() +{ + if (imguiCheck("Create Tiles", m_toolMode == TOOLMODE_CREATE_TILES)) + { + m_toolMode = TOOLMODE_CREATE_TILES; + toolRecalc(); + } + if (imguiCheck("Pathfind", m_toolMode == TOOLMODE_PATHFIND)) + { + m_toolMode = TOOLMODE_PATHFIND; + toolRecalc(); + } + if (imguiCheck("Distance to Wall", m_toolMode == TOOLMODE_DISTANCE_TO_WALL)) + { + m_toolMode = TOOLMODE_DISTANCE_TO_WALL; + toolRecalc(); + } + if (imguiCheck("Raycast", m_toolMode == TOOLMODE_RAYCAST)) + { + m_toolMode = TOOLMODE_RAYCAST; + toolRecalc(); + } + if (imguiCheck("Find Polys Around", m_toolMode == TOOLMODE_FIND_POLYS_AROUND)) + { + m_toolMode = TOOLMODE_FIND_POLYS_AROUND; + toolRecalc(); + } + if (imguiButton("Create All")) + { + int gw = 0, gh = 0; + rcCalcGridSize(m_bmin, m_bmax, m_cellSize, &gw, &gh); + const int ts = (int)m_tileSize; + const int tw = (gw + ts-1) / ts; + const int th = (gh + ts-1) / ts; + const float tcs = m_tileSize*m_cellSize; + + for (int y = 0; y < th; ++y) + { + for (int x = 0; x < tw; ++x) + { + m_tileBmin[0] = m_bmin[0] + x*tcs; + m_tileBmin[1] = m_bmin[1]; + m_tileBmin[2] = m_bmin[2] + y*tcs; + + m_tileBmax[0] = m_bmin[0] + (x+1)*tcs; + m_tileBmax[1] = m_bmax[1]; + m_tileBmax[2] = m_bmin[2] + (y+1)*tcs; + + int dataSize = 0; + unsigned char* data = buildTileMesh(m_tileBmin, m_tileBmax, dataSize); + if (data) + { + // Remove any previous data (navmesh owns and deletes the data). + m_navMesh->removeTileAt(x,y,0,0); + // Let the navmesh own the data. + if (!m_navMesh->addTileAt(x,y,data,dataSize,true)) + delete [] data; + } + } + } + + toolRecalc(); + } +} + +void Sample_DynMesh::handleDebugMode() +{ + if (m_navMesh) + { + imguiValue("Navmesh ready."); + imguiValue("Use 'Create Tiles' tool to experiment."); + imguiValue("LMB: (Re)Create tiles."); + imguiValue("LMB+SHIFT: Remove tiles."); + } + +} + +static void getPolyCenter(dtNavMesh* navMesh, dtPolyRef ref, float* center) +{ + const dtPoly* p = navMesh->getPolyByRef(ref); + if (!p) return; + const float* verts = navMesh->getPolyVertsByRef(ref); + center[0] = 0; + center[1] = 0; + center[2] = 0; + for (int i = 0; i < (int)p->nv; ++i) + { + const float* v = &verts[p->v[i]*3]; + center[0] += v[0]; + center[1] += v[1]; + center[2] += v[2]; + } + const float s = 1.0f / p->nv; + center[0] *= s; + center[1] *= s; + center[2] *= s; +} + +void Sample_DynMesh::handleRender() +{ + if (!m_verts || !m_tris || !m_trinorms) + return; + + DebugDrawGL dd; + + // Draw mesh + if (m_navMesh) + rcDebugDrawMesh(&dd, m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); + else + rcDebugDrawMeshSlope(&dd, m_verts, m_nverts, m_tris, m_trinorms, m_ntris, m_agentMaxSlope); + + glDepthMask(GL_FALSE); + + // Draw bounds + float col[4] = {1,1,1,0.5f}; + rcDebugDrawBoxWire(&dd, m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); + + // Tiling grid. + const int ts = (int)m_tileSize; + int gw = 0, gh = 0; + rcCalcGridSize(m_bmin, m_bmax, m_cellSize, &gw, &gh); + int tw = (gw + ts-1) / ts; + int th = (gh + ts-1) / ts; + const float s = ts*m_cellSize; + glBegin(GL_LINES); + glColor4ub(0,0,0,64); + for (int y = 0; y < th; ++y) + { + for (int x = 0; x < tw; ++x) + { + float fx, fy, fz; + fx = m_bmin[0] + x*s; + fy = m_bmin[1]; + fz = m_bmin[2] + y*s; + + glVertex3f(fx,fy,fz); + glVertex3f(fx+s,fy,fz); + glVertex3f(fx,fy,fz); + glVertex3f(fx,fy,fz+s); + + if (x+1 >= tw) + { + glVertex3f(fx+s,fy,fz); + glVertex3f(fx+s,fy,fz+s); + } + if (y+1 >= th) + { + glVertex3f(fx,fy,fz+s); + glVertex3f(fx+s,fy,fz+s); + } + } + } + glEnd(); + + // Draw active tile + rcDebugDrawBoxWire(&dd, m_tileBmin[0],m_tileBmin[1],m_tileBmin[2], m_tileBmax[0],m_tileBmax[1],m_tileBmax[2], m_tileCol); + + if (m_navMesh) + dtDebugDrawNavMesh(m_navMesh); + + if (m_sposSet) + { + const float s = 0.5f; + glColor4ub(64,16,0,255); + glLineWidth(3.0f); + glBegin(GL_LINES); + glVertex3f(m_spos[0]-s,m_spos[1]+m_cellHeight,m_spos[2]); + glVertex3f(m_spos[0]+s,m_spos[1]+m_cellHeight,m_spos[2]); + glVertex3f(m_spos[0],m_spos[1]-s+m_cellHeight,m_spos[2]); + glVertex3f(m_spos[0],m_spos[1]+s+m_cellHeight,m_spos[2]); + glVertex3f(m_spos[0],m_spos[1]+m_cellHeight,m_spos[2]-s); + glVertex3f(m_spos[0],m_spos[1]+m_cellHeight,m_spos[2]+s); + glEnd(); + glLineWidth(1.0f); + } + if (m_eposSet) + { + const float s = 0.5f; + glColor4ub(16,64,0,255); + glLineWidth(3.0f); + glBegin(GL_LINES); + glVertex3f(m_epos[0]-s,m_epos[1]+m_cellHeight,m_epos[2]); + glVertex3f(m_epos[0]+s,m_epos[1]+m_cellHeight,m_epos[2]); + glVertex3f(m_epos[0],m_epos[1]-s+m_cellHeight,m_epos[2]); + glVertex3f(m_epos[0],m_epos[1]+s+m_cellHeight,m_epos[2]); + glVertex3f(m_epos[0],m_epos[1]+m_cellHeight,m_epos[2]-s); + glVertex3f(m_epos[0],m_epos[1]+m_cellHeight,m_epos[2]+s); + glEnd(); + glLineWidth(1.0f); + } + + static const float startCol[4] = { 0.5f, 0.1f, 0.0f, 0.75f }; + static const float endCol[4] = { 0.2f, 0.4f, 0.0f, 0.75f }; + static const float pathCol[4] = {0,0,0,0.25f}; + + if (m_toolMode == TOOLMODE_PATHFIND) + { + dtDebugDrawNavMeshPoly(m_navMesh, m_startRef, startCol); + dtDebugDrawNavMeshPoly(m_navMesh, m_endRef, endCol); + + if (m_npolys) + { + for (int i = 1; i < m_npolys-1; ++i) + dtDebugDrawNavMeshPoly(m_navMesh, m_polys[i], pathCol); + } + if (m_nstraightPath) + { + glColor4ub(64,16,0,220); + glLineWidth(3.0f); + glBegin(GL_LINE_STRIP); + for (int i = 0; i < m_nstraightPath; ++i) + glVertex3f(m_straightPath[i*3], m_straightPath[i*3+1]+0.4f, m_straightPath[i*3+2]); + glEnd(); + glLineWidth(1.0f); + glPointSize(4.0f); + glBegin(GL_POINTS); + for (int i = 0; i < m_nstraightPath; ++i) + glVertex3f(m_straightPath[i*3], m_straightPath[i*3+1]+0.4f, m_straightPath[i*3+2]); + glEnd(); + glPointSize(1.0f); + } + } + else if (m_toolMode == TOOLMODE_RAYCAST) + { + dtDebugDrawNavMeshPoly(m_navMesh, m_startRef, startCol); + + if (m_nstraightPath) + { + for (int i = 1; i < m_npolys; ++i) + dtDebugDrawNavMeshPoly(m_navMesh, m_polys[i], pathCol); + + glColor4ub(64,16,0,220); + glLineWidth(3.0f); + glBegin(GL_LINE_STRIP); + for (int i = 0; i < m_nstraightPath; ++i) + glVertex3f(m_straightPath[i*3], m_straightPath[i*3+1]+0.4f, m_straightPath[i*3+2]); + glEnd(); + glLineWidth(1.0f); + glPointSize(4.0f); + glBegin(GL_POINTS); + for (int i = 0; i < m_nstraightPath; ++i) + glVertex3f(m_straightPath[i*3], m_straightPath[i*3+1]+0.4f, m_straightPath[i*3+2]); + glEnd(); + glPointSize(1.0f); + } + } + else if (m_toolMode == TOOLMODE_DISTANCE_TO_WALL) + { + dtDebugDrawNavMeshPoly(m_navMesh, m_startRef, startCol); + const float col[4] = {1,1,1,0.5f}; + rcDebugDrawCylinderWire(&dd, m_spos[0]-m_distanceToWall, m_spos[1]+0.02f, m_spos[2]-m_distanceToWall, + m_spos[0]+m_distanceToWall, m_spos[1]+m_agentHeight, m_spos[2]+m_distanceToWall, col); + glLineWidth(3.0f); + glColor4fv(col); + glBegin(GL_LINES); + glVertex3f(m_hitPos[0], m_hitPos[1] + 0.02f, m_hitPos[2]); + glVertex3f(m_hitPos[0], m_hitPos[1] + m_agentHeight, m_hitPos[2]); + glEnd(); + glLineWidth(1.0f); + } + else if (m_toolMode == TOOLMODE_FIND_POLYS_AROUND) + { + const float cola[4] = {0,0,0,0.5f}; + for (int i = 0; i < m_npolys; ++i) + { + dtDebugDrawNavMeshPoly(m_navMesh, m_polys[i], pathCol); + if (m_parent[i]) + { + float p0[3], p1[3]; + getPolyCenter(m_navMesh, m_polys[i], p0); + getPolyCenter(m_navMesh, m_parent[i], p1); + glColor4ub(0,0,0,128); + rcDrawArc(&dd, p0, p1, cola, 2.0f); + } + } + + const float dx = m_epos[0] - m_spos[0]; + const float dz = m_epos[2] - m_spos[2]; + float dist = sqrtf(dx*dx + dz*dz); + const float col[4] = {1,1,1,0.5f}; + rcDebugDrawCylinderWire(&dd, m_spos[0]-dist, m_spos[1]+0.02f, m_spos[2]-dist, + m_spos[0]+dist, m_spos[1]+m_agentHeight, m_spos[2]+dist, col); + } + + glDepthMask(GL_TRUE); + +} + +void Sample_DynMesh::handleRenderOverlay(double* proj, double* model, int* view) +{ + GLdouble x, y, z; + + // Draw start and end point labels + if (m_tileBuildTime > 0.0f && gluProject((GLdouble)(m_tileBmin[0]+m_tileBmax[0])/2, (GLdouble)(m_tileBmin[1]+m_tileBmax[1])/2, (GLdouble)(m_tileBmin[2]+m_tileBmax[2])/2, + model, proj, view, &x, &y, &z)) + { + char text[32]; + snprintf(text,32,"%.3fms / %dTris / %.1fkB", m_tileBuildTime, m_tileTriCount, m_tileMemUsage); + imguiDrawText((int)x, (int)y-25, IMGUI_ALIGN_CENTER, text, imguiRGBA(0,0,0,220)); + } +} + +void Sample_DynMesh::handleMeshChanged(const float* verts, int nverts, + const int* tris, const float* trinorms, int ntris, + const float* bmin, const float* bmax) +{ + m_verts = verts; + m_nverts = nverts; + m_tris = tris; + m_trinorms = trinorms; + m_ntris = ntris; + vcopy(m_bmin, bmin); + vcopy(m_bmax, bmax); + + delete m_chunkyMesh; + m_chunkyMesh = 0; + delete m_navMesh; + m_navMesh = 0; + cleanup(); +} + +void Sample_DynMesh::setToolStartPos(const float* p) +{ + m_sposSet = true; + vcopy(m_spos, p); + + if (m_toolMode == TOOLMODE_CREATE_TILES) + removeTile(m_spos); + else + toolRecalc(); +} + +void Sample_DynMesh::setToolEndPos(const float* p) +{ + if (!m_navMesh) + return; + + m_eposSet = true; + vcopy(m_epos, p); + + if (m_toolMode == TOOLMODE_CREATE_TILES) + buildTile(m_epos); + else + toolRecalc(); +} + +bool Sample_DynMesh::handleBuild() +{ + if (!m_verts || !m_tris) + { + printf("No verts or tris\n"); + return false; + } + + delete m_navMesh; + m_navMesh = new dtNavMesh; + if (!m_navMesh) + { + printf("Could not allocate navmehs\n"); + return false; + } + if (!m_navMesh->init(m_bmin, m_tileSize*m_cellSize, m_agentMaxClimb*m_cellHeight, 512, 512, 2048)) + { + printf("Could not init navmesh\n"); + return false; + } + + // Build chunky mesh. + delete m_chunkyMesh; + m_chunkyMesh = new rcChunkyTriMesh; + if (!m_chunkyMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'm_chunkyMesh'."); + return false; + } + if (!rcCreateChunkyTriMesh(m_verts, m_tris, m_ntris, 256, m_chunkyMesh)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Could not build chunky mesh."); + return false; + } + + return true; +} + +void Sample_DynMesh::buildTile(const float* pos) +{ + if (!m_navMesh) + return; + + const float ts = m_tileSize*m_cellSize; + const int tx = (int)floorf((pos[0]-m_bmin[0]) / ts); + const int ty = (int)floorf((pos[2]-m_bmin[2]) / ts); + if (tx < 0 || ty < 0) + return; + + m_tileBmin[0] = m_bmin[0] + tx*ts; + m_tileBmin[1] = m_bmin[1]; + m_tileBmin[2] = m_bmin[2] + ty*ts; + + m_tileBmax[0] = m_bmin[0] + (tx+1)*ts; + m_tileBmax[1] = m_bmax[1]; + m_tileBmax[2] = m_bmin[2] + (ty+1)*ts; + + m_tileCol[0] = 0.3f; m_tileCol[1] = 0.8f; m_tileCol[2] = 0; m_tileCol[3] = 1; + + int dataSize = 0; + unsigned char* data = buildTileMesh(m_tileBmin, m_tileBmax, dataSize); + + if (data) + { + // Remove any previous data (navmesh owns and deletes the data). + m_navMesh->removeTileAt(tx,ty,0,0); + + // Let the navmesh own the data. + if (!m_navMesh->addTileAt(tx,ty,data,dataSize,true)) + delete [] data; + } +} + +void Sample_DynMesh::removeTile(const float* pos) +{ + if (!m_navMesh) + return; + + const float ts = m_tileSize*m_cellSize; + const int tx = (int)floorf((pos[0]-m_bmin[0]) / ts); + const int ty = (int)floorf((pos[2]-m_bmin[2]) / ts); + + m_tileBmin[0] = m_bmin[0] + tx*ts; + m_tileBmin[1] = m_bmin[1]; + m_tileBmin[2] = m_bmin[2] + ty*ts; + + m_tileBmax[0] = m_bmin[0] + (tx+1)*ts; + m_tileBmax[1] = m_bmax[1]; + m_tileBmax[2] = m_bmin[2] + (ty+1)*ts; + + m_tileCol[0] = 0.8f; m_tileCol[1] = 0.1f; m_tileCol[2] = 0; m_tileCol[3] = 1; + + unsigned char* rdata = 0; + int rdataSize = 0; + if (m_navMesh->removeTileAt(tx,ty,&rdata,&rdataSize)) + delete [] rdata; +} + +unsigned char* Sample_DynMesh::buildTileMesh(const float* bmin, const float* bmax, int& dataSize) +{ + if (!m_verts || ! m_tris) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Input mesh is not specified."); + return 0; + } + + cleanup(); + + // Init build configuration from GUI + memset(&m_cfg, 0, sizeof(m_cfg)); + m_cfg.cs = m_cellSize; + m_cfg.ch = m_cellHeight; + m_cfg.walkableSlopeAngle = m_agentMaxSlope; + m_cfg.walkableHeight = (int)ceilf(m_agentHeight / m_cfg.ch); + m_cfg.walkableClimb = (int)ceilf(m_agentMaxClimb / m_cfg.ch); + m_cfg.walkableRadius = (int)ceilf(m_agentRadius / m_cfg.cs); + m_cfg.maxEdgeLen = (int)(m_edgeMaxLen / m_cellSize); + m_cfg.maxSimplificationError = m_edgeMaxError; + m_cfg.minRegionSize = (int)rcSqr(m_regionMinSize); + m_cfg.mergeRegionSize = (int)rcSqr(m_regionMergeSize); + m_cfg.maxVertsPerPoly = (int)m_vertsPerPoly; + m_cfg.tileSize = (int)m_tileSize; + m_cfg.borderSize = m_cfg.walkableRadius + 3; // Reserve enough padding. + m_cfg.width = m_cfg.tileSize + m_cfg.borderSize*2; + m_cfg.height = m_cfg.tileSize + m_cfg.borderSize*2; + m_cfg.detailSampleDist = m_detailSampleDist < 0.9f ? 0 : m_cellSize * m_detailSampleDist; + m_cfg.detailSampleMaxError = m_cellHeight * m_detailSampleMaxError; + + vcopy(m_cfg.bmin, bmin); + vcopy(m_cfg.bmax, bmax); + m_cfg.bmin[0] -= m_cfg.borderSize*m_cfg.cs; + m_cfg.bmin[2] -= m_cfg.borderSize*m_cfg.cs; + m_cfg.bmax[0] += m_cfg.borderSize*m_cfg.cs; + m_cfg.bmax[2] += m_cfg.borderSize*m_cfg.cs; + + // Reset build times gathering. + memset(&m_buildTimes, 0, sizeof(m_buildTimes)); + rcSetBuildTimes(&m_buildTimes); + + // Start the build process. + rcTimeVal totStartTime = rcGetPerformanceTimer(); + + if (rcGetLog()) + { + rcGetLog()->log(RC_LOG_PROGRESS, "Building navigation:"); + rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d cells", m_cfg.width, m_cfg.height); + rcGetLog()->log(RC_LOG_PROGRESS, " - %.1fK verts, %.1fK tris", m_nverts/1000.0f, m_ntris/1000.0f); + } + + // Allocate voxel heighfield where we rasterize our input data to. + m_solid = new rcHeightfield; + if (!m_solid) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'solid'."); + return 0; + } + if (!rcCreateHeightfield(*m_solid, m_cfg.width, m_cfg.height, m_cfg.bmin, m_cfg.bmax, m_cfg.cs, m_cfg.ch)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not create solid heightfield."); + return 0; + } + + // Allocate array that can hold triangle flags. + // If you have multiple meshes you need to process, allocate + // and array which can hold the max number of triangles you need to process. + m_triflags = new unsigned char[m_chunkyMesh->maxTrisPerChunk]; + if (!m_triflags) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'triangleFlags' (%d).", m_chunkyMesh->maxTrisPerChunk); + return 0; + } + + + float tbmin[2], tbmax[2]; + tbmin[0] = m_cfg.bmin[0]; + tbmin[1] = m_cfg.bmin[2]; + tbmax[0] = m_cfg.bmax[0]; + tbmax[1] = m_cfg.bmax[2]; + int cid[256];// TODO: Make grow when returning too many items. + const int ncid = rcGetChunksInRect(m_chunkyMesh, tbmin, tbmax, cid, 256); + if (!ncid) + return 0; + + m_tileTriCount = 0; + + for (int i = 0; i < ncid; ++i) + { + const rcChunkyTriMeshNode& node = m_chunkyMesh->nodes[cid[i]]; + const int* tris = &m_chunkyMesh->tris[node.i*3]; + const int ntris = node.n; + + m_tileTriCount += ntris; + + memset(m_triflags, 0, ntris*sizeof(unsigned char)); + rcMarkWalkableTriangles(m_cfg.walkableSlopeAngle, + m_verts, m_nverts, tris, ntris, m_triflags); + + rcRasterizeTriangles(m_verts, m_nverts, tris, m_triflags, ntris, *m_solid); + } + + if (!m_keepInterResults) + { + delete [] m_triflags; + m_triflags = 0; + } + + // Once all geoemtry is rasterized, we do initial pass of filtering to + // remove unwanted overhangs caused by the conservative rasterization + // as well as filter spans where the character cannot possibly stand. + rcFilterLedgeSpans(m_cfg.walkableHeight, m_cfg.walkableClimb, *m_solid); + rcFilterWalkableLowHeightSpans(m_cfg.walkableHeight, *m_solid); + + // Compact the heightfield so that it is faster to handle from now on. + // This will result more cache coherent data as well as the neighbours + // between walkable cells will be calculated. + m_chf = new rcCompactHeightfield; + if (!m_chf) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'chf'."); + return 0; + } + if (!rcBuildCompactHeightfield(m_cfg.walkableHeight, m_cfg.walkableClimb, RC_WALKABLE, *m_solid, *m_chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build compact data."); + return 0; + } + + if (!m_keepInterResults) + { + delete m_solid; + m_solid = 0; + } + + // Prepare for region partitioning, by calculating distance field along the walkable surface. + if (!rcBuildDistanceField(*m_chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build distance field."); + return 0; + } + + // Partition the walkable surface into simple regions without holes. + if (!rcBuildRegions(*m_chf, m_cfg.walkableRadius, m_cfg.borderSize, m_cfg.minRegionSize, m_cfg.mergeRegionSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build regions."); + return 0; + } + + // Create contours. + m_cset = new rcContourSet; + if (!m_cset) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'cset'."); + return 0; + } + if (!rcBuildContours(*m_chf, m_cfg.maxSimplificationError, m_cfg.maxEdgeLen, *m_cset)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not create contours."); + return 0; + } + + if (m_cset->nconts == 0) + { + return 0; + } + + // Build polygon navmesh from the contours. + m_pmesh = new rcPolyMesh; + if (!m_pmesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'pmesh'."); + return 0; + } + if (!rcBuildPolyMesh(*m_cset, m_cfg.maxVertsPerPoly, *m_pmesh)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not triangulate contours."); + return 0; + } + + // Build detail mesh. + m_dmesh = new rcPolyMeshDetail; + if (!m_dmesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'dmesh'."); + return 0; + } + + if (!rcBuildPolyMeshDetail(*m_pmesh, *m_chf, + m_cfg.detailSampleDist, m_cfg.detailSampleMaxError, + *m_dmesh)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could build polymesh detail."); + return 0; + } + + if (!m_keepInterResults) + { + delete m_chf; + m_chf = 0; + delete m_cset; + m_cset = 0; + } + + unsigned char* navData = 0; + int navDataSize = 0; + if (m_cfg.maxVertsPerPoly <= DT_VERTS_PER_POLYGON) + { + // Remove padding from the polymesh data. TODO: Remove this odditity. + for (int i = 0; i < m_pmesh->nverts; ++i) + { + unsigned short* v = &m_pmesh->verts[i*3]; + v[0] -= (unsigned short)m_cfg.borderSize; + v[2] -= (unsigned short)m_cfg.borderSize; + } + + if (m_pmesh->nverts >= 0xffff) + { + // The vertex indices are ushorts, and cannot point to more than 0xffff vertices. + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Too many vertices per tile %d (max: %d).", m_pmesh->nverts, 0xffff); + return false; + } +/* if (m_pmesh->npolys > DT_MAX_TILES) + { + // If you hit this error, you have too many polygons per tile. + // You can trade off tile count to poly count by adjusting DT_TILE_REF_TILE_BITS and DT_TILE_REF_POLY_BITS. + // The current setup is optimized for large number of tiles and small number of polys per tile. + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Too many polygons per tile %d (max: %d).", m_pmesh->npolys, DT_MAX_TILES); + return false; + }*/ + + if (!dtCreateNavMeshData(m_pmesh->verts, m_pmesh->nverts, + m_pmesh->polys, m_pmesh->npolys, m_pmesh->nvp, + m_dmesh->meshes, m_dmesh->verts, m_dmesh->nverts, m_dmesh->tris, m_dmesh->ntris, + bmin, bmax, m_cfg.cs, m_cfg.ch, m_cfg.tileSize, m_cfg.walkableClimb, &navData, &navDataSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not build Detour navmesh."); + return 0; + } + } + m_tileMemUsage = navDataSize/1024.0f; + + rcTimeVal totEndTime = rcGetPerformanceTimer(); + + // Show performance stats. + if (rcGetLog()) + { + const float pc = 100.0f / rcGetDeltaTimeUsec(totStartTime, totEndTime); + + rcGetLog()->log(RC_LOG_PROGRESS, "Rasterize: %.1fms (%.1f%%)", m_buildTimes.rasterizeTriangles/1000.0f, m_buildTimes.rasterizeTriangles*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Compact: %.1fms (%.1f%%)", m_buildTimes.buildCompact/1000.0f, m_buildTimes.buildCompact*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Border: %.1fms (%.1f%%)", m_buildTimes.filterBorder/1000.0f, m_buildTimes.filterBorder*pc); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Walkable: %.1fms (%.1f%%)", m_buildTimes.filterWalkable/1000.0f, m_buildTimes.filterWalkable*pc); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Reachable: %.1fms (%.1f%%)", m_buildTimes.filterMarkReachable/1000.0f, m_buildTimes.filterMarkReachable*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Distancefield: %.1fms (%.1f%%)", m_buildTimes.buildDistanceField/1000.0f, m_buildTimes.buildDistanceField*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - distance: %.1fms (%.1f%%)", m_buildTimes.buildDistanceFieldDist/1000.0f, m_buildTimes.buildDistanceFieldDist*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.1fms (%.1f%%)", m_buildTimes.buildDistanceFieldBlur/1000.0f, m_buildTimes.buildDistanceFieldBlur*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Regions: %.1fms (%.1f%%)", m_buildTimes.buildRegions/1000.0f, m_buildTimes.buildRegions*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - watershed: %.1fms (%.1f%%)", m_buildTimes.buildRegionsReg/1000.0f, m_buildTimes.buildRegionsReg*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - expand: %.1fms (%.1f%%)", m_buildTimes.buildRegionsExp/1000.0f, m_buildTimes.buildRegionsExp*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - find catchment basins: %.1fms (%.1f%%)", m_buildTimes.buildRegionsFlood/1000.0f, m_buildTimes.buildRegionsFlood*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.1fms (%.1f%%)", m_buildTimes.buildRegionsFilter/1000.0f, m_buildTimes.buildRegionsFilter*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Contours: %.1fms (%.1f%%)", m_buildTimes.buildContours/1000.0f, m_buildTimes.buildContours*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - trace: %.1fms (%.1f%%)", m_buildTimes.buildContoursTrace/1000.0f, m_buildTimes.buildContoursTrace*pc); + rcGetLog()->log(RC_LOG_PROGRESS, " - simplify: %.1fms (%.1f%%)", m_buildTimes.buildContoursSimplify/1000.0f, m_buildTimes.buildContoursSimplify*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Polymesh: %.1fms (%.1f%%)", m_buildTimes.buildPolymesh/1000.0f, m_buildTimes.buildPolymesh*pc); + rcGetLog()->log(RC_LOG_PROGRESS, "Build Polymesh Detail: %.1fms (%.1f%%)", m_buildTimes.buildDetailMesh/1000.0f, m_buildTimes.buildDetailMesh*pc); + rcGetLog()->log(RC_LOG_PROGRESS, "Merge Polymeshes: %.1fms (%.1f%%)", m_buildTimes.mergePolyMesh/1000.0f, m_buildTimes.mergePolyMesh*pc); + rcGetLog()->log(RC_LOG_PROGRESS, "Merge Polymesh Details: %.1fms (%.1f%%)", m_buildTimes.mergePolyMeshDetail/1000.0f, m_buildTimes.mergePolyMeshDetail*pc); + + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Polymesh: %.1fms (%.1f%%)", m_buildTimes.buildPolymesh/1000.0f, m_buildTimes.buildPolymesh*pc); + + rcGetLog()->log(RC_LOG_PROGRESS, "Polymesh: Verts:%d Polys:%d", m_pmesh->nverts, m_pmesh->npolys); + + rcGetLog()->log(RC_LOG_PROGRESS, "TOTAL: %.1fms", rcGetDeltaTimeUsec(totStartTime, totEndTime)/1000.0f); + } + + m_tileBuildTime = rcGetDeltaTimeUsec(totStartTime, totEndTime)/1000.0f; + + dataSize = navDataSize; + return navData; +} diff --git a/RecastDemo/Source/main.cpp b/RecastDemo/Source/main.cpp index 0641bdc..2635983 100644 --- a/RecastDemo/Source/main.cpp +++ b/RecastDemo/Source/main.cpp @@ -18,6 +18,7 @@ #include "Sample_StatMeshSimple.h" #include "Sample_StatMeshTiled.h" #include "Sample_TileMesh.h" +#include "Sample_DynMesh.h" #ifdef WIN32 # define snprintf _snprintf @@ -197,16 +198,17 @@ struct SampleItem Sample* createStatSimple() { return new Sample_StatMeshSimple(); } Sample* createStatTiled() { return new Sample_StatMeshTiled(); } Sample* createTile() { return new Sample_TileMesh(); } +Sample* createDyn() { return new Sample_DynMesh(); } static SampleItem g_samples[] = { { createStatSimple, "Static Mesh (Simple)" }, { createStatTiled, "Static Mesh (Tiled)" }, { createTile, "Tile Mesh" }, +{ createDyn, "Dyn Mesh" }, }; static const int g_nsamples = sizeof(g_samples)/sizeof(SampleItem); - int main(int argc, char *argv[]) { // Init SDL