diff --git a/Detour/Source/DetourStatNavMeshBuilder.cpp b/Detour/Source/DetourStatNavMeshBuilder.cpp index 125d8c2..a8ed05e 100755 --- a/Detour/Source/DetourStatNavMeshBuilder.cpp +++ b/Detour/Source/DetourStatNavMeshBuilder.cpp @@ -61,8 +61,8 @@ static int compareItemZ(const void* va, const void* vb) return 0; } -void calcExtends(BVItem* items, int nitems, int imin, int imax, - unsigned short* bmin, unsigned short* bmax) +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]; @@ -160,21 +160,10 @@ void subdivide(BVItem* items, int nitems, int imin, int imax, int& curNode, dtBV } } -/*struct rcPolyMesh -{ - inline rcPolyMesh() : verts(0), polys(0), nverts(0), npolys(0), nvp(3) {} - inline ~rcPolyMesh() { delete [] verts; delete [] polys; } - unsigned short* verts; - unsigned short* polys; - int nverts; - int npolys; - int nvp; -};*/ - -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) +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]; @@ -224,6 +213,11 @@ bool dtCreateNavMeshData(const unsigned short* verts, const int nverts, { if (nvp != DT_VERTS_PER_POLYGON) return false; + + if (!nverts) + return false; + if (!npolys) + return false; // Calculate data size const int headerSize = sizeof(dtStatNavMeshHeader); diff --git a/Recast/Include/Recast.h b/Recast/Include/Recast.h index 064304f..fb56ca1 100644 --- a/Recast/Include/Recast.h +++ b/Recast/Include/Recast.h @@ -22,6 +22,8 @@ struct rcConfig { int width, height; // Dimensions of the rasterized heighfield + int tileSize; // Size if a tile. + int borderSize; // Non-navigable Border around the heightfield. float cs, ch; // Grid cell size and height. float bmin[3], bmax[3]; // Grid bounds. float walkableSlopeAngle; // Maximum walkble slope angle in degrees. @@ -43,6 +45,8 @@ struct rcSpan rcSpan* next; }; +static const int RC_SPANS_PER_POOL = 2048; + struct rcSpanPool { rcSpanPool* next; @@ -93,8 +97,7 @@ struct rcCompactHeightfield int walkableHeight, walkableClimb; unsigned short maxDistance; unsigned short maxRegions; - float minx, miny, minz; - float maxx, maxy, maxz; + float bmin[3], bmax[3]; float cs, ch; rcCompactCell* cells; rcCompactSpan* spans; @@ -102,13 +105,12 @@ struct rcCompactHeightfield struct rcContour { - inline rcContour() : verts(0), nverts(0), rverts(0), nrverts(0), cx(0), cy(0), cz(0) { } + inline rcContour() : verts(0), nverts(0), rverts(0), nrverts(0) { } inline ~rcContour() { delete [] verts; delete [] rverts; } int* verts; int nverts; int* rverts; int nrverts; - int cx,cy,cz; unsigned short reg; }; @@ -129,6 +131,8 @@ struct rcPolyMesh int nverts; int npolys; int nvp; + float bmin[3], bmax[3]; + float cs, ch; }; class rcIntArray @@ -257,7 +261,7 @@ void rcCalcBounds(const float* verts, int nv, float* bmin, float* bmax); // cs - (in) grid cell size // w - (out) grid width // h - (out) grid height -void rcCalcGridSize(float* bmin, float* bmax, float cs, int* w, int* h); +void rcCalcGridSize(const float* bmin, const float* bmax, float cs, int* w, int* h); // Creates and initializes new heightfield. // Params: @@ -270,12 +274,14 @@ bool rcCreateHeightfield(rcHeightfield& hf, int width, int height); // the maximun walkable slope angle. // Params: // walkableSlopeAngle - (in) maximun slope angle in degrees. +// verts - (in) array of vertices +// nv - (in) vertex count // tris - (in) array of triangle vertex indices -// norms - (in) array of triangle normals // nt - (in) triangle count // flags - (out) array of triangle flags void rcMarkWalkableTriangles(const float walkableSlopeAngle, - const int* tris, const float* norms, int nt, + const float* verts, int nv, + const int* tris, int nt, unsigned char* flags); // Rasterizes the triangles into heightfield spans. @@ -356,7 +362,7 @@ bool rcBuildDistanceField(rcCompactHeightfield& chf); // maxMergeRegionSize - (in) the largest allowed regions size which can be merged. // Returns false if operation ran out of memory. bool rcBuildRegions(rcCompactHeightfield& chf, - int walkableRadius, int minRegionSize, int mergeRegionSize); + int walkableRadius, int borderSize, int minRegionSize, int mergeRegionSize); // Builds simplified contours from the regions outlines. // Params: @@ -369,14 +375,36 @@ bool rcBuildContours(rcCompactHeightfield& chf, float maxError, int maxEdgeLen, rcContourSet& cset); +// Ensures that connected contour sets A and B share the same vertices at the shared edges. +// Params: +// cseta - (in) contour set A. +// csetb - (in) contour set B. +// edge - (in) which edge to conform: 1) B is left of A 2) B is top of A +// borderSize - (in) the border which was used when the contours were generated. +// tileSize - (in) the tile size which was used when the contours were generated. +// orig - (in) origin of the contour set A. +// cs - (in) grid cell size +// ch - (in) grid cell height +bool rcFixupAdjacentContours(rcContourSet* cseta, rcContourSet* csetb, int edge, int edgePos); + +// Translates the cordinates of the contour set. +// Params: +// cset - (in) contour set to translate. +// dx - (in) delta X. +// dy - (in) delta Y. +// dz - (in) delta Z. +void rcTranslateContours(rcContourSet* cset, int dx, int dy, int dz); + // Builds connected convex polygon mesh from contour polygons. // Params: // cset - (in) contour set. // mesh - (out) poly mesh. // nvp - (int) maximum number of vertices per polygon. // Returns false if operation ran out of memory. -bool rcBuildPolyMesh(rcContourSet& cset, rcPolyMesh& mesh, int nvp); - +bool rcBuildPolyMesh(rcContourSet& cset, + const float* bmin, const float* bmax, + const float cs, const float ch, int nvp, + rcPolyMesh& mesh); bool rcBuildNavMesh(const rcConfig& cfg, const float* verts, const int nverts, diff --git a/Recast/Include/RecastDebugDraw.h b/Recast/Include/RecastDebugDraw.h index 31d6099..ffa8e07 100644 --- a/Recast/Include/RecastDebugDraw.h +++ b/Recast/Include/RecastDebugDraw.h @@ -48,7 +48,7 @@ void rcDebugDrawCompactHeightfieldDistance(const struct rcCompactHeightfield& ch void rcDebugDrawRawContours(const struct rcContourSet& cset, const float* orig, float cs, float ch); void rcDebugDrawContours(const struct rcContourSet& cset, const float* orig, float cs, float ch); -void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh, const float* orig, float cs, float ch); +void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh); void rcDebugDrawCylinderWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col); void rcDebugDrawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col); diff --git a/Recast/Include/RecastLog.h b/Recast/Include/RecastLog.h index 8dc432d..a90f5af 100644 --- a/Recast/Include/RecastLog.h +++ b/Recast/Include/RecastLog.h @@ -47,7 +47,32 @@ private: int m_textPoolSize; }; +struct rcBuildTimes +{ + int rasterizeTriangles; + int buildCompact; + int buildContours; + int buildContoursTrace; + int buildContoursSimplify; + int filterBorder; + int filterWalkable; + int filterMarkReachable; + int buildPolymesh; + int buildDistanceField; + int buildDistanceFieldDist; + int buildDistanceFieldBlur; + int buildRegions; + int buildRegionsReg; + int buildRegionsExp; + int buildRegionsFlood; + int buildRegionsFilter; + int fixupContours; +}; + void rcSetLog(rcLog* log); rcLog* rcGetLog(); +void rcSetBuildTimes(rcBuildTimes* btimes); +rcBuildTimes* rcGetBuildTimes(); + #endif // RECAST_LOG_H diff --git a/Recast/Source/Recast.cpp b/Recast/Source/Recast.cpp index c5bada5..102616f 100644 --- a/Recast/Source/Recast.cpp +++ b/Recast/Source/Recast.cpp @@ -54,7 +54,7 @@ void rcCalcBounds(const float* verts, int nv, float* bmin, float* bmax) } } -void rcCalcGridSize(float* bmin, float* bmax, float cs, int* w, int* h) +void rcCalcGridSize(const float* bmin, const float* bmax, float cs, int* w, int* h) { *w = (int)((bmax[0] - bmin[0])/cs+0.5f); *h = (int)((bmax[2] - bmin[2])/cs+0.5f); @@ -71,7 +71,7 @@ bool rcCreateHeightfield(rcHeightfield& hf, int width, int height) return true; } -void rcMarkWalkableTriangles(const float walkableSlopeAngle, +/*void rcMarkWalkableTriangles(const float walkableSlopeAngle, const int* tris, const float* norms, int nt, unsigned char* flags) { @@ -83,6 +83,34 @@ void rcMarkWalkableTriangles(const float walkableSlopeAngle, if (norms[i*3+1] > walkableThr) flags[i] |= RC_WALKABLE; } +}*/ + +static void calcTriNormal(const float* v0, const float* v1, const float* v2, float* norm) +{ + float e0[3], e1[3]; + vsub(e0, v1, v0); + vsub(e1, v2, v0); + vcross(norm, e0, e1); + vnormalize(norm); +} + +void rcMarkWalkableTriangles(const float walkableSlopeAngle, + const float* verts, int nv, + const int* tris, int nt, + unsigned char* flags) +{ + const float walkableThr = cosf(walkableSlopeAngle/180.0f*(float)M_PI); + + float norm[3]; + + for (int i = 0; i < nt; ++i) + { + const int* tri = &tris[i*3]; + calcTriNormal(&verts[tri[0]*3], &verts[tri[1]*3], &verts[tri[2]*3], norm); + // Check if the face is walkable. + if (norm[1] > walkableThr) + flags[i] |= RC_WALKABLE; + } } static int getSpanCount(unsigned char flags, rcHeightfield& hf) @@ -129,12 +157,9 @@ bool rcBuildCompactHeightfield(const float* bmin, const float* bmax, chf.walkableHeight = walkableHeight; chf.walkableClimb = walkableClimb; chf.maxRegions = 0; - chf.minx = bmin[0]; - chf.miny = bmin[1]; - chf.minz = bmin[2]; - chf.maxx = bmax[0]; - chf.maxy = bmax[1] + walkableHeight*ch; - chf.maxz = bmax[2]; + vcopy(chf.bmin, bmin); + vcopy(chf.bmax, bmax); + chf.bmax[1] += walkableHeight*ch; chf.cs = cs; chf.ch = ch; chf.cells = new rcCompactCell[w*h]; @@ -226,12 +251,38 @@ bool rcBuildCompactHeightfield(const float* bmin, const float* bmax, rcTimeVal endTime = rcGetPerformanceTimer(); - if (rcGetLog()) - rcGetLog()->log(RC_LOG_PROGRESS, "Build compact: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Build compact: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + if (rcGetBuildTimes()) + rcGetBuildTimes()->buildCompact += rcGetDeltaTimeUsec(startTime, endTime); return true; } +static int getHeightfieldMemoryUsage(const rcHeightfield& hf) +{ + int size = 0; + size += sizeof(hf); + size += hf.width * hf.height * sizeof(rcSpan*); + + rcSpanPool* pool = hf.pools; + while (pool) + { + size += (sizeof(rcSpanPool) - sizeof(rcSpan)) + sizeof(rcSpan)*RC_SPANS_PER_POOL; + pool = pool->next; + } + return size; +} + +static int getCompactHeightFieldMemoryusage(const rcCompactHeightfield& chf) +{ + int size = 0; + size += sizeof(rcCompactHeightfield); + size += sizeof(rcCompactSpan) * chf.spanCount; + size += sizeof(rcCompactCell) * chf.width * chf.height; + return size; +} + bool rcBuildNavMesh(const rcConfig& cfg, const float* verts, const int nverts, const int* tris, const unsigned char* tflags, const int ntris, @@ -253,23 +304,23 @@ bool rcBuildNavMesh(const rcConfig& cfg, rcFilterWalkableBorderSpans(cfg.walkableHeight, cfg.walkableClimb, solid); rcFilterWalkableLowHeightSpans(cfg.walkableHeight, solid); - - if (!rcMarkReachableSpans(cfg.walkableHeight, cfg.walkableClimb, solid)) + +/* if (!rcMarkReachableSpans(cfg.walkableHeight, cfg.walkableClimb, solid)) { if (rcGetLog()) rcGetLog()->log(RC_LOG_ERROR, "rcBuildNavMesh: Could not build navigable heightfield."); return false; - } + }*/ if (!rcBuildCompactHeightfield(cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, cfg.walkableHeight, cfg.walkableClimb, - RC_WALKABLE|RC_REACHABLE, solid, chf)) + RC_WALKABLE/*|RC_REACHABLE*/, solid, chf)) { if (rcGetLog()) rcGetLog()->log(RC_LOG_ERROR, "rcBuildNavMesh: Could not build compact data."); return false; } - + if (!rcBuildDistanceField(chf)) { if (rcGetLog()) @@ -277,7 +328,7 @@ bool rcBuildNavMesh(const rcConfig& cfg, return false; } - if (!rcBuildRegions(chf, cfg.walkableRadius, cfg.minRegionSize, cfg.mergeRegionSize)) + if (!rcBuildRegions(chf, cfg.walkableRadius, cfg.borderSize, cfg.minRegionSize, cfg.mergeRegionSize)) { if (rcGetLog()) rcGetLog()->log(RC_LOG_ERROR, "rcBuildNavMesh: Could not build regions."); @@ -291,7 +342,8 @@ bool rcBuildNavMesh(const rcConfig& cfg, return false; } - if (!rcBuildPolyMesh(cset, polyMesh, cfg.maxVertsPerPoly)) + if (!rcBuildPolyMesh(cset, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, + cfg.maxVertsPerPoly, polyMesh)) { if (rcGetLog()) rcGetLog()->log(RC_LOG_ERROR, "rcBuildNavMesh: Could not triangulate contours."); diff --git a/Recast/Source/RecastContour.cpp b/Recast/Source/RecastContour.cpp index 2e3c511..b5a90a9 100644 --- a/Recast/Source/RecastContour.cpp +++ b/Recast/Source/RecastContour.cpp @@ -501,7 +501,7 @@ bool rcBuildContours(rcCompactHeightfield& chf, return false; } - rcTimeVal boundaryStartTime = rcGetPerformanceTimer(); + rcTimeVal traceStartTime = rcGetPerformanceTimer(); // Mark boundaries. for (int y = 0; y < h; ++y) @@ -513,7 +513,7 @@ bool rcBuildContours(rcCompactHeightfield& chf, { unsigned char res = 0; const rcCompactSpan& s = chf.spans[i]; - if (s.reg == 0) + if (!s.reg || (s.reg & 0x8000)) { flags[i] = 0; continue; @@ -537,9 +537,9 @@ bool rcBuildContours(rcCompactHeightfield& chf, } } - rcTimeVal boundaryEndTime = rcGetPerformanceTimer(); + rcTimeVal traceEndTime = rcGetPerformanceTimer(); - rcTimeVal contourStartTime = rcGetPerformanceTimer(); + rcTimeVal simplifyStartTime = rcGetPerformanceTimer(); rcIntArray verts(256); rcIntArray simplified(64); @@ -556,6 +556,9 @@ bool rcBuildContours(rcCompactHeightfield& chf, flags[i] = 0; continue; } + unsigned short reg = chf.spans[i].reg; + if (!reg || (reg & 0x8000)) + continue; verts.resize(0); simplified.resize(0); @@ -564,7 +567,6 @@ bool rcBuildContours(rcCompactHeightfield& chf, removeDegenerateSegments(simplified); // Store region->contour remap info. - unsigned short reg = chf.spans[i].reg; // Create contour. if (simplified.size()/4 >= 3) { @@ -585,7 +587,7 @@ bool rcBuildContours(rcCompactHeightfield& chf, cont->rverts = new int[cont->nrverts*4]; memcpy(cont->rverts, &verts[0], sizeof(int)*cont->nrverts*4); - cont->cx = cont->cy = cont->cz = 0; +/* cont->cx = cont->cy = cont->cz = 0; for (int i = 0; i < cont->nverts; ++i) { cont->cx += cont->verts[i*4+0]; @@ -594,7 +596,7 @@ bool rcBuildContours(rcCompactHeightfield& chf, } cont->cx /= cont->nverts; cont->cy /= cont->nverts; - cont->cz /= cont->nverts; + cont->cz /= cont->nverts;*/ cont->reg = reg; } @@ -647,19 +649,305 @@ bool rcBuildContours(rcCompactHeightfield& chf, } - rcTimeVal contourEndTime = rcGetPerformanceTimer(); - - // Delete vertices. delete [] flags; + rcTimeVal simplifyEndTime = rcGetPerformanceTimer(); + rcTimeVal endTime = rcGetPerformanceTimer(); - if (rcGetLog()) +// if (rcGetLog()) +// { +// rcGetLog()->log(RC_LOG_PROGRESS, "Create contours: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); +// rcGetLog()->log(RC_LOG_PROGRESS, " - boundary: %.3f ms", rcGetDeltaTimeUsec(boundaryStartTime, boundaryEndTime)/1000.0f); +// rcGetLog()->log(RC_LOG_PROGRESS, " - contour: %.3f ms", rcGetDeltaTimeUsec(contourStartTime, contourEndTime)/1000.0f); +// } + + if (rcGetBuildTimes()) { - rcGetLog()->log(RC_LOG_PROGRESS, "Create contours: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); - rcGetLog()->log(RC_LOG_PROGRESS, " - boundary: %.3f ms", rcGetDeltaTimeUsec(boundaryStartTime, boundaryEndTime)/1000.0f); - rcGetLog()->log(RC_LOG_PROGRESS, " - contour: %.3f ms", rcGetDeltaTimeUsec(contourStartTime, contourEndTime)/1000.0f); + rcGetBuildTimes()->buildContours += rcGetDeltaTimeUsec(startTime, endTime); + rcGetBuildTimes()->buildContoursTrace += rcGetDeltaTimeUsec(traceStartTime, traceEndTime); + rcGetBuildTimes()->buildContoursSimplify += rcGetDeltaTimeUsec(simplifyStartTime, simplifyEndTime); } return true; } + +struct EdgeSegment +{ + int i0, i1; + int v0[3], v1[3]; +}; + +static int findEdgeSegments(rcContourSet* cset, int x, int z, EdgeSegment* segs, const int maxSegs) +{ + int n = 0; + + for (int i = 0; i < cset->nconts; ++i) + { + const rcContour* c = &cset->conts[i]; + const int nc = n; + for (int j = 0, k = c->nverts-1; j < c->nverts; k=j++) + { + const int* v0 = &c->verts[k*4]; + const int* v1 = &c->verts[j*4]; + if ((v0[0] == x && v1[0] == x) || (v0[2] == z && v1[2] == z)) + { + if (n && segs[n-1].i1 == k) + { + // Merge with previous + segs[n-1].i1 = j; + } + else + { + // Add new + if (n >= maxSegs) + return n; + segs[n].i0 = k; + segs[n].i1 = j; + n++; + } + } + } + // Check if first and last should be merged. + if (n && n && segs[n-1].v1 == segs[nc].v0) + { + segs[nc].i0 = segs[n-1].i0; + n--; + } + // Copy vertices + for (int j = nc; j < n; ++j) + { + segs[j].v0[0] = c->verts[segs[j].i0*4+0]; + segs[j].v0[1] = c->verts[segs[j].i0*4+1]; + segs[j].v0[2] = c->verts[segs[j].i0*4+2]; + segs[j].v1[0] = c->verts[segs[j].i1*4+0]; + segs[j].v1[1] = c->verts[segs[j].i1*4+1]; + segs[j].v1[2] = c->verts[segs[j].i1*4+2]; + } + } + return n; +} + +static bool pointOnEdgeSegment(const int* v0, const int* v1, int x, int z) +{ + const int dx = v1[0] - v0[0]; + const int dz = v1[2] - v0[2]; + if (rcAbs(dx) > rcAbs(dz)) + { + const int d = x - v0[0]; + if (dx < 0) + return d < 0 && d > dx; + else + return d > 0 && d < dx; + } + else + { + const int d = z - v0[2]; + if (dz < 0) + return d < 0 && d > dz; + else + return d > 0 && d < dz; + } +} + +static bool insertPoint(rcContour* c, int idx, const int* v) +{ + int* newVerts = new int[(c->nverts+1)*4]; + if (!newVerts) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "insertPoint: Out of memory 'newVerts'."); + return false; + } + + if (idx > 0) + memcpy(newVerts, c->verts, sizeof(int)*4*idx); + + newVerts[idx*4+0] = v[0]; + newVerts[idx*4+1] = v[1]; + newVerts[idx*4+2] = v[2]; + newVerts[idx*4+3] = 0; + + if (c->nverts - idx > 0) + memcpy(&newVerts[(idx+1)*4], &c->verts[idx*4], sizeof(int)*4*(c->nverts - idx)); + + delete [] c->verts; + + c->verts = newVerts; + c->nverts++; + + return true; +} + +inline bool ptsEqual(const int* a, const int* b) +{ + return a[0] == b[0] && a[1] == b[1] && a[2] == b[2]; +} + +static bool conformEdge(rcContourSet* cset, int ex, int ez, const int* v0, const int* v1) +{ + for (int i = 0; i < cset->nconts; ++i) + { + rcContour* c = &cset->conts[i]; + const int nv = c->nverts; + for (int j = 0; j < nv; ++j) + { + const int* v = &c->verts[j*4]; + if (ptsEqual(v, v0)) + { + const int jn = (j+1) % nv; + const int* vn = &c->verts[jn*4]; + + // Check if the segment is edge segment. + if ((v[0] == ex && vn[0] == ex) || (v[2] == ez && vn[2] == ez)) + { + if (ptsEqual(vn, v1)) + { + // Valid! + return true; + } + else + { + // Add new vertex + if (pointOnEdgeSegment(v, vn, v1[0], v1[2])) + { + if (!insertPoint(c, jn, v1)) + return false; + } + return true; + } + } + } + else if (ptsEqual(v, v1)) + { + const int jp = (j+nv-1) % nv; + const int* vp = &c->verts[jp*4]; + // Check if the segment is edge segment. + if ((v[0] == ex && vp[0] == ex) || (v[2] == ez && vp[2] == ez)) + { + if (ptsEqual(vp, v0)) + { + // Valid! + return true; + } + else + { + // Add new vertex + if (pointOnEdgeSegment(vp, v, v0[0], v0[2])) + { + if (!insertPoint(c, j, v0)) + return false; + } + return true; + } + } + } + } + } + + return true; +} + + +bool rcFixupAdjacentContours(rcContourSet* cseta, rcContourSet* csetb, + int edge, int edgePos) +{ + if (!cseta || !csetb) + return true; + + rcTimeVal startTime = rcGetPerformanceTimer(); + + if (edge == 1) + { + // x+1 + // Find edge segment + static const int MAX_SEGS = 512; // TODO: Do not hardcode. + EdgeSegment sa[MAX_SEGS], sb[MAX_SEGS]; + int nsa = findEdgeSegments(cseta, edgePos, -1, sa, MAX_SEGS); + int nsb = findEdgeSegments(csetb, edgePos, -1, sb, MAX_SEGS); + + // Conform set A to set B + for (int i = 0; i < nsb; ++i) + { + const int* v0 = sb[i].v0; + const int* v1 = sb[i].v1; + if (!conformEdge(cseta, edgePos, -1, v1, v0)) + { + return false; + } + } + + // Conform set B to set A + for (int i = 0; i < nsa; ++i) + { + const int* v0 = sa[i].v0; + const int* v1 = sa[i].v1; + if (!conformEdge(csetb, edgePos, -1, v1, v0)) + { + return false; + } + } + } + else if (edge == 2) + { + // y+1 + // Find edge segment + static const int MAX_SEGS = 512; // TODO: Do not hardcode. + EdgeSegment sa[MAX_SEGS], sb[MAX_SEGS]; + int nsa = findEdgeSegments(cseta, -1, edgePos, sa, MAX_SEGS); + int nsb = findEdgeSegments(csetb, -1, edgePos, sb, MAX_SEGS); + + // Conform set A to set B + for (int i = 0; i < nsb; ++i) + { + const int* v0 = sb[i].v0; + const int* v1 = sb[i].v1; + if (!conformEdge(cseta, -1, edgePos, v1, v0)) + { + return false; + } + } + + // Conform set B to set A + for (int i = 0; i < nsa; ++i) + { + const int* v0 = sa[i].v0; + const int* v1 = sa[i].v1; + if (!conformEdge(csetb, -1, edgePos, v1, v0)) + { + return false; + } + } + } + + rcTimeVal endTime = rcGetPerformanceTimer(); + if (rcGetBuildTimes()) + rcGetBuildTimes()->fixupContours += rcGetDeltaTimeUsec(startTime, endTime); + + return true; +} + +void rcTranslateContours(rcContourSet* cset, int dx, int dy, int dz) +{ + if (!cset) return; + + for (int i = 0; i < cset->nconts; ++i) + { + rcContour& cont = cset->conts[i]; + for (int i = 0; i < cont.nverts; ++i) + { + int* v = &cont.verts[i*4]; + v[0] += dx; + v[1] += dy; + v[2] += dz; + } + for (int i = 0; i < cont.nrverts; ++i) + { + int* v = &cont.rverts[i*4]; + v[0] += dx; + v[1] += dy; + v[2] += dz; + } + } +} + diff --git a/Recast/Source/RecastDebugDraw.cpp b/Recast/Source/RecastDebugDraw.cpp index 1ba932c..54769db 100644 --- a/Recast/Source/RecastDebugDraw.cpp +++ b/Recast/Source/RecastDebugDraw.cpp @@ -240,14 +240,14 @@ void rcDebugDrawCompactHeightfieldSolid(const rcCompactHeightfield& chf) { for (int x = 0; x < chf.width; ++x) { - const float fx = chf.minx + x*cs; - const float fz = chf.minz + y*cs; + const float fx = chf.bmin[0] + x*cs; + const float fz = chf.bmin[2] + y*cs; const rcCompactCell& c = chf.cells[x+y*chf.width]; for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) { const rcCompactSpan& s = chf.spans[i]; - const float fy = chf.miny + (s.y+1)*ch; + const float fy = chf.bmin[1] + (s.y+1)*ch; glVertex3f(fx, fy, fz); glVertex3f(fx, fy, fz+cs); glVertex3f(fx+cs, fy, fz+cs); @@ -270,8 +270,8 @@ void rcDebugDrawCompactHeightfieldRegions(const rcCompactHeightfield& chf) { for (int x = 0; x < chf.width; ++x) { - const float fx = chf.minx + x*cs; - const float fz = chf.minz + y*cs; + const float fx = chf.bmin[0] + x*cs; + const float fz = chf.bmin[2] + y*cs; const rcCompactCell& c = chf.cells[x+y*chf.width]; for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) @@ -284,7 +284,7 @@ void rcDebugDrawCompactHeightfieldRegions(const rcCompactHeightfield& chf) } else glColor4ub(0,0,0,128); - const float fy = chf.miny + (s.y+1)*ch; + const float fy = chf.bmin[1] + (s.y+1)*ch; glVertex3f(fx, fy, fz); glVertex3f(fx, fy, fz+cs); glVertex3f(fx+cs, fy, fz+cs); @@ -310,14 +310,14 @@ void rcDebugDrawCompactHeightfieldDistance(const rcCompactHeightfield& chf) { for (int x = 0; x < chf.width; ++x) { - const float fx = chf.minx + x*cs; - const float fz = chf.minz + y*cs; + const float fx = chf.bmin[0] + x*cs; + const float fz = chf.bmin[2] + y*cs; const rcCompactCell& c = chf.cells[x+y*chf.width]; for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) { const rcCompactSpan& s = chf.spans[i]; - const float fy = chf.miny + (s.y+1)*ch; + const float fy = chf.bmin[1] + (s.y+1)*ch; float cd = (float)s.dist * dscale; glColor3f(cd, cd, cd); glVertex3f(fx, fy, fz); @@ -363,6 +363,7 @@ void rcDebugDrawContours(const rcContourSet& cset, const float* orig, float cs, const rcContour& c = cset.conts[i]; intToCol(c.reg, col); glColor4fv(col); + glBegin(GL_LINE_LOOP); for (int j = 0; j < c.nverts; ++j) { @@ -373,6 +374,7 @@ void rcDebugDrawContours(const rcContourSet& cset, const float* orig, float cs, glVertex3f(fx,fy,fz); } glEnd(); + glColor4ub(0,0,0,128); glBegin(GL_POINTS); for (int j = 0; j < c.nverts; ++j) @@ -389,9 +391,12 @@ void rcDebugDrawContours(const rcContourSet& cset, const float* orig, float cs, glPointSize(1.0f); } -void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh, const float* orig, float cs, float ch) +void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh) { const int nvp = mesh.nvp; + const float cs = mesh.cs; + const float ch = mesh.ch; + const float* orig = mesh.bmin; glColor4ub(0,196,255,64); glBegin(GL_TRIANGLES); for (int i = 0; i < mesh.npolys; ++i) diff --git a/Recast/Source/RecastFilter.cpp b/Recast/Source/RecastFilter.cpp index 1077a1e..5c8fa47 100644 --- a/Recast/Source/RecastFilter.cpp +++ b/Recast/Source/RecastFilter.cpp @@ -81,8 +81,10 @@ void rcFilterWalkableBorderSpans(const int walkableHeight, } rcTimeVal endTime = rcGetPerformanceTimer(); - if (rcGetLog()) - rcGetLog()->log(RC_LOG_PROGRESS, "Filter border: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Filter border: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + if (rcGetBuildTimes()) + rcGetBuildTimes()->filterBorder += rcGetDeltaTimeUsec(startTime, endTime); } void rcFilterWalkableLowHeightSpans(int walkableHeight, @@ -112,10 +114,13 @@ void rcFilterWalkableLowHeightSpans(int walkableHeight, rcTimeVal endTime = rcGetPerformanceTimer(); - if (rcGetLog()) - rcGetLog()->log(RC_LOG_PROGRESS, "Filter walkable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Filter walkable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + if (rcGetBuildTimes()) + rcGetBuildTimes()->filterWalkable += rcGetDeltaTimeUsec(startTime, endTime); } + struct rcReachableSeed { inline void set(int ix, int iy, rcSpan* is) @@ -225,8 +230,10 @@ bool rcMarkReachableSpans(const int walkableHeight, rcTimeVal endTime = rcGetPerformanceTimer(); - if (rcGetLog()) - rcGetLog()->log(RC_LOG_PROGRESS, "Mark reachable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Mark reachable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + if (rcGetBuildTimes()) + rcGetBuildTimes()->filterMarkReachable += rcGetDeltaTimeUsec(startTime, endTime); return true; } diff --git a/Recast/Source/RecastLog.cpp b/Recast/Source/RecastLog.cpp index cc05f22..2786804 100644 --- a/Recast/Source/RecastLog.cpp +++ b/Recast/Source/RecastLog.cpp @@ -21,6 +21,7 @@ #include static rcLog* g_log = 0; +static rcBuildTimes* g_btimes = 0; rcLog::rcLog() : m_messageCount(0), @@ -64,3 +65,13 @@ rcLog* rcGetLog() { return g_log; } + +void rcSetBuildTimes(rcBuildTimes* btimes) +{ + g_btimes = btimes; +} + +rcBuildTimes* rcGetBuildTimes() +{ + return g_btimes; +} diff --git a/Recast/Source/RecastMesh.cpp b/Recast/Source/RecastMesh.cpp index f357410..43f737b 100644 --- a/Recast/Source/RecastMesh.cpp +++ b/Recast/Source/RecastMesh.cpp @@ -474,9 +474,17 @@ static void mergePolys(unsigned short* pa, unsigned short* pb, memcpy(pa, tmp, sizeof(unsigned short)*nvp); } -bool rcBuildPolyMesh(rcContourSet& cset, rcPolyMesh& mesh, const int nvp) +bool rcBuildPolyMesh(rcContourSet& cset, + const float* bmin, const float* bmax, + const float cs, const float ch, int nvp, + rcPolyMesh& mesh) { rcTimeVal startTime = rcGetPerformanceTimer(); + + vcopy(mesh.bmin, bmin); + vcopy(mesh.bmax, bmax); + mesh.cs = cs; + mesh.ch = ch; int maxVertices = 0; int maxTris = 0; @@ -692,8 +700,10 @@ bool rcBuildPolyMesh(rcContourSet& cset, rcPolyMesh& mesh, const int nvp) rcTimeVal endTime = rcGetPerformanceTimer(); - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "Build polymesh: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Build polymesh: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + if (rcGetBuildTimes()) + rcGetBuildTimes()->buildPolymesh += rcGetDeltaTimeUsec(startTime, endTime); return true; } diff --git a/Recast/Source/RecastRasterization.cpp b/Recast/Source/RecastRasterization.cpp index fc9e171..7da33a2 100644 --- a/Recast/Source/RecastRasterization.cpp +++ b/Recast/Source/RecastRasterization.cpp @@ -43,13 +43,12 @@ inline bool overlapInterval(unsigned short amin, unsigned short amax, static rcSpan* allocSpan(rcHeightfield& hf) { - static const int SPANS_PER_POOL = 2048; // If running out of memory, allocate new page and update the freelist. if (!hf.freelist || !hf.freelist->next) { // Create new page. // Allocate memory for the new pool. - const int size = (sizeof(rcSpanPool)-sizeof(rcSpan)) + sizeof(rcSpan)*SPANS_PER_POOL; + const int size = (sizeof(rcSpanPool)-sizeof(rcSpan)) + sizeof(rcSpan)*RC_SPANS_PER_POOL; rcSpanPool* pool = reinterpret_cast(new unsigned char[size]); if (!pool) return 0; pool->next = 0; @@ -59,7 +58,7 @@ static rcSpan* allocSpan(rcHeightfield& hf) // Add new items to the free list. rcSpan* freelist = hf.freelist; rcSpan* head = &pool->items[0]; - rcSpan* it = &pool->items[SPANS_PER_POOL]; + rcSpan* it = &pool->items[RC_SPANS_PER_POOL]; do { --it; @@ -290,6 +289,9 @@ void rcRasterizeTriangles(const float* bmin, const float* bmax, const float cs, rcTimeVal endTime = rcGetPerformanceTimer(); - if (rcGetLog()) - rcGetLog()->log(RC_LOG_PROGRESS, "Rasterize: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); +// if (rcGetLog()) +// rcGetLog()->log(RC_LOG_PROGRESS, "Rasterize: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + + if (rcGetBuildTimes()) + rcGetBuildTimes()->rasterizeTriangles += rcGetDeltaTimeUsec(startTime, endTime); } diff --git a/Recast/Source/RecastRegion.cpp b/Recast/Source/RecastRegion.cpp index 2409ff6..ac30010 100644 --- a/Recast/Source/RecastRegion.cpp +++ b/Recast/Source/RecastRegion.cpp @@ -379,7 +379,7 @@ static unsigned short* expandRegions(int maxIter, unsigned short level, const int ax = x + rcGetDirOffsetX(dir); const int ay = y + rcGetDirOffsetY(dir); const int ai = (int)chf.cells[ax+ay*w].index + rcGetCon(s, dir); - if (src[ai*2]) + if (src[ai*2] > 0 && (src[ai*2] & 0x8000) == 0) { if ((int)src[ai*2+1]+2 < (int)d2) { @@ -420,10 +420,11 @@ static unsigned short* expandRegions(int maxIter, unsigned short level, struct rcRegion { - inline rcRegion() : count(0), id(0) {} + inline rcRegion() : count(0), id(0), remap(false) {} int count; unsigned short id; + bool remap; rcIntArray connections; rcIntArray floors; }; @@ -741,7 +742,7 @@ static bool filterSmallRegions(int minRegionSize, int mergeRegionSize, for (int i = 0; i < nreg; ++i) { rcRegion& reg = regions[i]; - if (reg.id == 0) + if (reg.id == 0 || (reg.id & 0x8000)) continue; if (reg.count == 0) continue; @@ -766,7 +767,7 @@ static bool filterSmallRegions(int minRegionSize, int mergeRegionSize, for (int i = 0; i < nreg; ++i) { rcRegion& reg = regions[i]; - if (reg.id == 0) + if (reg.id == 0 || (reg.id & 0x8000)) continue; if (reg.count == 0) continue; @@ -782,8 +783,9 @@ static bool filterSmallRegions(int minRegionSize, int mergeRegionSize, unsigned short mergeId = reg.id; for (int j = 0; j < reg.connections.size(); ++j) { + if (reg.connections[j] & 0x8000) continue; rcRegion& mreg = regions[reg.connections[j]]; - if (mreg.id == 0) continue; + if (mreg.id == 0 || (mreg.id & 0x8000)) continue; if (mreg.count < smallest && canMergeWithRegion(reg, mreg.id) && canMergeWithRegion(mreg, reg.id)) @@ -804,7 +806,7 @@ static bool filterSmallRegions(int minRegionSize, int mergeRegionSize, // Fixup regions pointing to current region. for (int j = 0; j < nreg; ++j) { - if (regions[j].id == 0) continue; + if (regions[j].id == 0 || (regions[j].id & 0x8000)) continue; // If another region was already merged into current region // change the nid of the previous region too. if (regions[j].id == oldId) @@ -823,28 +825,36 @@ static bool filterSmallRegions(int minRegionSize, int mergeRegionSize, // Compress region Ids. for (int i = 0; i < nreg; ++i) { - if (regions[i].id == 0) continue; - regions[i].id |= 0x8000; + regions[i].remap = false; + if (regions[i].id == 0) continue; // Skip nil regions. + if (regions[i].id & 0x8000) continue; // Skip external regions. + regions[i].remap = true; } unsigned short regIdGen = 0; for (int i = 0; i < nreg; ++i) { - if ((regions[i].id & 0x8000) == 0) + if (!regions[i].remap) continue; unsigned short oldId = regions[i].id; unsigned short newId = ++regIdGen; for (int j = i; j < nreg; ++j) { if (regions[j].id == oldId) + { regions[j].id = newId; + regions[j].remap = false; + } } } maxRegionId = regIdGen; // Remap regions. for (int i = 0; i < chf.spanCount; ++i) - src[i*2] = regions[src[i*2]].id; + { + if ((src[i*2] & 0x8000) == 0) + src[i*2] = regions[src[i*2]].id; + } delete [] regions; @@ -902,18 +912,44 @@ bool rcBuildDistanceField(rcCompactHeightfield& chf) rcTimeVal endTime = rcGetPerformanceTimer(); - if (rcGetLog()) +/* if (rcGetLog()) { rcGetLog()->log(RC_LOG_PROGRESS, "Build distance field: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); rcGetLog()->log(RC_LOG_PROGRESS, " - dist: %.3f ms", rcGetDeltaTimeUsec(distStartTime, distEndTime)/1000.0f); rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.3f ms", rcGetDeltaTimeUsec(blurStartTime, blurEndTime)/1000.0f); + }*/ + if (rcGetBuildTimes()) + { + rcGetBuildTimes()->buildDistanceField += rcGetDeltaTimeUsec(startTime, endTime); + rcGetBuildTimes()->buildDistanceFieldDist += rcGetDeltaTimeUsec(distStartTime, distEndTime); + rcGetBuildTimes()->buildDistanceFieldBlur += rcGetDeltaTimeUsec(blurStartTime, blurEndTime); } return true; } +static void paintRectRegion(int minx, int maxx, int miny, int maxy, + unsigned short regId, unsigned short minLevel, + rcCompactHeightfield& chf, unsigned short* src) +{ + const int w = chf.width; + for (int y = miny; y < maxy; ++y) + { + for (int x = minx; x < maxx; ++x) + { + const rcCompactCell& c = chf.cells[x+y*w]; + for (int i = (int)c.index, ni = (int)(c.index+c.count); i < ni; ++i) + { + if (chf.spans[i].dist >= minLevel) + src[i*2] = regId; + } + } + } +} + bool rcBuildRegions(rcCompactHeightfield& chf, - int walkableRadius, int minRegionSize, int mergeRegionSize) + int walkableRadius, int borderSize, + int minRegionSize, int mergeRegionSize) { rcTimeVal startTime = rcGetPerformanceTimer(); @@ -952,9 +988,13 @@ bool rcBuildRegions(rcCompactHeightfield& chf, unsigned short minLevel = (unsigned short)walkableRadius * 2; const int expandIters = 4 + walkableRadius * 2; - + + paintRectRegion(0, borderSize, 0, h, regionId|0x8000, minLevel, chf, src); regionId++; + paintRectRegion(w-borderSize, w, 0, h, regionId|0x8000, minLevel, chf, src); regionId++; + paintRectRegion(0, w, 0, borderSize, regionId|0x8000, minLevel, chf, src); regionId++; + paintRectRegion(0, w, h-borderSize, h, regionId|0x8000, minLevel, chf, src); regionId++; + rcTimeVal expTime = 0; - rcTimeVal marknewTime = 0; rcTimeVal floodTime = 0; while (level > minLevel) @@ -1017,16 +1057,24 @@ bool rcBuildRegions(rcCompactHeightfield& chf, rcTimeVal endTime = rcGetPerformanceTimer(); - if (rcGetLog()) +/* if (rcGetLog()) { rcGetLog()->log(RC_LOG_PROGRESS, "Build regions: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); rcGetLog()->log(RC_LOG_PROGRESS, " - reg: %.3f ms", rcGetDeltaTimeUsec(regStartTime, regEndTime)/1000.0f); rcGetLog()->log(RC_LOG_PROGRESS, " - exp: %.3f ms", rcGetDeltaTimeUsec(0, expTime)/1000.0f); - rcGetLog()->log(RC_LOG_PROGRESS, " - new: %.3f ms", rcGetDeltaTimeUsec(0, marknewTime)/1000.0f); rcGetLog()->log(RC_LOG_PROGRESS, " - flood: %.3f ms", rcGetDeltaTimeUsec(0, floodTime)/1000.0f); rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.3f ms", rcGetDeltaTimeUsec(filterStartTime, filterEndTime)/1000.0f); } - +*/ + if (rcGetBuildTimes()) + { + rcGetBuildTimes()->buildRegions += rcGetDeltaTimeUsec(startTime, endTime); + rcGetBuildTimes()->buildRegionsReg += rcGetDeltaTimeUsec(regStartTime, regEndTime); + rcGetBuildTimes()->buildRegionsExp += rcGetDeltaTimeUsec(0, expTime); + rcGetBuildTimes()->buildRegionsFlood += rcGetDeltaTimeUsec(0, floodTime); + rcGetBuildTimes()->buildRegionsFilter += rcGetDeltaTimeUsec(filterStartTime, filterEndTime); + } + return true; } diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser index fc62e0d..603f344 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser @@ -7,17 +7,58 @@ addToTargets = ( 8D1107260486CEB800E47090 /* Recast */, ); + breakpoints = ( + 6B7708A10FBD9AC100D21BAE /* ChunkyTriMesh.cpp:5 */, + ); codeSenseManager = 6B8632AA0F78115100E2684A /* Code sense */; executables = ( 6B8632970F78114600E2684A /* Recast */, ); perUserDictionary = { + "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA23EDF0692099D00951B8B" = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 20, + 266, + 20, + 165, + 165, + 96, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXBreakpointsDataSource_ActionID, + PBXBreakpointsDataSource_TypeID, + PBXBreakpointsDataSource_BreakpointID, + PBXBreakpointsDataSource_UseID, + PBXBreakpointsDataSource_LocationID, + PBXBreakpointsDataSource_ConditionID, + PBXBreakpointsDataSource_IgnoreCountID, + PBXBreakpointsDataSource_ContinueID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXBookmarksDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXBookmarksDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 200, + 200, + 435, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXBookmarksDataSource_LocationID, + PBXBookmarksDataSource_NameID, + PBXBookmarksDataSource_CommentsID, + ); + }; PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, - 625, + 791, 20, 48, 43, @@ -34,12 +75,315 @@ PBXFileDataSource_Target_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 261165315; - PBXWorkspaceStateSaveDate = 261165315; + PBXPerProjectTemplateStateSaveDate = 264243480; + PBXWorkspaceStateSaveDate = 264243480; }; perUserProjectItems = { - 6B8633370F7813A600E2684A /* PBXTextBookmark */ = 6B8633370F7813A600E2684A /* PBXTextBookmark */; - 6B86333B0F7813A600E2684A /* PBXTextBookmark */ = 6B86333B0F7813A600E2684A /* PBXTextBookmark */; + 6B1E02670F924A8500CC0038 = 6B1E02670F924A8500CC0038 /* PBXTextBookmark */; + 6B1E02680F924A8500CC0038 = 6B1E02680F924A8500CC0038 /* PBXTextBookmark */; + 6B1E02690F924A8500CC0038 = 6B1E02690F924A8500CC0038 /* PBXTextBookmark */; + 6B1E02750F924A8500CC0038 = 6B1E02750F924A8500CC0038 /* PBXTextBookmark */; + 6B1E028F0F924D5A00CC0038 = 6B1E028F0F924D5A00CC0038 /* PBXTextBookmark */; + 6B1E029B0F924D8B00CC0038 = 6B1E029B0F924D8B00CC0038 /* PBXTextBookmark */; + 6B1E02AE0F92530C00CC0038 = 6B1E02AE0F92530C00CC0038 /* PBXTextBookmark */; + 6B1E02BB0F92547D00CC0038 = 6B1E02BB0F92547D00CC0038 /* PBXTextBookmark */; + 6B1E02FC0F92563500CC0038 = 6B1E02FC0F92563500CC0038 /* PBXTextBookmark */; + 6B1E032E0F925D9100CC0038 = 6B1E032E0F925D9100CC0038 /* PBXTextBookmark */; + 6B1E03440F925E4500CC0038 = 6B1E03440F925E4500CC0038 /* PBXTextBookmark */; + 6B1E03C40F926B5400CC0038 = 6B1E03C40F926B5400CC0038 /* PBXTextBookmark */; + 6B2031A60FB5888D00F4963B = 6B2031A60FB5888D00F4963B /* PBXTextBookmark */; + 6B458EA50FB4540500044EA9 = 6B458EA50FB4540500044EA9 /* PBXTextBookmark */; + 6B458EA80FB4540500044EA9 = 6B458EA80FB4540500044EA9 /* PBXTextBookmark */; + 6B7707290FBD540400D21BAE = 6B7707290FBD540400D21BAE /* PBXTextBookmark */; + 6B77072A0FBD540400D21BAE = 6B77072A0FBD540400D21BAE /* PBXTextBookmark */; + 6B77072B0FBD540400D21BAE = 6B77072B0FBD540400D21BAE /* PBXTextBookmark */; + 6B77072C0FBD540400D21BAE = 6B77072C0FBD540400D21BAE /* PBXTextBookmark */; + 6B77072D0FBD540400D21BAE = 6B77072D0FBD540400D21BAE /* PBXTextBookmark */; + 6B77072E0FBD540400D21BAE = 6B77072E0FBD540400D21BAE /* PBXTextBookmark */; + 6B77072F0FBD540400D21BAE = 6B77072F0FBD540400D21BAE /* PBXTextBookmark */; + 6B7707300FBD540400D21BAE = 6B7707300FBD540400D21BAE /* PBXTextBookmark */; + 6B7707310FBD540400D21BAE = 6B7707310FBD540400D21BAE /* PBXTextBookmark */; + 6B7707320FBD540400D21BAE = 6B7707320FBD540400D21BAE /* PBXTextBookmark */; + 6B7707330FBD540400D21BAE = 6B7707330FBD540400D21BAE /* PBXTextBookmark */; + 6B77074C0FBD597500D21BAE = 6B77074C0FBD597500D21BAE /* PBXTextBookmark */; + 6B77074D0FBD597500D21BAE = 6B77074D0FBD597500D21BAE /* PBXTextBookmark */; + 6B7707500FBD597500D21BAE = 6B7707500FBD597500D21BAE /* PBXTextBookmark */; + 6B7707510FBD597500D21BAE = 6B7707510FBD597500D21BAE /* PBXTextBookmark */; + 6B7707520FBD597500D21BAE = 6B7707520FBD597500D21BAE /* PBXTextBookmark */; + 6B7707530FBD597500D21BAE = 6B7707530FBD597500D21BAE /* PBXTextBookmark */; + 6B7707540FBD597500D21BAE = 6B7707540FBD597500D21BAE /* PBXTextBookmark */; + 6B7707550FBD597500D21BAE = 6B7707550FBD597500D21BAE /* PBXTextBookmark */; + 6B7707560FBD597500D21BAE = 6B7707560FBD597500D21BAE /* PBXTextBookmark */; + 6B7707570FBD597500D21BAE = 6B7707570FBD597500D21BAE /* PBXTextBookmark */; + 6B7707580FBD597500D21BAE = 6B7707580FBD597500D21BAE /* PBXTextBookmark */; + 6B7707590FBD597500D21BAE = 6B7707590FBD597500D21BAE /* PBXTextBookmark */; + 6B77076A0FBD5BA400D21BAE = 6B77076A0FBD5BA400D21BAE /* PBXTextBookmark */; + 6B77076B0FBD5BA400D21BAE = 6B77076B0FBD5BA400D21BAE /* PBXTextBookmark */; + 6B7707710FBD5DB300D21BAE = 6B7707710FBD5DB300D21BAE /* PBXTextBookmark */; + 6B7707730FBD5DB300D21BAE = 6B7707730FBD5DB300D21BAE /* PBXTextBookmark */; + 6B7707740FBD5DB300D21BAE = 6B7707740FBD5DB300D21BAE /* PBXTextBookmark */; + 6B77078E0FBD622A00D21BAE = 6B77078E0FBD622A00D21BAE /* PBXTextBookmark */; + 6B77078F0FBD622A00D21BAE = 6B77078F0FBD622A00D21BAE /* PBXTextBookmark */; + 6B7707950FBD624F00D21BAE = 6B7707950FBD624F00D21BAE /* PBXTextBookmark */; + 6B7707A20FBD650600D21BAE = 6B7707A20FBD650600D21BAE /* PBXTextBookmark */; + 6B7707A60FBD650600D21BAE = 6B7707A60FBD650600D21BAE /* PBXTextBookmark */; + 6B7707AF0FBD66CF00D21BAE = 6B7707AF0FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707B30FBD66CF00D21BAE = 6B7707B30FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707B40FBD66CF00D21BAE = 6B7707B40FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707B50FBD66CF00D21BAE = 6B7707B50FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707B60FBD66CF00D21BAE = 6B7707B60FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707B70FBD66CF00D21BAE = 6B7707B70FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707B80FBD66CF00D21BAE = 6B7707B80FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707B90FBD66CF00D21BAE = 6B7707B90FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707BA0FBD66CF00D21BAE = 6B7707BA0FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707BB0FBD66CF00D21BAE = 6B7707BB0FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707BC0FBD66CF00D21BAE = 6B7707BC0FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707BD0FBD66CF00D21BAE = 6B7707BD0FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707BE0FBD66CF00D21BAE = 6B7707BE0FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707BF0FBD66CF00D21BAE = 6B7707BF0FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707C00FBD66CF00D21BAE = 6B7707C00FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707C10FBD66CF00D21BAE = 6B7707C10FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707C20FBD66CF00D21BAE = 6B7707C20FBD66CF00D21BAE /* PBXTextBookmark */; + 6B7707EF0FBD90F100D21BAE = 6B7707EF0FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707F00FBD90F100D21BAE = 6B7707F00FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707F30FBD90F100D21BAE = 6B7707F30FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707F60FBD90F100D21BAE = 6B7707F60FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707F70FBD90F100D21BAE = 6B7707F70FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707F80FBD90F100D21BAE = 6B7707F80FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707F90FBD90F100D21BAE = 6B7707F90FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707FB0FBD90F100D21BAE = 6B7707FB0FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707FC0FBD90F100D21BAE = 6B7707FC0FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707FD0FBD90F100D21BAE = 6B7707FD0FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707FE0FBD90F100D21BAE = 6B7707FE0FBD90F100D21BAE /* PBXTextBookmark */; + 6B7707FF0FBD90F100D21BAE = 6B7707FF0FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708000FBD90F100D21BAE = 6B7708000FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708010FBD90F100D21BAE = 6B7708010FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708020FBD90F100D21BAE = 6B7708020FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708030FBD90F100D21BAE = 6B7708030FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708040FBD90F100D21BAE = 6B7708040FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708050FBD90F100D21BAE = 6B7708050FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708060FBD90F100D21BAE = 6B7708060FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708070FBD90F100D21BAE = 6B7708070FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708080FBD90F100D21BAE = 6B7708080FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708090FBD90F100D21BAE = 6B7708090FBD90F100D21BAE /* PBXTextBookmark */; + 6B77080A0FBD90F100D21BAE = 6B77080A0FBD90F100D21BAE /* PBXTextBookmark */; + 6B77080B0FBD90F100D21BAE = 6B77080B0FBD90F100D21BAE /* PBXTextBookmark */; + 6B77080C0FBD90F100D21BAE = 6B77080C0FBD90F100D21BAE /* PBXTextBookmark */; + 6B77080D0FBD90F100D21BAE = 6B77080D0FBD90F100D21BAE /* PBXTextBookmark */; + 6B77080E0FBD90F100D21BAE = 6B77080E0FBD90F100D21BAE /* PBXTextBookmark */; + 6B77080F0FBD90F100D21BAE = 6B77080F0FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708100FBD90F100D21BAE = 6B7708100FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708110FBD90F100D21BAE = 6B7708110FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708120FBD90F100D21BAE = 6B7708120FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708130FBD90F100D21BAE = 6B7708130FBD90F100D21BAE /* PBXTextBookmark */; + 6B7708140FBD90F100D21BAE = 6B7708140FBD90F100D21BAE /* PBXTextBookmark */; + 6B77081B0FBD917300D21BAE = 6B77081B0FBD917300D21BAE /* PBXTextBookmark */; + 6B77081C0FBD917300D21BAE = 6B77081C0FBD917300D21BAE /* PBXTextBookmark */; + 6B77081D0FBD917300D21BAE = 6B77081D0FBD917300D21BAE /* PBXTextBookmark */; + 6B77083E0FBD93F900D21BAE = 6B77083E0FBD93F900D21BAE /* PBXTextBookmark */; + 6B77083F0FBD93F900D21BAE = 6B77083F0FBD93F900D21BAE /* PBXTextBookmark */; + 6B7708400FBD93F900D21BAE = 6B7708400FBD93F900D21BAE /* PBXTextBookmark */; + 6B7708410FBD93F900D21BAE = 6B7708410FBD93F900D21BAE /* PBXTextBookmark */; + 6B7708420FBD93F900D21BAE = 6B7708420FBD93F900D21BAE /* PBXTextBookmark */; + 6B77084D0FBD94F500D21BAE = 6B77084D0FBD94F500D21BAE /* PBXTextBookmark */; + 6B77084E0FBD94F500D21BAE = 6B77084E0FBD94F500D21BAE /* PBXTextBookmark */; + 6B77084F0FBD94F500D21BAE = 6B77084F0FBD94F500D21BAE /* PBXTextBookmark */; + 6B7708500FBD94F500D21BAE = 6B7708500FBD94F500D21BAE /* PBXTextBookmark */; + 6B7708510FBD94F500D21BAE = 6B7708510FBD94F500D21BAE /* PBXTextBookmark */; + 6B7708520FBD94F500D21BAE = 6B7708520FBD94F500D21BAE /* PBXTextBookmark */; + 6B7708530FBD94F500D21BAE = 6B7708530FBD94F500D21BAE /* PBXTextBookmark */; + 6B7708590FBD956200D21BAE = 6B7708590FBD956200D21BAE /* PBXTextBookmark */; + 6B7708620FBD960F00D21BAE = 6B7708620FBD960F00D21BAE /* PBXTextBookmark */; + 6B7708680FBD969F00D21BAE = 6B7708680FBD969F00D21BAE /* PBXTextBookmark */; + 6B7708730FBD97C500D21BAE = 6B7708730FBD97C500D21BAE /* PBXTextBookmark */; + 6B7708740FBD97C500D21BAE = 6B7708740FBD97C500D21BAE /* PBXTextBookmark */; + 6B7708750FBD97C500D21BAE = 6B7708750FBD97C500D21BAE /* PBXTextBookmark */; + 6B7708760FBD97C500D21BAE = 6B7708760FBD97C500D21BAE /* PBXTextBookmark */; + 6B7708770FBD97C500D21BAE = 6B7708770FBD97C500D21BAE /* PBXTextBookmark */; + 6B7708780FBD97C500D21BAE = 6B7708780FBD97C500D21BAE /* PBXTextBookmark */; + 6B7708790FBD97C500D21BAE = 6B7708790FBD97C500D21BAE /* PBXTextBookmark */; + 6B77087A0FBD97C500D21BAE = 6B77087A0FBD97C500D21BAE /* PBXTextBookmark */; + 6B77087B0FBD97C500D21BAE = 6B77087B0FBD97C500D21BAE /* PBXTextBookmark */; + 6B7708860FBD987F00D21BAE = 6B7708860FBD987F00D21BAE /* PBXTextBookmark */; + 6B7708870FBD987F00D21BAE = 6B7708870FBD987F00D21BAE /* PBXTextBookmark */; + 6B77088D0FBD996700D21BAE = 6B77088D0FBD996700D21BAE /* PBXTextBookmark */; + 6B77089D0FBD9A6100D21BAE = 6B77089D0FBD9A6100D21BAE /* PBXTextBookmark */; + 6B7708AC0FBD9B5700D21BAE = 6B7708AC0FBD9B5700D21BAE /* PBXTextBookmark */; + 6B7708CD0FBDA4E800D21BAE = 6B7708CD0FBDA4E800D21BAE /* PBXTextBookmark */; + 6B7708CF0FBDA4E800D21BAE = 6B7708CF0FBDA4E800D21BAE /* PBXTextBookmark */; + 6B7708D00FBDA4E800D21BAE = 6B7708D00FBDA4E800D21BAE /* PBXTextBookmark */; + 6B7708E40FBDA68700D21BAE = 6B7708E40FBDA68700D21BAE /* PBXTextBookmark */; + 6B7708E50FBDA68700D21BAE = 6B7708E50FBDA68700D21BAE /* PBXTextBookmark */; + 6B7708E70FBDA68700D21BAE = 6B7708E70FBDA68700D21BAE /* PBXTextBookmark */; + 6B7708E80FBDA68700D21BAE = 6B7708E80FBDA68700D21BAE /* PBXTextBookmark */; + 6B7708E90FBDA68700D21BAE = 6B7708E90FBDA68700D21BAE /* PBXTextBookmark */; + 6B7708EA0FBDA68700D21BAE = 6B7708EA0FBDA68700D21BAE /* PBXTextBookmark */; + 6B7708F20FBDA96300D21BAE = 6B7708F20FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708F30FBDA96300D21BAE = 6B7708F30FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708F40FBDA96300D21BAE = 6B7708F40FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708F50FBDA96300D21BAE = 6B7708F50FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708F60FBDA96300D21BAE = 6B7708F60FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708F70FBDA96300D21BAE = 6B7708F70FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708F80FBDA96300D21BAE = 6B7708F80FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708F90FBDA96300D21BAE = 6B7708F90FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708FA0FBDA96300D21BAE = 6B7708FA0FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708FB0FBDA96300D21BAE = 6B7708FB0FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708FC0FBDA96300D21BAE = 6B7708FC0FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708FD0FBDA96300D21BAE = 6B7708FD0FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708FE0FBDA96300D21BAE = 6B7708FE0FBDA96300D21BAE /* PBXTextBookmark */; + 6B7708FF0FBDA96300D21BAE = 6B7708FF0FBDA96300D21BAE /* PBXTextBookmark */; + 6B7709040FBDA9AB00D21BAE = 6B7709040FBDA9AB00D21BAE /* PBXTextBookmark */; + 6B8633370F7813A600E2684A = 6B8633370F7813A600E2684A /* PBXTextBookmark */; + 6B86333B0F7813A600E2684A = 6B86333B0F7813A600E2684A /* PBXTextBookmark */; + 6B8DB2D70F93A7A5007FA9E1 = 6B8DB2D70F93A7A5007FA9E1 /* PBXTextBookmark */; + 6B8DB3890F9798DE007FA9E1 = 6B8DB3890F9798DE007FA9E1 /* PBXTextBookmark */; + 6B8DB38A0F9798DE007FA9E1 = 6B8DB38A0F9798DE007FA9E1 /* PBXTextBookmark */; + 6B8DB38C0F9798DE007FA9E1 = 6B8DB38C0F9798DE007FA9E1 /* PBXTextBookmark */; + 6B8DB38F0F9798DE007FA9E1 = 6B8DB38F0F9798DE007FA9E1 /* PBXTextBookmark */; + 6B8DB3900F9798DE007FA9E1 = 6B8DB3900F9798DE007FA9E1 /* PBXTextBookmark */; + 6B8DB3EA0F97A007007FA9E1 = 6B8DB3EA0F97A007007FA9E1 /* PBXTextBookmark */; + 6BB787660FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787660FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787670FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787670FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787680FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787680FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787690FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787690FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7876A0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7876A0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7876B0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7876B0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7876C0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7876C0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7876D0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7876D0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7876E0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7876E0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7876F0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7876F0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787700FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787700FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787710FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787710FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787720FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787720FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787730FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787730FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787740FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787740FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787750FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787750FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787760FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787760FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787770FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787770FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787780FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787780FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787790FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787790FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7877A0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7877A0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7877B0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7877B0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7877C0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7877C0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7877D0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7877D0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7877E0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7877E0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7877F0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7877F0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787800FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787800FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787810FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787810FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787820FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787820FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787830FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787830FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787840FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787840FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787850FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787850FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787860FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787860FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787870FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787870FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787880FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787880FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787890FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787890FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7878A0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7878A0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7878B0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7878B0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7878C0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7878C0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7878D0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7878D0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7878E0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7878E0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7878F0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7878F0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787900FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787900FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787910FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787910FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787920FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787920FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787930FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787930FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787940FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787940FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787950FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787950FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787960FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787960FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787970FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787970FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787980FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787980FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787990FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787990FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7879A0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7879A0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7879B0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7879B0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7879C0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7879C0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7879D0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7879D0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7879E0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7879E0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB7879F0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB7879F0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A00FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A00FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A10FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A10FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A20FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A20FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A30FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A30FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A40FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A40FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A50FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A50FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A60FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A60FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A70FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A70FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A80FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A80FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787A90FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787A90FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787AA0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787AA0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787AB0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787AB0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787AC0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787AC0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787AD0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787AD0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787AE0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787AE0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787AF0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787AF0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B00FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B00FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B10FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B10FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B20FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B20FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B30FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B30FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B40FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B40FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B50FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B50FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B60FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B60FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B70FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B70FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B80FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B80FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787B90FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787B90FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787BA0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787BA0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787BB0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787BB0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787BC0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787BC0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787BD0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787BD0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787BE0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787BE0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787BF0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787BF0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C00FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C00FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C10FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C10FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C20FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C20FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C30FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C30FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C40FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C40FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C50FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C50FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C60FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C60FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C70FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C70FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C80FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C80FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787C90FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787C90FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787CA0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787CA0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787CB0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787CB0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787CC0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787CC0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787CD0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787CD0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787CE0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787CE0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787CF0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787CF0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D00FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D00FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D10FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D10FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D20FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D20FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D30FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D30FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D40FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D40FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D50FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D50FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D60FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D60FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D70FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D70FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D80FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D80FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787D90FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787D90FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787DA0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787DA0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787DB0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787DB0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787DC0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787DC0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787DD0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787DD0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787DE0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787DE0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787DF0FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787DF0FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787E00FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787E00FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787E10FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787E10FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787E20FC03EAD003C24DB /* PBXTextBookmark */ = 6BB787E20FC03EAD003C24DB /* PBXTextBookmark */; + 6BB787E40FC03EB7003C24DB /* PBXTextBookmark */ = 6BB787E40FC03EB7003C24DB /* PBXTextBookmark */; + 6BB787EE0FC03ECF003C24DB /* PBXTextBookmark */ = 6BB787EE0FC03ECF003C24DB /* PBXTextBookmark */; + 6BB787F70FC04199003C24DB /* PBXTextBookmark */ = 6BB787F70FC04199003C24DB /* PBXTextBookmark */; + 6BB787F80FC04199003C24DB /* PBXTextBookmark */ = 6BB787F80FC04199003C24DB /* PBXTextBookmark */; + 6BB787FB0FC041F4003C24DB /* PBXTextBookmark */ = 6BB787FB0FC041F4003C24DB /* PBXTextBookmark */; + 6BB787FF0FC042A2003C24DB /* PBXTextBookmark */ = 6BB787FF0FC042A2003C24DB /* PBXTextBookmark */; + 6BB788000FC042A2003C24DB /* PBXTextBookmark */ = 6BB788000FC042A2003C24DB /* PBXTextBookmark */; + 6BB788010FC042A9003C24DB /* PBXTextBookmark */ = 6BB788010FC042A9003C24DB /* PBXTextBookmark */; + 6BB788080FC0437C003C24DB /* PBXTextBookmark */ = 6BB788080FC0437C003C24DB /* PBXTextBookmark */; + 6BB7880B0FC04434003C24DB /* PBXTextBookmark */ = 6BB7880B0FC04434003C24DB /* PBXTextBookmark */; + 6BB7880E0FC0446C003C24DB /* PBXTextBookmark */ = 6BB7880E0FC0446C003C24DB /* PBXTextBookmark */; + 6BB7880F0FC044B7003C24DB /* PBXTextBookmark */ = 6BB7880F0FC044B7003C24DB /* PBXTextBookmark */; + 6BB788130FC045A2003C24DB /* PBXTextBookmark */ = 6BB788130FC045A2003C24DB /* PBXTextBookmark */; + 6BB788140FC045A2003C24DB /* PBXTextBookmark */ = 6BB788140FC045A2003C24DB /* PBXTextBookmark */; + 6BB87DD70F9DDFBA00E33F12 = 6BB87DD70F9DDFBA00E33F12 /* PBXTextBookmark */; + 6BB87E0B0F9DE8A300E33F12 = 6BB87E0B0F9DE8A300E33F12 /* PBXTextBookmark */; + 6BB87E0E0F9DE8A300E33F12 = 6BB87E0E0F9DE8A300E33F12 /* PBXTextBookmark */; }; sourceControlManager = 6B8632A90F78115100E2684A /* Source Control */; userBuildSettings = { @@ -53,6 +397,1723 @@ sepNavWindowFrame = "{{38, 57}, {1011, 695}}"; }; }; + 6B137C6A0F7FCBBB00459200 /* demo.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1219, 28608}}"; + sepNavSelRange = "{38485, 0}"; + sepNavVisRange = "{37317, 411}"; + }; + }; + 6B137C6B0F7FCBBB00459200 /* glfont.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 4544}}"; + sepNavSelRange = "{4476, 0}"; + sepNavVisRange = "{4122, 707}"; + }; + }; + 6B137C6D0F7FCBBB00459200 /* MeshLoaderObj.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 3520}}"; + sepNavSelRange = "{4298, 380}"; + sepNavVisRange = "{4033, 666}"; + }; + }; + 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 800}}"; + sepNavSelRange = "{1361, 0}"; + sepNavVisRange = "{837, 759}"; + }; + }; + 6B137C7E0F7FCBFE00459200 /* Recast.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 6912}}"; + sepNavSelRange = "{1050, 0}"; + sepNavVisRange = "{317, 1639}"; + }; + }; + 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 944}}"; + sepNavSelRange = "{2059, 57}"; + sepNavVisRange = "{1119, 1399}"; + }; + }; + 6B137C800F7FCBFE00459200 /* RecastLog.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 1264}}"; + sepNavSelRange = "{2052, 13}"; + sepNavVisRange = "{1674, 522}"; + }; + }; + 6B137C810F7FCBFE00459200 /* RecastTimer.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 592}}"; + sepNavSelRange = "{964, 0}"; + sepNavVisRange = "{0, 1063}"; + sepNavWindowFrame = "{{15, 78}, {1011, 695}}"; + }; + }; + 6B137C820F7FCC1100459200 /* Recast.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 5628}}"; + sepNavSelRange = "{6993, 12}"; + sepNavVisRange = "{6474, 656}"; + }; + }; + 6B137C830F7FCC1100459200 /* RecastContour.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 15216}}"; + sepNavSelRange = "{22196, 0}"; + sepNavVisRange = "{21872, 479}"; + }; + }; + 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 7824}}"; + sepNavSelRange = "{9976, 0}"; + sepNavVisRange = "{9745, 727}"; + }; + }; + 6B137C850F7FCC1100459200 /* RecastFilter.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 3680}}"; + sepNavSelRange = "{6932, 0}"; + sepNavVisRange = "{6478, 557}"; + }; + }; + 6B137C860F7FCC1100459200 /* RecastLog.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 1248}}"; + sepNavSelRange = "{1703, 0}"; + sepNavVisRange = "{1527, 299}"; + }; + }; + 6B137C870F7FCC1100459200 /* RecastMesh.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 11200}}"; + sepNavSelRange = "{18231, 102}"; + sepNavVisRange = "{17736, 615}"; + }; + }; + 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 4400}}"; + sepNavSelRange = "{7850, 0}"; + sepNavVisRange = "{7133, 763}"; + }; + }; + 6B137C890F7FCC1100459200 /* RecastRegion.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 16640}}"; + sepNavSelRange = "{26082, 0}"; + sepNavVisRange = "{25144, 1115}"; + }; + }; + 6B137C8A0F7FCC1100459200 /* RecastTimer.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 736}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 574}"; + }; + }; + 6B1E02670F924A8500CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 13"; + rLen = 0; + rLoc = 705; + rType = 0; + vrLen = 1146; + vrLoc = 0; + }; + 6B1E02680F924A8500CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 253"; + rLen = 0; + rLoc = 8208; + rType = 0; + vrLen = 929; + vrLoc = 6318; + }; + 6B1E02690F924A8500CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 52"; + rLen = 13; + rLoc = 2177; + rType = 0; + vrLen = 557; + vrLoc = 1849; + }; + 6B1E02750F924A8500CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; + name = "RecastRasterization.cpp: 46"; + rLen = 0; + rLoc = 1659; + rType = 0; + vrLen = 834; + vrLoc = 1531; + }; + 6B1E028F0F924D5A00CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 1206"; + rLen = 0; + rLoc = 26944; + rType = 0; + vrLen = 689; + vrLoc = 26805; + }; + 6B1E029B0F924D8B00CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 285"; + rLen = 0; + rLoc = 7191; + rType = 0; + vrLen = 362; + vrLoc = 6876; + }; + 6B1E02AE0F92530C00CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1450; + vrLoc = 1079; + }; + 6B1E02BB0F92547D00CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 119"; + rLen = 0; + rLoc = 3913; + rType = 0; + vrLen = 785; + vrLoc = 3274; + }; + 6B1E02FC0F92563500CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E060F91112200904EEF /* DetourStatNavMeshBuilder.h */; + name = "DetourStatNavMeshBuilder.h: 22"; + rLen = 19; + rLoc = 995; + rType = 0; + vrLen = 1284; + vrLoc = 0; + }; + 6B1E032E0F925D9100CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; + name = "RecastRegion.cpp: 921"; + rLen = 0; + rLoc = 22732; + rType = 0; + vrLen = 918; + vrLoc = 20892; + }; + 6B1E03440F925E4500CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1173; + vrLoc = 0; + }; + 6B1E03C40F926B5400CC0038 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 126"; + rLen = 0; + rLoc = 3913; + rType = 0; + vrLen = 855; + vrLoc = 3570; + }; + 6B2031A60FB5888D00F4963B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; + name = "RecastRasterization.cpp: 199"; + rLen = 578; + rLoc = 4976; + rType = 0; + vrLen = 928; + vrLoc = 4754; + }; + 6B458EA50FB4540500044EA9 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C810F7FCBFE00459200 /* RecastTimer.h */; + name = "RecastTimer.h: 20"; + rLen = 0; + rLoc = 964; + rType = 0; + vrLen = 1182; + vrLoc = 0; + }; + 6B458EA80FB4540500044EA9 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C810F7FCBFE00459200 /* RecastTimer.h */; + name = "RecastTimer.h: 20"; + rLen = 0; + rLoc = 964; + rType = 0; + vrLen = 1182; + vrLoc = 0; + }; + 6B7707290FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1605"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 1278; + vrLoc = 40057; + }; + 6B77072A0FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 267"; + rLen = 1328; + rLoc = 7911; + rType = 0; + vrLen = 1023; + vrLoc = 7135; + }; + 6B77072B0FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1596"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 988; + vrLoc = 39320; + }; + 6B77072C0FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 26"; + rLen = 0; + rLoc = 1143; + rType = 0; + vrLen = 887; + vrLoc = 667; + }; + 6B77072D0FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1565"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 906; + vrLoc = 38501; + }; + 6B77072E0FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 228"; + rLen = 0; + rLoc = 5824; + rType = 0; + vrLen = 747; + vrLoc = 2893; + }; + 6B77072F0FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 38"; + rLen = 0; + rLoc = 1504; + rType = 0; + vrLen = 794; + vrLoc = 919; + }; + 6B7707300FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 1206"; + rLen = 0; + rLoc = 26893; + rType = 0; + vrLen = 1772; + vrLoc = 26238; + }; + 6B7707310FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 38"; + rLen = 0; + rLoc = 1504; + rType = 0; + vrLen = 794; + vrLoc = 919; + }; + 6B7707320FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 1206"; + rLen = 0; + rLoc = 26893; + rType = 0; + vrLen = 728; + vrLoc = 27912; + }; + 6B7707330FBD540400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 121"; + rLen = 0; + rLoc = 3162; + rType = 0; + vrLen = 747; + vrLoc = 2893; + }; + 6B77074C0FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 41"; + rLen = 63; + rLoc = 1555; + rType = 0; + vrLen = 794; + vrLoc = 919; + }; + 6B77074D0FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E060F91112200904EEF /* DetourStatNavMeshBuilder.h */; + name = "DetourStatNavMeshBuilder.h: 18"; + rLen = 0; + rLoc = 918; + rType = 0; + vrLen = 1284; + vrLoc = 0; + }; + 6B7707500FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 939"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 1008; + vrLoc = 19580; + }; + 6B7707510FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 121"; + rLen = 0; + rLoc = 3162; + rType = 0; + vrLen = 747; + vrLoc = 2893; + }; + 6B7707520FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */; + name = "DetourStatNavMesh.h: 41"; + rLen = 63; + rLoc = 1555; + rType = 0; + vrLen = 794; + vrLoc = 919; + }; + 6B7707530FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 832"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 790; + vrLoc = 18908; + }; + 6B7707540FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E060F91112200904EEF /* DetourStatNavMeshBuilder.h */; + name = "DetourStatNavMeshBuilder.h: 18"; + rLen = 0; + rLoc = 918; + rType = 0; + vrLen = 1284; + vrLoc = 0; + }; + 6B7707550FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 24"; + rLen = 4218; + rLoc = 1009; + rType = 0; + vrLen = 950; + vrLoc = 4519; + }; + 6B7707560FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 949"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 856; + vrLoc = 21551; + }; + 6B7707570FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 166"; + rLen = 0; + rLoc = 4172; + rType = 0; + vrLen = 962; + vrLoc = 3757; + }; + 6B7707580FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 944"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 850; + vrLoc = 21404; + }; + 6B7707590FBD597500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 278"; + rLen = 98; + rLoc = 7094; + rType = 0; + vrLen = 673; + vrLoc = 6575; + }; + 6B77076A0FBD5BA400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1111"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 847; + vrLoc = 25153; + }; + 6B77076B0FBD5BA400D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 1201"; + rLen = 1771; + rLoc = 26651; + rType = 0; + vrLen = 710; + vrLoc = 27713; + }; + 6B7707710FBD5DB300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 1191"; + rLen = 411; + rLoc = 26239; + rType = 0; + vrLen = 1004; + vrLoc = 25970; + }; + 6B7707730FBD5DB300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1097"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 804; + vrLoc = 25025; + }; + 6B7707740FBD5DB300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */; + name = "DetourStatNavMesh.cpp: 1191"; + rLen = 411; + rLoc = 26239; + rType = 0; + vrLen = 1004; + vrLoc = 25970; + }; + 6B77078E0FBD622A00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 430"; + rLen = 0; + rLoc = 5721; + rType = 0; + vrLen = 1562; + vrLoc = 9289; + }; + 6B77078F0FBD622A00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 267"; + rLen = 1773; + rLoc = 7911; + rType = 0; + vrLen = 915; + vrLoc = 8038; + }; + 6B7707950FBD624F00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 469"; + rLen = 0; + rLoc = 5721; + rType = 0; + vrLen = 637; + vrLoc = 9951; + }; + 6B7707A20FBD650600D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C870F7FCC1100459200 /* RecastMesh.cpp */; + name = "RecastMesh.cpp: 480"; + rLen = 0; + rLoc = 12748; + rType = 0; + vrLen = 604; + vrLoc = 12377; + }; + 6B7707A60FBD650600D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C870F7FCC1100459200 /* RecastMesh.cpp */; + name = "RecastMesh.cpp: 480"; + rLen = 0; + rLoc = 12748; + rType = 0; + vrLen = 604; + vrLoc = 12377; + }; + 6B7707AF0FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6D0F7FCBBB00459200 /* MeshLoaderObj.cpp */; + name = "MeshLoaderObj.cpp: 198"; + rLen = 380; + rLoc = 4298; + rType = 0; + vrLen = 666; + vrLoc = 4033; + }; + 6B7707B30FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 501"; + rLen = 0; + rLoc = 5721; + rType = 0; + vrLen = 1111; + vrLoc = 10842; + }; + 6B7707B40FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 91"; + rLen = 0; + rLoc = 2427; + rType = 0; + vrLen = 848; + vrLoc = 2038; + }; + 6B7707B50FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 293"; + rLen = 130; + rLoc = 7699; + rType = 0; + vrLen = 1351; + vrLoc = 7713; + }; + 6B7707B60FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 115"; + rLen = 0; + rLoc = 3116; + rType = 0; + vrLen = 745; + vrLoc = 2701; + }; + 6B7707B70FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 294"; + rLen = 26; + rLoc = 7768; + rType = 0; + vrLen = 1292; + vrLoc = 7713; + }; + 6B7707B80FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 104"; + rLen = 0; + rLoc = 2622; + rType = 0; + vrLen = 755; + vrLoc = 2701; + }; + 6B7707B90FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6D0F7FCBBB00459200 /* MeshLoaderObj.cpp */; + name = "MeshLoaderObj.cpp: 198"; + rLen = 380; + rLoc = 4298; + rType = 0; + vrLen = 666; + vrLoc = 4033; + }; + 6B7707BA0FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 107"; + rLen = 0; + rLoc = 2621; + rType = 0; + vrLen = 763; + vrLoc = 2701; + }; + 6B7707BB0FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 222"; + rLen = 0; + rLoc = 6097; + rType = 0; + vrLen = 693; + vrLoc = 5859; + }; + 6B7707BC0FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 107"; + rLen = 0; + rLoc = 2620; + rType = 0; + vrLen = 785; + vrLoc = 2701; + }; + 6B7707BD0FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 195"; + rLen = 0; + rLoc = 5598; + rType = 0; + vrLen = 837; + vrLoc = 5161; + }; + 6B7707BE0FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 112"; + rLen = 0; + rLoc = 2720; + rType = 0; + vrLen = 813; + vrLoc = 2962; + }; + 6B7707BF0FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 503"; + rLen = 0; + rLoc = 5721; + rType = 0; + vrLen = 1153; + vrLoc = 10935; + }; + 6B7707C00FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 86"; + rLen = 0; + rLoc = 2426; + rType = 0; + vrLen = 879; + vrLoc = 1980; + }; + 6B7707C10FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 280"; + rLen = 0; + rLoc = 7347; + rType = 0; + vrLen = 1326; + vrLoc = 7108; + }; + 6B7707C20FBD66CF00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 74"; + rLen = 0; + rLoc = 2069; + rType = 0; + vrLen = 906; + vrLoc = 1980; + }; + 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.c.h; + name = ChunkyTriMesh.h; + path = /Users/memon/Code/recastnavigation/RecastDemo/Source/ChunkyTriMesh.h; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 464}}"; + sepNavSelRange = "{497, 6}"; + sepNavVisRange = "{0, 584}"; + }; + }; + 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */ = { + isa = PBXFileReference; + fileEncoding = 4; + lastKnownFileType = sourcecode.cpp.cpp; + name = ChunkyTriMesh.cpp; + path = /Users/memon/Code/recastnavigation/RecastDemo/Include/ChunkyTriMesh.cpp; + sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 3760}}"; + sepNavSelRange = "{4539, 0}"; + sepNavVisRange = "{4597, 456}"; + }; + }; + 6B7707EF0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */; + name = "MeshLoaderObj.h: 34"; + rLen = 0; + rLoc = 1361; + rType = 0; + vrLen = 759; + vrLoc = 837; + }; + 6B7707F00FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707F10FBD90F100D21BAE /* btBvhTriangleMeshShape.h */; + name = "btBvhTriangleMeshShape.h: 34"; + rLen = 0; + rLoc = 2061; + rType = 0; + vrLen = 1134; + vrLoc = 2750; + }; + 6B7707F10FBD90F100D21BAE /* btBvhTriangleMeshShape.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = btBvhTriangleMeshShape.h; + path = "/Users/memon/Downloads/bullet-2.74/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h"; + sourceTree = ""; + }; + 6B7707F30FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 65"; + rLen = 0; + rLoc = 1863; + rType = 0; + vrLen = 726; + vrLoc = 1416; + }; + 6B7707F60FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 2107"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 0; + vrLoc = 45806; + }; + 6B7707F70FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */; + name = "MeshLoaderObj.h: 34"; + rLen = 0; + rLoc = 1361; + rType = 0; + vrLen = 759; + vrLoc = 837; + }; + 6B7707F80FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 360"; + rLen = 0; + rLoc = 5721; + rType = 0; + vrLen = 704; + vrLoc = 23973; + }; + 6B7707F90FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707FA0FBD90F100D21BAE /* btBvhTriangleMeshShape.h */; + name = "btBvhTriangleMeshShape.h: 34"; + rLen = 0; + rLoc = 2061; + rType = 0; + vrLen = 1134; + vrLoc = 2750; + }; + 6B7707FA0FBD90F100D21BAE /* btBvhTriangleMeshShape.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = btBvhTriangleMeshShape.h; + path = "/Users/memon/Downloads/bullet-2.74/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h"; + sourceTree = ""; + }; + 6B7707FB0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1106"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 685; + vrLoc = 25475; + }; + 6B7707FC0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "SubTriMesh.h: 4"; + rLen = 0; + rLoc = 584; + rType = 0; + vrLen = 67; + vrLoc = 0; + }; + 6B7707FD0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1194"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 999; + vrLoc = 27260; + }; + 6B7707FE0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "SubTriMesh.h: 24"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B7707FF0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1278"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 923; + vrLoc = 29471; + }; + 6B7708000FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 24"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B7708010FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 3"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 140; + vrLoc = 0; + }; + 6B7708020FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1037"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 634; + vrLoc = 24058; + }; + 6B7708030FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 138"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 732; + vrLoc = 2190; + }; + 6B7708040FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 24"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B7708050FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 138"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 732; + vrLoc = 2190; + }; + 6B7708060FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 21"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B7708070FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 146"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 795; + vrLoc = 2250; + }; + 6B7708080FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 12"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B7708090FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 143"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 722; + vrLoc = 2447; + }; + 6B77080A0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 12"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B77080B0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 63"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 664; + vrLoc = 1122; + }; + 6B77080C0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 4"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B77080D0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 14"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 688; + vrLoc = 0; + }; + 6B77080E0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 6"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B77080F0FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 22"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 688; + vrLoc = 0; + }; + 6B7708100FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 9"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B7708110FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 34"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 750; + vrLoc = 360; + }; + 6B7708120FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1067"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 720; + vrLoc = 24666; + }; + 6B7708130FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; + name = "DetourStatNavMeshBuilder.cpp: 65"; + rLen = 0; + rLoc = 1863; + rType = 0; + vrLen = 726; + vrLoc = 1416; + }; + 6B7708140FBD90F100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 21"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B77081B0FBD917300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 46"; + rLen = 0; + rLoc = 1463; + rType = 0; + vrLen = 686; + vrLoc = 1102; + }; + 6B77081C0FBD917300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 138"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 854; + vrLoc = 2760; + }; + 6B77081D0FBD917300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 4"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B77083E0FBD93F900D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 131"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 782; + vrLoc = 2668; + }; + 6B77083F0FBD93F900D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 2399"; + rLen = 0; + rLoc = 48051; + rType = 0; + vrLen = 0; + vrLoc = 45806; + }; + 6B7708400FBD93F900D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 171"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 695; + vrLoc = 3290; + }; + 6B7708410FBD93F900D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1666"; + rLen = 0; + rLoc = 33672; + rType = 0; + vrLen = 810; + vrLoc = 39317; + }; + 6B7708420FBD93F900D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 4"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B77084D0FBD94F500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 387"; + rLen = 0; + rLoc = 5721; + rType = 0; + vrLen = 466; + vrLoc = 9340; + }; + 6B77084E0FBD94F500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 25"; + rLen = 0; + rLoc = 584; + rType = 0; + vrLen = 444; + vrLoc = 0; + }; + 6B77084F0FBD94F500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 190"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 775; + vrLoc = 3985; + }; + 6B7708500FBD94F500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 24"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 542; + vrLoc = 0; + }; + 6B7708510FBD94F500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 194"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 775; + vrLoc = 3985; + }; + 6B7708520FBD94F500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 4"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 542; + vrLoc = 0; + }; + 6B7708530FBD94F500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 190"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 793; + vrLoc = 3985; + }; + 6B7708590FBD956200D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1696"; + rLen = 0; + rLoc = 33672; + rType = 0; + vrLen = 821; + vrLoc = 39981; + }; + 6B7708620FBD960F00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 216"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 307; + vrLoc = 4510; + }; + 6B7708680FBD969F00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1684"; + rLen = 0; + rLoc = 33672; + rType = 0; + vrLen = 822; + vrLoc = 39935; + }; + 6B7708730FBD97C500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 24"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 647; + vrLoc = 115; + }; + 6B7708740FBD97C500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 4"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 74; + vrLoc = 0; + }; + 6B7708750FBD97C500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 5"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 67; + vrLoc = 0; + }; + 6B7708760FBD97C500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 387"; + rLen = 0; + rLoc = 5721; + rType = 0; + vrLen = 469; + vrLoc = 8675; + }; + 6B7708770FBD97C500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 7"; + rLen = 0; + rLoc = 67; + rType = 0; + vrLen = 768; + vrLoc = 0; + }; + 6B7708780FBD97C500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 4"; + rLen = 0; + rLoc = 583; + rType = 0; + vrLen = 74; + vrLoc = 0; + }; + 6B7708790FBD97C500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 272"; + rLen = 0; + rLoc = 5496; + rType = 0; + vrLen = 434; + vrLoc = 5509; + }; + 6B77087A0FBD97C500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 24"; + rLen = 0; + rLoc = 554; + rType = 0; + vrLen = 542; + vrLoc = 0; + }; + 6B77087B0FBD97C500D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 227"; + rLen = 0; + rLoc = 5097; + rType = 0; + vrLen = 287; + vrLoc = 4530; + }; + 6B7708860FBD987F00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1681"; + rLen = 0; + rLoc = 33672; + rType = 0; + vrLen = 840; + vrLoc = 40010; + }; + 6B7708870FBD987F00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 18"; + rLen = 0; + rLoc = 345; + rType = 0; + vrLen = 542; + vrLoc = 0; + }; + 6B77088D0FBD996700D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 162"; + rLen = 0; + rLoc = 3723; + rType = 0; + vrLen = 735; + vrLoc = 3248; + }; + 6B77089D0FBD9A6100D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 517"; + rLen = 0; + rLoc = 5721; + rType = 0; + vrLen = 1042; + vrLoc = 11494; + }; + 6B7708A10FBD9AC100D21BAE /* ChunkyTriMesh.cpp:5 */ = { + isa = PBXFileBreakpoint; + actions = ( + ); + breakpointStyle = 0; + continueAfterActions = 0; + countType = 0; + delayBeforeContinue = 0; + fileReference = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + functionName = "subdivide(BVItem* items, int nitems, int imin, int imax, int trisPerChunk, int& curNode, ChunkyTriMeshNode* nodes, const int maxNodes, int& curTri, int* outTris, const int* inTris)"; + hitCount = 2; + ignoreCount = 0; + lineNumber = 5; + location = Recast; + modificationTime = 264084235.6554; + state = 1; + }; + 6B7708AC0FBD9B5700D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 90"; + rLen = 0; + rLoc = 75; + rType = 0; + vrLen = 636; + vrLoc = 1538; + }; + 6B7708CD0FBDA4E800D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 355"; + rLen = 198; + rLoc = 9241; + rType = 0; + vrLen = 761; + vrLoc = 9242; + }; + 6B7708CF0FBDA4E800D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 2102"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 0; + vrLoc = 45806; + }; + 6B7708D00FBDA4E800D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 355"; + rLen = 198; + rLoc = 9241; + rType = 0; + vrLen = 761; + vrLoc = 9242; + }; + 6B7708E40FBDA68700D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 169"; + rLen = 0; + rLoc = 3759; + rType = 0; + vrLen = 689; + vrLoc = 2580; + }; + 6B7708E50FBDA68700D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 13"; + rLen = 0; + rLoc = 193; + rType = 0; + vrLen = 590; + vrLoc = 0; + }; + 6B7708E70FBDA68700D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 2198"; + rLen = 0; + rLoc = 49754; + rType = 0; + vrLen = 0; + vrLoc = 45806; + }; + 6B7708E80FBDA68700D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 27"; + rLen = 0; + rLoc = 585; + rType = 0; + vrLen = 561; + vrLoc = 0; + }; + 6B7708E90FBDA68700D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 169"; + rLen = 0; + rLoc = 3759; + rType = 0; + vrLen = 689; + vrLoc = 2580; + }; + 6B7708EA0FBDA68700D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 13"; + rLen = 0; + rLoc = 193; + rType = 0; + vrLen = 590; + vrLoc = 0; + }; + 6B7708F20FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C8A0F7FCC1100459200 /* RecastTimer.cpp */; + name = "RecastTimer.cpp: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 574; + vrLoc = 0; + }; + 6B7708F30FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 875"; + rLen = 0; + rLoc = 20691; + rType = 0; + vrLen = 820; + vrLoc = 19912; + }; + 6B7708F40FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 389"; + rLen = 23; + rLoc = 12375; + rType = 0; + vrLen = 1243; + vrLoc = 11897; + }; + 6B7708F50FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1299"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 1094; + vrLoc = 33615; + }; + 6B7708F60FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 652"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 749; + vrLoc = 15165; + }; + 6B7708F70FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C8A0F7FCC1100459200 /* RecastTimer.cpp */; + name = "RecastTimer.cpp: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 574; + vrLoc = 0; + }; + 6B7708F80FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 387"; + rLen = 0; + rLoc = 12339; + rType = 0; + vrLen = 1377; + vrLoc = 11477; + }; + 6B7708F90FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 476"; + rLen = 0; + rLoc = 24938; + rType = 0; + vrLen = 731; + vrLoc = 11183; + }; + 6B7708FA0FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 827"; + rLen = 0; + rLoc = 20498; + rType = 0; + vrLen = 706; + vrLoc = 19950; + }; + 6B7708FB0FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 389"; + rLen = 95; + rLoc = 12370; + rType = 0; + vrLen = 1433; + vrLoc = 11419; + }; + 6B7708FC0FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 875"; + rLen = 0; + rLoc = 20691; + rType = 0; + vrLen = 820; + vrLoc = 19912; + }; + 6B7708FD0FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 391"; + rLen = 0; + rLoc = 12464; + rType = 0; + vrLen = 1151; + vrLoc = 11989; + }; + 6B7708FE0FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1299"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 1094; + vrLoc = 33615; + }; + 6B7708FF0FBDA96300D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 389"; + rLen = 23; + rLoc = 12375; + rType = 0; + vrLen = 1243; + vrLoc = 11897; + }; + 6B7709040FBDA9AB00D21BAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1304"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 1350; + vrLoc = 33765; + }; 6B8632970F78114600E2684A /* Recast */ = { isa = PBXExecutable; activeArgIndices = ( @@ -74,8 +2135,12 @@ executableUserSymbolLevel = 0; libgmallocEnabled = 0; name = Recast; + savedGlobals = { + }; sourceDirectories = ( ); + variableFormatDictionary = { + }; }; 6B8632A90F78115100E2684A /* Source Control */ = { isa = PBXSourceControlManager; @@ -122,6 +2187,1533 @@ path = /Library/Frameworks/SDL.framework/Versions/A/Headers/SDL_events.h; sourceTree = ""; }; + 6B8DB2D70F93A7A5007FA9E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 356"; + rLen = 19; + rLoc = 8959; + rType = 0; + vrLen = 696; + vrLoc = 8752; + }; + 6B8DB3890F9798DE007FA9E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 22"; + rLen = 0; + rLoc = 1019; + rType = 0; + vrLen = 1303; + vrLoc = 0; + }; + 6B8DB38A0F9798DE007FA9E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */; + name = "DetourDebugDraw.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1243; + vrLoc = 0; + }; + 6B8DB38C0F9798DE007FA9E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 46"; + rLen = 0; + rLoc = 1763; + rType = 0; + vrLen = 1540; + vrLoc = 1077; + }; + 6B8DB38F0F9798DE007FA9E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */; + name = "DetourDebugDraw.cpp: 22"; + rLen = 0; + rLoc = 1019; + rType = 0; + vrLen = 1303; + vrLoc = 0; + }; + 6B8DB3900F9798DE007FA9E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */; + name = "DetourDebugDraw.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1243; + vrLoc = 0; + }; + 6B8DB3EA0F97A007007FA9E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; + name = "RecastRegion.cpp: 856"; + rLen = 0; + rLoc = 19724; + rType = 0; + vrLen = 568; + vrLoc = 19338; + }; + 6BB787660FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 399"; + rLen = 0; + rLoc = 9976; + rType = 0; + vrLen = 727; + vrLoc = 9745; + }; + 6BB787670FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 51"; + rLen = 57; + rLoc = 2059; + rType = 0; + vrLen = 1399; + vrLoc = 1119; + }; + 6BB787680FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C860F7FCC1100459200 /* RecastLog.cpp */; + name = "RecastLog.cpp: 68"; + rLen = 0; + rLoc = 1703; + rType = 0; + vrLen = 299; + vrLoc = 1527; + }; + 6BB787690FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 257"; + rLen = 12; + rLoc = 6993; + rType = 0; + vrLen = 594; + vrLoc = 6474; + }; + 6BB7876A0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; + name = "RecastRegion.cpp: 1074"; + rLen = 0; + rLoc = 26082; + rType = 0; + vrLen = 1115; + vrLoc = 25144; + }; + 6BB7876B0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C810F7FCBFE00459200 /* RecastTimer.h */; + name = "RecastTimer.h: 20"; + rLen = 0; + rLoc = 964; + rType = 0; + vrLen = 1063; + vrLoc = 0; + }; + 6BB7876C0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C870F7FCC1100459200 /* RecastMesh.cpp */; + name = "RecastMesh.cpp: 705"; + rLen = 102; + rLoc = 18231; + rType = 0; + vrLen = 615; + vrLoc = 17736; + }; + 6BB7876D0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; + name = "RecastRasterization.cpp: 296"; + rLen = 0; + rLoc = 7850; + rType = 0; + vrLen = 763; + vrLoc = 7133; + }; + 6BB7876E0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 200"; + rLen = 0; + rLoc = 4539; + rType = 0; + vrLen = 456; + vrLoc = 4597; + }; + 6BB7876F0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 235"; + rLen = 0; + rLoc = 6932; + rType = 0; + vrLen = 557; + vrLoc = 6478; + }; + 6BB787700FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 25"; + rLen = 6; + rLoc = 497; + rType = 0; + vrLen = 584; + vrLoc = 0; + }; + 6BB787710FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 69"; + rLen = 13; + rLoc = 2052; + rType = 0; + vrLen = 522; + vrLoc = 1674; + }; + 6BB787720FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 925"; + rLen = 0; + rLoc = 22196; + rType = 0; + vrLen = 479; + vrLoc = 21872; + }; + 6BB787730FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 25"; + rLen = 0; + rLoc = 1050; + rType = 0; + vrLen = 1639; + vrLoc = 317; + }; + 6BB787740FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1203"; + rLen = 8; + rLoc = 41531; + rType = 0; + vrLen = 1119; + vrLoc = 32427; + }; + 6BB787750FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 354"; + rLen = 0; + rLoc = 9240; + rType = 0; + vrLen = 814; + vrLoc = 9189; + }; + 6BB787760FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 936"; + rLen = 69; + rLoc = 22260; + rType = 0; + vrLen = 591; + vrLoc = 22216; + }; + 6BB787770FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1206"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 874; + vrLoc = 30655; + }; + 6BB787780FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 1005"; + rLen = 0; + rLoc = 22055; + rType = 0; + vrLen = 576; + vrLoc = 23872; + }; + 6BB787790FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1206"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 874; + vrLoc = 30655; + }; + 6BB7877A0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1303"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 1134; + vrLoc = 33632; + }; + 6BB7877B0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 756"; + rLen = 0; + rLoc = 18734; + rType = 0; + vrLen = 740; + vrLoc = 18532; + }; + 6BB7877C0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1300"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 987; + vrLoc = 33725; + }; + 6BB7877D0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 994"; + rLen = 0; + rLoc = 22054; + rType = 0; + vrLen = 572; + vrLoc = 23496; + }; + 6BB7877E0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1353"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 946; + vrLoc = 35427; + }; + 6BB7877F0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 97"; + rLen = 23; + rLoc = 2629; + rType = 0; + vrLen = 763; + vrLoc = 2408; + }; + 6BB787800FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 423"; + rLen = 0; + rLoc = 5833; + rType = 0; + vrLen = 834; + vrLoc = 10129; + }; + 6BB787810FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 18"; + rLen = 0; + rLoc = 345; + rType = 0; + vrLen = 590; + vrLoc = 0; + }; + 6BB787820FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 459"; + rLen = 0; + rLoc = 8319; + rType = 0; + vrLen = 854; + vrLoc = 10963; + }; + 6BB787830FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 22"; + rLen = 21; + rLoc = 355; + rType = 0; + vrLen = 605; + vrLoc = 0; + }; + 6BB787840FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 177"; + rLen = 0; + rLoc = 4183; + rType = 0; + vrLen = 782; + vrLoc = 3301; + }; + 6BB787850FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 19"; + rLen = 15; + rLoc = 329; + rType = 0; + vrLen = 605; + vrLoc = 0; + }; + 6BB787860FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 177"; + rLen = 0; + rLoc = 3965; + rType = 0; + vrLen = 806; + vrLoc = 3301; + }; + 6BB787870FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1181"; + rLen = 0; + rLoc = 33672; + rType = 0; + vrLen = 864; + vrLoc = 30195; + }; + 6BB787880FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 180"; + rLen = 0; + rLoc = 4007; + rType = 0; + vrLen = 771; + vrLoc = 3492; + }; + 6BB787890FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 19"; + rLen = 15; + rLoc = 329; + rType = 0; + vrLen = 605; + vrLoc = 0; + }; + 6BB7878A0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 186"; + rLen = 0; + rLoc = 4183; + rType = 0; + vrLen = 712; + vrLoc = 3492; + }; + 6BB7878B0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 496"; + rLen = 0; + rLoc = 8722; + rType = 0; + vrLen = 981; + vrLoc = 12025; + }; + 6BB7878C0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 647"; + rLen = 0; + rLoc = 13241; + rType = 0; + vrLen = 966; + vrLoc = 16657; + }; + 6BB7878D0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 446"; + rLen = 14; + rLoc = 6913; + rType = 0; + vrLen = 882; + vrLoc = 10547; + }; + 6BB7878E0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 57"; + rLen = 0; + rLoc = 1678; + rType = 0; + vrLen = 701; + vrLoc = 1366; + }; + 6BB7878F0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 519"; + rLen = 17; + rLoc = 9358; + rType = 0; + vrLen = 1015; + vrLoc = 12670; + }; + 6BB787900FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 25"; + rLen = 6; + rLoc = 497; + rType = 0; + vrLen = 611; + vrLoc = 0; + }; + 6BB787910FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 200"; + rLen = 0; + rLoc = 4539; + rType = 0; + vrLen = 500; + vrLoc = 4597; + }; + 6BB787920FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1306"; + rLen = 0; + rLoc = 37577; + rType = 0; + vrLen = 541; + vrLoc = 34203; + }; + 6BB787930FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 46"; + rLen = 36; + rLoc = 1697; + rType = 0; + vrLen = 1520; + vrLoc = 1037; + }; + 6BB787940FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 280"; + rLen = 0; + rLoc = 7262; + rType = 0; + vrLen = 827; + vrLoc = 7537; + }; + 6BB787950FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 50"; + rLen = 19; + rLoc = 1966; + rType = 0; + vrLen = 1520; + vrLoc = 1037; + }; + 6BB787960FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 385"; + rLen = 0; + rLoc = 9490; + rType = 0; + vrLen = 756; + vrLoc = 9241; + }; + 6BB787970FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1330"; + rLen = 0; + rLoc = 38427; + rType = 0; + vrLen = 867; + vrLoc = 34310; + }; + 6BB787980FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 367"; + rLen = 0; + rLoc = 9239; + rType = 0; + vrLen = 796; + vrLoc = 8926; + }; + 6BB787990FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 309"; + rLen = 0; + rLoc = 8348; + rType = 0; + vrLen = 982; + vrLoc = 8036; + }; + 6BB7879A0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 399"; + rLen = 0; + rLoc = 10550; + rType = 0; + vrLen = 1118; + vrLoc = 9538; + }; + 6BB7879B0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 344"; + rLen = 0; + rLoc = 9411; + rType = 0; + vrLen = 790; + vrLoc = 8858; + }; + 6BB7879C0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 405"; + rLen = 0; + rLoc = 10718; + rType = 0; + vrLen = 841; + vrLoc = 13789; + }; + 6BB7879D0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 600"; + rLen = 0; + rLoc = 14701; + rType = 0; + vrLen = 962; + vrLoc = 14015; + }; + 6BB7879E0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 566"; + rLen = 0; + rLoc = 14470; + rType = 0; + vrLen = 954; + vrLoc = 14369; + }; + 6BB7879F0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 413"; + rLen = 0; + rLoc = 10550; + rType = 0; + vrLen = 1154; + vrLoc = 10087; + }; + 6BB787A00FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 308"; + rLen = 0; + rLoc = 8348; + rType = 0; + vrLen = 1008; + vrLoc = 7840; + }; + 6BB787A10FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 124"; + rLen = 0; + rLoc = 4013; + rType = 0; + vrLen = 699; + vrLoc = 3699; + }; + 6BB787A20FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 100"; + rLen = 0; + rLoc = 3090; + rType = 0; + vrLen = 719; + vrLoc = 2676; + }; + 6BB787A30FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 278"; + rLen = 0; + rLoc = 7218; + rType = 0; + vrLen = 691; + vrLoc = 7011; + }; + 6BB787A40FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 162"; + rLen = 0; + rLoc = 4211; + rType = 0; + vrLen = 836; + vrLoc = 3885; + }; + 6BB787A50FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 574"; + rLen = 0; + rLoc = 14556; + rType = 0; + vrLen = 870; + vrLoc = 14739; + }; + 6BB787A60FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 337"; + rLen = 0; + rLoc = 9321; + rType = 0; + vrLen = 793; + vrLoc = 8788; + }; + 6BB787A70FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 574"; + rLen = 0; + rLoc = 14556; + rType = 0; + vrLen = 868; + vrLoc = 14739; + }; + 6BB787A80FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 100"; + rLen = 0; + rLoc = 3103; + rType = 0; + vrLen = 716; + vrLoc = 2676; + }; + 6BB787A90FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 285"; + rLen = 0; + rLoc = 7346; + rType = 0; + vrLen = 691; + vrLoc = 7011; + }; + 6BB787AA0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 51"; + rLen = 19; + rLoc = 2064; + rType = 0; + vrLen = 1399; + vrLoc = 1119; + }; + 6BB787AB0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 399"; + rLen = 0; + rLoc = 9976; + rType = 0; + vrLen = 727; + vrLoc = 9745; + }; + 6BB787AC0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7F0F7FCBFE00459200 /* RecastDebugDraw.h */; + name = "RecastDebugDraw.h: 51"; + rLen = 57; + rLoc = 2059; + rType = 0; + vrLen = 1399; + vrLoc = 1119; + }; + 6BB787AD0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1437"; + rLen = 0; + rLoc = 41085; + rType = 0; + vrLen = 744; + vrLoc = 37732; + }; + 6BB787AE0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 928"; + rLen = 0; + rLoc = 22505; + rType = 0; + vrLen = 447; + vrLoc = 21750; + }; + 6BB787AF0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 458"; + rLen = 0; + rLoc = 12195; + rType = 0; + vrLen = 895; + vrLoc = 11594; + }; + 6BB787B00FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 255"; + rLen = 8; + rLoc = 6863; + rType = 0; + vrLen = 886; + vrLoc = 6272; + }; + 6BB787B10FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 255"; + rLen = 15; + rLoc = 6856; + rType = 0; + vrLen = 688; + vrLoc = 6272; + }; + 6BB787B20FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 236"; + rLen = 0; + rLoc = 6973; + rType = 0; + vrLen = 551; + vrLoc = 6478; + }; + 6BB787B30FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 668"; + rLen = 0; + rLoc = 16693; + rType = 0; + vrLen = 830; + vrLoc = 16125; + }; + 6BB787B40FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 235"; + rLen = 108; + rLoc = 6909; + rType = 0; + vrLen = 607; + vrLoc = 6428; + }; + 6BB787B50FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 487"; + rLen = 0; + rLoc = 11631; + rType = 0; + vrLen = 567; + vrLoc = 11482; + }; + 6BB787B60FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 254"; + rLen = 0; + rLoc = 6819; + rType = 0; + vrLen = 688; + vrLoc = 6272; + }; + 6BB787B70FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 235"; + rLen = 108; + rLoc = 6909; + rType = 0; + vrLen = 607; + vrLoc = 6428; + }; + 6BB787B80FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 152"; + rLen = 1; + rLoc = 3986; + rType = 0; + vrLen = 703; + vrLoc = 3543; + }; + 6BB787B90FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 111"; + rLen = 0; + rLoc = 3618; + rType = 0; + vrLen = 639; + vrLoc = 3375; + }; + 6BB787BA0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; + name = "RecastRegion.cpp: 1073"; + rLen = 0; + rLoc = 25847; + rType = 0; + vrLen = 1239; + vrLoc = 25239; + }; + 6BB787BB0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 669"; + rLen = 0; + rLoc = 16820; + rType = 0; + vrLen = 707; + vrLoc = 16459; + }; + 6BB787BC0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 119"; + rLen = 0; + rLoc = 3831; + rType = 0; + vrLen = 639; + vrLoc = 3375; + }; + 6BB787BD0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C860F7FCC1100459200 /* RecastLog.cpp */; + name = "RecastLog.cpp: 68"; + rLen = 0; + rLoc = 1703; + rType = 0; + vrLen = 299; + vrLoc = 1527; + }; + 6BB787BE0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 549"; + rLen = 0; + rLoc = 15403; + rType = 0; + vrLen = 725; + vrLoc = 14313; + }; + 6BB787BF0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 815"; + rLen = 0; + rLoc = 19924; + rType = 0; + vrLen = 376; + vrLoc = 20194; + }; + 6BB787C00FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; + name = "RecastRegion.cpp: 1076"; + rLen = 0; + rLoc = 26082; + rType = 0; + vrLen = 1145; + vrLoc = 25311; + }; + 6BB787C10FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 554"; + rLen = 0; + rLoc = 17448; + rType = 0; + vrLen = 574; + vrLoc = 14383; + }; + 6BB787C20FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 257"; + rLen = 12; + rLoc = 6993; + rType = 0; + vrLen = 594; + vrLoc = 6474; + }; + 6BB787C30FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 68"; + rLen = 0; + rLoc = 2066; + rType = 0; + vrLen = 524; + vrLoc = 1649; + }; + 6BB787C40FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; + name = "RecastRegion.cpp: 1075"; + rLen = 0; + rLoc = 26068; + rType = 0; + vrLen = 509; + vrLoc = 25971; + }; + 6BB787C50FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 61"; + rLen = 0; + rLoc = 1905; + rType = 0; + vrLen = 525; + vrLoc = 1647; + }; + 6BB787C60FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 255"; + rLen = 0; + rLoc = 5720; + rType = 0; + vrLen = 566; + vrLoc = 5438; + }; + 6BB787C70FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 50"; + rLen = 12; + rLoc = 1634; + rType = 0; + vrLen = 473; + vrLoc = 1602; + }; + 6BB787C80FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 557"; + rLen = 0; + rLoc = 17335; + rType = 0; + vrLen = 484; + vrLoc = 14543; + }; + 6BB787C90FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 52"; + rLen = 393; + rLoc = 1674; + rType = 0; + vrLen = 473; + vrLoc = 1602; + }; + 6BB787CA0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 568"; + rLen = 0; + rLoc = 16447; + rType = 0; + vrLen = 1660; + vrLoc = 14686; + }; + 6BB787CB0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; + name = "RecastRegion.cpp: 977"; + rLen = 0; + rLoc = 22939; + rType = 0; + vrLen = 664; + vrLoc = 24558; + }; + 6BB787CC0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 571"; + rLen = 0; + rLoc = 16823; + rType = 0; + vrLen = 1686; + vrLoc = 15059; + }; + 6BB787CD0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C890F7FCC1100459200 /* RecastRegion.cpp */; + name = "RecastRegion.cpp: 1074"; + rLen = 0; + rLoc = 26082; + rType = 0; + vrLen = 1115; + vrLoc = 25144; + }; + 6BB787CE0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 66"; + rLen = 0; + rLoc = 1998; + rType = 0; + vrLen = 470; + vrLoc = 1602; + }; + 6BB787CF0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 561"; + rLen = 19; + rLoc = 15954; + rType = 0; + vrLen = 2054; + vrLoc = 14544; + }; + 6BB787D00FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C810F7FCBFE00459200 /* RecastTimer.h */; + name = "RecastTimer.h: 20"; + rLen = 0; + rLoc = 964; + rType = 0; + vrLen = 1063; + vrLoc = 0; + }; + 6BB787D10FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 58"; + rLen = 19; + rLoc = 1811; + rType = 0; + vrLen = 470; + vrLoc = 1602; + }; + 6BB787D20FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 557"; + rLen = 0; + rLoc = 15527; + rType = 0; + vrLen = 1965; + vrLoc = 14488; + }; + 6BB787D30FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; + name = "RecastRasterization.cpp: 293"; + rLen = 0; + rLoc = 7680; + rType = 0; + vrLen = 787; + vrLoc = 7001; + }; + 6BB787D40FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C870F7FCC1100459200 /* RecastMesh.cpp */; + name = "RecastMesh.cpp: 705"; + rLen = 102; + rLoc = 18231; + rType = 0; + vrLen = 615; + vrLoc = 17736; + }; + 6BB787D50FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; + name = "RecastRasterization.cpp: 296"; + rLen = 0; + rLoc = 7850; + rType = 0; + vrLen = 693; + vrLoc = 7194; + }; + 6BB787D60FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 52"; + rLen = 18; + rLoc = 1654; + rType = 0; + vrLen = 476; + vrLoc = 1602; + }; + 6BB787D70FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; + name = "RecastRasterization.cpp: 296"; + rLen = 0; + rLoc = 7850; + rType = 0; + vrLen = 763; + vrLoc = 7133; + }; + 6BB787D80FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 581"; + rLen = 0; + rLoc = 17335; + rType = 0; + vrLen = 1867; + vrLoc = 14564; + }; + 6BB787D90FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DE0FBD8C0000D21BAE /* ChunkyTriMesh.cpp */; + name = "ChunkyTriMesh.cpp: 200"; + rLen = 0; + rLoc = 4539; + rType = 0; + vrLen = 456; + vrLoc = 4597; + }; + 6BB787DA0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C850F7FCC1100459200 /* RecastFilter.cpp */; + name = "RecastFilter.cpp: 235"; + rLen = 0; + rLoc = 6932; + rType = 0; + vrLen = 557; + vrLoc = 6478; + }; + 6BB787DB0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 75"; + rLen = 0; + rLoc = 2194; + rType = 0; + vrLen = 506; + vrLoc = 1693; + }; + 6BB787DC0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 291"; + rLen = 0; + rLoc = 6768; + rType = 0; + vrLen = 739; + vrLoc = 6318; + }; + 6BB787DD0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B7707DC0FBD8AE600D21BAE /* ChunkyTriMesh.h */; + name = "ChunkyTriMesh.h: 25"; + rLen = 6; + rLoc = 497; + rType = 0; + vrLen = 584; + vrLoc = 0; + }; + 6BB787DE0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C800F7FCBFE00459200 /* RecastLog.h */; + name = "RecastLog.h: 69"; + rLen = 13; + rLoc = 2052; + rType = 0; + vrLen = 522; + vrLoc = 1674; + }; + 6BB787DF0FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 925"; + rLen = 0; + rLoc = 22196; + rType = 0; + vrLen = 479; + vrLoc = 21872; + }; + 6BB787E00FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1203"; + rLen = 8; + rLoc = 41531; + rType = 0; + vrLen = 1119; + vrLoc = 32427; + }; + 6BB787E10FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 25"; + rLen = 0; + rLoc = 1050; + rType = 0; + vrLen = 1639; + vrLoc = 317; + }; + 6BB787E20FC03EAD003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1412"; + rLen = 0; + rLoc = 47858; + rType = 0; + vrLen = 1012; + vrLoc = 38728; + }; + 6BB787E40FC03EB7003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1412"; + rLen = 0; + rLoc = 47858; + rType = 0; + vrLen = 932; + vrLoc = 38712; + }; + 6BB787EE0FC03ECF003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 332"; + rLen = 6; + rLoc = 8209; + rType = 0; + vrLen = 659; + vrLoc = 7712; + }; + 6BB787F70FC04199003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: 'tileCfg' was not declared in this scope"; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + rLen = 1; + rLoc = 729; + rType = 1; + }; + 6BB787F80FC04199003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 761"; + rLen = 0; + rLoc = 22129; + rType = 0; + vrLen = 773; + vrLoc = 20745; + }; + 6BB787FB0FC041F4003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1395"; + rLen = 0; + rLoc = 40805; + rType = 0; + vrLen = 1129; + vrLoc = 38267; + }; + 6BB787FF0FC042A2003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + rLen = 1; + rLoc = 624; + rType = 1; + }; + 6BB788000FC042A2003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1321"; + rLen = 0; + rLoc = 38821; + rType = 0; + vrLen = 773; + vrLoc = 36624; + }; + 6BB788010FC042A9003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1307"; + rLen = 0; + rLoc = 38485; + rType = 0; + vrLen = 410; + vrLoc = 36987; + }; + 6BB788080FC0437C003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 641"; + rLen = 0; + rLoc = 18667; + rType = 0; + vrLen = 827; + vrLoc = 17264; + }; + 6BB7880B0FC04434003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1151"; + rLen = 0; + rLoc = 33431; + rType = 0; + vrLen = 758; + vrLoc = 31711; + }; + 6BB7880E0FC0446C003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1149"; + rLen = 0; + rLoc = 33417; + rType = 0; + vrLen = 658; + vrLoc = 31471; + }; + 6BB7880F0FC044B7003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 772"; + rLen = 0; + rLoc = 22357; + rType = 0; + vrLen = 1717; + vrLoc = 21162; + }; + 6BB788130FC045A2003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 772"; + rLen = 0; + rLoc = 22357; + rType = 0; + vrLen = 1717; + vrLoc = 21162; + }; + 6BB788140FC045A2003C24DB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6A0F7FCBBB00459200 /* demo.cpp */; + name = "demo.cpp: 1473"; + rLen = 0; + rLoc = 41057; + rType = 0; + vrLen = 812; + vrLoc = 40354; + }; + 6BB87DD70F9DDFBA00E33F12 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C840F7FCC1100459200 /* RecastDebugDraw.cpp */; + name = "RecastDebugDraw.cpp: 405"; + rLen = 0; + rLoc = 9490; + rType = 0; + vrLen = 896; + vrLoc = 9722; + }; + 6BB87E0B0F9DE8A300E33F12 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6B0F7FCBBB00459200 /* glfont.cpp */; + name = "glfont.cpp: 188"; + rLen = 0; + rLoc = 4476; + rType = 0; + vrLen = 707; + vrLoc = 4122; + }; + 6BB87E0E0F9DE8A300E33F12 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C6B0F7FCBBB00459200 /* glfont.cpp */; + name = "glfont.cpp: 188"; + rLen = 0; + rLoc = 4476; + rType = 0; + vrLen = 707; + vrLoc = 4122; + }; + 6BDD9E040F91112200904EEF /* DetourDebugDraw.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 504}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1243}"; + }; + }; + 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 3488}}"; + sepNavSelRange = "{1555, 63}"; + sepNavVisRange = "{919, 794}"; + }; + }; + 6BDD9E060F91112200904EEF /* DetourStatNavMeshBuilder.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 560}}"; + sepNavSelRange = "{918, 0}"; + sepNavVisRange = "{0, 1284}"; + }; + }; + 6BDD9E070F91113800904EEF /* DetourDebugDraw.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {760, 2672}}"; + sepNavSelRange = "{1019, 0}"; + sepNavVisRange = "{0, 1303}"; + }; + }; + 6BDD9E080F91113800904EEF /* DetourStatNavMesh.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 19568}}"; + sepNavSelRange = "{26239, 411}"; + sepNavVisRange = "{25970, 1004}"; + }; + }; + 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {969, 4480}}"; + sepNavSelRange = "{1863, 0}"; + sepNavVisRange = "{1416, 726}"; + }; + }; 8D1107260486CEB800E47090 /* Recast */ = { activeExec = 0; executables = ( diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 index 5ac4bc2..4ccde2c 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 @@ -200,8 +200,8 @@ PerspectiveWidths - 810 - 810 + 1280 + 1280 Perspectives @@ -230,8 +230,6 @@ Layout - BecomeActive - ContentConfiguration PBXBottomSmartGroupGIDs @@ -257,7 +255,7 @@ PBXSmartGroupTreeModuleColumnWidthsKey - 185 + 228 PBXSmartGroupTreeModuleColumnsKey_v4 @@ -270,23 +268,23 @@ 29B97314FDCFA39411CA2CEA 080E96DDFE201D6D7F000001 + 6BDD9E030F91110C00904EEF + 6B137C7D0F7FCBE800459200 29B97315FDCFA39411CA2CEA 29B97317FDCFA39411CA2CEA - 29B97323FDCFA39411CA2CEA - 1058C7A0FEA54F0111CA2CBB - 1058C7A2FEA54F0111CA2CBB 1C37FBAC04509CD000000102 + 1C77FABC04509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey - 2 + 27 1 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 0}, {185, 595}} + {{0, 17}, {228, 660}} PBXTopSmartGroupGIDs @@ -296,30 +294,32 @@ GeometryConfiguration Frame - {{0, 0}, {202, 613}} + {{0, 0}, {245, 678}} GroupTreeTableConfiguration MainColumn - 185 + 228 RubberWindowFrame - 55 112 1071 654 0 0 1280 778 + 0 59 1280 719 0 0 1280 778 Module PBXSmartGroupTreeModule Proportion - 202pt + 245pt Dock + BecomeActive + ContentConfiguration PBXProjectModuleGUID 6B8632A30F78115100E2684A PBXProjectModuleLabel - imgui.h + demo.cpp PBXSplitModuleInNavigatorKey Split0 @@ -327,14 +327,173 @@ PBXProjectModuleGUID 6B8632A40F78115100E2684A PBXProjectModuleLabel - imgui.h + demo.cpp + _historyCapacity + 0 + bookmark + 6BB788140FC045A2003C24DB history 6B8633370F7813A600E2684A + 6B8DB3890F9798DE007FA9E1 + 6B8DB38A0F9798DE007FA9E1 + 6BB87E0B0F9DE8A300E33F12 + 6B77074C0FBD597500D21BAE + 6B77074D0FBD597500D21BAE + 6B7707710FBD5DB300D21BAE + 6B7707AF0FBD66CF00D21BAE + 6B7707EF0FBD90F100D21BAE + 6B7707F00FBD90F100D21BAE + 6B7707F30FBD90F100D21BAE + 6B7708F20FBDA96300D21BAE + 6BB787660FC03EAD003C24DB + 6BB787670FC03EAD003C24DB + 6BB787680FC03EAD003C24DB + 6BB787690FC03EAD003C24DB + 6BB7876A0FC03EAD003C24DB + 6BB7876B0FC03EAD003C24DB + 6BB7876C0FC03EAD003C24DB + 6BB7876D0FC03EAD003C24DB + 6BB7876E0FC03EAD003C24DB + 6BB7876F0FC03EAD003C24DB + 6BB787700FC03EAD003C24DB + 6BB787710FC03EAD003C24DB + 6BB787720FC03EAD003C24DB + 6BB787730FC03EAD003C24DB + 6BB788130FC045A2003C24DB prevStack 6B86333B0F7813A600E2684A + 6B1E02680F924A8500CC0038 + 6B1E02750F924A8500CC0038 + 6B1E028F0F924D5A00CC0038 + 6B1E029B0F924D8B00CC0038 + 6B1E02AE0F92530C00CC0038 + 6B1E02BB0F92547D00CC0038 + 6B1E02FC0F92563500CC0038 + 6B1E032E0F925D9100CC0038 + 6B8DB2D70F93A7A5007FA9E1 + 6B8DB38F0F9798DE007FA9E1 + 6B8DB3900F9798DE007FA9E1 + 6BB87E0E0F9DE8A300E33F12 + 6B458EA80FB4540500044EA9 + 6B77072C0FBD540400D21BAE + 6B7707B90FBD66CF00D21BAE + 6B7707F70FBD90F100D21BAE + 6B7707F90FBD90F100D21BAE + 6B7707FC0FBD90F100D21BAE + 6B7708010FBD90F100D21BAE + 6B7708F70FBDA96300D21BAE + 6BB787750FC03EAD003C24DB + 6BB787760FC03EAD003C24DB + 6BB787770FC03EAD003C24DB + 6BB787780FC03EAD003C24DB + 6BB787790FC03EAD003C24DB + 6BB7877A0FC03EAD003C24DB + 6BB7877B0FC03EAD003C24DB + 6BB7877C0FC03EAD003C24DB + 6BB7877D0FC03EAD003C24DB + 6BB7877E0FC03EAD003C24DB + 6BB7877F0FC03EAD003C24DB + 6BB787800FC03EAD003C24DB + 6BB787810FC03EAD003C24DB + 6BB787820FC03EAD003C24DB + 6BB787830FC03EAD003C24DB + 6BB787840FC03EAD003C24DB + 6BB787850FC03EAD003C24DB + 6BB787860FC03EAD003C24DB + 6BB787870FC03EAD003C24DB + 6BB787880FC03EAD003C24DB + 6BB787890FC03EAD003C24DB + 6BB7878A0FC03EAD003C24DB + 6BB7878B0FC03EAD003C24DB + 6BB7878C0FC03EAD003C24DB + 6BB7878D0FC03EAD003C24DB + 6BB7878E0FC03EAD003C24DB + 6BB7878F0FC03EAD003C24DB + 6BB787900FC03EAD003C24DB + 6BB787910FC03EAD003C24DB + 6BB787920FC03EAD003C24DB + 6BB787930FC03EAD003C24DB + 6BB787940FC03EAD003C24DB + 6BB787950FC03EAD003C24DB + 6BB787960FC03EAD003C24DB + 6BB787970FC03EAD003C24DB + 6BB787980FC03EAD003C24DB + 6BB787990FC03EAD003C24DB + 6BB7879A0FC03EAD003C24DB + 6BB7879B0FC03EAD003C24DB + 6BB7879C0FC03EAD003C24DB + 6BB7879D0FC03EAD003C24DB + 6BB7879E0FC03EAD003C24DB + 6BB7879F0FC03EAD003C24DB + 6BB787A00FC03EAD003C24DB + 6BB787A10FC03EAD003C24DB + 6BB787A20FC03EAD003C24DB + 6BB787A30FC03EAD003C24DB + 6BB787A40FC03EAD003C24DB + 6BB787A50FC03EAD003C24DB + 6BB787A60FC03EAD003C24DB + 6BB787A70FC03EAD003C24DB + 6BB787A80FC03EAD003C24DB + 6BB787A90FC03EAD003C24DB + 6BB787AA0FC03EAD003C24DB + 6BB787AB0FC03EAD003C24DB + 6BB787AC0FC03EAD003C24DB + 6BB787AD0FC03EAD003C24DB + 6BB787AE0FC03EAD003C24DB + 6BB787AF0FC03EAD003C24DB + 6BB787B00FC03EAD003C24DB + 6BB787B10FC03EAD003C24DB + 6BB787B20FC03EAD003C24DB + 6BB787B30FC03EAD003C24DB + 6BB787B40FC03EAD003C24DB + 6BB787B50FC03EAD003C24DB + 6BB787B60FC03EAD003C24DB + 6BB787B70FC03EAD003C24DB + 6BB787B80FC03EAD003C24DB + 6BB787B90FC03EAD003C24DB + 6BB787BA0FC03EAD003C24DB + 6BB787BB0FC03EAD003C24DB + 6BB787BC0FC03EAD003C24DB + 6BB787BD0FC03EAD003C24DB + 6BB787BE0FC03EAD003C24DB + 6BB787BF0FC03EAD003C24DB + 6BB787C00FC03EAD003C24DB + 6BB787C10FC03EAD003C24DB + 6BB787C20FC03EAD003C24DB + 6BB787C30FC03EAD003C24DB + 6BB787C40FC03EAD003C24DB + 6BB787C50FC03EAD003C24DB + 6BB787C60FC03EAD003C24DB + 6BB787C70FC03EAD003C24DB + 6BB787C80FC03EAD003C24DB + 6BB787C90FC03EAD003C24DB + 6BB787CA0FC03EAD003C24DB + 6BB787CB0FC03EAD003C24DB + 6BB787CC0FC03EAD003C24DB + 6BB787CD0FC03EAD003C24DB + 6BB787CE0FC03EAD003C24DB + 6BB787CF0FC03EAD003C24DB + 6BB787D00FC03EAD003C24DB + 6BB787D10FC03EAD003C24DB + 6BB787D20FC03EAD003C24DB + 6BB787D30FC03EAD003C24DB + 6BB787D40FC03EAD003C24DB + 6BB787D50FC03EAD003C24DB + 6BB787D60FC03EAD003C24DB + 6BB787D70FC03EAD003C24DB + 6BB787D80FC03EAD003C24DB + 6BB787D90FC03EAD003C24DB + 6BB787DA0FC03EAD003C24DB + 6BB787DB0FC03EAD003C24DB + 6BB787DC0FC03EAD003C24DB + 6BB787DD0FC03EAD003C24DB + 6BB787DE0FC03EAD003C24DB + 6BB787DF0FC03EAD003C24DB + 6BB787E00FC03EAD003C24DB + 6BB787E10FC03EAD003C24DB SplitCount @@ -348,18 +507,18 @@ GeometryConfiguration Frame - {{0, 0}, {864, 405}} + {{0, 0}, {1030, 585}} RubberWindowFrame - 55 112 1071 654 0 0 1280 778 + 0 59 1280 719 0 0 1280 778 Module PBXNavigatorGroup Proportion - 405pt + 585pt Proportion - 203pt + 88pt Tabs @@ -373,9 +532,7 @@ GeometryConfiguration Frame - {{10, 27}, {864, 176}} - RubberWindowFrame - 55 112 1071 654 0 0 1280 778 + {{10, 27}, {1030, 100}} Module XCDetailModule @@ -391,7 +548,7 @@ GeometryConfiguration Frame - {{10, 31}, {603, 297}} + {{10, 27}, {1030, 225}} Module PBXProjectFindModule @@ -429,7 +586,9 @@ GeometryConfiguration Frame - {{10, 27}, {864, 176}} + {{10, 27}, {1030, 61}} + RubberWindowFrame + 0 59 1280 719 0 0 1280 778 Module PBXBuildResultsModule @@ -438,7 +597,7 @@ Proportion - 864pt + 1030pt Name @@ -457,11 +616,11 @@ TableOfContents - 6BDD9E120F91114E00904EEF + 6BB787E50FC03EB7003C24DB 1CA23ED40692098700951B8B - 6BDD9E130F91114E00904EEF + 6BB787E60FC03EB7003C24DB 6B8632A30F78115100E2684A - 6BDD9E140F91114E00904EEF + 6BB787E70FC03EB7003C24DB 1CA23EDF0692099D00951B8B 1CA23EE00692099D00951B8B 1CA23EE10692099D00951B8B @@ -510,12 +669,12 @@ GeometryConfiguration Frame - {{0, 0}, {810, 132}} + {{0, 0}, {1280, 199}} Module PBXDebugCLIModule Proportion - 132pt + 199pt ContentConfiguration @@ -534,8 +693,8 @@ yes sizes - {{0, 0}, {395, 150}} - {{395, 0}, {415, 150}} + {{0, 0}, {637, 130}} + {{637, 0}, {643, 130}} VerticalSplitView @@ -550,8 +709,8 @@ yes sizes - {{0, 0}, {810, 150}} - {{0, 150}, {810, 159}} + {{0, 0}, {1280, 130}} + {{0, 130}, {1280, 344}} @@ -571,7 +730,7 @@ DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame - {{0, 137}, {810, 309}} + {{0, 204}, {1280, 474}} PBXDebugSessionStackFrameViewKey DebugVariablesTableConfiguration @@ -581,16 +740,16 @@ Value 85 Summary - 185 + 413 Frame - {{395, 0}, {415, 150}} + {{637, 0}, {643, 130}} Module PBXDebugSessionModule Proportion - 309pt + 474pt Name @@ -608,14 +767,14 @@ TableOfContents - 6BDD9E150F91114E00904EEF + 6BB787E80FC03EB7003C24DB 1CCC7628064C1048000F2A68 1CCC7629064C1048000F2A68 - 6BDD9E160F91114E00904EEF - 6BDD9E170F91114E00904EEF - 6BDD9E180F91114E00904EEF - 6BDD9E190F91114E00904EEF - 6BDD9E1A0F91114E00904EEF + 6BB787E90FC03EB7003C24DB + 6BB787EA0FC03EB7003C24DB + 6BB787EB0FC03EB7003C24DB + 6BB787EC0FC03EB7003C24DB + 6BB786F40FC0091C003C24DB ToolbarConfiguration xcode.toolbar.config.debugV3 @@ -648,7 +807,7 @@ /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/Recast.xcodeproj WindowString - 55 112 1071 654 0 0 1280 778 + 0 59 1280 719 0 0 1280 778 WindowToolsV3 diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj b/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj index c270d50..8ac178c 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 6B137C930F7FCC1100459200 /* RecastTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B137C8A0F7FCC1100459200 /* RecastTimer.cpp */; }; 6B8632DA0F78122C00E2684A /* SDL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B8632D90F78122C00E2684A /* SDL.framework */; }; 6B8632DC0F78123E00E2684A /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B8632DB0F78123E00E2684A /* OpenGL.framework */; }; + 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 */; }; 6BDD9E0C0F91113800904EEF /* DetourStatNavMeshBuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BDD9E090F91113800904EEF /* DetourStatNavMeshBuilder.cpp */; }; @@ -63,6 +64,8 @@ 6B137C8A0F7FCC1100459200 /* RecastTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RecastTimer.cpp; path = ../../../Recast/Source/RecastTimer.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; }; + 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; }; 6BDD9E050F91112200904EEF /* DetourStatNavMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetourStatNavMesh.h; path = ../../../Detour/Include/DetourStatNavMesh.h; sourceTree = SOURCE_ROOT; }; 6BDD9E060F91112200904EEF /* DetourStatNavMeshBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetourStatNavMeshBuilder.h; path = ../../../Detour/Include/DetourStatNavMeshBuilder.h; sourceTree = SOURCE_ROOT; }; @@ -93,13 +96,15 @@ 6BDD9E030F91110C00904EEF /* Detour */, 6B137C7D0F7FCBE800459200 /* Recast */, 6B137C790F7FCBE400459200 /* glfont.h */, - 6B137C7A0F7FCBE400459200 /* imgui.h */, - 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */, - 6B137C7C0F7FCBE400459200 /* SDLMain.h */, - 6B137C6A0F7FCBBB00459200 /* demo.cpp */, 6B137C6B0F7FCBBB00459200 /* glfont.cpp */, + 6B137C7A0F7FCBE400459200 /* imgui.h */, 6B137C6C0F7FCBBB00459200 /* imgui.cpp */, + 6B137C7B0F7FCBE400459200 /* MeshLoaderObj.h */, 6B137C6D0F7FCBBB00459200 /* MeshLoaderObj.cpp */, + 6BB788160FC0472B003C24DB /* ChunkyTriMesh.cpp */, + 6BB788180FC04753003C24DB /* ChunkyTriMesh.h */, + 6B137C6A0F7FCBBB00459200 /* demo.cpp */, + 6B137C7C0F7FCBE400459200 /* SDLMain.h */, 6B137C6E0F7FCBBB00459200 /* SDLMain.m */, ); name = Classes; @@ -277,6 +282,7 @@ 6BDD9E0A0F91113800904EEF /* DetourDebugDraw.cpp in Sources */, 6BDD9E0B0F91113800904EEF /* DetourStatNavMesh.cpp in Sources */, 6BDD9E0C0F91113800904EEF /* DetourStatNavMeshBuilder.cpp in Sources */, + 6BB788170FC0472B003C24DB /* ChunkyTriMesh.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/RecastDemo/Include/ChunkyTriMesh.h b/RecastDemo/Include/ChunkyTriMesh.h new file mode 100644 index 0000000..aca5ce4 --- /dev/null +++ b/RecastDemo/Include/ChunkyTriMesh.h @@ -0,0 +1,49 @@ +// +// 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 CHUNKYTRIMESH_H +#define CHUNKYTRIMESH_H + +struct rcChunkyTriMeshNode +{ + float bmin[2], bmax[2]; + int i, n; +}; + +struct rcChunkyTriMesh +{ + inline rcChunkyTriMesh() : nodes(0), tris(0) {}; + inline ~rcChunkyTriMesh() { delete [] nodes; delete [] tris; } + + rcChunkyTriMeshNode* nodes; + int nnodes; + int* tris; + int ntris; + int maxTrisPerChunk; +}; + +// Creates partitioned triangle mesh (AABB tree), +// where each node contains at max trisPerChunk triangles. +bool rcCreateChunkyTriMesh(const float* verts, const int* tris, int ntris, + int trisPerChunk, rcChunkyTriMesh* cm); + +// Returns the chunk indices which touch the input rectable. +int rcGetChunksInRect(const rcChunkyTriMesh* cm, float bmin[2], float bmax[2], int* ids, const int maxIds); + + +#endif // CHUNKYTRIMESH_H diff --git a/RecastDemo/Include/MeshLoaderObj.h b/RecastDemo/Include/MeshLoaderObj.h index 4f1f7c0..37c734f 100644 --- a/RecastDemo/Include/MeshLoaderObj.h +++ b/RecastDemo/Include/MeshLoaderObj.h @@ -32,12 +32,13 @@ public: inline const int* getTris() const { return m_tris; } inline int getVertCount() const { return m_vertCount; } inline int getTriCount() const { return m_triCount; } - + private: void addVertex(float x, float y, float z, int& cap); void addTriangle(int a, int b, int c, int& cap); + float* m_verts; int* m_tris; float* m_normals; diff --git a/RecastDemo/Source/ChunkyTriMesh.cpp b/RecastDemo/Source/ChunkyTriMesh.cpp new file mode 100644 index 0000000..c877a9a --- /dev/null +++ b/RecastDemo/Source/ChunkyTriMesh.cpp @@ -0,0 +1,251 @@ +// +// 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 "ChunkyTriMesh.h" +#include +#include + +struct BoundsItem +{ + float bmin[2]; + float bmax[2]; + int i; +}; + +static int compareItemX(const void* va, const void* vb) +{ + const BoundsItem* a = (const BoundsItem*)va; + const BoundsItem* b = (const BoundsItem*)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 BoundsItem* a = (const BoundsItem*)va; + const BoundsItem* b = (const BoundsItem*)vb; + if (a->bmin[1] < b->bmin[1]) + return -1; + if (a->bmin[1] > b->bmin[1]) + return 1; + return 0; +} + +static void calcExtends(BoundsItem* items, int nitems, int imin, int imax, + float* bmin, float* bmax) +{ + bmin[0] = items[imin].bmin[0]; + bmin[1] = items[imin].bmin[1]; + + bmax[0] = items[imin].bmax[0]; + bmax[1] = items[imin].bmax[1]; + + for (int i = imin+1; i < imax; ++i) + { + const BoundsItem& 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.bmax[0] > bmax[0]) bmax[0] = it.bmax[0]; + if (it.bmax[1] > bmax[1]) bmax[1] = it.bmax[1]; + } +} + +inline int longestAxis(float x, float y) +{ + int axis = 0; + unsigned short maxVal = x; + if (y > maxVal) + { + axis = 1; + maxVal = y; + } + return axis; +} + +static void subdivide(BoundsItem* items, int nitems, int imin, int imax, int trisPerChunk, + int& curNode, rcChunkyTriMeshNode* nodes, const int maxNodes, + int& curTri, int* outTris, const int* inTris) +{ + int inum = imax - imin; + int icur = curNode; + + if (curNode > maxNodes) + return; + + rcChunkyTriMeshNode& node = nodes[curNode++]; + + if (inum <= trisPerChunk) + { + // Leaf + calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); + + // Copy triangles. + node.i = curTri; + node.n = inum; + + for (int i = imin; i < imax; ++i) + { + const int* src = &inTris[items[i].i*3]; + int* dst = &outTris[curTri*3]; + curTri++; + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + } + } + 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]); + + if (axis == 0) + { + // Sort along x-axis + qsort(items+imin, inum, sizeof(BoundsItem), compareItemX); + } + else if (axis == 1) + { + // Sort along y-axis + qsort(items+imin, inum, sizeof(BoundsItem), compareItemY); + } + + int isplit = imin+inum/2; + + // Left + subdivide(items, nitems, imin, isplit, trisPerChunk, curNode, nodes, maxNodes, curTri, outTris, inTris); + // Right + subdivide(items, nitems, isplit, imax, trisPerChunk, curNode, nodes, maxNodes, curTri, outTris, inTris); + + int iescape = curNode - icur; + // Negative index means escape. + node.i = -iescape; + } +} + +bool rcCreateChunkyTriMesh(const float* verts, const int* tris, int ntris, + int trisPerChunk, rcChunkyTriMesh* cm) +{ + int nchunks = (ntris + trisPerChunk-1) / trisPerChunk; + + cm->nodes = new rcChunkyTriMeshNode[nchunks*4]; + if (!cm->nodes) + return false; + + cm->tris = new int[ntris*3]; + if (!cm->tris) + return false; + + cm->ntris = ntris; + + // Build tree + BoundsItem* items = new BoundsItem[ntris]; + if (!items) + return false; + + for (int i = 0; i < ntris; i++) + { + const int* t = &tris[i*3]; + BoundsItem& it = items[i]; + it.i = i; + // Calc triangle XZ bounds. + it.bmin[0] = it.bmax[0] = verts[t[0]*3+0]; + it.bmin[1] = it.bmax[1] = verts[t[0]*3+2]; + for (int j = 1; j < 3; ++j) + { + const float* v = &verts[t[j]*3]; + if (v[0] < it.bmin[0]) it.bmin[0] = v[0]; + if (v[2] < it.bmin[1]) it.bmin[1] = v[2]; + + if (v[0] > it.bmax[0]) it.bmax[0] = v[0]; + if (v[2] > it.bmax[1]) it.bmax[1] = v[2]; + } + } + + int curTri = 0; + int curNode = 0; + subdivide(items, ntris, 0, ntris, trisPerChunk, curNode, cm->nodes, nchunks*4, curTri, cm->tris, tris); + + delete [] items; + + cm->nnodes = curNode; + + // Calc max tris per node. + cm->maxTrisPerChunk = 0; + for (int i = 0; i < cm->nnodes; ++i) + { + rcChunkyTriMeshNode& node = cm->nodes[i]; + const bool isLeaf = node.i >= 0; + if (!isLeaf) continue; + if (node.n > cm->maxTrisPerChunk) + cm->maxTrisPerChunk = node.n; + } + + return true; +} + + +inline bool checkOverlapRect(const float amin[2], const float amax[2], + const float bmin[2], const float bmax[2]) +{ + 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; +} + +int rcGetChunksInRect(const rcChunkyTriMesh* cm, + float bmin[2], float bmax[2], + int* ids, const int maxIds) +{ + // Traverse tree + int i = 0; + int n = 0; + while (i < cm->nnodes) + { + const rcChunkyTriMeshNode* node = &cm->nodes[i]; + const bool overlap = checkOverlapRect(bmin, bmax, node->bmin, node->bmax); + const bool isLeafNode = node->i >= 0; + + if (isLeafNode && overlap) + { + if (n < maxIds) + { + ids[n] = i; + n++; + } + } + + if (overlap || isLeafNode) + i++; + else + { + const int escapeIndex = -node->i; + i += escapeIndex; + } + } + + return n; +} + diff --git a/RecastDemo/Source/demo.cpp b/RecastDemo/Source/demo.cpp index c63efd9..5fbd21a 100644 --- a/RecastDemo/Source/demo.cpp +++ b/RecastDemo/Source/demo.cpp @@ -31,6 +31,7 @@ #include "GLFont.h" #include "RecastTimer.h" #include "MeshLoaderObj.h" +#include "ChunkyTriMesh.h" #include "Recast.h" #include "RecastLog.h" #include "RecastDebugDraw.h" @@ -199,6 +200,7 @@ enum DrawMode DRAWMODE_COMPACT_REGIONS, DRAWMODE_RAW_CONTOURS, DRAWMODE_CONTOURS, + DRAWMODE_POLYMESH, }; enum ToolMode @@ -221,108 +223,632 @@ void drawText(int x, int y, int dir, const char* text, unsigned int col) } + +struct Tile +{ + inline Tile() : chf(0), cset(0), solid(0), buildTime(0) {} + inline ~Tile() { delete chf; delete cset; delete solid; } + rcCompactHeightfield* chf; + rcHeightfield* solid; + rcContourSet* cset; + int buildTime; +}; + +struct TileSet +{ + inline TileSet() : width(0), height(0), tiles(0) {} + inline ~TileSet() { delete [] tiles; } + int width, height; + float bmin[3], bmax[3]; + float cs, ch; + Tile* tiles; +}; + + rcMeshLoaderObj* g_mesh = 0; -unsigned char* g_triangleFlags = 0; -rcHeightfield* g_solid = 0; -rcCompactHeightfield* g_chf = 0; -rcContourSet* g_cset = 0; +float g_meshBMin[3], g_meshBMax[3]; +rcChunkyTriMesh* g_chunkyMesh = 0; rcPolyMesh* g_polyMesh = 0; dtStatNavMesh* g_navMesh = 0; -rcConfig g_cfg; +TileSet* g_tileSet = 0; rcLog g_log; +rcBuildTimes g_buildTimes; -static bool buildNavigation() +bool buildTiledNavigation(const rcConfig& cfg, + const rcMeshLoaderObj* mesh, + const rcChunkyTriMesh* chunkyMesh, + TileSet* tileSet, + rcPolyMesh* polyMesh, + dtStatNavMesh* navMesh, + bool keepInterResults) { - delete g_solid; - delete g_chf; - delete g_cset; - delete g_polyMesh; - delete [] g_triangleFlags; - delete g_navMesh; - g_solid = 0; - g_chf = 0; - g_cset = 0; - g_polyMesh = 0; - g_triangleFlags = 0; - g_navMesh = 0; - - g_log.clear(); - rcSetLog(&g_log); - - if (!g_mesh) + if (!mesh) { - g_log.log(RC_LOG_ERROR, "Input mesh is not valid."); + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Input mesh is not valid."); + return false; + } + if (!chunkyMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Input chunky mesh is not valid."); + return false; + } + + if (!tileSet) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Output tile set is not valid."); + return false; + } + if (!polyMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Output polymesh is not valid."); + return false; + } + if (!navMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Output navmesh is not valid."); return false; } + memset(&g_buildTimes, 0, sizeof(g_buildTimes)); + rcSetBuildTimes(&g_buildTimes); - // TODO: Handle better. - g_cfg.maxVertsPerPoly = DT_VERTS_PER_POLYGON; + rcTimeVal totStartTime = rcGetPerformanceTimer(); + + // Calculate the number of tiles in the output and initialize tiles. + int gw = 0, gh = 0; + rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &gw, &gh); + vcopy(tileSet->bmin, cfg.bmin); + vcopy(tileSet->bmax, cfg.bmax); + tileSet->cs = cfg.cs; + tileSet->ch = cfg.ch; + tileSet->width = (gw + cfg.tileSize-1) / cfg.tileSize; + tileSet->height = (gh + cfg.tileSize-1) / cfg.tileSize; + tileSet->tiles = new Tile[tileSet->height * tileSet->width]; + if (!tileSet->tiles) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'tileSet->tiles' (%d).", tileSet->height * tileSet->width); + return false; + } + + if (rcGetLog()) + { + rcGetLog()->log(RC_LOG_PROGRESS, "Building navigation:"); + rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d cells", gw, gh); + rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d tiles", tileSet->width, tileSet->height); + rcGetLog()->log(RC_LOG_PROGRESS, " - %d verts, %d tris", mesh->getVertCount(), mesh->getTriCount()); + } + // Initialize per tile config. + rcConfig tileCfg; + memcpy(&tileCfg, &cfg, sizeof(rcConfig)); + tileCfg.width = cfg.tileSize + cfg.borderSize*2; + tileCfg.height = cfg.tileSize + cfg.borderSize*2; + + // Allocate array that can hold triangle flags for all geom chunks. + unsigned char* triangleFlags = new unsigned char[chunkyMesh->maxTrisPerChunk]; + if (!triangleFlags) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'triangleFlags' (%d).", chunkyMesh->maxTrisPerChunk); + return false; + } + + rcHeightfield* solid = 0; + rcCompactHeightfield* chf = 0; + rcContourSet* cset = 0; + + const float* verts = mesh->getVerts(); + const int nverts = mesh->getVertCount(); + + for (int y = 0; y < tileSet->height; ++y) + { + for (int x = 0; x < tileSet->width; ++x) + { + rcTimeVal startTime = rcGetPerformanceTimer(); + + Tile& tile = tileSet->tiles[x + y*tileSet->width]; + + // Calculate the per tile bounding box. + tileCfg.bmin[0] = cfg.bmin[0] + (x*cfg.tileSize - cfg.borderSize)*cfg.cs; + tileCfg.bmin[2] = cfg.bmin[2] + (y*cfg.tileSize - cfg.borderSize)*cfg.cs; + tileCfg.bmax[0] = cfg.bmin[0] + ((x+1)*cfg.tileSize + cfg.borderSize)*cfg.cs; + tileCfg.bmax[2] = cfg.bmin[2] + ((y+1)*cfg.tileSize + cfg.borderSize)*cfg.cs; + + delete solid; + delete chf; + solid = 0; + chf = 0; + + float tbmin[2], tbmax[2]; + tbmin[0] = tileCfg.bmin[0]; + tbmin[1] = tileCfg.bmin[2]; + tbmax[0] = tileCfg.bmax[0]; + tbmax[1] = tileCfg.bmax[2]; + int cid[256];// TODO: Make grow when returning too many items. + const int ncid = rcGetChunksInRect(chunkyMesh, tbmin, tbmax, cid, 256); + if (!ncid) + { + continue; + } + + solid = new rcHeightfield; + if (!solid) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Out of memory 'solid'.", x, y); + continue; + } + if (!rcCreateHeightfield(*solid, tileCfg.width, tileCfg.height)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not create solid heightfield.", x, y); + continue; + } + + for (int i = 0; i < ncid; ++i) + { + const rcChunkyTriMeshNode& node = chunkyMesh->nodes[cid[i]]; + const int* tris = &chunkyMesh->tris[node.i*3]; + const int ntris = node.n; + + memset(triangleFlags, 0, ntris*sizeof(unsigned char)); + rcMarkWalkableTriangles(tileCfg.walkableSlopeAngle, + verts, nverts, tris, ntris, triangleFlags); + + rcRasterizeTriangles(tileCfg.bmin, tileCfg.bmax, tileCfg.cs, tileCfg.ch, + verts, nverts, tris, triangleFlags, ntris, *solid); + } + + rcFilterWalkableBorderSpans(tileCfg.walkableHeight, tileCfg.walkableClimb, *solid); + + rcFilterWalkableLowHeightSpans(tileCfg.walkableHeight, *solid); + + chf = new rcCompactHeightfield; + if (!chf) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Out of memory 'chf'.", x, y); + continue; + } + if (!rcBuildCompactHeightfield(tileCfg.bmin, tileCfg.bmax, tileCfg.cs, tileCfg.ch, + tileCfg.walkableHeight, tileCfg.walkableClimb, + RC_WALKABLE/*|RC_REACHABLE*/, *solid, *chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not build compact data.", x, y); + continue; + } + + if (!rcBuildDistanceField(*chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not build distance fields.", x, y); + continue; + } + + if (!rcBuildRegions(*chf, tileCfg.walkableRadius, tileCfg.borderSize, tileCfg.minRegionSize, tileCfg.mergeRegionSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not build regions.", x, y); + continue; + } + + cset = new rcContourSet; + if (!cset) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Out of memory 'cset'.", x, y); + continue; + } + if (!rcBuildContours(*chf, tileCfg.maxSimplificationError, tileCfg.maxEdgeLen, *cset)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not create contours.", x, y); + return false; + } + + if (keepInterResults) + { + tile.solid = solid; + solid = 0; + tile.chf = chf; + chf = 0; + } + + if (!cset->nconts) + { + delete cset; + cset = 0; + continue; + } + + tile.cset = cset; + // Offset the vertices in the cset. + rcTranslateContours(tile.cset, x*tileCfg.tileSize - tileCfg.borderSize, 0, y*tileCfg.tileSize - tileCfg.borderSize); + + rcTimeVal endTime = rcGetPerformanceTimer(); + tile.buildTime += rcGetDeltaTimeUsec(startTime, endTime); + } + } + + delete [] triangleFlags; + delete solid; + delete chf; + + for (int y = 0; y < tileSet->height; ++y) + { + for (int x = 0; x < tileSet->width; ++x) + { + rcTimeVal startTime = rcGetPerformanceTimer(); + if ((x+1) < tileSet->width) + { + if (!rcFixupAdjacentContours(tileSet->tiles[x + y*tileSet->width].cset, + tileSet->tiles[x+1 + y*tileSet->width].cset, + 1, (x+1)*cfg.tileSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not fixup x+1.", x, y); + return false; + } + } + + if ((y+1) < tileSet->height) + { + if (!rcFixupAdjacentContours(tileSet->tiles[x + y*tileSet->width].cset, + tileSet->tiles[x + (y+1)*tileSet->width].cset, + 2, (y+1)*cfg.tileSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: [%d,%d] Could not fixup y+1.", x, y); + return false; + } + } + rcTimeVal endTime = rcGetPerformanceTimer(); + tileSet->tiles[x+y*tileSet->width].buildTime += rcGetDeltaTimeUsec(startTime, endTime); + } + } + + // Combine contours. + rcContourSet combSet; + + combSet.nconts = 0; + for (int y = 0; y < tileSet->height; ++y) + { + for (int x = 0; x < tileSet->width; ++x) + { + Tile& tile = tileSet->tiles[x + y*tileSet->width]; + if (!tile.cset) continue; + combSet.nconts += tile.cset->nconts; + } + } + combSet.conts = new rcContour[combSet.nconts]; + if (!combSet.conts) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'combSet.conts' (%d).", combSet.nconts); + return false; + } + int n = 0; + for (int y = 0; y < tileSet->height; ++y) + { + for (int x = 0; x < tileSet->width; ++x) + { + Tile& tile = tileSet->tiles[x + y*tileSet->width]; + if (!tile.cset) continue; + for (int i = 0; i < tile.cset->nconts; ++i) + { + combSet.conts[n].verts = tile.cset->conts[i].verts; + combSet.conts[n].nverts = tile.cset->conts[i].nverts; + combSet.conts[n].reg = tile.cset->conts[i].reg; + n++; + } + } + } + + if (!rcBuildPolyMesh(combSet, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, + cfg.maxVertsPerPoly, *polyMesh)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Could not triangulate contours."); + return false; + } + + // Remove vertex binding to avoid double deletion. + for (int i = 0; i < combSet.nconts; ++i) + { + combSet.conts[i].verts = 0; + combSet.conts[i].nverts = 0; + } + + unsigned char* navData = 0; + int navDataSize = 0; + if (!dtCreateNavMeshData(polyMesh->verts, polyMesh->nverts, + polyMesh->polys, polyMesh->npolys, polyMesh->nvp, + cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, &navData, &navDataSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not build Detour navmesh."); + return false; + } + + if (!navMesh->init(navData, navDataSize, true)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not init Detour navmesh"); + return false; + } + + rcTimeVal totEndTime = rcGetPerformanceTimer(); + + if (rcGetLog()) + { + rcGetLog()->log(RC_LOG_PROGRESS, "Rasterize: %.1fms\n", g_buildTimes.rasterizeTriangles/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Compact: %.1fms\n", g_buildTimes.buildCompact/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Border: %.1fms\n", g_buildTimes.filterBorder/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Walkable: %.1fms\n", g_buildTimes.filterWalkable/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Reachable: %.1fms\n", g_buildTimes.filterMarkReachable/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Distancefield: %.1fms\n", g_buildTimes.buildDistanceField/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - distance: %.1fms\n", g_buildTimes.buildDistanceFieldDist/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.1fms\n", g_buildTimes.buildDistanceFieldBlur/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Regions: %.1fms\n", g_buildTimes.buildRegions/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - watershed: %.1fms\n", g_buildTimes.buildRegionsReg/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - expand: %.1fms\n", g_buildTimes.buildRegionsExp/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - find catchment basins: %.1fms\n", g_buildTimes.buildRegionsFlood/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.1fms\n", g_buildTimes.buildRegionsFilter/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Contours: %.1fms\n", g_buildTimes.buildContours/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - trace: %.1fms\n", g_buildTimes.buildContoursTrace/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - simplify: %.1fms\n", g_buildTimes.buildContoursSimplify/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Fixup contours: %.1fms\n", g_buildTimes.fixupContours/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Polymesh: %.1fms\n", g_buildTimes.buildPolymesh/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "TOTAL: %.1fms\n", rcGetDeltaTimeUsec(totStartTime, totEndTime)/1000.0f); + } + + return true; +} + + +bool buildNavigation(const rcConfig& cfg, + const rcMeshLoaderObj* mesh, + const rcChunkyTriMesh* chunkyMesh, + TileSet* tileSet, + rcPolyMesh* polyMesh, + dtStatNavMesh* navMesh, + bool keepInterResults) +{ + if (!mesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Input mesh is not valid."); + return false; + } + if (!chunkyMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Input chunky mesh is not valid."); + return false; + } + + if (!tileSet) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Output tile set is not valid."); + return false; + } + if (!polyMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Output polymesh is not valid."); + return false; + } + if (!navMesh) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Output navmesh is not valid."); + return false; + } + + memset(&g_buildTimes, 0, sizeof(g_buildTimes)); + rcSetBuildTimes(&g_buildTimes); + + rcTimeVal totStartTime = rcGetPerformanceTimer(); + + // Calculate the number of tiles in the output and initialize tiles. + vcopy(tileSet->bmin, cfg.bmin); + vcopy(tileSet->bmax, cfg.bmax); + tileSet->cs = cfg.cs; + tileSet->ch = cfg.ch; + tileSet->width = 1; + tileSet->height = 1; + tileSet->tiles = new Tile[1]; + if (!tileSet->tiles) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'tileSet->tiles'."); + return false; + } + + if (rcGetLog()) + { + rcGetLog()->log(RC_LOG_PROGRESS, "Building navigation:"); + rcGetLog()->log(RC_LOG_PROGRESS, " - %d x %d cells", cfg.width, cfg.height); + rcGetLog()->log(RC_LOG_PROGRESS, " - %d verts, %d tris", mesh->getVertCount(), mesh->getTriCount()); + } + + // Initialize per tile config. + + // Allocate array that can hold triangle flags for all geom chunks. + unsigned char* triangleFlags = new unsigned char[mesh->getTriCount()]; + if (!triangleFlags) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'triangleFlags' (%d).", mesh->getTriCount()); + return false; + } + + rcHeightfield* solid = 0; + rcCompactHeightfield* chf = 0; + rcContourSet* cset = 0; + + solid = new rcHeightfield; + if (!solid) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'solid'."); + return false; + } + if (!rcCreateHeightfield(*solid, cfg.width, cfg.height)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not create solid heightfield."); + return false; + } rcTimeVal startTime = rcGetPerformanceTimer(); + + memset(triangleFlags, 0, mesh->getTriCount()*sizeof(unsigned char)); + rcMarkWalkableTriangles(cfg.walkableSlopeAngle, + mesh->getVerts(), mesh->getVertCount(), mesh->getTris(), mesh->getTriCount(), triangleFlags); - rcCalcBounds(g_mesh->getVerts(), g_mesh->getVertCount(), g_cfg.bmin, g_cfg.bmax); - rcCalcGridSize(g_cfg.bmin, g_cfg.bmax, g_cfg.cs, &g_cfg.width, &g_cfg.height); + rcRasterizeTriangles(cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, + mesh->getVerts(), mesh->getVertCount(), mesh->getTris(), triangleFlags, mesh->getTriCount(), *solid); - g_log.log(RC_LOG_PROGRESS, "Building navigation"); - g_log.log(RC_LOG_PROGRESS, " - %d x %d", g_cfg.width, g_cfg.height); - g_log.log(RC_LOG_PROGRESS, " - %d verts, %d tris", g_mesh->getVertCount(), g_mesh->getTriCount()); + rcFilterWalkableBorderSpans(cfg.walkableHeight, cfg.walkableClimb, *solid); - g_triangleFlags = new unsigned char[g_mesh->getTriCount()]; - memset(g_triangleFlags, 0, g_mesh->getTriCount()); - rcMarkWalkableTriangles(g_cfg.walkableSlopeAngle, - g_mesh->getTris(), g_mesh->getNormals(), g_mesh->getTriCount(), - g_triangleFlags); + rcFilterWalkableLowHeightSpans(cfg.walkableHeight, *solid); - g_solid = new rcHeightfield; - g_chf = new rcCompactHeightfield; - g_cset = new rcContourSet; - g_polyMesh = new rcPolyMesh; - - if (!rcBuildNavMesh(g_cfg, g_mesh->getVerts(), g_mesh->getVertCount(), - g_mesh->getTris(), g_triangleFlags, g_mesh->getTriCount(), - *g_solid, *g_chf, *g_cset, *g_polyMesh)) + chf = new rcCompactHeightfield; + if (!chf) { - g_log.log(RC_LOG_ERROR, "Could not build navmesh."); + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'chf'."); + return false; + } + if (!rcBuildCompactHeightfield(cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, + cfg.walkableHeight, cfg.walkableClimb, + RC_WALKABLE/*|RC_REACHABLE*/, *solid, *chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build compact data."); return false; } + if (!rcBuildDistanceField(*chf)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build distance fields."); + return false; + } + + if (!rcBuildRegions(*chf, cfg.walkableRadius, cfg.borderSize, cfg.minRegionSize, cfg.mergeRegionSize)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not build regions."); + return false; + } + + cset = new rcContourSet; + if (!cset) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Out of memory 'cset'."); + return false; + } + if (!rcBuildContours(*chf, cfg.maxSimplificationError, cfg.maxEdgeLen, *cset)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not create contours."); + return false; + } + + if (keepInterResults) + { + tileSet->tiles[0].solid = solid; + solid = 0; + tileSet->tiles[0].chf = chf; + chf = 0; + } + + tileSet->tiles[0].cset = cset; + rcTimeVal endTime = rcGetPerformanceTimer(); - g_log.log(RC_LOG_PROGRESS, "Build time: %.1f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); - g_log.log(RC_LOG_PROGRESS, "NavMesh"); - g_log.log(RC_LOG_PROGRESS, " - %d verts, %d polys", g_polyMesh->nverts, g_polyMesh->npolys); - const int navMeshDataSize = g_polyMesh->nverts*3*sizeof(unsigned short) + - g_polyMesh->npolys*g_polyMesh->nvp*2*sizeof(unsigned short); - g_log.log(RC_LOG_PROGRESS, " - Approx data size %.1f kB", (float)navMeshDataSize/1024.f); + tileSet->tiles[0].buildTime += rcGetDeltaTimeUsec(startTime, endTime); + + delete [] triangleFlags; + delete solid; + delete chf; + + if (!rcBuildPolyMesh(*tileSet->tiles[0].cset, cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, + cfg.maxVertsPerPoly, *polyMesh)) + { + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "buildNavigation: Could not triangulate contours."); + return false; + } unsigned char* navData = 0; int navDataSize = 0; - if (!dtCreateNavMeshData(g_polyMesh->verts, g_polyMesh->nverts, - g_polyMesh->polys, g_polyMesh->npolys, g_polyMesh->nvp, - g_cfg.bmin, g_cfg.bmax, g_cfg.cs, g_cfg.ch, &navData, &navDataSize)) + if (!dtCreateNavMeshData(polyMesh->verts, polyMesh->nverts, + polyMesh->polys, polyMesh->npolys, polyMesh->nvp, + cfg.bmin, cfg.bmax, cfg.cs, cfg.ch, &navData, &navDataSize)) { - g_log.log(RC_LOG_ERROR, "Could not build Detour navmesh."); - return false; - } - g_navMesh = new dtStatNavMesh; - if (!g_navMesh) - { - g_log.log(RC_LOG_ERROR, "Out of memory 'g_navMesh'"); + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not build Detour navmesh."); return false; } - if (!g_navMesh->init(navData, navDataSize, true)) + if (!navMesh->init(navData, navDataSize, true)) { - g_log.log(RC_LOG_ERROR, "Could not init Detour navmesh"); + if (rcGetLog()) + rcGetLog()->log(RC_LOG_ERROR, "Could not init Detour navmesh"); return false; } + rcTimeVal totEndTime = rcGetPerformanceTimer(); - for (int i = 0; i < g_log.getMessageCount(); ++i) + if (rcGetLog()) { - printf("%s\n", g_log.getMessageText(i)); + rcGetLog()->log(RC_LOG_PROGRESS, "Rasterize: %.1fms\n", g_buildTimes.rasterizeTriangles/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Compact: %.1fms\n", g_buildTimes.buildCompact/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Border: %.1fms\n", g_buildTimes.filterBorder/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Walkable: %.1fms\n", g_buildTimes.filterWalkable/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, "Filter Reachable: %.1fms\n", g_buildTimes.filterMarkReachable/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Distancefield: %.1fms\n", g_buildTimes.buildDistanceField/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - distance: %.1fms\n", g_buildTimes.buildDistanceFieldDist/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - blur: %.1fms\n", g_buildTimes.buildDistanceFieldBlur/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Regions: %.1fms\n", g_buildTimes.buildRegions/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - watershed: %.1fms\n", g_buildTimes.buildRegionsReg/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - expand: %.1fms\n", g_buildTimes.buildRegionsExp/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - find catchment basins: %.1fms\n", g_buildTimes.buildRegionsFlood/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - filter: %.1fms\n", g_buildTimes.buildRegionsFilter/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Contours: %.1fms\n", g_buildTimes.buildContours/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - trace: %.1fms\n", g_buildTimes.buildContoursTrace/1000.0f); + rcGetLog()->log(RC_LOG_PROGRESS, " - simplify: %.1fms\n", g_buildTimes.buildContoursSimplify/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Fixup contours: %.1fms\n", g_buildTimes.fixupContours/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "Build Polymesh: %.1fms\n", g_buildTimes.buildPolymesh/1000.0f); + + rcGetLog()->log(RC_LOG_PROGRESS, "TOTAL: %.1fms\n", rcGetDeltaTimeUsec(totStartTime, totEndTime)/1000.0f); } return true; @@ -367,7 +893,7 @@ int main(int argc, char *argv[]) float cellSize = 0.3f; float cellHeight = 0.2f; float agentHeight = 2.0f; - float agentRadius = 0.3f; + float agentRadius = 0.6f; float agentMaxClimb = 0.9f; float agentMaxSlope = 45.0f; float regionMinSize = 50; @@ -375,12 +901,14 @@ int main(int argc, char *argv[]) float edgeMaxLen = 12.0f; float edgeMaxError = 1.5f; float vertsPerPoly = 6.0f; - int drawMode = DRAWMODE_NAVMESH; + float tileSize = 0.0f; + int drawMode = DRAWMODE_CONTOURS; int toolMode = TOOLMODE_PATHFIND; bool showLevels = false; bool showLog = false; char curLevel[256] = "Choose Level..."; bool mouseOverMenu = false; + bool keepInterResults = false; FileList fileList; dtPolyRef startRef = 0, endRef = 0; @@ -467,7 +995,8 @@ int main(int argc, char *argv[]) spos[0] = rays[0] + (raye[0] - rays[0])*t; spos[1] = rays[1] + (raye[1] - rays[1])*t; spos[2] = rays[2] + (raye[2] - rays[2])*t; - startRef = g_navMesh->findNearestPoly(spos, polyPickExt); + if (g_navMesh) + startRef = g_navMesh->findNearestPoly(spos, polyPickExt); recalcTool = true; } else @@ -476,7 +1005,8 @@ int main(int argc, char *argv[]) epos[0] = rays[0] + (raye[0] - rays[0])*t; epos[1] = rays[1] + (raye[1] - rays[1])*t; epos[2] = rays[2] + (raye[2] - rays[2])*t; - endRef = g_navMesh->findNearestPoly(epos, polyPickExt); + if (g_navMesh) + endRef = g_navMesh->findNearestPoly(epos, polyPickExt); recalcTool = true; } } @@ -580,7 +1110,7 @@ int main(int argc, char *argv[]) if (drawMode == DRAWMODE_MESH) { if (g_mesh) - rcDebugDrawMesh(*g_mesh, g_triangleFlags); + rcDebugDrawMesh(*g_mesh, 0); //g_triangleFlags); } else if (drawMode != DRAWMODE_NAVMESH_TRANS) { @@ -591,6 +1121,8 @@ int main(int argc, char *argv[]) if (g_mesh) { + glDepthMask(GL_FALSE); + // Agent dimensions. const float r = agentRadius; const float h = agentHeight; @@ -628,11 +1160,55 @@ int main(int argc, char *argv[]) glEnd(); } - + // Tile bboxes + if ((int)tileSize > 0) + { + const int ts = (int)tileSize; + col[0] = 0.5f; col[1] = 0.1f; col[2] = 0.1f; col[3] = 0.15f; + int gw = 0, gh = 0; + rcCalcGridSize(g_meshBMin, g_meshBMax, cellSize, &gw, &gh); + int tx = (gw + ts-1) / ts; + int ty = (gh + ts-1) / ts; + + const float s = ts*cellSize; + + glBegin(GL_LINES); + glColor4ub(0,0,0,64); + for (int y = 0; y < ty; ++y) + { + for (int x = 0; x < tx; ++x) + { + float fx, fy, fz; + fx = g_meshBMin[0] + x*s; + fy = g_meshBMin[1]; + fz = g_meshBMin[2] + y*s; + + glVertex3f(fx,fy,fz); + glVertex3f(fx+s,fy,fz); + glVertex3f(fx,fy,fz); + glVertex3f(fx,fy,fz+s); + + if (x+1 >= tx) + { + glVertex3f(fx+s,fy,fz); + glVertex3f(fx+s,fy,fz+s); + } + if (y+1 >= ty) + { + glVertex3f(fx,fy,fz+s); + glVertex3f(fx+s,fy,fz+s); + } + } + } + glEnd(); + } + // Mesh bbox. col[0] = 1.0f; col[1] = 1.0f; col[2] = 1.0f; col[3] = 0.25f; - rcDebugDrawBoxWire(g_cfg.bmin[0], g_cfg.bmin[1], g_cfg.bmin[2], - g_cfg.bmax[0], g_cfg.bmax[1], g_cfg.bmax[2], col); + rcDebugDrawBoxWire(g_meshBMin[0], g_meshBMin[1], g_meshBMin[2], + g_meshBMax[0], g_meshBMax[1], g_meshBMax[2], col); + + glDepthMask(GL_TRUE); } glDepthMask(GL_FALSE); @@ -734,39 +1310,88 @@ int main(int argc, char *argv[]) if (drawMode == DRAWMODE_COMPACT) { - if (g_chf) - rcDebugDrawCompactHeightfieldSolid(*g_chf); + if (g_tileSet) + { + for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) + { + if (g_tileSet->tiles[i].chf) + rcDebugDrawCompactHeightfieldSolid(*(g_tileSet->tiles[i].chf)); + } + } } if (drawMode == DRAWMODE_COMPACT_DISTANCE) { - if (g_chf) - rcDebugDrawCompactHeightfieldDistance(*g_chf); + if (g_tileSet) + { + for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) + { + if (g_tileSet->tiles[i].chf) + rcDebugDrawCompactHeightfieldDistance(*(g_tileSet->tiles[i].chf)); + } + } } if (drawMode == DRAWMODE_COMPACT_REGIONS) { - if (g_chf) - rcDebugDrawCompactHeightfieldRegions(*g_chf); + if (g_tileSet) + { + for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) + { + if (g_tileSet->tiles[i].chf) + rcDebugDrawCompactHeightfieldRegions(*(g_tileSet->tiles[i].chf)); + } + } } if (drawMode == DRAWMODE_VOXELS) { - if (g_solid) - rcDebugDrawHeightfieldSolid(*g_solid, g_cfg.bmin, g_cfg.cs, g_cfg.ch); + if (g_tileSet) + { + for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) + { + if (g_tileSet->tiles[i].solid) + rcDebugDrawHeightfieldSolid(*g_tileSet->tiles[i].solid, g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch); + } + } } if (drawMode == DRAWMODE_VOXELS_WALKABLE) { - if (g_solid) - rcDebugDrawHeightfieldWalkable(*g_solid, g_cfg.bmin, g_cfg.cs, g_cfg.ch); + if (g_tileSet) + { + for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) + { + if (g_tileSet->tiles[i].solid) + rcDebugDrawHeightfieldWalkable(*g_tileSet->tiles[i].solid, g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch); + } + } } if (drawMode == DRAWMODE_RAW_CONTOURS) { - if (g_cset) - rcDebugDrawRawContours(*g_cset, g_cfg.bmin, g_cfg.cs, g_cfg.ch); + if (g_tileSet) + { + for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) + { + if (g_tileSet->tiles[i].cset) + rcDebugDrawRawContours(*(g_tileSet->tiles[i].cset), g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch); + } + } } if (drawMode == DRAWMODE_CONTOURS) { - if (g_cset) - rcDebugDrawContours(*g_cset, g_cfg.bmin, g_cfg.cs, g_cfg.ch); + if (g_tileSet) + { + for (int i = 0; i < g_tileSet->width*g_tileSet->height; ++i) + { + if (g_tileSet->tiles[i].cset) + rcDebugDrawContours(*(g_tileSet->tiles[i].cset), g_tileSet->bmin, g_tileSet->cs, g_tileSet->ch); + } + } + } + if (drawMode == DRAWMODE_POLYMESH) + { + if (g_polyMesh) + rcDebugDrawPolyMesh(*g_polyMesh); + } + glDisable(GL_FOG); @@ -800,20 +1425,54 @@ int main(int argc, char *argv[]) { if (imguiButton(GENID, "Build")) { - memset(&g_cfg, 0, sizeof(g_cfg)); - g_cfg.cs = cellSize; - g_cfg.ch = cellHeight; - g_cfg.walkableSlopeAngle = agentMaxSlope; - g_cfg.walkableHeight = (int)ceilf(agentHeight / g_cfg.ch); - g_cfg.walkableClimb = (int)ceilf(agentMaxClimb / g_cfg.ch); - g_cfg.walkableRadius = (int)ceilf(agentRadius / g_cfg.cs); - g_cfg.maxEdgeLen = (int)(edgeMaxLen / cellSize); - g_cfg.maxSimplificationError = edgeMaxError; - g_cfg.minRegionSize = (int)rcSqr(regionMinSize); - g_cfg.mergeRegionSize = (int)rcSqr(regionMergeSize); - g_cfg.maxVertsPerPoly = (int)vertsPerPoly; - - buildNavigation(); + rcConfig cfg; + memset(&cfg, 0, sizeof(cfg)); + cfg.cs = cellSize; + cfg.ch = cellHeight; + cfg.walkableSlopeAngle = agentMaxSlope; + cfg.walkableHeight = (int)ceilf(agentHeight / cfg.ch); + cfg.walkableClimb = (int)ceilf(agentMaxClimb / cfg.ch); + cfg.walkableRadius = (int)ceilf(agentRadius / cfg.cs); + cfg.maxEdgeLen = (int)(edgeMaxLen / cellSize); + cfg.maxSimplificationError = edgeMaxError; + cfg.minRegionSize = (int)rcSqr(regionMinSize); + cfg.mergeRegionSize = (int)rcSqr(regionMergeSize); + cfg.maxVertsPerPoly = DT_VERTS_PER_POLYGON; // TODO: Handle better. (int)vertsPerPoly; + rcCalcBounds(g_mesh->getVerts(), g_mesh->getVertCount(), cfg.bmin, cfg.bmax); + rcCalcGridSize(cfg.bmin, cfg.bmax, cfg.cs, &cfg.width, &cfg.height); + + g_log.clear(); + rcSetLog(&g_log); + + if ((int)tileSize > 0) + { + cfg.borderSize = cfg.walkableRadius*2 + 2; + cfg.tileSize = tileSize; + + delete g_tileSet; + g_tileSet = new TileSet; + delete g_polyMesh; + g_polyMesh = new rcPolyMesh; + delete g_navMesh; + g_navMesh = new dtStatNavMesh; + + buildTiledNavigation(cfg, g_mesh, g_chunkyMesh, g_tileSet, g_polyMesh, g_navMesh, keepInterResults); + } + else + { + cfg.borderSize = 0; + cfg.tileSize = 0; + + delete g_tileSet; + g_tileSet = new TileSet; + delete g_polyMesh; + g_polyMesh = new rcPolyMesh; + delete g_navMesh; + g_navMesh = new dtStatNavMesh; + + buildNavigation(cfg, g_mesh, g_chunkyMesh, g_tileSet, g_polyMesh, g_navMesh, keepInterResults); + } + } } @@ -821,16 +1480,20 @@ int main(int argc, char *argv[]) if (imguiCheck(GENID, "Show Log", showLog)) showLog = !showLog; + + if (imguiCheck(GENID, "Keep Itermediate Results", keepInterResults)) + keepInterResults = !keepInterResults; imguiSeparator(); imguiLabel(GENID, "Rasterization"); imguiSlider(GENID, "Cell Size", &cellSize, 0.1f, 1.0f, 0.01f); imguiSlider(GENID, "Cell Height", &cellHeight, 0.1f, 1.0f, 0.01f); + imguiSlider(GENID, "TileSize", &tileSize, 0.0f, 1024.0f, 16.0f); if (g_mesh) { int gw = 0, gh = 0; - rcCalcGridSize(g_cfg.bmin, g_cfg.bmax, cellSize, &gw, &gh); + rcCalcGridSize(g_meshBMin, g_meshBMax, cellSize, &gw, &gh); char text[64]; snprintf(text, 64, "Grid %d x %d", gw, gh); imguiValue(GENID, text); @@ -878,6 +1541,8 @@ int main(int argc, char *argv[]) drawMode = DRAWMODE_RAW_CONTOURS; if (imguiCheck(GENID, "Contours", drawMode == DRAWMODE_CONTOURS)) drawMode = DRAWMODE_CONTOURS; + if (imguiCheck(GENID, "Poly Mesh", drawMode == DRAWMODE_POLYMESH)) + drawMode = DRAWMODE_POLYMESH; imguiEndScrollArea(); @@ -1008,19 +1673,15 @@ int main(int argc, char *argv[]) showLevels = false; delete g_mesh; - delete g_solid; - delete g_chf; - delete g_cset; - delete g_polyMesh; - delete [] g_triangleFlags; + delete g_chunkyMesh; delete g_navMesh; + delete g_tileSet; + delete g_polyMesh; g_mesh = 0; - g_solid = 0; - g_chf = 0; - g_cset = 0; - g_polyMesh = 0; - g_triangleFlags = 0; + g_chunkyMesh = 0; g_navMesh = 0; + g_tileSet = 0; + g_polyMesh = 0; npolys = 0; nstraightPath = 0; @@ -1030,13 +1691,13 @@ int main(int argc, char *argv[]) endRef = 0; distanceToWall = 0; - g_mesh = new rcMeshLoaderObj; - char path[256]; strcpy(path, "meshes/"); strcat(path, curLevel); - if (!g_mesh->load(path)) + g_mesh = new rcMeshLoaderObj; + + if (!g_mesh || !g_mesh->load(path)) { printf("Could not load mesh\n"); delete g_mesh; @@ -1045,15 +1706,22 @@ int main(int argc, char *argv[]) if (g_mesh) { - rcCalcBounds(g_mesh->getVerts(), g_mesh->getVertCount(), g_cfg.bmin, g_cfg.bmax); + rcCalcBounds(g_mesh->getVerts(), g_mesh->getVertCount(), g_meshBMin, g_meshBMax); + g_chunkyMesh = new rcChunkyTriMesh; + +// rcTimeVal startTime = rcGetPerformanceTimer(); + rcCreateChunkyTriMesh(g_mesh->getVerts(), g_mesh->getTris(), g_mesh->getTriCount(), 256, g_chunkyMesh); +// rcTimeVal endTime = rcGetPerformanceTimer(); +// printf("%.3fms\n", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); + // Reset camera. - camr = sqrtf(rcSqr(g_cfg.bmax[0]-g_cfg.bmin[0]) + - rcSqr(g_cfg.bmax[1]-g_cfg.bmin[1]) + - rcSqr(g_cfg.bmax[2]-g_cfg.bmin[2])) / 2; - camx = (g_cfg.bmax[0] + g_cfg.bmin[0]) / 2 + camr; - camy = (g_cfg.bmax[1] + g_cfg.bmin[1]) / 2 + camr; - camz = (g_cfg.bmax[2] + g_cfg.bmin[2]) / 2 + camr; + camr = sqrtf(rcSqr(g_meshBMax[0]-g_meshBMin[0]) + + rcSqr(g_meshBMax[1]-g_meshBMin[1]) + + rcSqr(g_meshBMax[2]-g_meshBMin[2])) / 2; + camx = (g_meshBMax[0] + g_meshBMin[0]) / 2 + camr; + camy = (g_meshBMax[1] + g_meshBMin[1]) / 2 + camr; + camz = (g_meshBMax[2] + g_meshBMin[2]) / 2 + camr; camr *= 3; rx = 45; ry = -45; @@ -1087,7 +1755,6 @@ int main(int argc, char *argv[]) g_font.drawText((float)x-len/2, (float)y-g_font.getLineHeight(), "End", GLFont::RGBA(0,0,0,220)); } - glEnable(GL_DEPTH_TEST); SDL_GL_SwapBuffers(); } @@ -1095,12 +1762,12 @@ int main(int argc, char *argv[]) SDL_Quit(); delete g_mesh; - delete g_solid; - delete g_chf; - delete g_cset; - delete g_polyMesh; - delete [] g_triangleFlags; + delete g_chunkyMesh; delete g_navMesh; + delete g_tileSet; + delete g_polyMesh; + + return 0; }