From 10b330ffb45fa2bb61b092946449ef7f923cbc7c Mon Sep 17 00:00:00 2001 From: Mikko Mononen Date: Wed, 14 Apr 2010 18:45:46 +0000 Subject: [PATCH] Moved common functions behind name decoration. --- Detour/Include/DetourCommon.h | 56 +- Detour/Source/DetourCommon.cpp | 42 +- Detour/Source/DetourNavMesh.cpp | 246 +++--- Detour/Source/DetourNavMeshBuilder.cpp | 12 +- Recast/Include/Recast.h | 26 +- Recast/Source/Recast.cpp | 24 +- Recast/Source/RecastArea.cpp | 8 +- Recast/Source/RecastContour.cpp | 4 +- Recast/Source/RecastMesh.cpp | 12 +- Recast/Source/RecastMeshDetail.cpp | 26 +- Recast/Source/RecastRasterization.cpp | 18 +- .../Bin/Recast.app/Contents/MacOS/Recast | Bin 563208 -> 568672 bytes .../Xcode/Recast.xcodeproj/memon.pbxuser | 835 +++++++++++++++--- .../Recast.xcodeproj/memon.perspectivev3 | 180 ++-- RecastDemo/Source/ConvexVolumeTool.cpp | 6 +- RecastDemo/Source/InputGeom.cpp | 32 +- RecastDemo/Source/NavMeshTesterTool.cpp | 60 +- RecastDemo/Source/OffMeshConnectionTool.cpp | 4 +- RecastDemo/Source/Sample_Debug.cpp | 4 +- RecastDemo/Source/Sample_SoloMeshSimple.cpp | 8 +- RecastDemo/Source/Sample_SoloMeshTiled.cpp | 14 +- RecastDemo/Source/Sample_TileMesh.cpp | 12 +- RecastDemo/Source/TestCase.cpp | 20 +- 23 files changed, 1119 insertions(+), 530 deletions(-) diff --git a/Detour/Include/DetourCommon.h b/Detour/Include/DetourCommon.h index 87e6c1c..132f329 100644 --- a/Detour/Include/DetourCommon.h +++ b/Detour/Include/DetourCommon.h @@ -21,75 +21,75 @@ ////////////////////////////////////////////////////////////////////////////////////////// -template inline void swap(T& a, T& b) { T t = a; a = b; b = t; } -template inline T min(T a, T b) { return a < b ? a : b; } -template inline T max(T a, T b) { return a > b ? a : b; } -template inline T abs(T a) { return a < 0 ? -a : a; } -template inline T sqr(T a) { return a*a; } -template inline T clamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); } +template inline void dtSwap(T& a, T& b) { T t = a; a = b; b = t; } +template inline T dtMin(T a, T b) { return a < b ? a : b; } +template inline T dtMax(T a, T b) { return a > b ? a : b; } +template inline T dtAbs(T a) { return a < 0 ? -a : a; } +template inline T dtSqr(T a) { return a*a; } +template inline T dtClamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); } -inline void vcross(float* dest, const float* v1, const float* v2) +inline void dtVcross(float* dest, const float* v1, const float* v2) { dest[0] = v1[1]*v2[2] - v1[2]*v2[1]; dest[1] = v1[2]*v2[0] - v1[0]*v2[2]; dest[2] = v1[0]*v2[1] - v1[1]*v2[0]; } -inline float vdot(const float* v1, const float* v2) +inline float dtVdot(const float* v1, const float* v2) { return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; } -inline void vmad(float* dest, const float* v1, const float* v2, const float s) +inline void dtVmad(float* dest, const float* v1, const float* v2, const float s) { dest[0] = v1[0]+v2[0]*s; dest[1] = v1[1]+v2[1]*s; dest[2] = v1[2]+v2[2]*s; } -inline void vlerp(float* dest, const float* v1, const float* v2, const float t) +inline void dtVlerp(float* dest, const float* v1, const float* v2, const float t) { dest[0] = v1[0]+(v2[0]-v1[0])*t; dest[1] = v1[1]+(v2[1]-v1[1])*t; dest[2] = v1[2]+(v2[2]-v1[2])*t; } -inline void vadd(float* dest, const float* v1, const float* v2) +inline void dtVadd(float* dest, const float* v1, const float* v2) { dest[0] = v1[0]+v2[0]; dest[1] = v1[1]+v2[1]; dest[2] = v1[2]+v2[2]; } -inline void vsub(float* dest, const float* v1, const float* v2) +inline void dtVsub(float* dest, const float* v1, const float* v2) { dest[0] = v1[0]-v2[0]; dest[1] = v1[1]-v2[1]; dest[2] = v1[2]-v2[2]; } -inline void vmin(float* mn, const float* v) +inline void dtVmin(float* mn, const float* v) { - mn[0] = min(mn[0], v[0]); - mn[1] = min(mn[1], v[1]); - mn[2] = min(mn[2], v[2]); + mn[0] = dtMin(mn[0], v[0]); + mn[1] = dtMin(mn[1], v[1]); + mn[2] = dtMin(mn[2], v[2]); } -inline void vmax(float* mx, const float* v) +inline void dtVmax(float* mx, const float* v) { - mx[0] = max(mx[0], v[0]); - mx[1] = max(mx[1], v[1]); - mx[2] = max(mx[2], v[2]); + mx[0] = dtMax(mx[0], v[0]); + mx[1] = dtMax(mx[1], v[1]); + mx[2] = dtMax(mx[2], v[2]); } -inline void vcopy(float* dest, const float* a) +inline void dtVcopy(float* dest, const float* a) { dest[0] = a[0]; dest[1] = a[1]; dest[2] = a[2]; } -inline float vdist(const float* v1, const float* v2) +inline float dtVdist(const float* v1, const float* v2) { float dx = v2[0] - v1[0]; float dy = v2[1] - v1[1]; @@ -97,7 +97,7 @@ inline float vdist(const float* v1, const float* v2) return sqrtf(dx*dx + dy*dy + dz*dz); } -inline float vdistSqr(const float* v1, const float* v2) +inline float dtVdistSqr(const float* v1, const float* v2) { float dx = v2[0] - v1[0]; float dy = v2[1] - v1[1]; @@ -105,18 +105,18 @@ inline float vdistSqr(const float* v1, const float* v2) return dx*dx + dy*dy + dz*dz; } -inline void vnormalize(float* v) +inline void dtVnormalize(float* v) { - float d = 1.0f / sqrtf(sqr(v[0]) + sqr(v[1]) + sqr(v[2])); + float d = 1.0f / sqrtf(dtSqr(v[0]) + dtSqr(v[1]) + dtSqr(v[2])); v[0] *= d; v[1] *= d; v[2] *= d; } -inline bool vequal(const float* p0, const float* p1) +inline bool dtVequal(const float* p0, const float* p1) { - static const float thr = sqr(1.0f/16384.0f); - const float d = vdistSqr(p0, p1); + static const float thr = dtSqr(1.0f/16384.0f); + const float d = dtVdistSqr(p0, p1); return d < thr; } diff --git a/Detour/Source/DetourCommon.cpp b/Detour/Source/DetourCommon.cpp index ad99326..7016cf8 100644 --- a/Detour/Source/DetourCommon.cpp +++ b/Detour/Source/DetourCommon.cpp @@ -24,27 +24,27 @@ void closestPtPointTriangle(float* closest, const float* p, { // Check if P in vertex region outside A float ab[3], ac[3], ap[3]; - vsub(ab, b, a); - vsub(ac, c, a); - vsub(ap, p, a); - float d1 = vdot(ab, ap); - float d2 = vdot(ac, ap); + dtVsub(ab, b, a); + dtVsub(ac, c, a); + dtVsub(ap, p, a); + float d1 = dtVdot(ab, ap); + float d2 = dtVdot(ac, ap); if (d1 <= 0.0f && d2 <= 0.0f) { // barycentric coordinates (1,0,0) - vcopy(closest, a); + dtVcopy(closest, a); return; } // Check if P in vertex region outside B float bp[3]; - vsub(bp, p, b); - float d3 = vdot(ab, bp); - float d4 = vdot(ac, bp); + dtVsub(bp, p, b); + float d3 = dtVdot(ab, bp); + float d4 = dtVdot(ac, bp); if (d3 >= 0.0f && d4 <= d3) { // barycentric coordinates (0,1,0) - vcopy(closest, b); + dtVcopy(closest, b); return; } @@ -62,13 +62,13 @@ void closestPtPointTriangle(float* closest, const float* p, // Check if P in vertex region outside C float cp[3]; - vsub(cp, p, c); - float d5 = vdot(ab, cp); - float d6 = vdot(ac, cp); + dtVsub(cp, p, c); + float d5 = dtVdot(ab, cp); + float d6 = dtVdot(ac, cp); if (d6 >= 0.0f && d5 <= d6) { // barycentric coordinates (0,0,1) - vcopy(closest, c); + dtVcopy(closest, c); return; } @@ -118,16 +118,16 @@ bool intersectSegmentPoly2D(const float* p0, const float* p1, segMax = -1; float dir[3]; - vsub(dir, p1, p0); + dtVsub(dir, p1, p0); for (int i = 0, j = nverts-1; i < nverts; j=i++) { float edge[3], diff[3]; - vsub(edge, &verts[i*3], &verts[j*3]); - vsub(diff, p0, &verts[j*3]); + dtVsub(edge, &verts[i*3], &verts[j*3]); + dtVsub(diff, p0, &verts[j*3]); float n = vperp2D(edge, diff); float d = -vperp2D(edge, dir); - if (fabs(d) < EPS) + if (fabsf(d) < EPS) { // S is nearly parallel to this edge if (n < 0) @@ -202,9 +202,9 @@ void calcPolyCenter(float* tc, const unsigned short* idx, int nidx, const float* bool closestHeightPointTriangle(const float* p, const float* a, const float* b, const float* c, float& h) { float v0[3], v1[3], v2[3]; - vsub(v0, c,a); - vsub(v1, b,a); - vsub(v2, p,a); + dtVsub(v0, c,a); + dtVsub(v1, b,a); + dtVsub(v2, p,a); const float dot00 = vdot2D(v0, v0); const float dot01 = vdot2D(v0, v1); diff --git a/Detour/Source/DetourNavMesh.cpp b/Detour/Source/DetourNavMesh.cpp index 0a854ef..2e47aec 100644 --- a/Detour/Source/DetourNavMesh.cpp +++ b/Detour/Source/DetourNavMesh.cpp @@ -52,17 +52,17 @@ static void calcRect(const float* va, const float* vb, { if (side == 0 || side == 4) { - bmin[0] = min(va[2],vb[2]) + padx; - bmin[1] = min(va[1],vb[1]) - pady; - bmax[0] = max(va[2],vb[2]) - padx; - bmax[1] = max(va[1],vb[1]) + pady; + bmin[0] = dtMin(va[2],vb[2]) + padx; + bmin[1] = dtMin(va[1],vb[1]) - pady; + bmax[0] = dtMax(va[2],vb[2]) - padx; + bmax[1] = dtMax(va[1],vb[1]) + pady; } else if (side == 2 || side == 6) { - bmin[0] = min(va[0],vb[0]) + padx; - bmin[1] = min(va[1],vb[1]) - pady; - bmax[0] = max(va[0],vb[0]) - padx; - bmax[1] = max(va[1],vb[1]) + pady; + bmin[0] = dtMin(va[0],vb[0]) + padx; + bmin[1] = dtMin(va[1],vb[1]) - pady; + bmax[0] = dtMax(va[0],vb[0]) - padx; + bmax[1] = dtMax(va[1],vb[1]) + pady; } } @@ -141,7 +141,7 @@ dtNavMesh::~dtNavMesh() bool dtNavMesh::init(const dtNavMeshParams* params) { memcpy(&m_params, params, sizeof(dtNavMeshParams)); - vcopy(m_orig, params->orig); + dtVcopy(m_orig, params->orig); m_tileWidth = params->tileWidth; m_tileHeight = params->tileHeight; @@ -181,8 +181,8 @@ bool dtNavMesh::init(const dtNavMeshParams* params) } // Init ID generator values. - m_tileBits = max((unsigned int)1,ilog2(nextPow2((unsigned int)params->maxTiles))); - m_polyBits = max((unsigned int)1,ilog2(nextPow2((unsigned int)params->maxPolys))); + m_tileBits = dtMax((unsigned int)1,ilog2(nextPow2((unsigned int)params->maxTiles))); + m_polyBits = dtMax((unsigned int)1,ilog2(nextPow2((unsigned int)params->maxPolys))); m_saltBits = 32 - m_tileBits - m_polyBits; if (m_saltBits < 10) return false; @@ -200,7 +200,7 @@ bool dtNavMesh::init(unsigned char* data, int dataSize, int flags, int maxNodes) return false; dtNavMeshParams params; - vcopy(params.orig, header->bmin); + dtVcopy(params.orig, header->bmin); params.tileWidth = header->bmax[0] - header->bmin[0]; params.tileHeight = header->bmax[2] - header->bmin[2]; params.maxTiles = 1; @@ -250,8 +250,8 @@ int dtNavMesh::findConnectingPolys(const float* va, const float* vb, // Add return value. if (n < maxcon) { - conarea[n*2+0] = max(amin[0], bmin[0]); - conarea[n*2+1] = min(amax[0], bmax[0]); + conarea[n*2+0] = dtMax(amin[0], bmin[0]); + conarea[n*2+1] = dtMin(amax[0], bmax[0]); con[n] = base | (unsigned int)i; n++; } @@ -332,17 +332,17 @@ void dtNavMesh::connectExtLinks(dtMeshTile* tile, dtMeshTile* target, int side) // Compress portal limits to a byte value. if (side == 0 || side == 4) { - const float lmin = min(va[2], vb[2]); - const float lmax = max(va[2], vb[2]); - link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); - link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + const float lmin = dtMin(va[2], vb[2]); + const float lmax = dtMax(va[2], vb[2]); + link->bmin = (unsigned char)(dtClamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + link->bmax = (unsigned char)(dtClamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); } else if (side == 2 || side == 6) { - const float lmin = min(va[0], vb[0]); - const float lmax = max(va[0], vb[0]); - link->bmin = (unsigned char)(clamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); - link->bmax = (unsigned char)(clamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + const float lmin = dtMin(va[0], vb[0]); + const float lmax = dtMax(va[0], vb[0]); + link->bmin = (unsigned char)(dtClamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); + link->bmax = (unsigned char)(dtClamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f); } } } @@ -375,11 +375,11 @@ void dtNavMesh::connectExtOffMeshLinks(dtMeshTile* tile, dtMeshTile* target, int dtPolyRef ref = findNearestPolyInTile(tile, p, ext, &defaultFilter, nearestPt); if (!ref) continue; // findNearestPoly may return too optimistic results, further check to make sure. - if (sqr(nearestPt[0]-p[0])+sqr(nearestPt[2]-p[2]) > sqr(targetCon->rad)) + if (dtSqr(nearestPt[0]-p[0])+dtSqr(nearestPt[2]-p[2]) > dtSqr(targetCon->rad)) continue; // Make sure the location is on current mesh. float* v = &target->verts[targetPoly->verts[1]*3]; - vcopy(v, nearestPt); + dtVcopy(v, nearestPt); // Link off-mesh connection to target poly. unsigned int idx = allocLink(target); @@ -481,11 +481,11 @@ void dtNavMesh::connectIntOffMeshLinks(dtMeshTile* tile) dtPolyRef ref = findNearestPolyInTile(tile, p, ext, &defaultFilter, nearestPt); if (!ref) continue; // findNearestPoly may return too optimistic results, further check to make sure. - if (sqr(nearestPt[0]-p[0])+sqr(nearestPt[2]-p[2]) > sqr(con->rad)) + if (dtSqr(nearestPt[0]-p[0])+dtSqr(nearestPt[2]-p[2]) > dtSqr(con->rad)) continue; // Make sure the location is on current mesh. float* v = &tile->verts[poly->verts[j]*3]; - vcopy(v, nearestPt); + dtVcopy(v, nearestPt); // Link off-mesh connection to target poly. unsigned int idx = allocLink(tile); @@ -927,10 +927,10 @@ bool dtNavMesh::closestPointOnPolyInTile(const dtMeshTile* tile, unsigned int ip } float pt[3]; closestPtPointTriangle(pt, pos, v[0], v[1], v[2]); - float d = vdistSqr(pos, pt); + float d = dtVdistSqr(pos, pt); if (d < closestDistSqr) { - vcopy(closest, pt); + dtVcopy(closest, pt); closestDistSqr = d; } } @@ -956,7 +956,7 @@ bool dtNavMesh::closestPointOnPolyBoundary(dtPolyRef ref, const float* pos, floa int nv = 0; for (int i = 0; i < (int)poly->vertCount; ++i) { - vcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]); + dtVcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]); nv++; } @@ -964,11 +964,11 @@ bool dtNavMesh::closestPointOnPolyBoundary(dtPolyRef ref, const float* pos, floa if (inside) { // Point is inside the polygon, return the point. - vcopy(closest, pos); + dtVcopy(closest, pos); } else { - // Point is outside the polygon, clamp to nearest edge. + // Point is outside the polygon, dtClamp to nearest edge. float dmin = FLT_MAX; int imin = -1; for (int i = 0; i < nv; ++i) @@ -981,7 +981,7 @@ bool dtNavMesh::closestPointOnPolyBoundary(dtPolyRef ref, const float* pos, floa } const float* va = &verts[imin*3]; const float* vb = &verts[((imin+1)%nv)*3]; - vlerp(closest, va, vb, edget[imin]); + dtVlerp(closest, va, vb, edget[imin]); } return true; @@ -1021,8 +1021,8 @@ bool dtNavMesh::getOffMeshConnectionPolyEndPoints(dtPolyRef prevRef, dtPolyRef p } } - vcopy(startPos, &tile->verts[poly->verts[idx0]*3]); - vcopy(endPos, &tile->verts[poly->verts[idx1]*3]); + dtVcopy(startPos, &tile->verts[poly->verts[idx0]*3]); + dtVcopy(endPos, &tile->verts[poly->verts[idx1]*3]); return true; } @@ -1043,8 +1043,8 @@ bool dtNavMesh::getPolyHeight(dtPolyRef ref, const float* pos, float* height) co { const float* v0 = &tile->verts[poly->verts[0]*3]; const float* v1 = &tile->verts[poly->verts[1]*3]; - const float d0 = vdist(pos, v0); - const float d1 = vdist(pos, v1); + const float d0 = dtVdist(pos, v0); + const float d1 = dtVdist(pos, v1); const float u = d0 / (d0+d1); if (height) *height = v0[1] + (v1[1] - v0[1]) * u; @@ -1105,11 +1105,11 @@ dtPolyRef dtNavMesh::findNearestPoly(const float* center, const float* extents, float closestPtPoly[3]; if (!closestPointOnPoly(ref, center, closestPtPoly)) continue; - float d = vdistSqr(center, closestPtPoly); + float d = dtVdistSqr(center, closestPtPoly); if (d < nearestDistanceSqr) { if (nearestPt) - vcopy(nearestPt, closestPtPoly); + dtVcopy(nearestPt, closestPtPoly); nearestDistanceSqr = d; nearest = ref; } @@ -1122,8 +1122,8 @@ dtPolyRef dtNavMesh::findNearestPolyInTile(dtMeshTile* tile, const float* center dtQueryFilter* filter, float* nearestPt) { float bmin[3], bmax[3]; - vsub(bmin, center, extents); - vadd(bmax, center, extents); + dtVsub(bmin, center, extents); + dtVadd(bmax, center, extents); // Get nearby polygons from proximity grid. dtPolyRef polys[128]; @@ -1138,11 +1138,11 @@ dtPolyRef dtNavMesh::findNearestPolyInTile(dtMeshTile* tile, const float* center float closestPtPoly[3]; if (!closestPointOnPolyInTile(tile, decodePolyIdPoly(ref), center, closestPtPoly)) continue; - float d = vdistSqr(center, closestPtPoly); + float d = dtVdistSqr(center, closestPtPoly); if (d < nearestDistanceSqr) { if (nearestPt) - vcopy(nearestPt, closestPtPoly); + dtVcopy(nearestPt, closestPtPoly); nearestDistanceSqr = d; nearest = ref; } @@ -1165,13 +1165,13 @@ int dtNavMesh::queryPolygonsInTile(dtMeshTile* tile, const float* qmin, const fl // Calculate quantized box unsigned short bmin[3], bmax[3]; - // Clamp query box to world box. - float minx = clamp(qmin[0], tbmin[0], tbmax[0]) - tbmin[0]; - float miny = clamp(qmin[1], tbmin[1], tbmax[1]) - tbmin[1]; - float minz = clamp(qmin[2], tbmin[2], tbmax[2]) - tbmin[2]; - float maxx = clamp(qmax[0], tbmin[0], tbmax[0]) - tbmin[0]; - float maxy = clamp(qmax[1], tbmin[1], tbmax[1]) - tbmin[1]; - float maxz = clamp(qmax[2], tbmin[2], tbmax[2]) - tbmin[2]; + // dtClamp query box to world box. + float minx = dtClamp(qmin[0], tbmin[0], tbmax[0]) - tbmin[0]; + float miny = dtClamp(qmin[1], tbmin[1], tbmax[1]) - tbmin[1]; + float minz = dtClamp(qmin[2], tbmin[2], tbmax[2]) - tbmin[2]; + float maxx = dtClamp(qmax[0], tbmin[0], tbmax[0]) - tbmin[0]; + float maxy = dtClamp(qmax[1], tbmin[1], tbmax[1]) - tbmin[1]; + float maxz = dtClamp(qmax[2], tbmin[2], tbmax[2]) - tbmin[2]; // Quantize bmin[0] = (unsigned short)(qfac * minx) & 0xfffe; bmin[1] = (unsigned short)(qfac * miny) & 0xfffe; @@ -1218,13 +1218,13 @@ int dtNavMesh::queryPolygonsInTile(dtMeshTile* tile, const float* qmin, const fl // Calc polygon bounds. dtPoly* p = &tile->polys[i]; const float* v = &tile->verts[p->verts[0]*3]; - vcopy(bmin, v); - vcopy(bmax, v); + dtVcopy(bmin, v); + dtVcopy(bmax, v); for (int j = 1; j < p->vertCount; ++j) { v = &tile->verts[p->verts[j]*3]; - vmin(bmin, v); - vmax(bmax, v); + dtVmin(bmin, v); + dtVmax(bmax, v); } if (overlapBoxes(qmin,qmax, bmin,bmax)) { @@ -1243,8 +1243,8 @@ int dtNavMesh::queryPolygons(const float* center, const float* extents, dtQueryF dtPolyRef* polys, const int maxPolys) { float bmin[3], bmax[3]; - vsub(bmin, center, extents); - vadd(bmax, center, extents); + dtVsub(bmin, center, extents); + dtVadd(bmax, center, extents); // Find tiles the query touches. const int minx = (int)floorf((bmin[0]-m_orig[0]) / m_tileWidth); @@ -1298,7 +1298,7 @@ int dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef, dtNode* startNode = m_nodePool->getNode(startRef); startNode->pidx = 0; startNode->cost = 0; - startNode->total = vdist(startPos, endPos) * H_SCALE; + startNode->total = dtVdist(startPos, endPos) * H_SCALE; startNode->id = startRef; startNode->flags = DT_NODE_OPEN; m_openList->push(startNode); @@ -1350,7 +1350,7 @@ int dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef, } else { - vcopy(previousEdgeMidPoint, startPos); + dtVcopy(previousEdgeMidPoint, startPos); } for (unsigned int i = bestPoly->firstLink; i != DT_NULL_LINK; i = bestTile->links[i].next) @@ -1387,8 +1387,8 @@ int dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef, { // Cost newNode.cost = bestNode->cost + - vdist(previousEdgeMidPoint,edgeMidPoint) * m_areaCost[bestPoly->area] + - vdist(edgeMidPoint, endPos) * m_areaCost[neighbourPoly->area]; + dtVdist(previousEdgeMidPoint,edgeMidPoint) * m_areaCost[bestPoly->area] + + dtVdist(edgeMidPoint, endPos) * m_areaCost[neighbourPoly->area]; // Heuristic h = 0; } @@ -1396,9 +1396,9 @@ int dtNavMesh::findPath(dtPolyRef startRef, dtPolyRef endRef, { // Cost newNode.cost = bestNode->cost + - vdist(previousEdgeMidPoint,edgeMidPoint) * m_areaCost[bestPoly->area]; + dtVdist(previousEdgeMidPoint,edgeMidPoint) * m_areaCost[bestPoly->area]; // Heuristic - h = vdist(edgeMidPoint,endPos)*H_SCALE; + h = dtVdist(edgeMidPoint,endPos)*H_SCALE; } newNode.total = newNode.cost + h; @@ -1484,7 +1484,7 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, return 0; // Add start point. - vcopy(&straightPath[straightPathSize*3], closestStartPos); + dtVcopy(&straightPath[straightPathSize*3], closestStartPos); if (straightPathFlags) straightPathFlags[straightPathSize] = DT_STRAIGHTPATH_START; if (straightPathRefs) @@ -1500,9 +1500,9 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, if (pathSize > 1) { float portalApex[3], portalLeft[3], portalRight[3]; - vcopy(portalApex, closestStartPos); - vcopy(portalLeft, portalApex); - vcopy(portalRight, portalApex); + dtVcopy(portalApex, closestStartPos); + dtVcopy(portalLeft, portalApex); + dtVcopy(portalRight, portalApex); int apexIndex = 0; int leftIndex = 0; int rightIndex = 0; @@ -1526,7 +1526,7 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, if (!closestPointOnPolyBoundary(path[i], endPos, closestEndPos)) return 0; - vcopy(&straightPath[straightPathSize*3], closestEndPos); + dtVcopy(&straightPath[straightPathSize*3], closestEndPos); if (straightPathFlags) straightPathFlags[straightPathSize] = 0; if (straightPathRefs) @@ -1547,8 +1547,8 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, else { // End of the path. - vcopy(left, closestEndPos); - vcopy(right, closestEndPos); + dtVcopy(left, closestEndPos); + dtVcopy(right, closestEndPos); fromType = toType = DT_POLYTYPE_GROUND; } @@ -1556,16 +1556,16 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, // Right vertex. if (triArea2D(portalApex, portalRight, right) <= 0.0f) { - if (vequal(portalApex, portalRight) || triArea2D(portalApex, portalLeft, right) > 0.0f) + if (dtVequal(portalApex, portalRight) || triArea2D(portalApex, portalLeft, right) > 0.0f) { - vcopy(portalRight, right); + dtVcopy(portalRight, right); rightPolyRef = (i+1 < pathSize) ? path[i+1] : 0; rightPolyType = toType; rightIndex = i; } else { - vcopy(portalApex, portalLeft); + dtVcopy(portalApex, portalLeft); apexIndex = leftIndex; unsigned char flags = 0; @@ -1575,10 +1575,10 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, flags = DT_STRAIGHTPATH_OFFMESH_CONNECTION; dtPolyRef ref = leftPolyRef; - if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex)) + if (!dtVequal(&straightPath[(straightPathSize-1)*3], portalApex)) { // Append new vertex. - vcopy(&straightPath[straightPathSize*3], portalApex); + dtVcopy(&straightPath[straightPathSize*3], portalApex); if (straightPathFlags) straightPathFlags[straightPathSize] = flags; if (straightPathRefs) @@ -1597,8 +1597,8 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, straightPathRefs[straightPathSize-1] = ref; } - vcopy(portalLeft, portalApex); - vcopy(portalRight, portalApex); + dtVcopy(portalLeft, portalApex); + dtVcopy(portalRight, portalApex); leftIndex = apexIndex; rightIndex = apexIndex; @@ -1612,16 +1612,16 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, // Left vertex. if (triArea2D(portalApex, portalLeft, left) >= 0.0f) { - if (vequal(portalApex, portalLeft) || triArea2D(portalApex, portalRight, left) < 0.0f) + if (dtVequal(portalApex, portalLeft) || triArea2D(portalApex, portalRight, left) < 0.0f) { - vcopy(portalLeft, left); + dtVcopy(portalLeft, left); leftPolyRef = (i+1 < pathSize) ? path[i+1] : 0; leftPolyType = toType; leftIndex = i; } else { - vcopy(portalApex, portalRight); + dtVcopy(portalApex, portalRight); apexIndex = rightIndex; unsigned char flags = 0; @@ -1631,10 +1631,10 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, flags = DT_STRAIGHTPATH_OFFMESH_CONNECTION; dtPolyRef ref = rightPolyRef; - if (!vequal(&straightPath[(straightPathSize-1)*3], portalApex)) + if (!dtVequal(&straightPath[(straightPathSize-1)*3], portalApex)) { // Append new vertex. - vcopy(&straightPath[straightPathSize*3], portalApex); + dtVcopy(&straightPath[straightPathSize*3], portalApex); if (straightPathFlags) straightPathFlags[straightPathSize] = flags; if (straightPathRefs) @@ -1653,8 +1653,8 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, straightPathRefs[straightPathSize-1] = ref; } - vcopy(portalLeft, portalApex); - vcopy(portalRight, portalApex); + dtVcopy(portalLeft, portalApex); + dtVcopy(portalRight, portalApex); leftIndex = apexIndex; rightIndex = apexIndex; @@ -1668,13 +1668,13 @@ int dtNavMesh::findStraightPath(const float* startPos, const float* endPos, } // If the point already exists, remove it and add reappend the actual end location. - if (straightPathSize && vequal(&straightPath[(straightPathSize-1)*3], closestEndPos)) + if (straightPathSize && dtVequal(&straightPath[(straightPathSize-1)*3], closestEndPos)) straightPathSize--; // Add end point. if (straightPathSize < maxStraightPathSize) { - vcopy(&straightPath[straightPathSize*3], closestEndPos); + dtVcopy(&straightPath[straightPathSize*3], closestEndPos); if (straightPathFlags) straightPathFlags[straightPathSize] = DT_STRAIGHTPATH_END; if (straightPathRefs) @@ -1700,7 +1700,7 @@ int dtNavMesh::moveAlongPathCorridor(const float* startPos, const float* endPos, static const float SLOP = 0.01f; - vcopy(resultPos, startPos); + dtVcopy(resultPos, startPos); while (n < pathSize) { @@ -1722,7 +1722,7 @@ int dtNavMesh::moveAlongPathCorridor(const float* startPos, const float* endPos, unsigned char fromType, toType; if (!getPortalPoints(path[n], path[n+1], left, right, fromType, toType)) return n; - vcopy(resultPos, endPos); + dtVcopy(resultPos, endPos); } return n+1; } @@ -1731,7 +1731,7 @@ int dtNavMesh::moveAlongPathCorridor(const float* startPos, const float* endPos, int nv = 0; for (int i = 0; i < (int)poly->vertCount; ++i) { - vcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]); + dtVcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]); nv++; } @@ -1739,7 +1739,7 @@ int dtNavMesh::moveAlongPathCorridor(const float* startPos, const float* endPos, if (inside) { // The end point is inside the current polygon. - vcopy(resultPos, endPos); + dtVcopy(resultPos, endPos); return n; } @@ -1757,7 +1757,7 @@ int dtNavMesh::moveAlongPathCorridor(const float* startPos, const float* endPos, } const float* va = &verts[imin*3]; const float* vb = &verts[((imin+1)%nv)*3]; - vlerp(resultPos, va, vb, edget[imin]); + dtVlerp(resultPos, va, vb, edget[imin]); // Check to see if the point is on the portal edge to the next polygon. if (n+1 >= pathSize) @@ -1767,7 +1767,7 @@ int dtNavMesh::moveAlongPathCorridor(const float* startPos, const float* endPos, unsigned char fromType, toType; if (!getPortalPoints(path[n], path[n+1], left, right, fromType, toType)) return n; - // If the clamped point is close to the next portal edge, advance to next poly. + // If the dtClamped point is close to the next portal edge, advance to next poly. float t; float d = distancePtSegSqr2D(resultPos, left, right, t); if (d > SLOP*SLOP) @@ -1831,8 +1831,8 @@ bool dtNavMesh::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dt if (fromTile->links[i].ref == to) { const int v = fromTile->links[i].edge; - vcopy(left, &fromTile->verts[fromPoly->verts[v]*3]); - vcopy(right, &fromTile->verts[fromPoly->verts[v]*3]); + dtVcopy(left, &fromTile->verts[fromPoly->verts[v]*3]); + dtVcopy(right, &fromTile->verts[fromPoly->verts[v]*3]); return true; } } @@ -1846,8 +1846,8 @@ bool dtNavMesh::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dt if (toTile->links[i].ref == from) { const int v = toTile->links[i].edge; - vcopy(left, &toTile->verts[toPoly->verts[v]*3]); - vcopy(right, &toTile->verts[toPoly->verts[v]*3]); + dtVcopy(left, &toTile->verts[toPoly->verts[v]*3]); + dtVcopy(right, &toTile->verts[toPoly->verts[v]*3]); return true; } } @@ -1857,36 +1857,36 @@ bool dtNavMesh::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dt // Find portal vertices. const int v0 = fromPoly->verts[link->edge]; const int v1 = fromPoly->verts[(link->edge+1) % (int)fromPoly->vertCount]; - vcopy(left, &fromTile->verts[v0*3]); - vcopy(right, &fromTile->verts[v1*3]); + dtVcopy(left, &fromTile->verts[v0*3]); + dtVcopy(right, &fromTile->verts[v1*3]); - // If the link is at tile boundary, clamp the vertices to + // If the link is at tile boundary, dtClamp the vertices to // the link width. if (link->side == 0 || link->side == 4) { // Unpack portal limits. - const float smin = min(left[2],right[2]); - const float smax = max(left[2],right[2]); + const float smin = dtMin(left[2],right[2]); + const float smax = dtMax(left[2],right[2]); const float s = (smax-smin) / 255.0f; const float lmin = smin + link->bmin*s; const float lmax = smin + link->bmax*s; - left[2] = max(left[2],lmin); - left[2] = min(left[2],lmax); - right[2] = max(right[2],lmin); - right[2] = min(right[2],lmax); + left[2] = dtMax(left[2],lmin); + left[2] = dtMin(left[2],lmax); + right[2] = dtMax(right[2],lmin); + right[2] = dtMin(right[2],lmax); } else if (link->side == 2 || link->side == 6) { // Unpack portal limits. - const float smin = min(left[0],right[0]); - const float smax = max(left[0],right[0]); + const float smin = dtMin(left[0],right[0]); + const float smax = dtMax(left[0],right[0]); const float s = (smax-smin) / 255.0f; const float lmin = smin + link->bmin*s; const float lmax = smin + link->bmax*s; - left[0] = max(left[0],lmin); - left[0] = min(left[0],lmax); - right[0] = max(right[0],lmin); - right[0] = min(right[0],lmax); + left[0] = dtMax(left[0],lmin); + left[0] = dtMin(left[0],lmax); + right[0] = dtMax(right[0],lmin); + right[0] = dtMin(right[0],lmax); } return true; @@ -1996,7 +1996,7 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float* int nv = 0; for (int i = 0; i < (int)poly->vertCount; ++i) { - vcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]); + dtVcopy(&verts[nv*3], &tile->verts[poly->verts[i]*3]); nv++; } @@ -2047,8 +2047,8 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float* if (link->side == 0 || link->side == 4) { // Calculate link size. - const float smin = min(left[2],right[2]); - const float smax = max(left[2],right[2]); + const float smin = dtMin(left[2],right[2]); + const float smax = dtMax(left[2],right[2]); const float s = (smax-smin) / 255.0f; const float lmin = smin + link->bmin*s; const float lmax = smin + link->bmax*s; @@ -2063,8 +2063,8 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float* else if (link->side == 2 || link->side == 6) { // Calculate link size. - const float smin = min(left[0],right[0]); - const float smax = max(left[0],right[0]); + const float smin = dtMin(left[0],right[0]); + const float smax = dtMax(left[0],right[0]); const float s = (smax-smin) / 255.0f; const float lmin = smin + link->bmin*s; const float lmax = smin + link->bmax*s; @@ -2093,7 +2093,7 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float* hitNormal[0] = dz; hitNormal[1] = 0; hitNormal[2] = -dx; - vnormalize(hitNormal); + dtVnormalize(hitNormal); return n; } @@ -2136,7 +2136,7 @@ int dtNavMesh::findPolysAround(dtPolyRef centerRef, const float* centerPos, floa ++n; } - const float radiusSqr = sqr(radius); + const float radiusSqr = dtSqr(radius); unsigned int it, ip; @@ -2172,7 +2172,7 @@ int dtNavMesh::findPolysAround(dtPolyRef centerRef, const float* centerPos, floa } else { - vcopy(previousEdgeMidPoint, centerPos); + dtVcopy(previousEdgeMidPoint, centerPos); } for (unsigned int i = bestPoly->firstLink; i != DT_NULL_LINK; i = bestTile->links[i].next) @@ -2211,7 +2211,7 @@ int dtNavMesh::findPolysAround(dtPolyRef centerRef, const float* centerPos, floa getEdgeMidPoint(bestRef, bestPoly, bestTile, neighbourRef, neighbourPoly, neighbourTile, edgeMidPoint); - newNode.total = bestNode->total + vdist(previousEdgeMidPoint, edgeMidPoint); + newNode.total = bestNode->total + dtVdist(previousEdgeMidPoint, edgeMidPoint); dtNode* actualNode = m_nodePool->getNode(newNode.id); if (!actualNode) @@ -2268,7 +2268,7 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos, startNode->flags = DT_NODE_OPEN; m_openList->push(startNode); - float radiusSqr = sqr(maxRadius); + float radiusSqr = dtSqr(maxRadius); unsigned int it, ip; @@ -2304,7 +2304,7 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos, } else { - vcopy(previousEdgeMidPoint, centerPos); + dtVcopy(previousEdgeMidPoint, centerPos); } // Hit test walls. @@ -2387,7 +2387,7 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos, getEdgeMidPoint(bestRef, bestPoly, bestTile, neighbourRef, neighbourPoly, neighbourTile, edgeMidPoint); - newNode.total = bestNode->total + vdist(previousEdgeMidPoint, edgeMidPoint); + newNode.total = bestNode->total + dtVdist(previousEdgeMidPoint, edgeMidPoint); dtNode* actualNode = m_nodePool->getNode(newNode.id); if (!actualNode) @@ -2414,8 +2414,8 @@ float dtNavMesh::findDistanceToWall(dtPolyRef centerRef, const float* centerPos, } // Calc hit normal. - vsub(hitNormal, centerPos, hitPos); - vnormalize(hitNormal); + dtVsub(hitNormal, centerPos, hitPos); + dtVnormalize(hitNormal); return sqrtf(radiusSqr); } diff --git a/Detour/Source/DetourNavMeshBuilder.cpp b/Detour/Source/DetourNavMeshBuilder.cpp index 3a9a7a5..ce9ed47 100644 --- a/Detour/Source/DetourNavMeshBuilder.cpp +++ b/Detour/Source/DetourNavMeshBuilder.cpp @@ -375,8 +375,8 @@ bool dtCreateNavMeshData(dtNavMeshCreateParams* params, unsigned char** outData, header->polyCount = totPolyCount; header->vertCount = totVertCount; header->maxLinkCount = maxLinkCount; - vcopy(header->bmin, params->bmin); - vcopy(header->bmax, params->bmax); + dtVcopy(header->bmin, params->bmin); + dtVcopy(header->bmax, params->bmax); header->detailMeshCount = params->polyCount; header->detailVertCount = uniqueDetailVertCount; header->detailTriCount = params->detailTriCount; @@ -410,8 +410,8 @@ bool dtCreateNavMeshData(dtNavMeshCreateParams* params, unsigned char** outData, { const float* linkv = ¶ms->offMeshConVerts[i*2*3]; float* v = &navVerts[(offMeshVertsBase + n*2)*3]; - vcopy(&v[0], &linkv[0]); - vcopy(&v[3], &linkv[3]); + dtVcopy(&v[0], &linkv[0]); + dtVcopy(&v[3], &linkv[3]); n++; } } @@ -519,8 +519,8 @@ bool dtCreateNavMeshData(dtNavMeshCreateParams* params, unsigned char** outData, con->poly = (unsigned short)(offMeshPolyBase + n); // Copy connection end-points. const float* endPts = ¶ms->offMeshConVerts[i*2*3]; - vcopy(&con->pos[0], &endPts[0]); - vcopy(&con->pos[3], &endPts[3]); + dtVcopy(&con->pos[0], &endPts[0]); + dtVcopy(&con->pos[3], &endPts[3]); con->rad = params->offMeshConRad[i]; con->flags = params->offMeshConDir[i] ? DT_OFFMESH_CON_BIDIR : 0; con->side = offMeshConClass[i*2+1]; diff --git a/Recast/Include/Recast.h b/Recast/Include/Recast.h index 050a772..7c75d9f 100644 --- a/Recast/Include/Recast.h +++ b/Recast/Include/Recast.h @@ -300,61 +300,61 @@ template inline T rcSqr(T a) { return a*a; } template inline T rcClamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); } // Common vector helper functions. -inline void vcross(float* dest, const float* v1, const float* v2) +inline void rcVcross(float* dest, const float* v1, const float* v2) { dest[0] = v1[1]*v2[2] - v1[2]*v2[1]; dest[1] = v1[2]*v2[0] - v1[0]*v2[2]; dest[2] = v1[0]*v2[1] - v1[1]*v2[0]; } -inline float vdot(const float* v1, const float* v2) +inline float rcVdot(const float* v1, const float* v2) { return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; } -inline void vmad(float* dest, const float* v1, const float* v2, const float s) +inline void rcVmad(float* dest, const float* v1, const float* v2, const float s) { dest[0] = v1[0]+v2[0]*s; dest[1] = v1[1]+v2[1]*s; dest[2] = v1[2]+v2[2]*s; } -inline void vadd(float* dest, const float* v1, const float* v2) +inline void rcVadd(float* dest, const float* v1, const float* v2) { dest[0] = v1[0]+v2[0]; dest[1] = v1[1]+v2[1]; dest[2] = v1[2]+v2[2]; } -inline void vsub(float* dest, const float* v1, const float* v2) +inline void rcVsub(float* dest, const float* v1, const float* v2) { dest[0] = v1[0]-v2[0]; dest[1] = v1[1]-v2[1]; dest[2] = v1[2]-v2[2]; } -inline void vmin(float* mn, const float* v) +inline void rcVmin(float* mn, const float* v) { mn[0] = rcMin(mn[0], v[0]); mn[1] = rcMin(mn[1], v[1]); mn[2] = rcMin(mn[2], v[2]); } -inline void vmax(float* mx, const float* v) +inline void rcVmax(float* mx, const float* v) { mx[0] = rcMax(mx[0], v[0]); mx[1] = rcMax(mx[1], v[1]); mx[2] = rcMax(mx[2], v[2]); } -inline void vcopy(float* dest, const float* v) +inline void rcVcopy(float* dest, const float* v) { dest[0] = v[0]; dest[1] = v[1]; dest[2] = v[2]; } -inline float vdist(const float* v1, const float* v2) +inline float rcVdist(const float* v1, const float* v2) { float dx = v2[0] - v1[0]; float dy = v2[1] - v1[1]; @@ -362,7 +362,7 @@ inline float vdist(const float* v1, const float* v2) return sqrtf(dx*dx + dy*dy + dz*dz); } -inline float vdistSqr(const float* v1, const float* v2) +inline float rcVdistSqr(const float* v1, const float* v2) { float dx = v2[0] - v1[0]; float dy = v2[1] - v1[1]; @@ -370,7 +370,7 @@ inline float vdistSqr(const float* v1, const float* v2) return dx*dx + dy*dy + dz*dz; } -inline void vnormalize(float* v) +inline void rcVnormalize(float* v) { float d = 1.0f / sqrtf(rcSqr(v[0]) + rcSqr(v[1]) + rcSqr(v[2])); v[0] *= d; @@ -378,10 +378,10 @@ inline void vnormalize(float* v) v[2] *= d; } -inline bool vequal(const float* p0, const float* p1) +inline bool rcVequal(const float* p0, const float* p1) { static const float thr = rcSqr(1.0f/16384.0f); - const float d = vdistSqr(p0, p1); + const float d = rcVdistSqr(p0, p1); return d < thr; } diff --git a/Recast/Source/Recast.cpp b/Recast/Source/Recast.cpp index f039ed1..9fed737 100644 --- a/Recast/Source/Recast.cpp +++ b/Recast/Source/Recast.cpp @@ -44,13 +44,13 @@ void rcIntArray::resize(int n) void rcCalcBounds(const float* verts, int nv, float* bmin, float* bmax) { // Calculate bounding box. - vcopy(bmin, verts); - vcopy(bmax, verts); + rcVcopy(bmin, verts); + rcVcopy(bmax, verts); for (int i = 1; i < nv; ++i) { const float* v = &verts[i*3]; - vmin(bmin, v); - vmax(bmax, v); + rcVmin(bmin, v); + rcVmax(bmax, v); } } @@ -67,8 +67,8 @@ bool rcCreateHeightfield(rcHeightfield& hf, int width, int height, hf.width = width; hf.height = height; hf.spans = new rcSpan*[hf.width*hf.height]; - vcopy(hf.bmin, bmin); - vcopy(hf.bmax, bmax); + rcVcopy(hf.bmin, bmin); + rcVcopy(hf.bmax, bmax); hf.cs = cs; hf.ch = ch; if (!hf.spans) @@ -80,10 +80,10 @@ bool rcCreateHeightfield(rcHeightfield& hf, int width, int height, 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); + rcVsub(e0, v1, v0); + rcVsub(e1, v2, v0); + rcVcross(norm, e0, e1); + rcVnormalize(norm); } void rcMarkWalkableTriangles(const float walkableSlopeAngle, @@ -141,8 +141,8 @@ bool rcBuildCompactHeightfield(const int walkableHeight, const int walkableClimb chf.walkableHeight = walkableHeight; chf.walkableClimb = walkableClimb; chf.maxRegions = 0; - vcopy(chf.bmin, hf.bmin); - vcopy(chf.bmax, hf.bmax); + rcVcopy(chf.bmin, hf.bmin); + rcVcopy(chf.bmax, hf.bmax); chf.bmax[1] += walkableHeight*hf.ch; chf.cs = hf.cs; chf.ch = hf.ch; diff --git a/Recast/Source/RecastArea.cpp b/Recast/Source/RecastArea.cpp index b937af2..56a7bb2 100644 --- a/Recast/Source/RecastArea.cpp +++ b/Recast/Source/RecastArea.cpp @@ -265,12 +265,12 @@ void rcMarkConvexPolyArea(const float* verts, const int nverts, rcCompactHeightfield& chf) { float bmin[3], bmax[3]; - vcopy(bmin, verts); - vcopy(bmax, verts); + rcVcopy(bmin, verts); + rcVcopy(bmax, verts); for (int i = 1; i < nverts; ++i) { - vmin(bmin, &verts[i*3]); - vmax(bmax, &verts[i*3]); + rcVmin(bmin, &verts[i*3]); + rcVmax(bmax, &verts[i*3]); } bmin[1] = hmin; bmax[1] = hmax; diff --git a/Recast/Source/RecastContour.cpp b/Recast/Source/RecastContour.cpp index 8484e60..1340bcf 100644 --- a/Recast/Source/RecastContour.cpp +++ b/Recast/Source/RecastContour.cpp @@ -565,8 +565,8 @@ bool rcBuildContours(rcCompactHeightfield& chf, rcTimeVal startTime = rcGetPerformanceTimer(); - vcopy(cset.bmin, chf.bmin); - vcopy(cset.bmax, chf.bmax); + rcVcopy(cset.bmin, chf.bmin); + rcVcopy(cset.bmax, chf.bmax); cset.cs = chf.cs; cset.ch = chf.ch; diff --git a/Recast/Source/RecastMesh.cpp b/Recast/Source/RecastMesh.cpp index f74e2f6..2236e5f 100644 --- a/Recast/Source/RecastMesh.cpp +++ b/Recast/Source/RecastMesh.cpp @@ -819,8 +819,8 @@ bool rcBuildPolyMesh(rcContourSet& cset, int nvp, rcPolyMesh& mesh) { rcTimeVal startTime = rcGetPerformanceTimer(); - vcopy(mesh.bmin, cset.bmin); - vcopy(mesh.bmax, cset.bmax); + rcVcopy(mesh.bmin, cset.bmin); + rcVcopy(mesh.bmax, cset.bmax); mesh.cs = cset.cs; mesh.ch = cset.ch; @@ -1125,16 +1125,16 @@ bool rcMergePolyMeshes(rcPolyMesh** meshes, const int nmeshes, rcPolyMesh& mesh) mesh.nvp = meshes[0]->nvp; mesh.cs = meshes[0]->cs; mesh.ch = meshes[0]->ch; - vcopy(mesh.bmin, meshes[0]->bmin); - vcopy(mesh.bmax, meshes[0]->bmax); + rcVcopy(mesh.bmin, meshes[0]->bmin); + rcVcopy(mesh.bmax, meshes[0]->bmax); int maxVerts = 0; int maxPolys = 0; int maxVertsPerMesh = 0; for (int i = 0; i < nmeshes; ++i) { - vmin(mesh.bmin, meshes[i]->bmin); - vmax(mesh.bmax, meshes[i]->bmax); + rcVmin(mesh.bmin, meshes[i]->bmin); + rcVmax(mesh.bmax, meshes[i]->bmax); maxVertsPerMesh = rcMax(maxVertsPerMesh, meshes[i]->nverts); maxVerts += meshes[i]->nverts; maxPolys += meshes[i]->npolys; diff --git a/Recast/Source/RecastMeshDetail.cpp b/Recast/Source/RecastMeshDetail.cpp index 06cabd7..42fe11e 100644 --- a/Recast/Source/RecastMeshDetail.cpp +++ b/Recast/Source/RecastMeshDetail.cpp @@ -90,9 +90,9 @@ static bool circumCircle(const float* p1, const float* p2, const float* p3, static float distPtTri(const float* p, const float* a, const float* b, const float* c) { float v0[3], v1[3], v2[3]; - vsub(v0, c,a); - vsub(v1, b,a); - vsub(v2, p,a); + rcVsub(v0, c,a); + rcVsub(v1, b,a); + rcVsub(v2, p,a); const float dot00 = vdot2(v0, v0); const float dot01 = vdot2(v0, v1); @@ -508,7 +508,7 @@ static bool buildPolyDetail(const float* in, const int nin, nverts = 0; for (int i = 0; i < nin; ++i) - vcopy(&verts[i*3], &in[i*3]); + rcVcopy(&verts[i*3], &in[i*3]); nverts = nin; const float cs = chf.cs; @@ -602,7 +602,7 @@ static bool buildPolyDetail(const float* in, const int nin, { for (int k = nidx-2; k > 0; --k) { - vcopy(&verts[nverts*3], &edge[idx[k]*3]); + rcVcopy(&verts[nverts*3], &edge[idx[k]*3]); hull[nhull++] = nverts; nverts++; } @@ -611,7 +611,7 @@ static bool buildPolyDetail(const float* in, const int nin, { for (int k = 1; k < nidx-1; ++k) { - vcopy(&verts[nverts*3], &edge[idx[k]*3]); + rcVcopy(&verts[nverts*3], &edge[idx[k]*3]); hull[nhull++] = nverts; nverts++; } @@ -645,12 +645,12 @@ static bool buildPolyDetail(const float* in, const int nin, { // Create sample locations in a grid. float bmin[3], bmax[3]; - vcopy(bmin, in); - vcopy(bmax, in); + rcVcopy(bmin, in); + rcVcopy(bmax, in); for (int i = 1; i < nin; ++i) { - vmin(bmin, &in[i*3]); - vmax(bmax, &in[i*3]); + rcVmin(bmin, &in[i*3]); + rcVmax(bmax, &in[i*3]); } int x0 = (int)floorf(bmin[0]/sampleDist); int x1 = (int)ceilf(bmax[0]/sampleDist); @@ -693,7 +693,7 @@ static bool buildPolyDetail(const float* in, const int nin, if (d > bestd) { bestd = d; - vcopy(bestpt,pt); + rcVcopy(bestpt,pt); } } // If the max error is within accepted threshold, stop tesselating. @@ -701,7 +701,7 @@ static bool buildPolyDetail(const float* in, const int nin, break; // Add the new sample point. - vcopy(&verts[nverts*3],bestpt); + rcVcopy(&verts[nverts*3],bestpt); nverts++; // Create new triangulation. @@ -1200,7 +1200,7 @@ bool rcMergePolyMeshDetails(rcPolyMeshDetail** meshes, const int nmeshes, rcPoly for (int k = 0; k < dm->nverts; ++k) { - vcopy(&mesh.verts[mesh.nverts*3], &dm->verts[k*3]); + rcVcopy(&mesh.verts[mesh.nverts*3], &dm->verts[k*3]); mesh.nverts++; } for (int k = 0; k < dm->ntris; ++k) diff --git a/Recast/Source/RecastRasterization.cpp b/Recast/Source/RecastRasterization.cpp index 3f6720f..abc8815 100644 --- a/Recast/Source/RecastRasterization.cpp +++ b/Recast/Source/RecastRasterization.cpp @@ -196,12 +196,12 @@ static void rasterizeTri(const float* v0, const float* v1, const float* v2, const float by = bmax[1] - bmin[1]; // Calculate the bounding box of the triangle. - vcopy(tmin, v0); - vcopy(tmax, v0); - vmin(tmin, v1); - vmin(tmin, v2); - vmax(tmax, v1); - vmax(tmax, v2); + rcVcopy(tmin, v0); + rcVcopy(tmax, v0); + rcVmin(tmin, v1); + rcVmin(tmin, v2); + rcVmax(tmax, v1); + rcVmax(tmax, v2); // If the triangle does not touch the bbox of the heightfield, skip the triagle. if (!overlapBounds(bmin, bmax, tmin, tmax)) @@ -223,9 +223,9 @@ static void rasterizeTri(const float* v0, const float* v1, const float* v2, for (int y = y0; y <= y1; ++y) { // Clip polygon to row. - vcopy(&in[0], v0); - vcopy(&in[1*3], v1); - vcopy(&in[2*3], v2); + rcVcopy(&in[0], v0); + rcVcopy(&in[1*3], v1); + rcVcopy(&in[2*3], v2); int nvrow = 3; const float cz = bmin[2] + y*cs; nvrow = clipPoly(in, nvrow, out, 0, 1, -cz); diff --git a/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast b/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast index c412a5609a6137f705e2f97fff9e705b2928bf51..41a49096c6fd276a6f257ef9570661e711a7b4ec 100755 GIT binary patch delta 116073 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
ACLN0tg(LiQhNU2`n2 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 diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser index c1531ff..93c3689 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.pbxuser @@ -19,7 +19,7 @@ 6BBB4BAE115B649300CF791D /* Sample_TileMesh.cpp:559 */, 6BBB4BBE115B64E600CF791D /* Sample_TileMesh.cpp:592 */, 6BBB4C4C115B7BAD00CF791D /* Sample_TileMesh.cpp:264 */, - 6BF5F32C11759C35000502A6 /* DetourNavMesh.cpp:1977 */, + 6BF5F32C11759C35000502A6 /* DetourNavMesh.cpp:144 */, ); codeSenseManager = 6B8632AA0F78115100E2684A /* Code sense */; executables = ( @@ -319,6 +319,62 @@ 6BF5F3731175AACB000502A6 = 6BF5F3731175AACB000502A6 /* PBXTextBookmark */; 6BF5F3741175AACB000502A6 = 6BF5F3741175AACB000502A6 /* PBXTextBookmark */; 6BF5F3751175AACB000502A6 = 6BF5F3751175AACB000502A6 /* PBXTextBookmark */; + 6BF5F471117644A2000502A6 /* PBXTextBookmark */ = 6BF5F471117644A2000502A6 /* PBXTextBookmark */; + 6BF5F472117644A2000502A6 /* PBXTextBookmark */ = 6BF5F472117644A2000502A6 /* PBXTextBookmark */; + 6BF5F473117644A2000502A6 /* PBXTextBookmark */ = 6BF5F473117644A2000502A6 /* PBXTextBookmark */; + 6BF5F474117644A2000502A6 /* PBXTextBookmark */ = 6BF5F474117644A2000502A6 /* PBXTextBookmark */; + 6BF5F475117644A2000502A6 /* PBXTextBookmark */ = 6BF5F475117644A2000502A6 /* PBXTextBookmark */; + 6BF5F476117644A2000502A6 /* PBXTextBookmark */ = 6BF5F476117644A2000502A6 /* PBXTextBookmark */; + 6BF5F477117644A2000502A6 /* PBXTextBookmark */ = 6BF5F477117644A2000502A6 /* PBXTextBookmark */; + 6BF5F478117644A2000502A6 /* PBXTextBookmark */ = 6BF5F478117644A2000502A6 /* PBXTextBookmark */; + 6BF5F479117644A2000502A6 /* PBXTextBookmark */ = 6BF5F479117644A2000502A6 /* PBXTextBookmark */; + 6BF5F47A117644A2000502A6 /* PBXTextBookmark */ = 6BF5F47A117644A2000502A6 /* PBXTextBookmark */; + 6BF5F47B117644A2000502A6 /* PBXTextBookmark */ = 6BF5F47B117644A2000502A6 /* PBXTextBookmark */; + 6BF5F47C117644A2000502A6 /* PBXTextBookmark */ = 6BF5F47C117644A2000502A6 /* PBXTextBookmark */; + 6BF5F47D117644A2000502A6 /* PBXTextBookmark */ = 6BF5F47D117644A2000502A6 /* PBXTextBookmark */; + 6BF5F47E117644A2000502A6 /* PBXTextBookmark */ = 6BF5F47E117644A2000502A6 /* PBXTextBookmark */; + 6BF5F47F117644A2000502A6 /* PBXTextBookmark */ = 6BF5F47F117644A2000502A6 /* PBXTextBookmark */; + 6BF5F480117644A2000502A6 /* PBXTextBookmark */ = 6BF5F480117644A2000502A6 /* PBXTextBookmark */; + 6BF5F481117644A2000502A6 /* PBXTextBookmark */ = 6BF5F481117644A2000502A6 /* PBXTextBookmark */; + 6BF5F482117644A2000502A6 /* PBXTextBookmark */ = 6BF5F482117644A2000502A6 /* PBXTextBookmark */; + 6BF5F483117644A2000502A6 /* PBXTextBookmark */ = 6BF5F483117644A2000502A6 /* PBXTextBookmark */; + 6BF5F484117644A2000502A6 /* PBXTextBookmark */ = 6BF5F484117644A2000502A6 /* PBXTextBookmark */; + 6BF5F485117644A2000502A6 /* PBXTextBookmark */ = 6BF5F485117644A2000502A6 /* PBXTextBookmark */; + 6BF5F486117644A2000502A6 /* PBXTextBookmark */ = 6BF5F486117644A2000502A6 /* PBXTextBookmark */; + 6BF5F487117644A2000502A6 /* PBXTextBookmark */ = 6BF5F487117644A2000502A6 /* PBXTextBookmark */; + 6BF5F488117644A2000502A6 /* PBXTextBookmark */ = 6BF5F488117644A2000502A6 /* PBXTextBookmark */; + 6BF5F489117644A2000502A6 /* PBXTextBookmark */ = 6BF5F489117644A2000502A6 /* PBXTextBookmark */; + 6BF5F48A117644A2000502A6 /* PBXTextBookmark */ = 6BF5F48A117644A2000502A6 /* PBXTextBookmark */; + 6BF5F48B117644A2000502A6 /* PBXTextBookmark */ = 6BF5F48B117644A2000502A6 /* PBXTextBookmark */; + 6BF5F48C117644A2000502A6 /* PBXTextBookmark */ = 6BF5F48C117644A2000502A6 /* PBXTextBookmark */; + 6BF5F48D117644A2000502A6 /* PBXTextBookmark */ = 6BF5F48D117644A2000502A6 /* PBXTextBookmark */; + 6BF5F48E117644A2000502A6 /* PBXTextBookmark */ = 6BF5F48E117644A2000502A6 /* PBXTextBookmark */; + 6BF5F48F117644A2000502A6 /* PBXTextBookmark */ = 6BF5F48F117644A2000502A6 /* PBXTextBookmark */; + 6BF5F490117644A2000502A6 /* PBXTextBookmark */ = 6BF5F490117644A2000502A6 /* PBXTextBookmark */; + 6BF5F491117644A2000502A6 /* PBXTextBookmark */ = 6BF5F491117644A2000502A6 /* PBXTextBookmark */; + 6BF5F492117644A2000502A6 /* PBXTextBookmark */ = 6BF5F492117644A2000502A6 /* PBXTextBookmark */; + 6BF5F493117644A2000502A6 /* PBXTextBookmark */ = 6BF5F493117644A2000502A6 /* PBXTextBookmark */; + 6BF5F494117644A2000502A6 /* PBXTextBookmark */ = 6BF5F494117644A2000502A6 /* PBXTextBookmark */; + 6BF5F495117644A2000502A6 /* PBXTextBookmark */ = 6BF5F495117644A2000502A6 /* PBXTextBookmark */; + 6BF5F496117644A2000502A6 /* PBXTextBookmark */ = 6BF5F496117644A2000502A6 /* PBXTextBookmark */; + 6BF5F497117644A2000502A6 /* PBXTextBookmark */ = 6BF5F497117644A2000502A6 /* PBXTextBookmark */; + 6BF5F498117644A2000502A6 /* PBXTextBookmark */ = 6BF5F498117644A2000502A6 /* PBXTextBookmark */; + 6BF5F499117644A2000502A6 /* PBXTextBookmark */ = 6BF5F499117644A2000502A6 /* PBXTextBookmark */; + 6BF5F49A117644A2000502A6 /* PBXTextBookmark */ = 6BF5F49A117644A2000502A6 /* PBXTextBookmark */; + 6BF5F49B117644A2000502A6 /* PBXTextBookmark */ = 6BF5F49B117644A2000502A6 /* PBXTextBookmark */; + 6BF5F49C117644A2000502A6 /* PBXTextBookmark */ = 6BF5F49C117644A2000502A6 /* PBXTextBookmark */; + 6BF5F49D117644A2000502A6 /* PBXTextBookmark */ = 6BF5F49D117644A2000502A6 /* PBXTextBookmark */; + 6BF5F49E117644A2000502A6 /* PBXTextBookmark */ = 6BF5F49E117644A2000502A6 /* PBXTextBookmark */; + 6BF5F49F117644A2000502A6 /* PBXTextBookmark */ = 6BF5F49F117644A2000502A6 /* PBXTextBookmark */; + 6BF5F4A0117644A2000502A6 /* PBXTextBookmark */ = 6BF5F4A0117644A2000502A6 /* PBXTextBookmark */; + 6BF5F4A1117644A2000502A6 /* PBXTextBookmark */ = 6BF5F4A1117644A2000502A6 /* PBXTextBookmark */; + 6BF5F4A2117644A2000502A6 /* PBXTextBookmark */ = 6BF5F4A2117644A2000502A6 /* PBXTextBookmark */; + 6BF5F4A3117644A2000502A6 /* PBXTextBookmark */ = 6BF5F4A3117644A2000502A6 /* PBXTextBookmark */; + 6BF5F4A4117644A2000502A6 /* PBXTextBookmark */ = 6BF5F4A4117644A2000502A6 /* PBXTextBookmark */; + 6BF5F4A5117644A2000502A6 /* PBXTextBookmark */ = 6BF5F4A5117644A2000502A6 /* PBXTextBookmark */; + 6BF5F4A6117644A2000502A6 /* PBXTextBookmark */ = 6BF5F4A6117644A2000502A6 /* PBXTextBookmark */; + 6BF5F4A7117644A2000502A6 /* PBXTextBookmark */ = 6BF5F4A7117644A2000502A6 /* PBXTextBookmark */; + 6BF5F4B1117644A2000502A6 /* PBXTextBookmark */ = 6BF5F4B1117644A2000502A6 /* PBXTextBookmark */; }; sourceControlManager = 6B8632A90F78115100E2684A /* Source Control */; userBookmarkGroup = 6B8DE6F010A88F0500DF20FB /* PBXBookmarkGroup */; @@ -349,16 +405,16 @@ }; 6B1185FC10068B040018F96F /* DetourCommon.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 3024}}"; - sepNavSelRange = "{148, 0}"; - sepNavVisRange = "{0, 1063}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 3408}}"; + sepNavSelRange = "{3389, 0}"; + sepNavVisRange = "{3129, 468}"; }; }; 6B1185FD10068B150018F96F /* DetourCommon.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 3728}}"; - sepNavSelRange = "{5828, 0}"; - sepNavVisRange = "{5622, 583}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 4000}}"; + sepNavSelRange = "{5158, 0}"; + sepNavVisRange = "{4839, 694}"; }; }; 6B137C6C0F7FCBBB00459200 /* imgui.cpp */ = { @@ -405,9 +461,9 @@ }; 6B137C7E0F7FCBFE00459200 /* Recast.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 10288}}"; - sepNavSelRange = "{3406, 0}"; - sepNavVisRange = "{3108, 629}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 10976}}"; + sepNavSelRange = "{12739, 0}"; + sepNavVisRange = "{12575, 890}"; }; }; 6B137C800F7FCBFE00459200 /* RecastLog.h */ = { @@ -427,16 +483,16 @@ }; 6B137C820F7FCC1100459200 /* Recast.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 4608}}"; - sepNavSelRange = "{3214, 0}"; - sepNavVisRange = "{3040, 525}"; + sepNavIntBoundsRect = "{{0, 0}, {1034, 4576}}"; + sepNavSelRange = "{6024, 0}"; + sepNavVisRange = "{5556, 1070}"; }; }; 6B137C830F7FCC1100459200 /* RecastContour.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {909, 12864}}"; - sepNavSelRange = "{15251, 0}"; - sepNavVisRange = "{14919, 939}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 12272}}"; + sepNavSelRange = "{14629, 0}"; + sepNavVisRange = "{14302, 603}"; sepNavWindowFrame = "{{38, 30}, {1214, 722}}"; }; }; @@ -457,16 +513,16 @@ }; 6B137C870F7FCC1100459200 /* RecastMesh.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 20016}}"; - sepNavSelRange = "{11515, 0}"; - sepNavVisRange = "{11277, 450}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 19948}}"; + sepNavSelRange = "{20942, 0}"; + sepNavVisRange = "{20593, 527}"; }; }; 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 5360}}"; - sepNavSelRange = "{1159, 0}"; - sepNavVisRange = "{842, 726}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 5612}}"; + sepNavSelRange = "{5843, 0}"; + sepNavVisRange = "{5633, 746}"; }; }; 6B137C890F7FCC1100459200 /* RecastRegion.cpp */ = { @@ -514,9 +570,9 @@ }; 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1223, 18112}}"; - sepNavSelRange = "{12389, 0}"; - sepNavVisRange = "{12187, 761}"; + sepNavIntBoundsRect = "{{0, 0}, {1048, 15468}}"; + sepNavSelRange = "{25328, 0}"; + sepNavVisRange = "{24874, 860}"; sepNavWindowFrame = "{{38, 30}, {1214, 722}}"; }; }; @@ -529,9 +585,9 @@ }; 6B324C65111C5D9A00EBD2FD /* ConvexVolumeTool.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 4208}}"; - sepNavSelRange = "{2134, 0}"; - sepNavVisRange = "{1841, 593}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 4340}}"; + sepNavSelRange = "{5379, 0}"; + sepNavVisRange = "{5919, 795}"; }; }; 6B555DAE100B211D00247EA3 /* imguiRenderGL.h */ = { @@ -557,9 +613,9 @@ }; 6B624169103434880002E346 /* RecastMeshDetail.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 19584}}"; - sepNavSelRange = "{22234, 0}"; - sepNavVisRange = "{21816, 592}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 19608}}"; + sepNavSelRange = "{16693, 0}"; + sepNavVisRange = "{16259, 695}"; sepNavWindowFrame = "{{61, 36}, {1011, 695}}"; }; }; @@ -572,9 +628,9 @@ }; 6B8036AD113BAABE005ED67B /* Sample_Debug.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {909, 3436}}"; - sepNavSelRange = "{1298, 59}"; - sepNavVisRange = "{1188, 420}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 3536}}"; + sepNavSelRange = "{3931, 0}"; + sepNavVisRange = "{3571, 825}"; }; }; 6B8632970F78114600E2684A /* Recast */ = { @@ -584,7 +640,7 @@ argumentStrings = ( ); autoAttachOnCrash = 1; - breakpointsEnabled = 1; + breakpointsEnabled = 0; configStateDict = { }; customDataFormattersEnabled = 1; @@ -628,17 +684,17 @@ }; 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {909, 39840}}"; - sepNavSelRange = "{55744, 0}"; - sepNavVisRange = "{55411, 1075}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 39936}}"; + sepNavSelRange = "{37873, 0}"; + sepNavVisRange = "{37368, 703}"; sepNavWindowFrame = "{{15, 51}, {1214, 722}}"; }; }; 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {909, 11680}}"; - sepNavSelRange = "{16766, 0}"; - sepNavVisRange = "{19240, 698}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 10848}}"; + sepNavSelRange = "{11979, 0}"; + sepNavVisRange = "{11498, 732}"; }; }; 6B8DE88B10B69E4C00DF20FB /* DetourNavMesh.h */ = { @@ -667,16 +723,16 @@ }; 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {909, 11664}}"; - sepNavSelRange = "{2277, 116}"; - sepNavVisRange = "{1992, 599}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 11308}}"; + sepNavSelRange = "{19258, 0}"; + sepNavVisRange = "{18776, 907}"; }; }; 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {909, 19856}}"; - sepNavSelRange = "{5056, 0}"; - sepNavVisRange = "{2030, 813}"; + sepNavIntBoundsRect = "{{0, 0}, {1006, 18732}}"; + sepNavSelRange = "{32437, 0}"; + sepNavVisRange = "{31955, 907}"; }; }; 6BA1E88E10C7BFD3008007F6 /* Sample_SoloMeshSimple.h */ = { @@ -716,9 +772,9 @@ }; 6BB7FC0A10EBB6AA006DA0A6 /* NavMeshTesterTool.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1195, 15296}}"; - sepNavSelRange = "{16316, 0}"; - sepNavVisRange = "{16266, 230}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 15328}}"; + sepNavSelRange = "{9634, 0}"; + sepNavVisRange = "{9406, 745}"; }; }; 6BB7FDA310F36EFC006DA0A6 /* InputGeom.h */ = { @@ -730,9 +786,9 @@ }; 6BB7FDA410F36F0E006DA0A6 /* InputGeom.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 7008}}"; - sepNavSelRange = "{10873, 0}"; - sepNavVisRange = "{10414, 708}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 7188}}"; + sepNavSelRange = "{7189, 0}"; + sepNavVisRange = "{7211, 531}"; }; }; 6BB93C7710CFE1D500F74F2B /* DebugDraw.h */ = { @@ -797,7 +853,7 @@ fRef = 6B1185FD10068B150018F96F /* DetourCommon.cpp */; name = "DetourCommon.cpp: 226"; rLen = 0; - rLoc = 5828; + rLoc = 5869; rType = 0; vrLen = 583; vrLoc = 5622; @@ -897,7 +953,7 @@ fRef = 6BB7FDA410F36F0E006DA0A6 /* InputGeom.cpp */; name = "InputGeom.cpp: 426"; rLen = 0; - rLoc = 10873; + rLoc = 10905; rType = 0; vrLen = 708; vrLoc = 10414; @@ -1057,7 +1113,7 @@ fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; name = "Recast.cpp: 121"; rLen = 0; - rLoc = 3214; + rLoc = 3234; rType = 0; vrLen = 525; vrLoc = 3040; @@ -1107,7 +1163,7 @@ fRef = 6BF7C4531115C277002B3F46 /* RecastArea.cpp */; name = "RecastArea.cpp: 303"; rLen = 0; - rLoc = 8512; + rLoc = 8520; rType = 0; vrLen = 628; vrLoc = 8137; @@ -1137,7 +1193,7 @@ fRef = 6B624169103434880002E346 /* RecastMeshDetail.cpp */; name = "RecastMeshDetail.cpp: 928"; rLen = 0; - rLoc = 22234; + rLoc = 22258; rType = 0; vrLen = 592; vrLoc = 21816; @@ -1197,7 +1253,7 @@ fRef = 6B1185FD10068B150018F96F /* DetourCommon.cpp */; name = "DetourCommon.cpp: 231"; rLen = 0; - rLoc = 5890; + rLoc = 5931; rType = 0; vrLen = 583; vrLoc = 5622; @@ -1317,7 +1373,7 @@ fRef = 6BB7FDA410F36F0E006DA0A6 /* InputGeom.cpp */; name = "InputGeom.cpp: 426"; rLen = 0; - rLoc = 10873; + rLoc = 10905; rType = 0; vrLen = 708; vrLoc = 10414; @@ -1427,7 +1483,7 @@ fRef = 6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */; name = "OffMeshConnectionTool.cpp: 122"; rLen = 0; - rLoc = 2934; + rLoc = 2938; rType = 0; vrLen = 449; vrLoc = 2809; @@ -1497,7 +1553,7 @@ fRef = 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */; name = "Sample_SoloMeshSimple.cpp: 485"; rLen = 0; - rLoc = 15301; + rLoc = 15305; rType = 0; vrLen = 753; vrLoc = 14781; @@ -1567,7 +1623,7 @@ fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; name = "Recast.cpp: 121"; rLen = 0; - rLoc = 3214; + rLoc = 3234; rType = 0; vrLen = 525; vrLoc = 3040; @@ -1617,7 +1673,7 @@ fRef = 6BF7C4531115C277002B3F46 /* RecastArea.cpp */; name = "RecastArea.cpp: 303"; rLen = 0; - rLoc = 8512; + rLoc = 8520; rType = 0; vrLen = 628; vrLoc = 8137; @@ -1637,7 +1693,7 @@ fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; name = "RecastContour.cpp: 604"; rLen = 0; - rLoc = 15425; + rLoc = 15429; rType = 0; vrLen = 681; vrLoc = 15076; @@ -1657,7 +1713,7 @@ fRef = 6B624169103434880002E346 /* RecastMeshDetail.cpp */; name = "RecastMeshDetail.cpp: 928"; rLen = 0; - rLoc = 22234; + rLoc = 22258; rType = 0; vrLen = 592; vrLoc = 21816; @@ -1677,7 +1733,7 @@ fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; name = "DetourNavMeshBuilder.cpp: 596"; rLen = 0; - rLoc = 16766; + rLoc = 16778; rType = 0; vrLen = 698; vrLoc = 19240; @@ -1707,7 +1763,7 @@ fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; name = "DetourNavMeshBuilder.cpp: 596"; rLen = 0; - rLoc = 16766; + rLoc = 16778; rType = 0; vrLen = 698; vrLoc = 19240; @@ -1806,9 +1862,9 @@ }; 6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {909, 2704}}"; - sepNavSelRange = "{2909, 0}"; - sepNavVisRange = "{2592, 670}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 2728}}"; + sepNavSelRange = "{2918, 0}"; + sepNavVisRange = "{2872, 504}"; }; }; 6BED8AE2117451EB00582F38 /* PBXTextBookmark */ = { @@ -1826,7 +1882,7 @@ fRef = 6BB7FC0A10EBB6AA006DA0A6 /* NavMeshTesterTool.cpp */; name = "NavMeshTesterTool.cpp: 896"; rLen = 0; - rLoc = 25264; + rLoc = 25324; rType = 0; vrLen = 989; vrLoc = 24647; @@ -1836,7 +1892,7 @@ fRef = 6BB7FC0A10EBB6AA006DA0A6 /* NavMeshTesterTool.cpp */; name = "NavMeshTesterTool.cpp: 896"; rLen = 0; - rLoc = 25264; + rLoc = 25324; rType = 0; vrLen = 989; vrLoc = 24647; @@ -1846,7 +1902,7 @@ fRef = 6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */; name = "OffMeshConnectionTool.cpp: 120"; rLen = 0; - rLoc = 2909; + rLoc = 2911; rType = 0; vrLen = 670; vrLoc = 2592; @@ -1856,7 +1912,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 1635"; rLen = 0; - rLoc = 44290; + rLoc = 3950; rType = 0; vrLen = 1130; vrLoc = 43415; @@ -1955,6 +2011,11 @@ name = glimage.h; path = /Users/memon/Code/recastnavigation/Backups/Backup_slideshow/Include/glimage.h; sourceTree = ""; + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1155, 592}}"; + sepNavSelRange = "{419, 71}"; + sepNavVisRange = "{0, 495}"; + }; }; 6BF5F2C511747E9F000502A6 /* stb_image.h */ = { uiCtxt = { @@ -2015,7 +2076,7 @@ fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; name = "RecastContour.cpp: 596"; rLen = 0; - rLoc = 15251; + rLoc = 15255; rType = 0; vrLen = 939; vrLoc = 14919; @@ -2165,7 +2226,7 @@ fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; name = "RecastContour.cpp: 596"; rLen = 0; - rLoc = 15251; + rLoc = 15255; rType = 0; vrLen = 939; vrLoc = 14919; @@ -2205,7 +2266,7 @@ fRef = 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */; name = "Sample_SoloMeshSimple.cpp: 682"; rLen = 0; - rLoc = 22915; + rLoc = 22923; rType = 0; vrLen = 3066; vrLoc = 19865; @@ -2260,7 +2321,7 @@ vrLen = 845; vrLoc = 920; }; - 6BF5F32C11759C35000502A6 /* DetourNavMesh.cpp:1977 */ = { + 6BF5F32C11759C35000502A6 /* DetourNavMesh.cpp:144 */ = { isa = PBXFileBreakpoint; actions = ( ); @@ -2272,7 +2333,7 @@ functionName = "dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float* endPos, dtQueryFilter* filter, float& t, float* hitNormal, dtPolyRef* path, const int pathSize)"; hitCount = 1; ignoreCount = 0; - lineNumber = 1977; + lineNumber = 144; location = Recast; modificationTime = 292920411.683684; state = 1; @@ -2332,7 +2393,7 @@ fRef = 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */; name = "Sample_SoloMeshTiled.cpp: 202"; rLen = 0; - rLoc = 5056; + rLoc = 5058; rType = 0; vrLen = 813; vrLoc = 2030; @@ -2342,7 +2403,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 541"; rLen = 0; - rLoc = 12389; + rLoc = 12393; rType = 0; vrLen = 761; vrLoc = 12187; @@ -2372,7 +2433,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 356"; rLen = 0; - rLoc = 7960; + rLoc = 7962; rType = 0; vrLen = 627; vrLoc = 7665; @@ -2432,7 +2493,7 @@ fRef = 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */; name = "Sample_SoloMeshSimple.cpp: 694"; rLen = 78; - rLoc = 23060; + rLoc = 23068; rType = 0; vrLen = 2687; vrLoc = 20503; @@ -2502,7 +2563,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 160"; rLen = 0; - rLoc = 3719; + rLoc = 3721; rType = 0; vrLen = 457; vrLoc = 3512; @@ -2522,7 +2583,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 160"; rLen = 0; - rLoc = 3718; + rLoc = 3720; rType = 0; vrLen = 545; vrLoc = 3512; @@ -2552,7 +2613,7 @@ fRef = 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */; name = "Sample_SoloMeshTiled.cpp: 202"; rLen = 0; - rLoc = 5056; + rLoc = 5058; rType = 0; vrLen = 781; vrLoc = 4621; @@ -2562,7 +2623,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 596"; rLen = 0; - rLoc = 13811; + rLoc = 13815; rType = 0; vrLen = 719; vrLoc = 13666; @@ -2572,7 +2633,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 1638"; rLen = 0; - rLoc = 44466; + rLoc = 3950; rType = 0; vrLen = 793; vrLoc = 1565; @@ -2582,7 +2643,7 @@ fRef = 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */; name = "Sample_SoloMeshTiled.cpp: 202"; rLen = 0; - rLoc = 5056; + rLoc = 5058; rType = 0; vrLen = 813; vrLoc = 2030; @@ -2592,7 +2653,7 @@ fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; name = "Sample_TileMesh.cpp: 541"; rLen = 0; - rLoc = 12389; + rLoc = 12393; rType = 0; vrLen = 761; vrLoc = 12187; @@ -2602,7 +2663,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 2030"; rLen = 0; - rLoc = 55847; + rLoc = 3950; rType = 0; vrLen = 1059; vrLoc = 55387; @@ -2622,7 +2683,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 1842"; rLen = 0; - rLoc = 50384; + rLoc = 3950; rType = 0; vrLen = 959; vrLoc = 50928; @@ -2642,7 +2703,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 1990"; rLen = 0; - rLoc = 54904; + rLoc = 3950; rType = 0; vrLen = 751; vrLoc = 54164; @@ -2662,7 +2723,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 1990"; rLen = 0; - rLoc = 54904; + rLoc = 3950; rType = 0; vrLen = 751; vrLoc = 54164; @@ -2682,7 +2743,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 1990"; rLen = 0; - rLoc = 54871; + rLoc = 3950; rType = 0; vrLen = 751; vrLoc = 54164; @@ -2702,7 +2763,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 359"; rLen = 0; - rLoc = 9870; + rLoc = 3950; rType = 0; vrLen = 938; vrLoc = 9425; @@ -2722,7 +2783,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 2001"; rLen = 0; - rLoc = 55194; + rLoc = 3950; rType = 0; vrLen = 1077; vrLoc = 55436; @@ -2761,8 +2822,8 @@ isa = PBXTextBookmark; fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 2034"; - rLen = 4; - rLoc = 55843; + rLen = 0; + rLoc = 3950; rType = 0; vrLen = 832; vrLoc = 55510; @@ -2792,7 +2853,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 2040"; rLen = 0; - rLoc = 55744; + rLoc = 3950; rType = 0; vrLen = 1075; vrLoc = 55411; @@ -2822,7 +2883,7 @@ fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; name = "DetourNavMesh.cpp: 2040"; rLen = 0; - rLoc = 55744; + rLoc = 3950; rType = 0; vrLen = 1075; vrLoc = 55411; @@ -2874,6 +2935,564 @@ path = /Users/memon/Code/recastnavigation/Backups/Backup_slideshow/Include/glimage.h; sourceTree = ""; }; + 6BF5F471117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB93C7A10CFE1D500F74F2B /* DebugDraw.cpp */; + name = "DebugDraw.cpp: 68"; + rLen = 0; + rLoc = 2304; + rType = 0; + vrLen = 1196; + vrLoc = 2054; + }; + 6BF5F472117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 384"; + rLen = 0; + rLoc = 12739; + rType = 0; + vrLen = 890; + vrLoc = 12575; + }; + 6BF5F473117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 223"; + rLen = 0; + rLoc = 6024; + rType = 0; + vrLen = 1070; + vrLoc = 5556; + }; + 6BF5F474117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB7FDA410F36F0E006DA0A6 /* InputGeom.cpp */; + name = "InputGeom.cpp: 292"; + rLen = 0; + rLoc = 7189; + rType = 0; + vrLen = 519; + vrLoc = 7170; + }; + 6BF5F475117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */; + name = "OffMeshConnectionTool.cpp: 121"; + rLen = 0; + rLoc = 2918; + rType = 0; + vrLen = 463; + vrLoc = 2866; + }; + 6BF5F476117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BF7C13F1111953A002B3F46 /* TestCase.cpp */; + name = "TestCase.cpp: 289"; + rLen = 0; + rLoc = 6946; + rType = 0; + vrLen = 750; + vrLoc = 7612; + }; + 6BF5F477117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BF7C4531115C277002B3F46 /* RecastArea.cpp */; + name = "RecastArea.cpp: 276"; + rLen = 0; + rLoc = 7726; + rType = 0; + vrLen = 502; + vrLoc = 8390; + }; + 6BF5F478117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B324C65111C5D9A00EBD2FD /* ConvexVolumeTool.cpp */; + name = "ConvexVolumeTool.cpp: 220"; + rLen = 0; + rLoc = 5379; + rType = 0; + vrLen = 798; + vrLoc = 5916; + }; + 6BF5F479117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8036AD113BAABE005ED67B /* Sample_Debug.cpp */; + name = "Sample_Debug.cpp: 162"; + rLen = 0; + rLoc = 3931; + rType = 0; + vrLen = 825; + vrLoc = 3571; + }; + 6BF5F47A117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */; + name = "Sample_SoloMeshSimple.cpp: 626"; + rLen = 0; + rLoc = 19258; + rType = 0; + vrLen = 837; + vrLoc = 18776; + }; + 6BF5F47B117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B624169103434880002E346 /* RecastMeshDetail.cpp */; + name = "RecastMeshDetail.cpp: 696"; + rLen = 0; + rLoc = 16693; + rType = 0; + vrLen = 646; + vrLoc = 16259; + }; + 6BF5F47C117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; + name = "Sample_TileMesh.cpp: 964"; + rLen = 0; + rLoc = 25328; + rType = 0; + vrLen = 830; + vrLoc = 24874; + }; + 6BF5F47D117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; + name = "RecastRasterization.cpp: 228"; + rLen = 0; + rLoc = 5843; + rType = 0; + vrLen = 701; + vrLoc = 5633; + }; + 6BF5F47E117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C870F7FCC1100459200 /* RecastMesh.cpp */; + name = "RecastMesh.cpp: 823"; + rLen = 0; + rLoc = 20942; + rType = 0; + vrLen = 524; + vrLoc = 20593; + }; + 6BF5F47F117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 569"; + rLen = 0; + rLoc = 14629; + rType = 0; + vrLen = 603; + vrLoc = 14302; + }; + 6BF5F480117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */; + name = "Sample_SoloMeshTiled.cpp: 1085"; + rLen = 0; + rLoc = 32437; + rType = 0; + vrLen = 837; + vrLoc = 31955; + }; + 6BF5F481117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB7FC0A10EBB6AA006DA0A6 /* NavMeshTesterTool.cpp */; + name = "NavMeshTesterTool.cpp: 361"; + rLen = 0; + rLoc = 9634; + rType = 0; + vrLen = 745; + vrLoc = 9406; + }; + 6BF5F482117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 118"; + rLen = 0; + rLoc = 3389; + rType = 0; + vrLen = 468; + vrLoc = 3129; + }; + 6BF5F483117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 414"; + rLen = 0; + rLoc = 11979; + rType = 0; + vrLen = 732; + vrLoc = 11498; + }; + 6BF5F484117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FD10068B150018F96F /* DetourCommon.cpp */; + name = "DetourCommon.cpp: 205"; + rLen = 0; + rLoc = 5158; + rType = 0; + vrLen = 694; + vrLoc = 4839; + }; + 6BF5F485117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + comments = "error: 'vdist' was not declared in this scope"; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + rLen = 1; + rLoc = 1400; + rType = 1; + }; + 6BF5F486117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB93C7A10CFE1D500F74F2B /* DebugDraw.cpp */; + name = "DebugDraw.cpp: 68"; + rLen = 0; + rLoc = 2304; + rType = 0; + vrLen = 1196; + vrLoc = 2054; + }; + 6BF5F487117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1434"; + rLen = 0; + rLoc = 3950; + rType = 0; + vrLen = 757; + vrLoc = 38453; + }; + 6BF5F488117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C7E0F7FCBFE00459200 /* Recast.h */; + name = "Recast.h: 384"; + rLen = 0; + rLoc = 12739; + rType = 0; + vrLen = 890; + vrLoc = 12575; + }; + 6BF5F489117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C820F7FCC1100459200 /* Recast.cpp */; + name = "Recast.cpp: 223"; + rLen = 0; + rLoc = 6024; + rType = 0; + vrLen = 1070; + vrLoc = 5556; + }; + 6BF5F48A117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 568"; + rLen = 0; + rLoc = 14572; + rType = 0; + vrLen = 569; + vrLoc = 14318; + }; + 6BF5F48B117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C870F7FCC1100459200 /* RecastMesh.cpp */; + name = "RecastMesh.cpp: 1137"; + rLen = 0; + rLoc = 29099; + rType = 0; + vrLen = 830; + vrLoc = 30056; + }; + 6BF5F48C117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; + name = "RecastRasterization.cpp: 204"; + rLen = 0; + rLoc = 5144; + rType = 0; + vrLen = 828; + vrLoc = 9067; + }; + 6BF5F48D117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; + name = "Sample_TileMesh.cpp: 696"; + rLen = 0; + rLoc = 17086; + rType = 0; + vrLen = 1038; + vrLoc = 16714; + }; + 6BF5F48E117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B624169103434880002E346 /* RecastMeshDetail.cpp */; + name = "RecastMeshDetail.cpp: 1203"; + rLen = 57; + rLoc = 29424; + rType = 0; + vrLen = 684; + vrLoc = 29073; + }; + 6BF5F48F117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */; + name = "Sample_SoloMeshSimple.cpp: 374"; + rLen = 0; + rLoc = 11354; + rType = 0; + vrLen = 1078; + vrLoc = 10840; + }; + 6BF5F490117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */; + name = "Sample_SoloMeshTiled.cpp: 720"; + rLen = 0; + rLoc = 20934; + rType = 0; + vrLen = 992; + vrLoc = 20465; + }; + 6BF5F491117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB7FC0A10EBB6AA006DA0A6 /* NavMeshTesterTool.cpp */; + name = "NavMeshTesterTool.cpp: 343"; + rLen = 41; + rLoc = 9088; + rType = 0; + vrLen = 668; + vrLoc = 8760; + }; + 6BF5F492117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB7FDA410F36F0E006DA0A6 /* InputGeom.cpp */; + name = "InputGeom.cpp: 292"; + rLen = 0; + rLoc = 7189; + rType = 0; + vrLen = 519; + vrLoc = 7170; + }; + 6BF5F493117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */; + name = "OffMeshConnectionTool.cpp: 121"; + rLen = 0; + rLoc = 2918; + rType = 0; + vrLen = 463; + vrLoc = 2866; + }; + 6BF5F494117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BF7C13F1111953A002B3F46 /* TestCase.cpp */; + name = "TestCase.cpp: 289"; + rLen = 0; + rLoc = 6946; + rType = 0; + vrLen = 750; + vrLoc = 7612; + }; + 6BF5F495117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BF7C4531115C277002B3F46 /* RecastArea.cpp */; + name = "RecastArea.cpp: 276"; + rLen = 0; + rLoc = 7726; + rType = 0; + vrLen = 502; + vrLoc = 8390; + }; + 6BF5F496117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B324C65111C5D9A00EBD2FD /* ConvexVolumeTool.cpp */; + name = "ConvexVolumeTool.cpp: 220"; + rLen = 0; + rLoc = 5379; + rType = 0; + vrLen = 798; + vrLoc = 5916; + }; + 6BF5F497117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8036AD113BAABE005ED67B /* Sample_Debug.cpp */; + name = "Sample_Debug.cpp: 162"; + rLen = 0; + rLoc = 3931; + rType = 0; + vrLen = 825; + vrLoc = 3571; + }; + 6BF5F498117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB7FC0A10EBB6AA006DA0A6 /* NavMeshTesterTool.cpp */; + name = "NavMeshTesterTool.cpp: 328"; + rLen = 0; + rLoc = 8564; + rType = 0; + vrLen = 913; + vrLoc = 8125; + }; + 6BF5F499117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */; + name = "Sample_SoloMeshTiled.cpp: 740"; + rLen = 0; + rLoc = 21558; + rType = 0; + vrLen = 802; + vrLoc = 21238; + }; + 6BF5F49A117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BA1E88810C7BFC9008007F6 /* Sample_SoloMeshSimple.cpp */; + name = "Sample_SoloMeshSimple.cpp: 626"; + rLen = 0; + rLoc = 19258; + rType = 0; + vrLen = 837; + vrLoc = 18776; + }; + 6BF5F49B117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B624169103434880002E346 /* RecastMeshDetail.cpp */; + name = "RecastMeshDetail.cpp: 696"; + rLen = 0; + rLoc = 16693; + rType = 0; + vrLen = 646; + vrLoc = 16259; + }; + 6BF5F49C117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B2AEC520FFB8958005BE9CC /* Sample_TileMesh.cpp */; + name = "Sample_TileMesh.cpp: 964"; + rLen = 0; + rLoc = 25328; + rType = 0; + vrLen = 830; + vrLoc = 24874; + }; + 6BF5F49D117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C880F7FCC1100459200 /* RecastRasterization.cpp */; + name = "RecastRasterization.cpp: 228"; + rLen = 0; + rLoc = 5843; + rType = 0; + vrLen = 701; + vrLoc = 5633; + }; + 6BF5F49E117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C870F7FCC1100459200 /* RecastMesh.cpp */; + name = "RecastMesh.cpp: 823"; + rLen = 0; + rLoc = 20942; + rType = 0; + vrLen = 524; + vrLoc = 20593; + }; + 6BF5F49F117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B137C830F7FCC1100459200 /* RecastContour.cpp */; + name = "RecastContour.cpp: 569"; + rLen = 0; + rLoc = 14629; + rType = 0; + vrLen = 603; + vrLoc = 14302; + }; + 6BF5F4A0117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BA1E88910C7BFC9008007F6 /* Sample_SoloMeshTiled.cpp */; + name = "Sample_SoloMeshTiled.cpp: 1085"; + rLen = 0; + rLoc = 32437; + rType = 0; + vrLen = 837; + vrLoc = 31955; + }; + 6BF5F4A1117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BB7FC0A10EBB6AA006DA0A6 /* NavMeshTesterTool.cpp */; + name = "NavMeshTesterTool.cpp: 361"; + rLen = 0; + rLoc = 9634; + rType = 0; + vrLen = 745; + vrLoc = 9406; + }; + 6BF5F4A2117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 118"; + rLen = 0; + rLoc = 3391; + rType = 0; + vrLen = 468; + vrLoc = 3129; + }; + 6BF5F4A3117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 379"; + rLen = 0; + rLoc = 10725; + rType = 0; + vrLen = 928; + vrLoc = 10307; + }; + 6BF5F4A4117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FC10068B040018F96F /* DetourCommon.h */; + name = "DetourCommon.h: 118"; + rLen = 0; + rLoc = 3389; + rType = 0; + vrLen = 468; + vrLoc = 3129; + }; + 6BF5F4A5117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88810B69E3E00DF20FB /* DetourNavMeshBuilder.cpp */; + name = "DetourNavMeshBuilder.cpp: 414"; + rLen = 0; + rLoc = 11979; + rType = 0; + vrLen = 732; + vrLoc = 11498; + }; + 6BF5F4A6117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B1185FD10068B150018F96F /* DetourCommon.cpp */; + name = "DetourCommon.cpp: 205"; + rLen = 0; + rLoc = 5158; + rType = 0; + vrLen = 694; + vrLoc = 4839; + }; + 6BF5F4A7117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6B8DE88710B69E3E00DF20FB /* DetourNavMesh.cpp */; + name = "DetourNavMesh.cpp: 1396"; + rLen = 0; + rLoc = 37873; + rType = 0; + vrLen = 703; + vrLoc = 37368; + }; + 6BF5F4B1117644A2000502A6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 6BF5F2B911747E6F000502A6 /* glimage.h */; + name = "glimage.h: 30"; + rLen = 71; + rLoc = 419; + rType = 0; + vrLen = 495; + vrLoc = 0; + }; 6BF7C13E11119520002B3F46 /* TestCase.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {815, 1264}}"; @@ -2883,16 +3502,16 @@ }; 6BF7C13F1111953A002B3F46 /* TestCase.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 5232}}"; - sepNavSelRange = "{1047, 0}"; - sepNavVisRange = "{446, 731}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 5080}}"; + sepNavSelRange = "{6946, 0}"; + sepNavVisRange = "{8025, 337}"; }; }; 6BF7C4531115C277002B3F46 /* RecastArea.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {815, 5216}}"; - sepNavSelRange = "{8512, 0}"; - sepNavVisRange = "{8137, 628}"; + sepNavIntBoundsRect = "{{0, 0}, {909, 5316}}"; + sepNavSelRange = "{7726, 0}"; + sepNavVisRange = "{8604, 288}"; }; }; 8D1107260486CEB800E47090 /* Recast */ = { diff --git a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 index 309c3a0..a6477e0 100644 --- a/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 +++ b/RecastDemo/Build/Xcode/Recast.xcodeproj/memon.perspectivev3 @@ -216,10 +216,10 @@ _historyCapacity 0 bookmark - 6BF5F3751175AACB000502A6 + 6BF5F4B1117644A2000502A6 history - 6BF5F2B811747E6F000502A6 + 6BF5F3751175AACB000502A6 SplitCount @@ -323,8 +323,8 @@ PBXSmartGroupTreeModuleOutlineStateSelectionKey - 5 - 2 + 18 + 11 1 0 @@ -365,7 +365,7 @@ PBXProjectModuleGUID 6B8632A30F78115100E2684A PBXProjectModuleLabel - DebugDraw.cpp + DetourNavMesh.cpp PBXSplitModuleInNavigatorKey Split0 @@ -373,23 +373,19 @@ PBXProjectModuleGUID 6B8632A40F78115100E2684A PBXProjectModuleLabel - DebugDraw.cpp + DetourNavMesh.cpp _historyCapacity 0 bookmark - 6BF5F3741175AACB000502A6 + 6BF5F4A7117644A2000502A6 history - 6BBB4A94115B4F3400CF791D - 6BBB4A95115B4F3400CF791D 6BBB4A96115B4F3400CF791D 6BBB4A99115B4F3400CF791D 6BBB4A9A115B4F3400CF791D 6BBB4A9B115B4F3400CF791D 6BBB4A9E115B4F3400CF791D - 6BBB4AA0115B4F3400CF791D 6BBB4AA1115B4F3400CF791D - 6BBB4AA2115B4F3400CF791D 6BBB4AA3115B4F3400CF791D 6BBB4AA4115B4F3400CF791D 6BBB4AA5115B4F3400CF791D @@ -397,39 +393,27 @@ 6BBB4AA7115B4F3400CF791D 6BBB4AAB115B4F3400CF791D 6BBB4AB0115B4F3400CF791D - 6BBB4AB1115B4F3400CF791D 6BBB4AB2115B4F3400CF791D 6BBB4AB3115B4F3400CF791D 6BBB4AB4115B4F3400CF791D 6BBB4ABB115B4F3400CF791D - 6BBB4ABD115B4F3400CF791D 6BBB4ABE115B4F3400CF791D 6BBB4ABF115B4F3400CF791D - 6BBB4AC0115B4F3400CF791D 6BBB4AC1115B4F3400CF791D 6BBB4AC2115B4F3400CF791D - 6BBB4AC3115B4F3400CF791D 6BBB4AC4115B4F3400CF791D - 6BBB4AC5115B4F3400CF791D 6BBB4AC6115B4F3400CF791D - 6BBB4AC8115B4F3400CF791D - 6BBB4AC9115B4F3400CF791D 6BBB4ACB115B4F3400CF791D 6BBB4ACD115B4F3400CF791D - 6BBB4B7A115B639200CF791D - 6BBB4B7D115B639200CF791D 6BBB4B7F115B639200CF791D 6BBB4C34115B7A3D00CF791D 6BED8AE2117451EB00582F38 - 6BED8AEE117455CB00582F38 - 6BED8AF21174567000582F38 6BF5F27011747CFA000502A6 6BF5F27311747CFA000502A6 6BF5F2E411748884000502A6 6BF5F2E511748884000502A6 6BF5F2E611748884000502A6 6BF5F2E711748884000502A6 - 6BF5F2E911748884000502A6 6BF5F2EA11748884000502A6 6BF5F30E1174904B000502A6 6BF5F31C117490A1000502A6 @@ -437,14 +421,30 @@ 6BF5F32F11759C3C000502A6 6BF5F33011759C3C000502A6 6BF5F33111759C3C000502A6 - 6BF5F33211759C3C000502A6 - 6BF5F33311759C3C000502A6 - 6BF5F33411759C3C000502A6 6BF5F36A1175A3C9000502A6 - 6BF5F36E1175AACB000502A6 6BF5F36F1175AACB000502A6 6BF5F3701175AACB000502A6 - 6BBB4A9C115B4F3400CF791D + 6BF5F471117644A2000502A6 + 6BF5F472117644A2000502A6 + 6BF5F473117644A2000502A6 + 6BF5F474117644A2000502A6 + 6BF5F475117644A2000502A6 + 6BF5F476117644A2000502A6 + 6BF5F477117644A2000502A6 + 6BF5F478117644A2000502A6 + 6BF5F479117644A2000502A6 + 6BF5F47A117644A2000502A6 + 6BF5F47B117644A2000502A6 + 6BF5F47C117644A2000502A6 + 6BF5F47D117644A2000502A6 + 6BF5F47E117644A2000502A6 + 6BF5F47F117644A2000502A6 + 6BF5F480117644A2000502A6 + 6BF5F481117644A2000502A6 + 6BF5F482117644A2000502A6 + 6BF5F483117644A2000502A6 + 6BF5F484117644A2000502A6 + 6BF5F485117644A2000502A6 prevStack @@ -506,73 +506,45 @@ 6BF5F27811747CFA000502A6 6BF5F28011747CFA000502A6 6BF5F28D11747CFA000502A6 - 6BF5F2EC11748884000502A6 6BF5F2ED11748884000502A6 6BF5F2EE11748884000502A6 - 6BF5F2EF11748884000502A6 - 6BF5F2F011748884000502A6 - 6BF5F2F111748884000502A6 - 6BF5F2F211748884000502A6 - 6BF5F2F311748884000502A6 - 6BF5F2F411748884000502A6 - 6BF5F2F511748884000502A6 - 6BF5F2F611748884000502A6 - 6BF5F2F711748884000502A6 6BF5F2F811748884000502A6 - 6BF5F2F911748884000502A6 - 6BF5F2FA11748884000502A6 - 6BF5F3121174904B000502A6 - 6BF5F3131174904B000502A6 - 6BF5F3141174904B000502A6 - 6BF5F3151174904B000502A6 - 6BF5F31E117490A1000502A6 - 6BF5F31F117490A1000502A6 - 6BF5F33611759C3C000502A6 - 6BF5F33711759C3C000502A6 6BF5F33811759C3C000502A6 6BF5F33911759C3C000502A6 - 6BF5F33A11759C3C000502A6 - 6BF5F33B11759C3C000502A6 - 6BF5F33C11759C3C000502A6 - 6BF5F33D11759C3C000502A6 - 6BF5F33E11759C3C000502A6 - 6BF5F33F11759C3C000502A6 - 6BF5F34011759C3C000502A6 - 6BF5F34111759C3C000502A6 - 6BF5F34211759C3C000502A6 - 6BF5F34311759C3C000502A6 - 6BF5F34411759C3C000502A6 - 6BF5F34511759C3C000502A6 - 6BF5F34611759C3C000502A6 - 6BF5F34711759C3C000502A6 - 6BF5F34811759C3C000502A6 - 6BF5F34911759C3C000502A6 6BF5F34A11759C3C000502A6 - 6BF5F34B11759C3C000502A6 - 6BF5F34C11759C3C000502A6 - 6BF5F34D11759C3C000502A6 - 6BF5F34E11759C3C000502A6 - 6BF5F3541175A187000502A6 - 6BF5F3551175A187000502A6 - 6BF5F3561175A187000502A6 - 6BF5F3571175A187000502A6 - 6BF5F3581175A187000502A6 - 6BF5F3591175A187000502A6 - 6BF5F35A1175A187000502A6 - 6BF5F35B1175A187000502A6 - 6BF5F35C1175A187000502A6 - 6BF5F35D1175A187000502A6 - 6BF5F35E1175A187000502A6 - 6BF5F35F1175A187000502A6 - 6BF5F3601175A187000502A6 - 6BF5F3611175A187000502A6 - 6BF5F3621175A187000502A6 - 6BF5F3631175A187000502A6 - 6BF5F3671175A3A4000502A6 - 6BF5F36B1175A3C9000502A6 - 6BF5F3711175AACB000502A6 - 6BF5F3721175AACB000502A6 - 6BF5F3731175AACB000502A6 + 6BF5F486117644A2000502A6 + 6BF5F487117644A2000502A6 + 6BF5F488117644A2000502A6 + 6BF5F489117644A2000502A6 + 6BF5F48A117644A2000502A6 + 6BF5F48B117644A2000502A6 + 6BF5F48C117644A2000502A6 + 6BF5F48D117644A2000502A6 + 6BF5F48E117644A2000502A6 + 6BF5F48F117644A2000502A6 + 6BF5F490117644A2000502A6 + 6BF5F491117644A2000502A6 + 6BF5F492117644A2000502A6 + 6BF5F493117644A2000502A6 + 6BF5F494117644A2000502A6 + 6BF5F495117644A2000502A6 + 6BF5F496117644A2000502A6 + 6BF5F497117644A2000502A6 + 6BF5F498117644A2000502A6 + 6BF5F499117644A2000502A6 + 6BF5F49A117644A2000502A6 + 6BF5F49B117644A2000502A6 + 6BF5F49C117644A2000502A6 + 6BF5F49D117644A2000502A6 + 6BF5F49E117644A2000502A6 + 6BF5F49F117644A2000502A6 + 6BF5F4A0117644A2000502A6 + 6BF5F4A1117644A2000502A6 + 6BF5F4A2117644A2000502A6 + 6BF5F4A3117644A2000502A6 + 6BF5F4A4117644A2000502A6 + 6BF5F4A5117644A2000502A6 + 6BF5F4A6117644A2000502A6 SplitCount @@ -586,18 +558,18 @@ GeometryConfiguration Frame - {{0, 0}, {970, 546}} + {{0, 0}, {970, 456}} RubberWindowFrame 13 75 1256 702 0 0 1280 778 Module PBXNavigatorGroup Proportion - 546pt + 456pt Proportion - 110pt + 200pt Tabs @@ -611,7 +583,7 @@ GeometryConfiguration Frame - {{10, 27}, {970, 92}} + {{10, 27}, {970, 83}} Module XCDetailModule @@ -665,7 +637,7 @@ GeometryConfiguration Frame - {{10, 27}, {970, 83}} + {{10, 27}, {970, 173}} RubberWindowFrame 13 75 1256 702 0 0 1280 778 @@ -695,11 +667,11 @@ TableOfContents - 6BF5F2FC11748884000502A6 + 6BF5F4A8117644A2000502A6 1CA23ED40692098700951B8B - 6BF5F2FD11748884000502A6 + 6BF5F4A9117644A2000502A6 6B8632A30F78115100E2684A - 6BF5F2FE11748884000502A6 + 6BF5F4AA117644A2000502A6 1CA23EDF0692099D00951B8B 1CA23EE00692099D00951B8B 1CA23EE10692099D00951B8B @@ -848,14 +820,14 @@ TableOfContents - 6BF5F2FF11748884000502A6 + 6BF5F4AB117644A2000502A6 1CCC7628064C1048000F2A68 1CCC7629064C1048000F2A68 - 6BF5F30011748884000502A6 - 6BF5F30111748884000502A6 - 6BF5F30211748884000502A6 - 6BF5F30311748884000502A6 - 6BF5F30411748884000502A6 + 6BF5F4AC117644A2000502A6 + 6BF5F4AD117644A2000502A6 + 6BF5F4AE117644A2000502A6 + 6BF5F4AF117644A2000502A6 + 6BF5F4B0117644A2000502A6 ToolbarConfigUserDefaultsMinorVersion 2 @@ -887,8 +859,6 @@ 5 WindowOrderList - 6BF5F322117490A1000502A6 - 6BF5F323117490A1000502A6 6BF5F29911747CFA000502A6 /Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/Recast.xcodeproj diff --git a/RecastDemo/Source/ConvexVolumeTool.cpp b/RecastDemo/Source/ConvexVolumeTool.cpp index d137ed5..f571a04 100644 --- a/RecastDemo/Source/ConvexVolumeTool.cpp +++ b/RecastDemo/Source/ConvexVolumeTool.cpp @@ -191,14 +191,14 @@ void ConvexVolumeTool::handleClick(const float* p, bool shift) // Create // If clicked on that last pt, create the shape. - if (m_npts && vdistSqr(p, &m_pts[(m_npts-1)*3]) < rcSqr(0.2f)) + if (m_npts && rcVdistSqr(p, &m_pts[(m_npts-1)*3]) < rcSqr(0.2f)) { if (m_nhull > 2) { // Create shape. float verts[MAX_PTS*3]; for (int i = 0; i < m_nhull; ++i) - vcopy(&verts[i*3], &m_pts[m_hull[i]*3]); + rcVcopy(&verts[i*3], &m_pts[m_hull[i]*3]); float minh = FLT_MAX, maxh = 0; for (int i = 0; i < m_nhull; ++i) @@ -217,7 +217,7 @@ void ConvexVolumeTool::handleClick(const float* p, bool shift) // Add new point if (m_npts < MAX_PTS) { - vcopy(&m_pts[m_npts*3], p); + rcVcopy(&m_pts[m_npts*3], p); m_npts++; // Update hull. if (m_npts > 1) diff --git a/RecastDemo/Source/InputGeom.cpp b/RecastDemo/Source/InputGeom.cpp index 8cfa278..1397a00 100644 --- a/RecastDemo/Source/InputGeom.cpp +++ b/RecastDemo/Source/InputGeom.cpp @@ -36,32 +36,32 @@ static bool intersectSegmentTriangle(const float* sp, const float* sq, { float v, w; float ab[3], ac[3], qp[3], ap[3], norm[3], e[3]; - vsub(ab, b, a); - vsub(ac, c, a); - vsub(qp, sp, sq); + rcVsub(ab, b, a); + rcVsub(ac, c, a); + rcVsub(qp, sp, sq); // Compute triangle normal. Can be precalculated or cached if // intersecting multiple segments against the same triangle - vcross(norm, ab, ac); + rcVcross(norm, ab, ac); // Compute denominator d. If d <= 0, segment is parallel to or points // away from triangle, so exit early - float d = vdot(qp, norm); + float d = rcVdot(qp, norm); if (d <= 0.0f) return false; // Compute intersection t value of pq with plane of triangle. A ray // intersects iff 0 <= t. Segment intersects iff 0 <= t <= 1. Delay // dividing by d until intersection has been found to pierce triangle - vsub(ap, sp, a); - t = vdot(ap, norm); + rcVsub(ap, sp, a); + t = rcVdot(ap, norm); if (t < 0.0f) return false; if (t > d) return false; // For segment; exclude this code line for a ray test // Compute barycentric coordinate components and test if within bounds - vcross(e, qp, ap); - v = vdot(ac, e); + rcVcross(e, qp, ap); + v = rcVdot(ac, e); if (v < 0.0f || v > d) return false; - w = -vdot(ab, e); + w = -rcVdot(ab, e); if (w < 0.0f || v + w > d) return false; // Segment/ray intersects triangle. Perform delayed division @@ -289,7 +289,7 @@ bool InputGeom::save(const char* filepath) bool InputGeom::raycastMesh(float* src, float* dst, float& tmin) { float dir[3]; - vsub(dir, dst, src); + rcVsub(dir, dst, src); int nt = m_mesh->getTriCount(); const float* verts = m_mesh->getVerts(); @@ -301,7 +301,7 @@ bool InputGeom::raycastMesh(float* src, float* dst, float& tmin) for (int i = 0; i < nt*3; i += 3) { const float* n = &normals[i]; - if (vdot(dir, n) > 0) + if (rcVdot(dir, n) > 0) continue; float t = 1; @@ -328,8 +328,8 @@ void InputGeom::addOffMeshConnection(const float* spos, const float* epos, const m_offMeshConDirs[m_offMeshConCount] = bidir; m_offMeshConAreas[m_offMeshConCount] = area; m_offMeshConFlags[m_offMeshConCount] = flags; - vcopy(&v[0], spos); - vcopy(&v[3], epos); + rcVcopy(&v[0], spos); + rcVcopy(&v[3], epos); m_offMeshConCount++; } @@ -338,8 +338,8 @@ void InputGeom::deleteOffMeshConnection(int i) m_offMeshConCount--; float* src = &m_offMeshConVerts[m_offMeshConCount*3*2]; float* dst = &m_offMeshConVerts[i*3*2]; - vcopy(&dst[0], &src[0]); - vcopy(&dst[3], &src[3]); + rcVcopy(&dst[0], &src[0]); + rcVcopy(&dst[3], &src[3]); m_offMeshConRads[i] = m_offMeshConRads[m_offMeshConCount]; m_offMeshConDirs[i] = m_offMeshConDirs[m_offMeshConCount]; m_offMeshConAreas[i] = m_offMeshConAreas[m_offMeshConCount]; diff --git a/RecastDemo/Source/NavMeshTesterTool.cpp b/RecastDemo/Source/NavMeshTesterTool.cpp index b801bc5..92d2383 100644 --- a/RecastDemo/Source/NavMeshTesterTool.cpp +++ b/RecastDemo/Source/NavMeshTesterTool.cpp @@ -66,7 +66,7 @@ static bool getSteerTarget(dtNavMesh* navMesh, const float* startPos, const floa { *outPointCount = nsteerPath; for (int i = 0; i < nsteerPath; ++i) - vcopy(&outPoints[i*3], &steerPath[i*3]); + rcVcopy(&outPoints[i*3], &steerPath[i*3]); } @@ -84,7 +84,7 @@ static bool getSteerTarget(dtNavMesh* navMesh, const float* startPos, const floa if (ns >= nsteerPath) return false; - vcopy(steerPos, &steerPath[ns*3]); + rcVcopy(steerPos, &steerPath[ns*3]); steerPosFlag = steerPathFlags[ns]; steerPosRef = steerPathPolys[ns]; @@ -258,12 +258,12 @@ void NavMeshTesterTool::handleClick(const float* p, bool shift) if (shift) { m_sposSet = true; - vcopy(m_spos, p); + rcVcopy(m_spos, p); } else { m_eposSet = true; - vcopy(m_epos, p); + rcVcopy(m_epos, p); } recalc(); } @@ -297,12 +297,12 @@ void NavMeshTesterTool::handleStep() m_nsmoothPath = 0; - vcopy(&m_smoothPath[m_nsmoothPath*3], m_iterPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], m_iterPos); m_nsmoothPath++; } } - vcopy(m_prevIterPos, m_iterPos); + rcVcopy(m_prevIterPos, m_iterPos); m_pathIterNum++; @@ -325,22 +325,22 @@ void NavMeshTesterTool::handleStep() m_steerPoints, &m_steerPointCount)) return; - vcopy(m_steerPos, steerPos); + rcVcopy(m_steerPos, steerPos); bool endOfPath = (steerPosFlag & DT_STRAIGHTPATH_END) ? true : false; bool offMeshConnection = (steerPosFlag & DT_STRAIGHTPATH_OFFMESH_CONNECTION) ? true : false; // Find movement delta. float delta[3], len; - vsub(delta, steerPos, m_iterPos); - len = sqrtf(vdot(delta,delta)); + rcVsub(delta, steerPos, m_iterPos); + len = sqrtf(rcVdot(delta,delta)); // If the steer target is end of path or off-mesh link, do not move past the location. if ((endOfPath || offMeshConnection) && len < STEP_SIZE) len = 1; else len = STEP_SIZE / len; float moveTgt[3]; - vmad(moveTgt, m_iterPos, delta, len); + rcVmad(moveTgt, m_iterPos, delta, len); // Move float result[3]; @@ -355,16 +355,16 @@ void NavMeshTesterTool::handleStep() m_pathIterPolyCount -= n; } // Update position. - vcopy(m_iterPos, result); + rcVcopy(m_iterPos, result); // Handle end of path and off-mesh links when close enough. if (endOfPath && inRange(m_iterPos, steerPos, SLOP, 1.0f)) { // Reached end of path. - vcopy(m_iterPos, m_targetPos); + rcVcopy(m_iterPos, m_targetPos); if (m_nsmoothPath < MAX_SMOOTH) { - vcopy(&m_smoothPath[m_nsmoothPath*3], m_iterPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], m_iterPos); m_nsmoothPath++; } return; @@ -389,17 +389,17 @@ void NavMeshTesterTool::handleStep() { if (m_nsmoothPath < MAX_SMOOTH) { - vcopy(&m_smoothPath[m_nsmoothPath*3], startPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], startPos); m_nsmoothPath++; // Hack to make the dotted path not visible during off-mesh connection. if (m_nsmoothPath & 1) { - vcopy(&m_smoothPath[m_nsmoothPath*3], startPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], startPos); m_nsmoothPath++; } } // Move position at the other side of the off-mesh link. - vcopy(m_iterPos, endPos); + rcVcopy(m_iterPos, endPos); float h; m_navMesh->getPolyHeight(m_pathIterPolys[0], m_iterPos, &h); m_iterPos[1] = h; @@ -409,7 +409,7 @@ void NavMeshTesterTool::handleStep() // Store results. if (m_nsmoothPath < MAX_SMOOTH) { - vcopy(&m_smoothPath[m_nsmoothPath*3], m_iterPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], m_iterPos); m_nsmoothPath++; } @@ -473,7 +473,7 @@ void NavMeshTesterTool::recalc() m_nsmoothPath = 0; - vcopy(&m_smoothPath[m_nsmoothPath*3], iterPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], iterPos); m_nsmoothPath++; // Move towards target a small advancement at a time until target reached or @@ -494,15 +494,15 @@ void NavMeshTesterTool::recalc() // Find movement delta. float delta[3], len; - vsub(delta, steerPos, iterPos); - len = sqrtf(vdot(delta,delta)); + rcVsub(delta, steerPos, iterPos); + len = sqrtf(rcVdot(delta,delta)); // If the steer target is end of path or off-mesh link, do not move past the location. if ((endOfPath || offMeshConnection) && len < STEP_SIZE) len = 1; else len = STEP_SIZE / len; float moveTgt[3]; - vmad(moveTgt, iterPos, delta, len); + rcVmad(moveTgt, iterPos, delta, len); // Move float result[3]; @@ -517,16 +517,16 @@ void NavMeshTesterTool::recalc() npolys -= n; } // Update position. - vcopy(iterPos, result); + rcVcopy(iterPos, result); // Handle end of path and off-mesh links when close enough. if (endOfPath && inRange(iterPos, steerPos, SLOP, 1.0f)) { // Reached end of path. - vcopy(iterPos, targetPos); + rcVcopy(iterPos, targetPos); if (m_nsmoothPath < MAX_SMOOTH) { - vcopy(&m_smoothPath[m_nsmoothPath*3], iterPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], iterPos); m_nsmoothPath++; } break; @@ -551,17 +551,17 @@ void NavMeshTesterTool::recalc() { if (m_nsmoothPath < MAX_SMOOTH) { - vcopy(&m_smoothPath[m_nsmoothPath*3], startPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], startPos); m_nsmoothPath++; // Hack to make the dotted path not visible during off-mesh connection. if (m_nsmoothPath & 1) { - vcopy(&m_smoothPath[m_nsmoothPath*3], startPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], startPos); m_nsmoothPath++; } } // Move position at the other side of the off-mesh link. - vcopy(iterPos, endPos); + rcVcopy(iterPos, endPos); float h; m_navMesh->getPolyHeight(polys[0], iterPos, &h); iterPos[1] = h; @@ -571,7 +571,7 @@ void NavMeshTesterTool::recalc() // Store results. if (m_nsmoothPath < MAX_SMOOTH) { - vcopy(&m_smoothPath[m_nsmoothPath*3], iterPos); + rcVcopy(&m_smoothPath[m_nsmoothPath*3], iterPos); m_nsmoothPath++; } } @@ -628,7 +628,7 @@ void NavMeshTesterTool::recalc() if (t > 1) { // No hit - vcopy(m_hitPos, m_epos); + rcVcopy(m_hitPos, m_epos); m_hitResult = false; } else @@ -645,7 +645,7 @@ void NavMeshTesterTool::recalc() } m_hitResult = true; } - vcopy(&m_straightPath[3], m_hitPos); + rcVcopy(&m_straightPath[3], m_hitPos); } } else if (m_toolMode == TOOLMODE_DISTANCE_TO_WALL) diff --git a/RecastDemo/Source/OffMeshConnectionTool.cpp b/RecastDemo/Source/OffMeshConnectionTool.cpp index 5505471..9ede57d 100644 --- a/RecastDemo/Source/OffMeshConnectionTool.cpp +++ b/RecastDemo/Source/OffMeshConnectionTool.cpp @@ -99,7 +99,7 @@ void OffMeshConnectionTool::handleClick(const float* p, bool shift) for (int i = 0; i < geom->getOffMeshConnectionCount()*2; ++i) { const float* v = &verts[i*3]; - float d = vdistSqr(p, v); + float d = rcVdistSqr(p, v); if (d < nearestDist) { nearestDist = d; @@ -118,7 +118,7 @@ void OffMeshConnectionTool::handleClick(const float* p, bool shift) // Create if (!m_hitPosSet) { - vcopy(m_hitPos, p); + rcVcopy(m_hitPos, p); m_hitPosSet = true; } else diff --git a/RecastDemo/Source/Sample_Debug.cpp b/RecastDemo/Source/Sample_Debug.cpp index 8ad8a30..a62972c 100644 --- a/RecastDemo/Source/Sample_Debug.cpp +++ b/RecastDemo/Source/Sample_Debug.cpp @@ -159,8 +159,8 @@ void Sample_Debug::handleRender() duDebugDrawNavMeshPoly(&dd, m_navMesh, m_ref, duRGBA(255,0,0,128)); float bmin[3], bmax[3]; - vsub(bmin, m_center, m_ext); - vadd(bmax, m_center, m_ext); + rcVsub(bmin, m_center, m_ext); + rcVadd(bmax, m_center, m_ext); duDebugDrawBoxWire(&dd, bmin[0],bmin[1],bmin[2], bmax[0],bmax[1],bmax[2], duRGBA(255,255,255,128), 1.0f); duDebugDrawCross(&dd, m_center[0], m_center[1], m_center[2], 1.0f, duRGBA(255,255,255,128), 2.0f); diff --git a/RecastDemo/Source/Sample_SoloMeshSimple.cpp b/RecastDemo/Source/Sample_SoloMeshSimple.cpp index 237b57f..0022ac3 100644 --- a/RecastDemo/Source/Sample_SoloMeshSimple.cpp +++ b/RecastDemo/Source/Sample_SoloMeshSimple.cpp @@ -370,8 +370,8 @@ bool Sample_SoloMeshSimple::handleBuild() // Set the area where the navigation will be build. // Here the bounds of the input mesh are used, but the // area could be specified by an user defined box, etc. - vcopy(m_cfg.bmin, bmin); - vcopy(m_cfg.bmax, bmax); + rcVcopy(m_cfg.bmin, bmin); + rcVcopy(m_cfg.bmax, bmax); rcCalcGridSize(m_cfg.bmin, m_cfg.bmax, m_cfg.cs, &m_cfg.width, &m_cfg.height); // Reset build times gathering. @@ -622,8 +622,8 @@ bool Sample_SoloMeshSimple::handleBuild() params.walkableHeight = m_agentHeight; params.walkableRadius = m_agentRadius; params.walkableClimb = m_agentMaxClimb; - vcopy(params.bmin, m_pmesh->bmin); - vcopy(params.bmax, m_pmesh->bmax); + rcVcopy(params.bmin, m_pmesh->bmin); + rcVcopy(params.bmax, m_pmesh->bmax); params.cs = m_cfg.cs; params.ch = m_cfg.ch; diff --git a/RecastDemo/Source/Sample_SoloMeshTiled.cpp b/RecastDemo/Source/Sample_SoloMeshTiled.cpp index b5ec4c8..9c7febc 100644 --- a/RecastDemo/Source/Sample_SoloMeshTiled.cpp +++ b/RecastDemo/Source/Sample_SoloMeshTiled.cpp @@ -81,7 +81,7 @@ public: virtual void handleClick(const float* p, bool /*shift*/) { m_hitPosSet = true; - vcopy(m_hitPos,p); + rcVcopy(m_hitPos,p); if (m_sample) m_sample->setHighlightedTile(m_hitPos); } @@ -716,8 +716,8 @@ bool Sample_SoloMeshTiled::handleBuild() // Set the area where the navigation will be build. // Here the bounds of the input mesh are used, but the // area could be specified by an user defined box, etc. - vcopy(m_cfg.bmin, bmin); - vcopy(m_cfg.bmax, bmax); + rcVcopy(m_cfg.bmin, bmin); + rcVcopy(m_cfg.bmax, bmax); rcCalcGridSize(m_cfg.bmin, m_cfg.bmax, m_cfg.cs, &m_cfg.width, &m_cfg.height); // Reset build times gathering. @@ -735,8 +735,8 @@ bool Sample_SoloMeshTiled::handleBuild() rcGetLog()->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'tileSet'."); return false; } - vcopy(m_tileSet->bmin, m_cfg.bmin); - vcopy(m_tileSet->bmax, m_cfg.bmax); + rcVcopy(m_tileSet->bmin, m_cfg.bmin); + rcVcopy(m_tileSet->bmax, m_cfg.bmax); m_tileSet->cs = m_cfg.cs; m_tileSet->ch = m_cfg.ch; m_tileSet->width = (m_cfg.width + m_cfg.tileSize-1) / m_cfg.tileSize; @@ -1081,8 +1081,8 @@ bool Sample_SoloMeshTiled::handleBuild() params.walkableHeight = m_agentHeight; params.walkableRadius = m_agentRadius; params.walkableClimb = m_agentMaxClimb; - vcopy(params.bmin, m_pmesh->bmin); - vcopy(params.bmax, m_pmesh->bmax); + rcVcopy(params.bmin, m_pmesh->bmin); + rcVcopy(params.bmax, m_pmesh->bmax); params.cs = m_cfg.cs; params.ch = m_cfg.ch; diff --git a/RecastDemo/Source/Sample_TileMesh.cpp b/RecastDemo/Source/Sample_TileMesh.cpp index 83bbc90..bb332dc 100644 --- a/RecastDemo/Source/Sample_TileMesh.cpp +++ b/RecastDemo/Source/Sample_TileMesh.cpp @@ -115,7 +115,7 @@ public: virtual void handleClick(const float* p, bool shift) { m_hitPosSet = true; - vcopy(m_hitPos,p); + rcVcopy(m_hitPos,p); if (m_sample) { if (shift) @@ -509,7 +509,7 @@ bool Sample_TileMesh::handleBuild() } dtNavMeshParams params; - vcopy(params.orig, m_geom->getMeshBoundsMin()); + rcVcopy(params.orig, m_geom->getMeshBoundsMin()); params.tileWidth = m_tileSize*m_cellSize; params.tileHeight = m_tileSize*m_cellSize; params.maxTiles = m_maxTiles; @@ -692,8 +692,8 @@ unsigned char* Sample_TileMesh::buildTileMesh(const int tx, const int ty, const m_cfg.detailSampleDist = m_detailSampleDist < 0.9f ? 0 : m_cellSize * m_detailSampleDist; m_cfg.detailSampleMaxError = m_cellHeight * m_detailSampleMaxError; - vcopy(m_cfg.bmin, bmin); - vcopy(m_cfg.bmax, bmax); + rcVcopy(m_cfg.bmin, bmin); + rcVcopy(m_cfg.bmax, bmax); m_cfg.bmin[0] -= m_cfg.borderSize*m_cfg.cs; m_cfg.bmin[2] -= m_cfg.borderSize*m_cfg.cs; m_cfg.bmax[0] += m_cfg.borderSize*m_cfg.cs; @@ -960,8 +960,8 @@ unsigned char* Sample_TileMesh::buildTileMesh(const int tx, const int ty, const params.walkableClimb = m_agentMaxClimb; params.tileX = tx; params.tileY = ty; - vcopy(params.bmin, bmin); - vcopy(params.bmax, bmax); + rcVcopy(params.bmin, bmin); + rcVcopy(params.bmax, bmax); params.cs = m_cfg.cs; params.ch = m_cfg.ch; params.tileSize = m_cfg.tileSize; diff --git a/RecastDemo/Source/TestCase.cpp b/RecastDemo/Source/TestCase.cpp index 4e265fd..04a6998 100644 --- a/RecastDemo/Source/TestCase.cpp +++ b/RecastDemo/Source/TestCase.cpp @@ -234,8 +234,8 @@ void TestCase::handleRender() for (Test* iter = m_tests; iter; iter = iter->next) { float dir[3]; - vsub(dir, iter->epos, iter->spos); - vnormalize(dir); + rcVsub(dir, iter->epos, iter->spos); + rcVnormalize(dir); glColor4ub(128,25,0,192); glVertex3f(iter->spos[0],iter->spos[1]-0.3f,iter->spos[2]); glVertex3f(iter->spos[0],iter->spos[1]+0.3f,iter->spos[2]); @@ -273,20 +273,20 @@ bool TestCase::handleRenderOverlay(double* proj, double* model, int* view) float pt[3], dir[3]; if (iter->nstraight) { - vcopy(pt, &iter->straight[3]); - if (vdist(pt, iter->spos) > LABEL_DIST) + rcVcopy(pt, &iter->straight[3]); + if (rcVdist(pt, iter->spos) > LABEL_DIST) { - vsub(dir, pt, iter->spos); - vnormalize(dir); - vmad(pt, iter->spos, dir, LABEL_DIST); + rcVsub(dir, pt, iter->spos); + rcVnormalize(dir); + rcVmad(pt, iter->spos, dir, LABEL_DIST); } pt[1]+=0.5f; } else { - vsub(dir, iter->epos, iter->spos); - vnormalize(dir); - vmad(pt, iter->spos, dir, LABEL_DIST); + rcVsub(dir, iter->epos, iter->spos); + rcVnormalize(dir); + rcVmad(pt, iter->spos, dir, LABEL_DIST); pt[1]+=0.5f; }