From 480063229d0baec3e41853d1087893ac6c9f51b7 Mon Sep 17 00:00:00 2001 From: Mikko Mononen Date: Sun, 15 Nov 2009 15:30:54 +0000 Subject: [PATCH] Removed rcMarkReachableSpans(), added RC_LEDGE flag, made rcFilterLedgeSpans() to add RC_LEDGE flags instead of removing RC_WALKABLE flag. Voxel debugdraw colors voxels based on flags. Added debug draw interface. --- Recast/Include/Recast.h | 12 +- Recast/Include/RecastDebugDraw.h | 72 +- Recast/Source/RecastDebugDraw.cpp | 699 ++++--- Recast/Source/RecastFilter.cpp | 121 +- .../Bin/Recast.app/Contents/MacOS/Recast | Bin 380976 -> 387320 bytes .../Xcode/Recast.xcodeproj/memon.pbxuser | 1840 ++++++++++++++++- .../Recast.xcodeproj/memon.perspectivev3 | 112 +- RecastDemo/Include/Sample.h | 10 + RecastDemo/Source/Sample.cpp | 50 +- RecastDemo/Source/Sample_StatMesh.cpp | 16 +- RecastDemo/Source/Sample_StatMeshSimple.cpp | 34 +- RecastDemo/Source/Sample_StatMeshTiled.cpp | 38 +- RecastDemo/Source/Sample_TileMesh.cpp | 19 +- 13 files changed, 2451 insertions(+), 572 deletions(-) diff --git a/Recast/Include/Recast.h b/Recast/Include/Recast.h index ad24713..2eda512 100644 --- a/Recast/Include/Recast.h +++ b/Recast/Include/Recast.h @@ -231,7 +231,7 @@ public: enum rcSpanFlags { RC_WALKABLE = 0x01, - RC_REACHABLE = 0x02, + RC_LEDGE = 0x02, }; // If heightfield region ID has the following bit set, the region is on border area @@ -466,16 +466,6 @@ void rcFilterLedgeSpans(const int walkableHeight, void rcFilterWalkableLowHeightSpans(int walkableHeight, rcHeightfield& solid); -// Marks spans which are reachable from any of the topmost spans. -// Params: -// walkableHeight - (in) minimum height where the agent can still walk -// walkableClimb - (in) maximum height between grid cells the agent can climb -// solid - (in/out) heightfield describing the solid space -// Returns false if operation ran out of memory. -bool rcMarkReachableSpans(const int walkableHeight, - const int walkableClimb, - rcHeightfield& solid); - // Builds compact representation of the heightfield. // Params: // walkableHeight - (in) minimum height where the agent can still walk diff --git a/Recast/Include/RecastDebugDraw.h b/Recast/Include/RecastDebugDraw.h index 27ba0a1..095c349 100644 --- a/Recast/Include/RecastDebugDraw.h +++ b/Recast/Include/RecastDebugDraw.h @@ -19,11 +19,49 @@ #ifndef RECAST_DEBUGDRAW_H #define RECAST_DEBUGDRAW_H +enum rcDebugDrawPrimitives +{ + RC_DRAW_POINTS, + RC_DRAW_LINES, + RC_DRAW_TRIS, + RC_DRAW_QUADS, +}; + +struct rcDebugDraw +{ + virtual void begin(rcDebugDrawPrimitives prim, int nverts, float size = 1.0f) = 0; + virtual void vertex(const float* pos, unsigned int color) = 0; + virtual void vertex(const float x, const float y, const float z, unsigned int color) = 0; + virtual void end() = 0; +}; + +inline unsigned int RGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + return (r) | (g << 8) | (b << 16) | (a << 24); +} + +inline unsigned int RGBAf(float fr, float fg, float fb, float fa) +{ + unsigned char r = (unsigned char)(fr*255.0f); + unsigned char g = (unsigned char)(fg*255.0f); + unsigned char b = (unsigned char)(fb*255.0f); + unsigned char a = (unsigned char)(fa*255.0f); + return RGBA(r,g,b,a); +} + inline int bit(int a, int b) { return (a & (1 << b)) >> b; } +inline unsigned int intToCol(int i, int a) +{ + int r = bit(i, 0) + bit(i, 3) * 2 + 1; + int g = bit(i, 1) + bit(i, 4) * 2 + 1; + int b = bit(i, 2) + bit(i, 5) * 2 + 1; + return RGBA(r*63,g*63,b*63,a); +} + inline void intToCol(int i, float* col) { int r = bit(i, 0) + bit(i, 3) * 2 + 1; @@ -34,26 +72,28 @@ inline void intToCol(int i, float* col) col[2] = 1 - b*63.0f/255.0f; } -void rcDebugDrawHeightfieldSolid(const struct rcHeightfield& hf); -void rcDebugDrawHeightfieldWalkable(const struct rcHeightfield& hf); +void rcDebugDrawHeightfieldSolid(rcDebugDraw* dd, const struct rcHeightfield& hf); +void rcDebugDrawHeightfieldWalkable(rcDebugDraw* dd, const struct rcHeightfield& hf); -void rcDebugDrawMesh(const float* verts, int nverts, const int* tris, const float* normals, int ntris, const unsigned char* flags); -void rcDebugDrawMeshSlope(const float* verts, int nverts, const int* tris, const float* normals, int ntris, const float walkableSlopeAngle); +void rcDebugDrawMesh(rcDebugDraw* dd, const float* verts, int nverts, const int* tris, const float* normals, int ntris, const unsigned char* flags); +void rcDebugDrawMeshSlope(rcDebugDraw* dd, const float* verts, int nverts, const int* tris, const float* normals, int ntris, const float walkableSlopeAngle); -void rcDebugDrawCompactHeightfieldSolid(const struct rcCompactHeightfield& chf); -void rcDebugDrawCompactHeightfieldRegions(const struct rcCompactHeightfield& chf); -void rcDebugDrawCompactHeightfieldDistance(const struct rcCompactHeightfield& chf); +void rcDebugDrawCompactHeightfieldSolid(rcDebugDraw* dd, const struct rcCompactHeightfield& chf); +void rcDebugDrawCompactHeightfieldRegions(rcDebugDraw* dd, const struct rcCompactHeightfield& chf); +void rcDebugDrawCompactHeightfieldDistance(rcDebugDraw* dd, const struct rcCompactHeightfield& chf); -void rcDebugDrawRegionConnections(const struct rcContourSet& cset, const float alpha = 1.0f); -void rcDebugDrawRawContours(const struct rcContourSet& cset, const float alpha = 1.0f); -void rcDebugDrawContours(const struct rcContourSet& cset, const float alpha = 1.0f); -void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh); -void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh); +void rcDebugDrawRegionConnections(rcDebugDraw* dd, const struct rcContourSet& cset, const float alpha = 1.0f); +void rcDebugDrawRawContours(rcDebugDraw* dd, const struct rcContourSet& cset, const float alpha = 1.0f); +void rcDebugDrawContours(rcDebugDraw* dd, const struct rcContourSet& cset, const float alpha = 1.0f); +void rcDebugDrawPolyMesh(rcDebugDraw* dd, const struct rcPolyMesh& mesh); +void rcDebugDrawPolyMeshDetail(rcDebugDraw* dd, const struct rcPolyMeshDetail& dmesh); -void rcDebugDrawCylinderWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col); -void rcDebugDrawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col); -void rcDebugDrawBox(float minx, float miny, float minz, float maxx, float maxy, float maxz, +void rcDebugDrawCylinderWire(rcDebugDraw* dd, float minx, float miny, float minz, + float maxx, float maxy, float maxz, const float* col); +void rcDebugDrawBoxWire(rcDebugDraw* dd, float minx, float miny, float minz, + float maxx, float maxy, float maxz, const float* col); +void rcDebugDrawBox(rcDebugDraw* dd, float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col1, const float* col2); -void rcDrawArc(const float* p0, const float* p1); +void rcDrawArc(rcDebugDraw* dd, const float* p0, const float* p1, const float* col, float lineWidth); #endif // RECAST_DEBUGDRAW_H diff --git a/Recast/Source/RecastDebugDraw.cpp b/Recast/Source/RecastDebugDraw.cpp index a88d668..bf5bd30 100644 --- a/Recast/Source/RecastDebugDraw.cpp +++ b/Recast/Source/RecastDebugDraw.cpp @@ -19,91 +19,107 @@ #define _USE_MATH_DEFINES #include #include "RecastDebugDraw.h" -#include "SDL.h" -#include "SDL_opengl.h" #include "MeshLoaderObj.h" #include "Recast.h" -void rcDebugDrawMesh(const float* verts, int nverts, - const int* tris, const float* normals, int ntris, - const unsigned char* flags) -{ - glBegin(GL_TRIANGLES); - for (int i = 0; i < ntris*3; i += 3) - { - float a = (2+normals[i+0]+normals[i+1])/4 * 0.6f; - if (flags && !flags[i/3]) - glColor3f(a,a*0.3f,a*0.1f); - else - glColor3f(a,a,a); - glVertex3fv(&verts[tris[i]*3]); - glVertex3fv(&verts[tris[i+1]*3]); - glVertex3fv(&verts[tris[i+2]*3]); - } - glEnd(); +inline unsigned int dark(unsigned int col) +{ + return ((col >> 1) & 0x007f7f7f) | (col & 0xff000000); } -void rcDebugDrawMeshSlope(const float* verts, int nverts, +void rcDebugDrawMesh(rcDebugDraw* dd, const float* verts, int nverts, + const int* tris, const float* normals, int ntris, + const unsigned char* flags) +{ + dd->begin(RC_DRAW_TRIS, ntris); + for (int i = 0; i < ntris*3; i += 3) + { + unsigned int color; + unsigned char a = (unsigned char)(150*(2+normals[i+0]+normals[i+1])/4); + if (flags && !flags[i/3]) + color = RGBA(a,a/4,a/16,255); + else + color = RGBA(a,a,a,255); + + dd->vertex(&verts[tris[i+0]*3], color); + dd->vertex(&verts[tris[i+1]*3], color); + dd->vertex(&verts[tris[i+2]*3], color); + } + dd->end(); +} + +void rcDebugDrawMeshSlope(rcDebugDraw* dd, const float* verts, int nverts, const int* tris, const float* normals, int ntris, const float walkableSlopeAngle) { const float walkableThr = cosf(walkableSlopeAngle/180.0f*(float)M_PI); - - glBegin(GL_TRIANGLES); + + dd->begin(RC_DRAW_TRIS, ntris); for (int i = 0; i < ntris*3; i += 3) { const float* norm = &normals[i]; - float a = (2+norm[0]+norm[1])/4; - if (norm[1] > walkableThr) - glColor3f(a,a,a); + unsigned int color; + unsigned char a = (unsigned char)(255*(2+normals[i+0]+normals[i+1])/4); + if (norm[1] < walkableThr) + color = RGBA(a,a/4,a/16,255); else - glColor3f(a,a*0.3f,a*0.1f); - glVertex3fv(&verts[tris[i]*3]); - glVertex3fv(&verts[tris[i+1]*3]); - glVertex3fv(&verts[tris[i+2]*3]); + color = RGBA(a,a,a,255); + + dd->vertex(&verts[tris[i+0]*3], color); + dd->vertex(&verts[tris[i+1]*3], color); + dd->vertex(&verts[tris[i+2]*3], color); } - glEnd(); + dd->end(); } -void drawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) +static void drawBoxWire(rcDebugDraw* dd, + float minx, float miny, float minz, + float maxx, float maxy, float maxz, + const float* col) { - glColor4fv(col); + // Submits 24 vertices. + + unsigned int color = RGBAf(col[0],col[1],col[2],col[3]); // Top - glVertex3f(minx, miny, minz); - glVertex3f(maxx, miny, minz); - glVertex3f(maxx, miny, minz); - glVertex3f(maxx, miny, maxz); - glVertex3f(maxx, miny, maxz); - glVertex3f(minx, miny, maxz); - glVertex3f(minx, miny, maxz); - glVertex3f(minx, miny, minz); + dd->vertex(minx, miny, minz, color); + dd->vertex(maxx, miny, minz, color); + dd->vertex(maxx, miny, minz, color); + dd->vertex(maxx, miny, maxz, color); + dd->vertex(maxx, miny, maxz, color); + dd->vertex(minx, miny, maxz, color); + dd->vertex(minx, miny, maxz, color); + dd->vertex(minx, miny, minz, color); // bottom - glVertex3f(minx, maxy, minz); - glVertex3f(maxx, maxy, minz); - glVertex3f(maxx, maxy, minz); - glVertex3f(maxx, maxy, maxz); - glVertex3f(maxx, maxy, maxz); - glVertex3f(minx, maxy, maxz); - glVertex3f(minx, maxy, maxz); - glVertex3f(minx, maxy, minz); + dd->vertex(minx, maxy, minz, color); + dd->vertex(maxx, maxy, minz, color); + dd->vertex(maxx, maxy, minz, color); + dd->vertex(maxx, maxy, maxz, color); + dd->vertex(maxx, maxy, maxz, color); + dd->vertex(minx, maxy, maxz, color); + dd->vertex(minx, maxy, maxz, color); + dd->vertex(minx, maxy, minz, color); // Sides - glVertex3f(minx, miny, minz); - glVertex3f(minx, maxy, minz); - glVertex3f(maxx, miny, minz); - glVertex3f(maxx, maxy, minz); - glVertex3f(maxx, miny, maxz); - glVertex3f(maxx, maxy, maxz); - glVertex3f(minx, miny, maxz); - glVertex3f(minx, maxy, maxz); + dd->vertex(minx, miny, minz, color); + dd->vertex(minx, maxy, minz, color); + dd->vertex(maxx, miny, minz, color); + dd->vertex(maxx, maxy, minz, color); + dd->vertex(maxx, miny, maxz, color); + dd->vertex(maxx, maxy, maxz, color); + dd->vertex(minx, miny, maxz, color); + dd->vertex(minx, maxy, maxz, color); } -void drawBox(float minx, float miny, float minz, float maxx, float maxy, float maxz, - const float* col1, const float* col2) +static void drawBox(rcDebugDraw* dd, + float minx, float miny, float minz, + float maxx, float maxy, float maxz, + const float* col1, const float* col2) { - float verts[8*3] = + // Submits 24 vertices. + + const float verts[8*3] = { minx, miny, minz, maxx, miny, minz, @@ -132,18 +148,21 @@ void drawBox(float minx, float miny, float minz, float maxx, float maxy, float m for (int i = 0; i < 6; ++i) { float d = dim[*in]; in++; + unsigned int color; if (i == 0) - glColor4f(d*col2[0],d*col2[1],d*col2[2], col2[3]); + color = RGBAf(d*col2[0],d*col2[1],d*col2[2], col2[3]); else - glColor4f(d*col1[0],d*col1[1],d*col1[2], col1[3]); - glVertex3fv(&verts[*in*3]); in++; - glVertex3fv(&verts[*in*3]); in++; - glVertex3fv(&verts[*in*3]); in++; - glVertex3fv(&verts[*in*3]); in++; + color = RGBAf(d*col1[0],d*col1[1],d*col1[2], col1[3]); + dd->vertex(&verts[*in*3], color); in++; + dd->vertex(&verts[*in*3], color); in++; + dd->vertex(&verts[*in*3], color); in++; + dd->vertex(&verts[*in*3], color); in++; } } -void rcDebugDrawCylinderWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) +void rcDebugDrawCylinderWire(rcDebugDraw* dd, float minx, float miny, float minz, + float maxx, float maxy, float maxz, + const float* col) { static const int NUM_SEG = 16; float dir[NUM_SEG*2]; @@ -159,40 +178,56 @@ void rcDebugDrawCylinderWire(float minx, float miny, float minz, float maxx, flo const float rx = (maxx - minx)/2; const float rz = (maxz - minz)/2; - glColor4fv(col); - glBegin(GL_LINES); + unsigned int color = RGBAf(col[0],col[1],col[2],col[3]); + + const int nv = NUM_SEG*4 + 4*2; + + dd->begin(RC_DRAW_LINES, nv); + for (int i = 0, j=NUM_SEG-1; i < NUM_SEG; j=i++) { - glVertex3f(cx+dir[j*2+0]*rx, miny, cz+dir[j*2+1]*rz); - glVertex3f(cx+dir[i*2+0]*rx, miny, cz+dir[i*2+1]*rz); - glVertex3f(cx+dir[j*2+0]*rx, maxy, cz+dir[j*2+1]*rz); - glVertex3f(cx+dir[i*2+0]*rx, maxy, cz+dir[i*2+1]*rz); + dd->vertex(cx+dir[j*2+0]*rx, miny, cz+dir[j*2+1]*rz, color); + dd->vertex(cx+dir[i*2+0]*rx, miny, cz+dir[i*2+1]*rz, color); + dd->vertex(cx+dir[j*2+0]*rx, maxy, cz+dir[j*2+1]*rz, color); + dd->vertex(cx+dir[i*2+0]*rx, maxy, cz+dir[i*2+1]*rz, color); } for (int i = 0; i < NUM_SEG; i += NUM_SEG/4) { - glVertex3f(cx+dir[i*2+0]*rx, miny, cz+dir[i*2+1]*rz); - glVertex3f(cx+dir[i*2+0]*rx, maxy, cz+dir[i*2+1]*rz); + dd->vertex(cx+dir[i*2+0]*rx, miny, cz+dir[i*2+1]*rz, color); + dd->vertex(cx+dir[i*2+0]*rx, maxy, cz+dir[i*2+1]*rz, color); } - glEnd(); + + dd->end(); } -void rcDebugDrawBoxWire(float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) +void rcDebugDrawBoxWire(rcDebugDraw* dd, float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col) { - glBegin(GL_LINES); - drawBoxWire(minx, miny, minz, maxx, maxy, maxz, col); - glEnd(); + dd->begin(RC_DRAW_LINES, 24, 1.0f); + drawBoxWire(dd, minx, miny, minz, maxx, maxy, maxz, col); + dd->end(); } -void rcDebugDrawBox(float minx, float miny, float minz, float maxx, float maxy, float maxz, +void rcDebugDrawBox(rcDebugDraw* dd, float minx, float miny, float minz, float maxx, float maxy, float maxz, const float* col1, const float* col2) { - glBegin(GL_QUADS); - drawBox(minx, miny, minz, maxx, maxy, maxz, col1, col2); - glEnd(); + dd->begin(RC_DRAW_QUADS,24); + drawBox(dd, minx, miny, minz, maxx, maxy, maxz, col1, col2); + dd->end(); } +static int getSpanCount(const rcHeightfield& hf) +{ + const int w = hf.width; + const int h = hf.height; + int spanCount = 0; + for (int y = 0; y < h; ++y) + for (int x = 0; x < w; ++x) + for (rcSpan* s = hf.spans[x + y*w]; s; s = s->next) + spanCount++; + return spanCount; +} -void rcDebugDrawHeightfieldSolid(const rcHeightfield& hf) +void rcDebugDrawHeightfieldSolid(rcDebugDraw* dd, const rcHeightfield& hf) { static const float col0[4] = { 1,1,1,1 }; @@ -203,7 +238,10 @@ void rcDebugDrawHeightfieldSolid(const rcHeightfield& hf) const int w = hf.width; const int h = hf.height; - glBegin(GL_QUADS); + const int spanCount = getSpanCount(hf); + const int nv = spanCount*24; + + dd->begin(RC_DRAW_QUADS, nv); for (int y = 0; y < h; ++y) { @@ -214,18 +252,20 @@ void rcDebugDrawHeightfieldSolid(const rcHeightfield& hf) const rcSpan* s = hf.spans[x + y*w]; while (s) { - drawBox(fx, orig[1]+s->smin*ch, fz, fx+cs, orig[1] + s->smax*ch, fz+cs, col0, col0); + drawBox(dd, fx, orig[1]+s->smin*ch, fz, fx+cs, orig[1] + s->smax*ch, fz+cs, col0, col0); s = s->next; } } } - glEnd(); + dd->end(); } -void rcDebugDrawHeightfieldWalkable(const rcHeightfield& hf) +void rcDebugDrawHeightfieldWalkable(rcDebugDraw* dd, const rcHeightfield& hf) { - static const float col0[4] = { 1,1,1,1 }; - static const float col1[4] = { 0.25f,0.44f,0.5f,1 }; + static const float colb[4] = {0.85f,0.85f,0.85f,1 }; // Base + static const float col0[4] = {0.5f, 0.75f, 0.85f,1}; // Culled + static const float col1[4] = {0.3f, 0.55f, 0.65f, 1}; // Walkable + static const float col2[4] = {0.15f, 0.4f, 0.5f,1}; // Ledge const float* orig = hf.bmin; const float cs = hf.cs; @@ -234,7 +274,10 @@ void rcDebugDrawHeightfieldWalkable(const rcHeightfield& hf) const int w = hf.width; const int h = hf.height; - glBegin(GL_QUADS); + const int spanCount = getSpanCount(hf); + const int nv = spanCount*24; + + dd->begin(RC_DRAW_QUADS, nv); for (int y = 0; y < h; ++y) { @@ -245,23 +288,29 @@ void rcDebugDrawHeightfieldWalkable(const rcHeightfield& hf) const rcSpan* s = hf.spans[x + y*w]; while (s) { - bool csel = (s->flags & 0x1) == 0; - drawBox(fx, orig[1]+s->smin*ch, fz, fx+cs, orig[1] + s->smax*ch, fz+cs, col0, csel ? col0 : col1); + const float* c = col0; + if (s->flags & RC_LEDGE) + c = col2; + else if (s->flags & RC_WALKABLE) + c = col1; + drawBox(dd, fx, orig[1]+s->smin*ch, fz, fx+cs, orig[1] + s->smax*ch, fz+cs, colb, c); s = s->next; } } } - glEnd(); + + dd->end(); } -void rcDebugDrawCompactHeightfieldSolid(const rcCompactHeightfield& chf) +void rcDebugDrawCompactHeightfieldSolid(rcDebugDraw* dd, const rcCompactHeightfield& chf) { const float cs = chf.cs; const float ch = chf.ch; - glColor3ub(64,112,128); - - glBegin(GL_QUADS); + unsigned int color = RGBA(0,192,255,64); + + dd->begin(RC_DRAW_QUADS, chf.spanCount*4); + for (int y = 0; y < chf.height; ++y) { for (int x = 0; x < chf.width; ++x) @@ -274,26 +323,23 @@ void rcDebugDrawCompactHeightfieldSolid(const rcCompactHeightfield& chf) { const rcCompactSpan& s = chf.spans[i]; const float fy = chf.bmin[1] + (s.y+1)*ch; - glVertex3f(fx, fy, fz); - glVertex3f(fx, fy, fz+cs); - glVertex3f(fx+cs, fy, fz+cs); - glVertex3f(fx+cs, fy, fz); + dd->vertex(fx, fy, fz, color); + dd->vertex(fx, fy, fz+cs, color); + dd->vertex(fx+cs, fy, fz+cs, color); + dd->vertex(fx+cs, fy, fz, color); } } } - glEnd(); + dd->end(); } -void rcDebugDrawCompactHeightfieldRegions(const rcCompactHeightfield& chf) +void rcDebugDrawCompactHeightfieldRegions(rcDebugDraw* dd, const rcCompactHeightfield& chf) { const float cs = chf.cs; const float ch = chf.ch; - float col[4] = { 1,1,1,1 }; - - glDepthMask(GL_TRUE); - - glBegin(GL_QUADS); + dd->begin(RC_DRAW_QUADS, chf.spanCount*4); + for (int y = 0; y < chf.height; ++y) { for (int x = 0; x < chf.width; ++x) @@ -305,40 +351,36 @@ void rcDebugDrawCompactHeightfieldRegions(const rcCompactHeightfield& chf) for (unsigned i = c.index, ni = c.index+c.count; i < ni; ++i) { const rcCompactSpan& s = chf.spans[i]; - - if (chf.reg[i]) - { - intToCol(chf.reg[i], col); - glColor4fv(col); - } - else - { - glColor4ub(0,0,0,64); - } - const float fy = chf.bmin[1] + (s.y)*ch; + unsigned int color; + if (chf.reg[i]) + color = intToCol(chf.reg[i], 192); + else + color = RGBA(0,0,0,64); - glVertex3f(fx, fy, fz); - glVertex3f(fx, fy, fz+cs); - glVertex3f(fx+cs, fy, fz+cs); - glVertex3f(fx+cs, fy, fz); + dd->vertex(fx, fy, fz, color); + dd->vertex(fx, fy, fz+cs, color); + dd->vertex(fx+cs, fy, fz+cs, color); + dd->vertex(fx+cs, fy, fz, color); } } } - glEnd(); + + dd->end(); } -void rcDebugDrawCompactHeightfieldDistance(const rcCompactHeightfield& chf) +void rcDebugDrawCompactHeightfieldDistance(rcDebugDraw* dd, const rcCompactHeightfield& chf) { const float cs = chf.cs; const float ch = chf.ch; - + float maxd = chf.maxDistance; if (maxd < 1.0f) maxd = 1; - float dscale = 1.0f / maxd; + const float dscale = 255.0f / maxd; + + dd->begin(RC_DRAW_QUADS, chf.spanCount*4); - glBegin(GL_QUADS); for (int y = 0; y < chf.height; ++y) { for (int x = 0; x < chf.width; ++x) @@ -351,16 +393,16 @@ void rcDebugDrawCompactHeightfieldDistance(const rcCompactHeightfield& chf) { const rcCompactSpan& s = chf.spans[i]; const float fy = chf.bmin[1] + (s.y+1)*ch; - float cd = (float)chf.dist[i] * dscale; - glColor3f(cd, cd, cd); - glVertex3f(fx, fy, fz); - glVertex3f(fx, fy, fz+cs); - glVertex3f(fx+cs, fy, fz+cs); - glVertex3f(fx+cs, fy, fz); + const unsigned char cd = (unsigned char)(chf.dist[i] * dscale); + const unsigned int color = RGBA(cd,cd,cd,255); + dd->vertex(fx, fy, fz, color); + dd->vertex(fx, fy, fz+cs, color); + dd->vertex(fx+cs, fy, fz+cs, color); + dd->vertex(fx+cs, fy, fz, color); } } } - glEnd(); + dd->end(); } static void getContourCenter(const rcContour* cont, const float* orig, float cs, float ch, float* center) @@ -396,36 +438,39 @@ static const rcContour* findContourFromSet(const rcContourSet& cset, unsigned sh return 0; } -static void drawArc(const float* p0, const float* p1) +static const int NUM_ARC_PTS = 8; + +static void drawArc(rcDebugDraw* dd, const float* p0, const float* p1, unsigned int color) { - static const int NPTS = 8; - float pts[NPTS*3]; + // Submits NPTS*2 vertices. + float pts[NUM_ARC_PTS*3]; float dir[3]; vsub(dir, p1, p0); const float len = sqrtf(vdistSqr(p0, p1)); - for (int i = 0; i < NPTS; ++i) + for (int i = 0; i < NUM_ARC_PTS; ++i) { - float u = (float)i / (float)(NPTS-1); + float u = (float)i / (float)(NUM_ARC_PTS-1); float* p = &pts[i*3]; p[0] = p0[0] + dir[0] * u; p[1] = p0[1] + dir[1] * u + (len/4) * (1-rcSqr(u*2-1)); p[2] = p0[2] + dir[2] * u; } - for (int i = 0; i < NPTS-1; ++i) + for (int i = 0; i < NUM_ARC_PTS-1; ++i) { - glVertex3fv(&pts[i*3]); - glVertex3fv(&pts[(i+1)*3]); + dd->vertex(&pts[i*3], color); + dd->vertex(&pts[(i+1)*3], color); } } -void rcDrawArc(const float* p0, const float* p1) +void rcDrawArc(rcDebugDraw* dd, const float* p0, const float* p1, const float* col, float lineWidth) { - glBegin(GL_LINES); - drawArc(p0, p1); - glEnd(); + const unsigned int color = RGBAf(col[0],col[1],col[2],col[3]); + dd->begin(RC_DRAW_LINES, NUM_ARC_PTS*2, lineWidth); + drawArc(dd, p0, p1, color); + dd->end(); } -void rcDebugDrawRegionConnections(const rcContourSet& cset, const float alpha) +void rcDebugDrawRegionConnections(rcDebugDraw* dd, const rcContourSet& cset, const float alpha) { const float* orig = cset.bmin; const float cs = cset.cs; @@ -434,10 +479,23 @@ void rcDebugDrawRegionConnections(const rcContourSet& cset, const float alpha) // Draw centers float pos[3], pos2[3]; - glColor4ub(0,0,0,196); + unsigned int color = RGBA(0,0,0,196); + + int nv = 0; + for (int i = 0; i < cset.nconts; ++i) + { + const rcContour* cont = &cset.conts[i]; + for (int j = 0; j < cont->nverts; ++j) + { + const int* v = &cont->verts[j*4]; + if (v[3] == 0 || (unsigned short)v[3] < cont->reg) continue; + if (findContourFromSet(cset, (unsigned short)v[3])) + nv += NUM_ARC_PTS; + } + } + + dd->begin(RC_DRAW_LINES, nv, 2.0f); - glLineWidth(2.0f); - glBegin(GL_LINES); for (int i = 0; i < cset.nconts; ++i) { const rcContour* cont = &cset.conts[i]; @@ -450,158 +508,203 @@ void rcDebugDrawRegionConnections(const rcContourSet& cset, const float alpha) if (cont2) { getContourCenter(cont2, orig, cs, ch, pos2); - drawArc(pos, pos2); + drawArc(dd, pos, pos2, color); } } } - glEnd(); - - float col[4] = { 1,1,1,alpha }; - glPointSize(7.0f); - glBegin(GL_POINTS); + dd->end(); + + unsigned char a = (unsigned char)(alpha * 255.0f); + + dd->begin(RC_DRAW_POINTS, nv, 7.0f); + for (int i = 0; i < cset.nconts; ++i) { const rcContour* cont = &cset.conts[i]; - intToCol(cont->reg, col); - col[0] *= 0.5f; - col[1] *= 0.5f; - col[2] *= 0.5f; - glColor4fv(col); + unsigned int color = dark(intToCol(cont->reg,a)); getContourCenter(cont, orig, cs, ch, pos); - glVertex3fv(pos); + dd->vertex(pos, color); } - glEnd(); - - - glLineWidth(1.0f); - glPointSize(1.0f); + dd->end(); } -void rcDebugDrawRawContours(const rcContourSet& cset, const float alpha) +void rcDebugDrawRawContours(rcDebugDraw* dd, const rcContourSet& cset, const float alpha) { const float* orig = cset.bmin; const float cs = cset.cs; const float ch = cset.ch; - float col[4] = { 1,1,1,alpha }; - glLineWidth(2.0f); - glPointSize(2.0f); + + const unsigned char a = (unsigned char)(alpha*255.0f); + + int nv = 0; for (int i = 0; i < cset.nconts; ++i) { const rcContour& c = cset.conts[i]; - intToCol(c.reg, col); - glColor4fv(col); - glBegin(GL_LINE_LOOP); + nv += c.nrverts; + } + + dd->begin(RC_DRAW_LINES, nv*2, 2.0f); + + for (int i = 0; i < cset.nconts; ++i) + { + const rcContour& c = cset.conts[i]; + unsigned int color = intToCol(c.reg, a); + for (int j = 0; j < c.nrverts; ++j) { const int* v = &c.rverts[j*4]; float fx = orig[0] + v[0]*cs; float fy = orig[1] + (v[1]+1+(i&1))*ch; float fz = orig[2] + v[2]*cs; - glVertex3f(fx,fy,fz); + dd->vertex(fx,fy,fz,color); + if (j > 0) + dd->vertex(fx,fy,fz,color); } - glEnd(); + // Loop last segment. + const int* v = &c.rverts[0]; + float fx = orig[0] + v[0]*cs; + float fy = orig[1] + (v[1]+1+(i&1))*ch; + float fz = orig[2] + v[2]*cs; + dd->vertex(fx,fy,fz,color); + } + dd->end(); - col[0] *= 0.5f; - col[1] *= 0.5f; - col[2] *= 0.5f; - glColor4fv(col); + dd->begin(RC_DRAW_POINTS, nv, 2.0f); - glBegin(GL_POINTS); + for (int i = 0; i < cset.nconts; ++i) + { + const rcContour& c = cset.conts[i]; + unsigned int color = dark(intToCol(c.reg, a)); + for (int j = 0; j < c.nrverts; ++j) { const int* v = &c.rverts[j*4]; - float off = 0; + unsigned int colv = color; if (v[3] & RC_BORDER_VERTEX) { - glColor4ub(255,255,255,255); + colv = RGBA(255,255,255,a); off = ch*2; } - else - { - glColor4fv(col); - } float fx = orig[0] + v[0]*cs; float fy = orig[1] + (v[1]+1+(i&1))*ch + off; float fz = orig[2] + v[2]*cs; - glVertex3f(fx,fy,fz); + dd->vertex(fx,fy,fz, colv); } - glEnd(); } - glLineWidth(1.0f); - glPointSize(1.0f); + dd->end(); } -void rcDebugDrawContours(const rcContourSet& cset, const float alpha) +void rcDebugDrawContours(rcDebugDraw* dd, const rcContourSet& cset, const float alpha) { const float* orig = cset.bmin; const float cs = cset.cs; const float ch = cset.ch; - float col[4] = { 1,1,1,1 }; - glLineWidth(2.5f); - glPointSize(3.0f); + + const unsigned char a = (unsigned char)(alpha*255.0f); + + int nv = 0; for (int i = 0; i < cset.nconts; ++i) { const rcContour& c = cset.conts[i]; - intToCol(c.reg, col); - glColor4fv(col); + nv += c.nverts; + } + + dd->begin(RC_DRAW_LINES, nv*2, 2.5f); + + for (int i = 0; i < cset.nconts; ++i) + { + const rcContour& c = cset.conts[i]; + unsigned int color = intToCol(c.reg, a); - glBegin(GL_LINE_LOOP); for (int j = 0; j < c.nverts; ++j) { const int* v = &c.verts[j*4]; float fx = orig[0] + v[0]*cs; float fy = orig[1] + (v[1]+1+(i&1))*ch; float fz = orig[2] + v[2]*cs; - glVertex3f(fx,fy,fz); + dd->vertex(fx,fy,fz, color); + if (j > 0) + dd->vertex(fx,fy,fz, color); } - glEnd(); + // Loop last segment + const int* v = &c.verts[0]; + float fx = orig[0] + v[0]*cs; + float fy = orig[1] + (v[1]+1+(i&1))*ch; + float fz = orig[2] + v[2]*cs; + dd->vertex(fx,fy,fz, color); + } + dd->end(); - col[0] *= 0.5f; - col[1] *= 0.5f; - col[2] *= 0.5f; - glColor4fv(col); - glBegin(GL_POINTS); + dd->begin(RC_DRAW_POINTS, nv, 3.0f); + + for (int i = 0; i < cset.nconts; ++i) + { + const rcContour& c = cset.conts[i]; + unsigned int color = dark(intToCol(c.reg, a)); for (int j = 0; j < c.nverts; ++j) { const int* v = &c.verts[j*4]; float off = 0; + unsigned int colv = color; if (v[3] & RC_BORDER_VERTEX) { - glColor4ub(255,255,255,255); + colv = RGBA(255,255,255,a); off = ch*2; } - else - { - glColor4fv(col); - } float fx = orig[0] + v[0]*cs; float fy = orig[1] + (v[1]+1+(i&1))*ch + off; float fz = orig[2] + v[2]*cs; - glVertex3f(fx,fy,fz); + dd->vertex(fx,fy,fz, colv); } - glEnd(); } - glLineWidth(1.0f); - glPointSize(1.0f); + dd->end(); } -void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh) +void rcDebugDrawPolyMesh(rcDebugDraw* dd, const struct rcPolyMesh& mesh) { const int nvp = mesh.nvp; const float cs = mesh.cs; const float ch = mesh.ch; const float* orig = mesh.bmin; - float col[4] = {1,1,1,0.75f}; - glBegin(GL_TRIANGLES); + + int nvt = 0; // triangle verts + int nvb = 0; // boundary edge verts + int nvn = 0; // neighbour edge verts for (int i = 0; i < mesh.npolys; ++i) { const unsigned short* p = &mesh.polys[i*nvp*2]; - intToCol(i, col); - glColor4fv(col); + // Tris + for (int j = 2; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + nvt += 3; + } + // boundary edges + for (int j = 0; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + if (p[nvp+j] == 0xffff) continue; + nvb += 2; + } + // neighbour edges + for (int j = 0; j < nvp; ++j) + { + if (p[j] == 0xffff) break; + if (p[nvp+j] != 0xffff) continue; + nvb += 2; + } + } + + dd->begin(RC_DRAW_TRIS, nvt); + + for (int i = 0; i < mesh.npolys; ++i) + { + const unsigned short* p = &mesh.polys[i*nvp*2]; + unsigned int color = intToCol(i, 192); unsigned short vi[3]; for (int j = 2; j < nvp; ++j) { @@ -615,91 +718,121 @@ void rcDebugDrawPolyMesh(const struct rcPolyMesh& mesh) const float x = orig[0] + v[0]*cs; const float y = orig[1] + (v[1]+1)*ch; const float z = orig[2] + v[2]*cs; - glVertex3f(x, y, z); + dd->vertex(x,y,z, color); } } } - glEnd(); + dd->end(); - // Draw tri boundaries - glColor4ub(0,48,64,32); - glLineWidth(1.5f); - glBegin(GL_LINES); + // Draw neighbours edges + const unsigned int coln = RGBA(0,48,64,32); + dd->begin(RC_DRAW_LINES, nvn, 1.5f); for (int i = 0; i < mesh.npolys; ++i) { - const unsigned short* poly = &mesh.polys[i*nvp*2]; + const unsigned short* p = &mesh.polys[i*nvp*2]; for (int j = 0; j < nvp; ++j) { - if (poly[j] == 0xffff) break; - if (poly[nvp+j] == 0xffff) continue; + if (p[j] == 0xffff) break; + if (p[nvp+j] == 0xffff) continue; int vi[2]; - vi[0] = poly[j]; - if (j+1 >= nvp || poly[j+1] == 0xffff) - vi[1] = poly[0]; + vi[0] = p[j]; + if (j+1 >= nvp || p[j+1] == 0xffff) + vi[1] = p[0]; else - vi[1] = poly[j+1]; + vi[1] = p[j+1]; for (int k = 0; k < 2; ++k) { const unsigned short* v = &mesh.verts[vi[k]*3]; const float x = orig[0] + v[0]*cs; const float y = orig[1] + (v[1]+1)*ch + 0.1f; const float z = orig[2] + v[2]*cs; - glVertex3f(x, y, z); + dd->vertex(x, y, z, coln); } } } - glEnd(); + dd->end(); - // Draw boundaries - glLineWidth(2.5f); - glColor4ub(0,48,64,220); - glBegin(GL_LINES); + // Draw boundary edges + const unsigned int colb = RGBA(0,48,64,220); + dd->begin(RC_DRAW_LINES, nvb, 2.5f); for (int i = 0; i < mesh.npolys; ++i) { - const unsigned short* poly = &mesh.polys[i*nvp*2]; + const unsigned short* p = &mesh.polys[i*nvp*2]; for (int j = 0; j < nvp; ++j) { - if (poly[j] == 0xffff) break; - if (poly[nvp+j] != 0xffff) continue; + if (p[j] == 0xffff) break; + if (p[nvp+j] != 0xffff) continue; int vi[2]; - vi[0] = poly[j]; - if (j+1 >= nvp || poly[j+1] == 0xffff) - vi[1] = poly[0]; + vi[0] = p[j]; + if (j+1 >= nvp || p[j+1] == 0xffff) + vi[1] = p[0]; else - vi[1] = poly[j+1]; + vi[1] = p[j+1]; for (int k = 0; k < 2; ++k) { const unsigned short* v = &mesh.verts[vi[k]*3]; const float x = orig[0] + v[0]*cs; const float y = orig[1] + (v[1]+1)*ch + 0.1f; const float z = orig[2] + v[2]*cs; - glVertex3f(x, y, z); + dd->vertex(x, y, z, colb); } } } - glEnd(); - glLineWidth(1.0f); + dd->end(); - glPointSize(3.0f); - glColor4ub(0,0,0,220); - glBegin(GL_POINTS); + dd->begin(RC_DRAW_POINTS, mesh.nverts, 3.0f); + const unsigned int colv = RGBA(0,0,0,220); for (int i = 0; i < mesh.nverts; ++i) { const unsigned short* v = &mesh.verts[i*3]; const float x = orig[0] + v[0]*cs; const float y = orig[1] + (v[1]+1)*ch + 0.1f; const float z = orig[2] + v[2]*cs; - glVertex3f(x, y, z); + dd->vertex(x,y,z, colv); } - glEnd(); - glPointSize(1.0f); + dd->end(); } -void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh) +void rcDebugDrawPolyMeshDetail(rcDebugDraw* dd, const struct rcPolyMeshDetail& dmesh) { - float col[4] = {1,1,1,0.75f}; + int nvt = 0; + int nvi = 0; + int nve = 0; + int nvv = 0; + + for (int i = 0; i < dmesh.nmeshes; ++i) + { + const unsigned short* m = &dmesh.meshes[i*4]; + const unsigned short nverts = m[1]; + const unsigned short btris = m[2]; + const unsigned short ntris = m[3]; + const unsigned char* tris = &dmesh.tris[btris*4]; + + nvt += (int)ntris*3; + nvv += (int)nverts; + + for (int j = 0; j < ntris; ++j) + { + const unsigned char* t = &tris[j*4]; + for (int k = 0, kp = 2; k < 3; kp=k++) + { + unsigned char ef = (t[3] >> (kp*2)) & 0x3; + if (ef == 0) + { + if (t[kp] < t[k]) + nvi += 2; + } + else + { + nve += 2; + } + } + } + + } + + dd->begin(RC_DRAW_TRIS, nvt); - glBegin(GL_TRIANGLES); for (int i = 0; i < dmesh.nmeshes; ++i) { const unsigned short* m = &dmesh.meshes[i*4]; @@ -709,21 +842,20 @@ void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh) const float* verts = &dmesh.verts[bverts*3]; const unsigned char* tris = &dmesh.tris[btris*4]; - intToCol(i, col); - glColor4fv(col); + unsigned int color = intToCol(i, 192); + for (int j = 0; j < ntris; ++j) { - glVertex3fv(&verts[tris[j*4+0]*3]); - glVertex3fv(&verts[tris[j*4+1]*3]); - glVertex3fv(&verts[tris[j*4+2]*3]); + dd->vertex(&verts[tris[j*4+0]*3], color); + dd->vertex(&verts[tris[j*4+1]*3], color); + dd->vertex(&verts[tris[j*4+2]*3], color); } } - glEnd(); + dd->end(); // Internal edges. - glLineWidth(1.0f); - glColor4ub(0,0,0,64); - glBegin(GL_LINES); + dd->begin(RC_DRAW_LINES, nvi, 1.0f); + const unsigned int coli = RGBA(0,0,0,64); for (int i = 0; i < dmesh.nmeshes; ++i) { const unsigned short* m = &dmesh.meshes[i*4]; @@ -744,19 +876,18 @@ void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh) // Internal edge if (t[kp] < t[k]) { - glVertex3fv(&verts[t[kp]*3]); - glVertex3fv(&verts[t[k]*3]); + dd->vertex(&verts[t[kp]*3], coli); + dd->vertex(&verts[t[k]*3], coli); } } } } } - glEnd(); + dd->end(); // External edges. - glLineWidth(2.0f); - glColor4ub(0,0,0,64); - glBegin(GL_LINES); + dd->begin(RC_DRAW_LINES, 2.0f); + const unsigned int cole = RGBA(0,0,0,64); for (int i = 0; i < dmesh.nmeshes; ++i) { const unsigned short* m = &dmesh.meshes[i*4]; @@ -775,18 +906,16 @@ void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh) if (ef != 0) { // Ext edge - glVertex3fv(&verts[t[kp]*3]); - glVertex3fv(&verts[t[k]*3]); + dd->vertex(&verts[t[kp]*3], cole); + dd->vertex(&verts[t[k]*3], cole); } } } } - glEnd(); + dd->end(); - glLineWidth(1.0f); - - glPointSize(3.0f); - glBegin(GL_POINTS); + dd->begin(RC_DRAW_POINTS, nvv, 3.0f); + const unsigned int colv = RGBA(0,0,0,64); for (int i = 0; i < dmesh.nmeshes; ++i) { const unsigned short* m = &dmesh.meshes[i*4]; @@ -794,11 +923,7 @@ void rcDebugDrawPolyMeshDetail(const struct rcPolyMeshDetail& dmesh) const unsigned short nverts = m[1]; const float* verts = &dmesh.verts[bverts*3]; for (int j = 0; j < nverts; ++j) - { - glColor4ub(0,0,0,64); - glVertex3fv(&verts[j*3]); - } + dd->vertex(&verts[j*3], colv); } - glEnd(); - glPointSize(1.0f); + dd->end(); } diff --git a/Recast/Source/RecastFilter.cpp b/Recast/Source/RecastFilter.cpp index cd1b4aa..658316b 100644 --- a/Recast/Source/RecastFilter.cpp +++ b/Recast/Source/RecastFilter.cpp @@ -84,8 +84,7 @@ void rcFilterLedgeSpans(const int walkableHeight, // The current span is close to a ledge if the drop to any // neighbour span is less than the walkableClimb. if (minh < -walkableClimb) - s->flags &= ~RC_WALKABLE; - + s->flags |= RC_LEDGE; } } } @@ -129,121 +128,3 @@ void rcFilterWalkableLowHeightSpans(int walkableHeight, if (rcGetBuildTimes()) rcGetBuildTimes()->filterWalkable += rcGetDeltaTimeUsec(startTime, endTime); } - - -struct rcReachableSeed -{ - inline void set(int ix, int iy, rcSpan* is) - { - x = (unsigned short)ix; - y = (unsigned short)iy; - s = is; - } - unsigned short x, y; - rcSpan* s; -}; - -bool rcMarkReachableSpans(const int walkableHeight, - const int walkableClimb, - rcHeightfield& solid) -{ - const int w = solid.width; - const int h = solid.height; - const int MAX_HEIGHT = 0xffff; - - rcTimeVal startTime = rcGetPerformanceTimer(); - - // Build navigable space. - const int MAX_SEEDS = w*h; - rcReachableSeed* stack = new rcReachableSeed[MAX_SEEDS]; - if (!stack) - { - if (rcGetLog()) - rcGetLog()->log(RC_LOG_ERROR, "rcMarkReachableSpans: Out of memory 'stack' (%d).", MAX_SEEDS); - return false; - } - int stackSize = 0; - - for (int y = 0; y < h; ++y) - { - for (int x = 0; x < w; ++x) - { - rcSpan* topSpan = solid.spans[x + y*w]; - if (!topSpan) - continue; - while (topSpan->next) - topSpan = topSpan->next; - - // If the span is not walkable, skip it. - if ((topSpan->flags & RC_WALKABLE) == 0) - continue; - // If the span has been visited already, skip it. - if (topSpan->flags & RC_REACHABLE) - continue; - - // Start flood fill. - topSpan->flags |= RC_REACHABLE; - stackSize = 0; - stack[stackSize].set(x, y, topSpan); - stackSize++; - - while (stackSize) - { - // Pop a seed from the stack. - stackSize--; - rcReachableSeed cur = stack[stackSize]; - - const int bot = (int)(cur.s->smax); - const int top = cur.s->next ? (int)(cur.s->next->smin) : MAX_HEIGHT; - - // Visit neighbours in all 4 directions. - for (int dir = 0; dir < 4; ++dir) - { - int dx = (int)cur.x + rcGetDirOffsetX(dir); - int dy = (int)cur.y + rcGetDirOffsetY(dir); - // Skip neighbour which are out of bounds. - if (dx < 0 || dy < 0 || dx >= w || dy >= h) - continue; - for (rcSpan* ns = solid.spans[dx + dy*w]; ns; ns = ns->next) - { - // Skip neighbour if it is not walkable. - if ((ns->flags & RC_WALKABLE) == 0) - continue; - // Skip the neighbour if it has been visited already. - if (ns->flags & RC_REACHABLE) - continue; - - const int nbot = (int)ns->smax; - const int ntop = ns->next ? (int)ns->next->smin : MAX_HEIGHT; - // Skip neightbour if the gap between the spans is too small. - if (rcMin(top,ntop) - rcMax(bot,nbot) < walkableHeight) - continue; - // Skip neightbour if the climb height to the neighbour is too high. - if (rcAbs(nbot - bot) >= walkableClimb) - continue; - - // This neighbour has not been visited yet. - // Mark it as reachable and add it to the seed stack. - ns->flags |= RC_REACHABLE; - if (stackSize < MAX_SEEDS) - { - stack[stackSize].set(dx, dy, ns); - stackSize++; - } - } - } - } - } - } - - delete [] stack; - - rcTimeVal endTime = rcGetPerformanceTimer(); - -// if (rcGetLog()) -// rcGetLog()->log(RC_LOG_PROGRESS, "Mark reachable: %.3f ms", rcGetDeltaTimeUsec(startTime, endTime)/1000.0f); - if (rcGetBuildTimes()) - rcGetBuildTimes()->filterMarkReachable += rcGetDeltaTimeUsec(startTime, endTime); - - return true; -} diff --git a/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast b/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast index 8e5f86f397831996388aa47888d51cfd29dda6fb..0bd308c2a61c52baa30b8d7a103399152995e1e8 100755 GIT binary patch delta 103480 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

~90z@B}wF%KiqTZ$QZK1|Fg^V!in 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 delta 97319 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 - 28 + 21 18 1 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 125}, {282, 660}} + {{0, 49}, {282, 660}} PBXTopSmartGroupGIDs @@ -321,7 +321,7 @@ PBXProjectModuleGUID 6B8632A30F78115100E2684A PBXProjectModuleLabel - Recast.cpp + RecastDebugDraw.cpp PBXSplitModuleInNavigatorKey Split0 @@ -329,37 +329,44 @@ PBXProjectModuleGUID 6B8632A40F78115100E2684A PBXProjectModuleLabel - Recast.cpp + RecastDebugDraw.cpp _historyCapacity 0 bookmark - 6B8DE74910B01BE900DF20FB + 6B8DE84710B055DA00DF20FB history - 6B6FA3B61076452F009B0572 6B3BFADD107A80E1006284CD 6B3BFB0C107A8979006284CD 6B3BFB0D107A8979006284CD 6B57D358108C66B200DDD053 6B57D38F108C69E400DDD053 - 6B7FB74A1091EBDE001BA51A 6B7FB74D1091EBDE001BA51A 6B8DE6FE10B01BBF00DF20FB 6B8DE6FF10B01BBF00DF20FB - 6B8DE70010B01BBF00DF20FB 6B8DE70110B01BBF00DF20FB 6B8DE70310B01BBF00DF20FB 6B8DE70410B01BBF00DF20FB 6B8DE70510B01BBF00DF20FB 6B8DE70610B01BBF00DF20FB 6B8DE70710B01BBF00DF20FB - 6B8DE70810B01BBF00DF20FB 6B8DE70910B01BBF00DF20FB 6B8DE70A10B01BBF00DF20FB 6B8DE70B10B01BBF00DF20FB - 6B8DE70C10B01BBF00DF20FB 6B8DE70D10B01BBF00DF20FB - 6B8DE73D10B01BBF00DF20FB + 6B8DE76D10B0243500DF20FB + 6B8DE76E10B0243500DF20FB + 6B8DE7F110B0517A00DF20FB + 6B8DE7F310B0517A00DF20FB + 6B8DE7F410B0517A00DF20FB + 6B8DE7F510B0517A00DF20FB + 6B8DE7F610B0517A00DF20FB + 6B8DE7F710B0517A00DF20FB + 6B8DE7F810B0517A00DF20FB + 6B8DE81E10B0528100DF20FB + 6B8DE81F10B0528100DF20FB + 6B8DE82010B0528100DF20FB + 6B8DE82110B0528100DF20FB prevStack @@ -367,7 +374,6 @@ 6B6FA36B1070C1F7009B0572 6B6FA3B81076452F009B0572 6B6FA3BA1076452F009B0572 - 6B6FA3BC1076452F009B0572 6B3BFADF107A80E1006284CD 6B3BFB12107A8979006284CD 6B3BFB13107A8979006284CD @@ -375,7 +381,6 @@ 6B57D35B108C66B200DDD053 6B57D376108C692900DDD053 6B57D393108C69E400DDD053 - 6B7FB7531091EBDE001BA51A 6B7FB7541091EBDE001BA51A 6B7FB7571091EBDE001BA51A 6B8DE71110B01BBF00DF20FB @@ -406,17 +411,76 @@ 6B8DE72E10B01BBF00DF20FB 6B8DE72F10B01BBF00DF20FB 6B8DE73010B01BBF00DF20FB - 6B8DE73110B01BBF00DF20FB 6B8DE73210B01BBF00DF20FB - 6B8DE73310B01BBF00DF20FB 6B8DE73410B01BBF00DF20FB - 6B8DE73510B01BBF00DF20FB 6B8DE73610B01BBF00DF20FB 6B8DE73710B01BBF00DF20FB 6B8DE73810B01BBF00DF20FB - 6B8DE73910B01BBF00DF20FB 6B8DE73A10B01BBF00DF20FB 6B8DE73B10B01BBF00DF20FB + 6B8DE75010B01EEA00DF20FB + 6B8DE75110B01EEA00DF20FB + 6B8DE75210B01EEA00DF20FB + 6B8DE75310B01EEA00DF20FB + 6B8DE75410B01EEA00DF20FB + 6B8DE75510B01EEA00DF20FB + 6B8DE75610B01EEA00DF20FB + 6B8DE75A10B01F1A00DF20FB + 6B8DE75F10B01F9900DF20FB + 6B8DE76710B022B200DF20FB + 6B8DE77010B0243500DF20FB + 6B8DE77110B0243500DF20FB + 6B8DE7A010B0404100DF20FB + 6B8DE7A110B0404100DF20FB + 6B8DE7A510B0412B00DF20FB + 6B8DE7A610B0412B00DF20FB + 6B8DE7A710B0412B00DF20FB + 6B8DE7A810B0412B00DF20FB + 6B8DE7AC10B0463F00DF20FB + 6B8DE7AD10B0463F00DF20FB + 6B8DE7C910B04B7F00DF20FB + 6B8DE7CA10B04B7F00DF20FB + 6B8DE7CB10B04B7F00DF20FB + 6B8DE7CC10B04B7F00DF20FB + 6B8DE7CD10B04B7F00DF20FB + 6B8DE7CE10B04B7F00DF20FB + 6B8DE7D510B04C5000DF20FB + 6B8DE7FA10B0517A00DF20FB + 6B8DE7FB10B0517A00DF20FB + 6B8DE7FC10B0517A00DF20FB + 6B8DE7FD10B0517A00DF20FB + 6B8DE7FE10B0517A00DF20FB + 6B8DE7FF10B0517A00DF20FB + 6B8DE80010B0517A00DF20FB + 6B8DE80110B0517A00DF20FB + 6B8DE80210B0517A00DF20FB + 6B8DE80310B0517A00DF20FB + 6B8DE80410B0517A00DF20FB + 6B8DE80510B0517A00DF20FB + 6B8DE80610B0517A00DF20FB + 6B8DE80710B0517A00DF20FB + 6B8DE80810B0517A00DF20FB + 6B8DE80910B0517A00DF20FB + 6B8DE80A10B0517A00DF20FB + 6B8DE80B10B0517A00DF20FB + 6B8DE80C10B0517A00DF20FB + 6B8DE80D10B0517A00DF20FB + 6B8DE80E10B0517A00DF20FB + 6B8DE80F10B0517A00DF20FB + 6B8DE81010B0517A00DF20FB + 6B8DE81110B0517A00DF20FB + 6B8DE81210B0517A00DF20FB + 6B8DE81310B0517A00DF20FB + 6B8DE81410B0517A00DF20FB + 6B8DE81510B0517A00DF20FB + 6B8DE81610B0517A00DF20FB + 6B8DE81710B0517A00DF20FB + 6B8DE81810B0517A00DF20FB + 6B8DE81910B0517A00DF20FB + 6B8DE81A10B0517A00DF20FB + 6B8DE82210B0528100DF20FB + 6B8DE82310B0528100DF20FB + 6B8DE82410B0528100DF20FB SplitCount @@ -430,18 +494,18 @@ GeometryConfiguration Frame - {{0, 0}, {976, 434}} + {{0, 0}, {976, 456}} RubberWindowFrame 0 59 1280 719 0 0 1280 778 Module PBXNavigatorGroup Proportion - 434pt + 456pt Proportion - 239pt + 217pt Tabs @@ -471,9 +535,7 @@ GeometryConfiguration Frame - {{10, 27}, {976, 212}} - RubberWindowFrame - 0 59 1280 719 0 0 1280 778 + {{10, 27}, {976, 175}} Module PBXProjectFindModule @@ -511,7 +573,9 @@ GeometryConfiguration Frame - {{10, 27}, {976, 155}} + {{10, 27}, {976, 190}} + RubberWindowFrame + 0 59 1280 719 0 0 1280 778 Module PBXBuildResultsModule diff --git a/RecastDemo/Include/Sample.h b/RecastDemo/Include/Sample.h index 00239c5..9487799 100644 --- a/RecastDemo/Include/Sample.h +++ b/RecastDemo/Include/Sample.h @@ -1,6 +1,16 @@ #ifndef RECASTSAMPLE_H #define RECASTSAMPLE_H +#include "RecastDebugDraw.h" + +struct DebugDrawGL : public rcDebugDraw +{ + virtual void begin(rcDebugDrawPrimitives prim, int nverts, float size = 1.0f); + virtual void vertex(const float* pos, unsigned int color); + virtual void vertex(const float x, const float y, const float z, unsigned int color); + virtual void end(); +}; + class Sample { diff --git a/RecastDemo/Source/Sample.cpp b/RecastDemo/Source/Sample.cpp index 1b66782..ab87bbc 100644 --- a/RecastDemo/Source/Sample.cpp +++ b/RecastDemo/Source/Sample.cpp @@ -5,12 +5,55 @@ #include "Recast.h" #include "RecastDebugDraw.h" #include "imgui.h" +#include "SDL.h" +#include "SDL_opengl.h" #ifdef WIN32 # define snprintf _snprintf #endif +void DebugDrawGL::begin(rcDebugDrawPrimitives prim, int nverts, float size) +{ + switch (prim) + { + case RC_DRAW_POINTS: + glPointSize(size); + glBegin(GL_POINTS); + break; + case RC_DRAW_LINES: + glLineWidth(size); + glBegin(GL_LINES); + break; + case RC_DRAW_TRIS: + glBegin(GL_TRIANGLES); + break; + case RC_DRAW_QUADS: + glBegin(GL_QUADS); + break; + }; +} + +void DebugDrawGL::vertex(const float* pos, unsigned int color) +{ + glColor4ubv((GLubyte*)&color); + glVertex3fv(pos); +} + +void DebugDrawGL::vertex(const float x, const float y, const float z, unsigned int color) +{ + glColor4ubv((GLubyte*)&color); + glVertex3f(x,y,z); +} + +void DebugDrawGL::end() +{ + glEnd(); + glLineWidth(1.0f); + glPointSize(1.0f); +} + + Sample::Sample() : m_verts(0), m_nverts(0), m_tris(0), m_trinorms(0), m_ntris(0) { @@ -37,11 +80,14 @@ void Sample::handleRender() { if (!m_verts || !m_tris || !m_trinorms) return; + + DebugDrawGL dd; + // Draw mesh - rcDebugDrawMesh(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); + rcDebugDrawMesh(&dd, m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); // Draw bounds float col[4] = {1,1,1,0.5f}; - rcDebugDrawBoxWire(m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); + rcDebugDrawBoxWire(&dd, m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); } void Sample::handleRenderOverlay(double* proj, double* model, int* view) diff --git a/RecastDemo/Source/Sample_StatMesh.cpp b/RecastDemo/Source/Sample_StatMesh.cpp index 8053d46..a1da83c 100644 --- a/RecastDemo/Source/Sample_StatMesh.cpp +++ b/RecastDemo/Source/Sample_StatMesh.cpp @@ -193,6 +193,8 @@ void Sample_StatMesh::toolRender(int flags) if (!m_navMesh) return; + DebugDrawGL dd; + static const float startCol[4] = { 0.5f, 0.1f, 0.0f, 0.75f }; static const float endCol[4] = { 0.2f, 0.4f, 0.0f, 0.75f }; static const float pathCol[4] = {0,0,0,0.25f}; @@ -262,7 +264,7 @@ void Sample_StatMesh::toolRender(int flags) { dtDebugDrawStatNavMeshPoly(m_navMesh, m_startRef, startCol); const float col[4] = {1,1,1,0.5f}; - rcDebugDrawCylinderWire(m_spos[0]-m_distanceToWall, m_spos[1]+0.02f, m_spos[2]-m_distanceToWall, + rcDebugDrawCylinderWire(&dd, m_spos[0]-m_distanceToWall, m_spos[1]+0.02f, m_spos[2]-m_distanceToWall, m_spos[0]+m_distanceToWall, m_spos[1]+m_agentHeight, m_spos[2]+m_distanceToWall, col); glLineWidth(3.0f); glColor4fv(col); @@ -274,7 +276,7 @@ void Sample_StatMesh::toolRender(int flags) } else if (m_toolMode == TOOLMODE_FIND_POLYS_AROUND) { - glLineWidth(2.0f); + const float cola[4] = {0,0,0,0.5f}; for (int i = 0; i < m_npolys; ++i) { dtDebugDrawStatNavMeshPoly(m_navMesh, m_polys[i], pathCol); @@ -283,17 +285,15 @@ void Sample_StatMesh::toolRender(int flags) float p0[3], p1[3]; getPolyCenter(m_navMesh, m_polys[i], p0); getPolyCenter(m_navMesh, m_parent[i], p1); - glColor4ub(0,0,0,128); - rcDrawArc(p0, p1); + rcDrawArc(&dd, p0, p1, cola, 2.0f); } } - glLineWidth(1.0f); const float dx = m_epos[0] - m_spos[0]; const float dz = m_epos[2] - m_spos[2]; float dist = sqrtf(dx*dx + dz*dz); const float col[4] = {1,1,1,0.5f}; - rcDebugDrawCylinderWire(m_spos[0]-dist, m_spos[1]+0.02f, m_spos[2]-dist, + rcDebugDrawCylinderWire(&dd, m_spos[0]-dist, m_spos[1]+0.02f, m_spos[2]-dist, m_spos[0]+dist, m_spos[1]+m_agentHeight, m_spos[2]+dist, col); } } @@ -320,11 +320,13 @@ void Sample_StatMesh::toolRenderOverlay(double* proj, double* model, int* view) void Sample_StatMesh::drawAgent(const float* pos, float r, float h, float c, const float* col) { + DebugDrawGL dd; + glDepthMask(GL_FALSE); // Agent dimensions. glLineWidth(2.0f); - rcDebugDrawCylinderWire(pos[0]-r, pos[1]+0.02f, pos[2]-r, pos[0]+r, pos[1]+h, pos[2]+r, col); + rcDebugDrawCylinderWire(&dd, pos[0]-r, pos[1]+0.02f, pos[2]-r, pos[0]+r, pos[1]+h, pos[2]+r, col); glLineWidth(1.0f); glColor4ub(0,0,0,196); diff --git a/RecastDemo/Source/Sample_StatMeshSimple.cpp b/RecastDemo/Source/Sample_StatMeshSimple.cpp index ec92d84..6311cc9 100644 --- a/RecastDemo/Source/Sample_StatMeshSimple.cpp +++ b/RecastDemo/Source/Sample_StatMeshSimple.cpp @@ -144,6 +144,8 @@ void Sample_StatMeshSimple::handleRender() return; float col[4]; + + DebugDrawGL dd; glEnable(GL_FOG); glDepthMask(GL_TRUE); @@ -151,12 +153,12 @@ void Sample_StatMeshSimple::handleRender() if (m_drawMode == DRAWMODE_MESH) { // Draw mesh - rcDebugDrawMeshSlope(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, m_agentMaxSlope); + rcDebugDrawMeshSlope(&dd, m_verts, m_nverts, m_tris, m_trinorms, m_ntris, m_agentMaxSlope); } else if (m_drawMode != DRAWMODE_NAVMESH_TRANS) { // Draw mesh - rcDebugDrawMesh(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); + rcDebugDrawMesh(&dd, m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); } glDisable(GL_FOG); @@ -164,7 +166,7 @@ void Sample_StatMeshSimple::handleRender() // Draw bounds col[0] = 1; col[1] = 1; col[2] = 1; col[3] = 0.5f; - rcDebugDrawBoxWire(m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); + rcDebugDrawBoxWire(&dd, m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); if (m_navMesh && (m_drawMode == DRAWMODE_NAVMESH || @@ -183,61 +185,61 @@ void Sample_StatMeshSimple::handleRender() glDepthMask(GL_TRUE); if (m_chf && m_drawMode == DRAWMODE_COMPACT) - rcDebugDrawCompactHeightfieldSolid(*m_chf); + rcDebugDrawCompactHeightfieldSolid(&dd, *m_chf); if (m_chf && m_drawMode == DRAWMODE_COMPACT_DISTANCE) - rcDebugDrawCompactHeightfieldDistance(*m_chf); + rcDebugDrawCompactHeightfieldDistance(&dd, *m_chf); if (m_chf && m_drawMode == DRAWMODE_COMPACT_REGIONS) - rcDebugDrawCompactHeightfieldRegions(*m_chf); + rcDebugDrawCompactHeightfieldRegions(&dd, *m_chf); if (m_solid && m_drawMode == DRAWMODE_VOXELS) { glEnable(GL_FOG); - rcDebugDrawHeightfieldSolid(*m_solid); + rcDebugDrawHeightfieldSolid(&dd, *m_solid); glDisable(GL_FOG); } if (m_solid && m_drawMode == DRAWMODE_VOXELS_WALKABLE) { glEnable(GL_FOG); - rcDebugDrawHeightfieldWalkable(*m_solid); + rcDebugDrawHeightfieldWalkable(&dd, *m_solid); glDisable(GL_FOG); } if (m_cset && m_drawMode == DRAWMODE_RAW_CONTOURS) { glDepthMask(GL_FALSE); - rcDebugDrawRawContours(*m_cset); + rcDebugDrawRawContours(&dd, *m_cset); glDepthMask(GL_TRUE); } if (m_cset && m_drawMode == DRAWMODE_BOTH_CONTOURS) { glDepthMask(GL_FALSE); - rcDebugDrawRawContours(*m_cset, 0.5f); - rcDebugDrawContours(*m_cset); + rcDebugDrawRawContours(&dd, *m_cset, 0.5f); + rcDebugDrawContours(&dd, *m_cset); glDepthMask(GL_TRUE); } if (m_cset && m_drawMode == DRAWMODE_CONTOURS) { glDepthMask(GL_FALSE); - rcDebugDrawContours(*m_cset); + rcDebugDrawContours(&dd, *m_cset); glDepthMask(GL_TRUE); } if (m_chf && m_cset && m_drawMode == DRAWMODE_REGION_CONNECTIONS) { - rcDebugDrawCompactHeightfieldRegions(*m_chf); + rcDebugDrawCompactHeightfieldRegions(&dd, *m_chf); glDepthMask(GL_FALSE); - rcDebugDrawRegionConnections(*m_cset); + rcDebugDrawRegionConnections(&dd, *m_cset); glDepthMask(GL_TRUE); } if (m_pmesh && m_drawMode == DRAWMODE_POLYMESH) { glDepthMask(GL_FALSE); - rcDebugDrawPolyMesh(*m_pmesh); + rcDebugDrawPolyMesh(&dd, *m_pmesh); glDepthMask(GL_TRUE); } if (m_dmesh && m_drawMode == DRAWMODE_POLYMESH_DETAIL) { glDepthMask(GL_FALSE); - rcDebugDrawPolyMeshDetail(*m_dmesh); + rcDebugDrawPolyMeshDetail(&dd, *m_dmesh); glDepthMask(GL_TRUE); } diff --git a/RecastDemo/Source/Sample_StatMeshTiled.cpp b/RecastDemo/Source/Sample_StatMeshTiled.cpp index aeb8362..4236f07 100644 --- a/RecastDemo/Source/Sample_StatMeshTiled.cpp +++ b/RecastDemo/Source/Sample_StatMeshTiled.cpp @@ -178,18 +178,20 @@ void Sample_StatMeshTiled::handleRender() float col[4]; + DebugDrawGL dd; + glEnable(GL_FOG); glDepthMask(GL_TRUE); if (m_drawMode == DRAWMODE_MESH) { // Draw mesh - rcDebugDrawMeshSlope(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, m_agentMaxSlope); + rcDebugDrawMeshSlope(&dd, m_verts, m_nverts, m_tris, m_trinorms, m_ntris, m_agentMaxSlope); } else if (m_drawMode != DRAWMODE_NAVMESH_TRANS) { // Draw mesh - rcDebugDrawMesh(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); + rcDebugDrawMesh(&dd, m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); } glDisable(GL_FOG); @@ -197,7 +199,7 @@ void Sample_StatMeshTiled::handleRender() // Draw bounds col[0] = 1; col[1] = 1; col[2] = 1; col[3] = 0.5f; - rcDebugDrawBoxWire(m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); + rcDebugDrawBoxWire(&dd, m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); // Tiling grid. const int ts = (int)m_tileSize; @@ -260,7 +262,7 @@ void Sample_StatMeshTiled::handleRender() for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].chf) - rcDebugDrawCompactHeightfieldSolid(*m_tileSet->tiles[i].chf); + rcDebugDrawCompactHeightfieldSolid(&dd, *m_tileSet->tiles[i].chf); } } @@ -269,7 +271,7 @@ void Sample_StatMeshTiled::handleRender() for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].chf) - rcDebugDrawCompactHeightfieldDistance(*m_tileSet->tiles[i].chf); + rcDebugDrawCompactHeightfieldDistance(&dd, *m_tileSet->tiles[i].chf); } } if (m_drawMode == DRAWMODE_COMPACT_REGIONS) @@ -277,7 +279,7 @@ void Sample_StatMeshTiled::handleRender() for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].chf) - rcDebugDrawCompactHeightfieldRegions(*m_tileSet->tiles[i].chf); + rcDebugDrawCompactHeightfieldRegions(&dd, *m_tileSet->tiles[i].chf); } } @@ -287,7 +289,7 @@ void Sample_StatMeshTiled::handleRender() for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].solid) - rcDebugDrawHeightfieldSolid(*m_tileSet->tiles[i].solid); + rcDebugDrawHeightfieldSolid(&dd, *m_tileSet->tiles[i].solid); } glDisable(GL_FOG); } @@ -297,7 +299,7 @@ void Sample_StatMeshTiled::handleRender() for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].solid) - rcDebugDrawHeightfieldWalkable(*m_tileSet->tiles[i].solid); + rcDebugDrawHeightfieldWalkable(&dd, *m_tileSet->tiles[i].solid); } glDisable(GL_FOG); } @@ -307,7 +309,7 @@ void Sample_StatMeshTiled::handleRender() for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].cset) - rcDebugDrawRawContours(*m_tileSet->tiles[i].cset); + rcDebugDrawRawContours(&dd, *m_tileSet->tiles[i].cset); } glDepthMask(GL_TRUE); } @@ -318,8 +320,8 @@ void Sample_StatMeshTiled::handleRender() { if (m_tileSet->tiles[i].cset) { - rcDebugDrawRawContours(*m_tileSet->tiles[i].cset, 0.5f); - rcDebugDrawContours(*m_tileSet->tiles[i].cset); + rcDebugDrawRawContours(&dd, *m_tileSet->tiles[i].cset, 0.5f); + rcDebugDrawContours(&dd, *m_tileSet->tiles[i].cset); } } glDepthMask(GL_TRUE); @@ -330,7 +332,7 @@ void Sample_StatMeshTiled::handleRender() for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].cset) - rcDebugDrawContours(*m_tileSet->tiles[i].cset); + rcDebugDrawContours(&dd, *m_tileSet->tiles[i].cset); } glDepthMask(GL_TRUE); } @@ -339,14 +341,14 @@ void Sample_StatMeshTiled::handleRender() for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].chf) - rcDebugDrawCompactHeightfieldRegions(*m_tileSet->tiles[i].chf); + rcDebugDrawCompactHeightfieldRegions(&dd, *m_tileSet->tiles[i].chf); } glDepthMask(GL_FALSE); for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].cset) - rcDebugDrawRegionConnections(*m_tileSet->tiles[i].cset); + rcDebugDrawRegionConnections(&dd, *m_tileSet->tiles[i].cset); } glDepthMask(GL_TRUE); } @@ -355,14 +357,14 @@ void Sample_StatMeshTiled::handleRender() glDepthMask(GL_FALSE); if (m_pmesh) { - rcDebugDrawPolyMesh(*m_pmesh); + rcDebugDrawPolyMesh(&dd, *m_pmesh); } else { for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].pmesh) - rcDebugDrawPolyMesh(*m_tileSet->tiles[i].pmesh); + rcDebugDrawPolyMesh(&dd, *m_tileSet->tiles[i].pmesh); } } @@ -373,14 +375,14 @@ void Sample_StatMeshTiled::handleRender() glDepthMask(GL_FALSE); if (m_dmesh) { - rcDebugDrawPolyMeshDetail(*m_dmesh); + rcDebugDrawPolyMeshDetail(&dd, *m_dmesh); } else { for (int i = 0; i < m_tileSet->width*m_tileSet->height; ++i) { if (m_tileSet->tiles[i].dmesh) - rcDebugDrawPolyMeshDetail(*m_tileSet->tiles[i].dmesh); + rcDebugDrawPolyMeshDetail(&dd, *m_tileSet->tiles[i].dmesh); } } glDepthMask(GL_TRUE); diff --git a/RecastDemo/Source/Sample_TileMesh.cpp b/RecastDemo/Source/Sample_TileMesh.cpp index b470523..37ea3fd 100644 --- a/RecastDemo/Source/Sample_TileMesh.cpp +++ b/RecastDemo/Source/Sample_TileMesh.cpp @@ -244,17 +244,19 @@ void Sample_TileMesh::handleRender() if (!m_verts || !m_tris || !m_trinorms) return; + DebugDrawGL dd; + // Draw mesh if (m_navMesh) - rcDebugDrawMesh(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); + rcDebugDrawMesh(&dd, m_verts, m_nverts, m_tris, m_trinorms, m_ntris, 0); else - rcDebugDrawMeshSlope(m_verts, m_nverts, m_tris, m_trinorms, m_ntris, m_agentMaxSlope); + rcDebugDrawMeshSlope(&dd, m_verts, m_nverts, m_tris, m_trinorms, m_ntris, m_agentMaxSlope); glDepthMask(GL_FALSE); // Draw bounds float col[4] = {1,1,1,0.5f}; - rcDebugDrawBoxWire(m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); + rcDebugDrawBoxWire(&dd, m_bmin[0],m_bmin[1],m_bmin[2], m_bmax[0],m_bmax[1],m_bmax[2], col); // Tiling grid. const int ts = (int)m_tileSize; @@ -294,7 +296,7 @@ void Sample_TileMesh::handleRender() glEnd(); // Draw active tile - rcDebugDrawBoxWire(m_tileBmin[0],m_tileBmin[1],m_tileBmin[2], m_tileBmax[0],m_tileBmax[1],m_tileBmax[2], m_tileCol); + rcDebugDrawBoxWire(&dd, m_tileBmin[0],m_tileBmin[1],m_tileBmin[2], m_tileBmax[0],m_tileBmax[1],m_tileBmax[2], m_tileCol); if (m_navMesh) dtDebugDrawTiledNavMesh(m_navMesh); @@ -389,7 +391,7 @@ void Sample_TileMesh::handleRender() { dtDebugDrawTiledNavMeshPoly(m_navMesh, m_startRef, startCol); const float col[4] = {1,1,1,0.5f}; - rcDebugDrawCylinderWire(m_spos[0]-m_distanceToWall, m_spos[1]+0.02f, m_spos[2]-m_distanceToWall, + rcDebugDrawCylinderWire(&dd, m_spos[0]-m_distanceToWall, m_spos[1]+0.02f, m_spos[2]-m_distanceToWall, m_spos[0]+m_distanceToWall, m_spos[1]+m_agentHeight, m_spos[2]+m_distanceToWall, col); glLineWidth(3.0f); glColor4fv(col); @@ -401,7 +403,7 @@ void Sample_TileMesh::handleRender() } else if (m_toolMode == TOOLMODE_FIND_POLYS_AROUND) { - glLineWidth(2.0f); + const float cola[4] = {0,0,0,0.5f}; for (int i = 0; i < m_npolys; ++i) { dtDebugDrawTiledNavMeshPoly(m_navMesh, m_polys[i], pathCol); @@ -411,16 +413,15 @@ void Sample_TileMesh::handleRender() getPolyCenter(m_navMesh, m_polys[i], p0); getPolyCenter(m_navMesh, m_parent[i], p1); glColor4ub(0,0,0,128); - rcDrawArc(p0, p1); + rcDrawArc(&dd, p0, p1, cola, 2.0f); } } - glLineWidth(1.0f); const float dx = m_epos[0] - m_spos[0]; const float dz = m_epos[2] - m_spos[2]; float dist = sqrtf(dx*dx + dz*dz); const float col[4] = {1,1,1,0.5f}; - rcDebugDrawCylinderWire(m_spos[0]-dist, m_spos[1]+0.02f, m_spos[2]-dist, + rcDebugDrawCylinderWire(&dd, m_spos[0]-dist, m_spos[1]+0.02f, m_spos[2]-dist, m_spos[0]+dist, m_spos[1]+m_agentHeight, m_spos[2]+dist, col); }