From f5bb64a3759fbb21f2ef74a623ff559f0f42d94b Mon Sep 17 00:00:00 2001 From: Mikko Mononen Date: Fri, 17 Sep 2010 07:25:19 +0000 Subject: [PATCH] Fix for Issue 123. --- DebugUtils/Source/DetourDebugDraw.cpp | 14 +- Detour/Include/DetourNavMesh.h | 7 +- Detour/Source/DetourNavMesh.cpp | 12 +- Detour/Source/DetourNavMeshBuilder.cpp | 8 +- Detour/Source/DetourNavMeshQuery.cpp | 18 +- .../Bin/Recast.app/Contents/MacOS/Recast | Bin 993212 -> 993212 bytes .../Xcode/Recast.xcodeproj/memon.pbxuser | 317 ++++++++++++++++-- .../Recast.xcodeproj/memon.perspectivev3 | 56 ++-- RecastDemo/Source/main.cpp | 2 +- 9 files changed, 344 insertions(+), 90 deletions(-) diff --git a/DebugUtils/Source/DetourDebugDraw.cpp b/DebugUtils/Source/DetourDebugDraw.cpp index 9edbcc6..dd7965f 100755 --- a/DebugUtils/Source/DetourDebugDraw.cpp +++ b/DebugUtils/Source/DetourDebugDraw.cpp @@ -50,7 +50,7 @@ static void drawPolyBoundaries(duDebugDraw* dd, const dtMeshTile* tile, { const dtPoly* p = &tile->polys[i]; - if (p->type == DT_POLYTYPE_OFFMESH_CONNECTION) continue; + if (p->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) continue; const dtPolyDetail* pd = &tile->detailMeshes[i]; @@ -127,7 +127,7 @@ static void drawMeshTile(duDebugDraw* dd, const dtNavMesh& mesh, const dtNavMesh for (int i = 0; i < tile->header->polyCount; ++i) { const dtPoly* p = &tile->polys[i]; - if (p->type == DT_POLYTYPE_OFFMESH_CONNECTION) // Skip off-mesh links. + if (p->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) // Skip off-mesh links. continue; const dtPolyDetail* pd = &tile->detailMeshes[i]; @@ -137,10 +137,10 @@ static void drawMeshTile(duDebugDraw* dd, const dtNavMesh& mesh, const dtNavMesh col = duRGBA(255,196,0,64); else { - if (p->area == 0) // Treat zero area type as default. + if (p->getArea() == 0) // Treat zero area type as default. col = duRGBA(0,192,255,64); else - col = duIntToCol(p->area, 64); + col = duIntToCol(p->getArea(), 64); } for (int j = 0; j < pd->triCount; ++j) @@ -169,14 +169,14 @@ static void drawMeshTile(duDebugDraw* dd, const dtNavMesh& mesh, const dtNavMesh for (int i = 0; i < tile->header->polyCount; ++i) { const dtPoly* p = &tile->polys[i]; - if (p->type != DT_POLYTYPE_OFFMESH_CONNECTION) // Skip regular polys. + if (p->getType() != DT_POLYTYPE_OFFMESH_CONNECTION) // Skip regular polys. continue; unsigned int col; if (query && query->isInClosedList(base | (dtPolyRef)i)) col = duRGBA(255,196,0,220); else - col = duDarkenCol(duIntToCol(p->area, 220)); + col = duDarkenCol(duIntToCol(p->getArea(), 220)); const dtOffMeshConnection* con = &tile->offMeshCons[i - tile->header->offMeshBase]; const float* va = &tile->verts[p->verts[0]*3]; @@ -427,7 +427,7 @@ void duDebugDrawNavMeshPoly(duDebugDraw* dd, const dtNavMesh& mesh, dtPolyRef re const unsigned int c = (col & 0x00ffffff) | (64 << 24); const unsigned int ip = (unsigned int)(poly - tile->polys); - if (poly->type == DT_POLYTYPE_OFFMESH_CONNECTION) + if (poly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) { dtOffMeshConnection* con = &tile->offMeshCons[ip - tile->header->offMeshBase]; diff --git a/Detour/Include/DetourNavMesh.h b/Detour/Include/DetourNavMesh.h index 92e5cb6..b441bc6 100644 --- a/Detour/Include/DetourNavMesh.h +++ b/Detour/Include/DetourNavMesh.h @@ -71,8 +71,11 @@ struct dtPoly unsigned short neis[DT_VERTS_PER_POLYGON]; // Refs to neighbours of the poly. unsigned short flags; // Flags (see dtPolyFlags). unsigned char vertCount; // Number of vertices. - unsigned char area : 6; // Area ID of the polygon. - unsigned char type : 2; // Polygon type, see dtPolyTypes. + unsigned char areaAndtype; // Bit packed: Area ID of the polygon, and Polygon type, see dtPolyTypes.. + inline void setArea(unsigned char a) { areaAndtype = (areaAndtype & 0xc0) | (a & 0x3f); } + inline void setType(unsigned char t) { areaAndtype = (areaAndtype & 0x3f) | (t << 6); } + inline unsigned char getArea() const { return areaAndtype & 0x3f; } + inline unsigned char getType() const { return areaAndtype >> 6; } }; // Stucture describing polygon detail triangles. diff --git a/Detour/Source/DetourNavMesh.cpp b/Detour/Source/DetourNavMesh.cpp index 9c09c80..ab805d3 100644 --- a/Detour/Source/DetourNavMesh.cpp +++ b/Detour/Source/DetourNavMesh.cpp @@ -455,7 +455,7 @@ void dtNavMesh::connectIntLinks(dtMeshTile* tile) dtPoly* poly = &tile->polys[i]; poly->firstLink = DT_NULL_LINK; - if (poly->type == DT_POLYTYPE_OFFMESH_CONNECTION) + if (poly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) continue; // Build edge links backwards so that the links will be @@ -1065,7 +1065,7 @@ bool dtNavMesh::storeTileState(const dtMeshTile* tile, unsigned char* data, cons const dtPoly* p = &tile->polys[i]; dtPolyState* s = &polyStates[i]; s->flags = p->flags; - s->area = p->area; + s->area = p->getArea(); } return true; @@ -1095,7 +1095,7 @@ bool dtNavMesh::restoreTileState(dtMeshTile* tile, const unsigned char* data, co dtPoly* p = &tile->polys[i]; const dtPolyState* s = &polyStates[i]; p->flags = s->flags; - p->area = s->area; + p->setArea(s->area); } return true; @@ -1115,7 +1115,7 @@ bool dtNavMesh::getOffMeshConnectionPolyEndPoints(dtPolyRef prevRef, dtPolyRef p const dtPoly* poly = &tile->polys[ip]; // Make sure that the current poly is indeed off-mesh link. - if (poly->type != DT_POLYTYPE_OFFMESH_CONNECTION) + if (poly->getType() != DT_POLYTYPE_OFFMESH_CONNECTION) return false; // Figure out which way to hand out the vertices. @@ -1177,7 +1177,7 @@ void dtNavMesh::setPolyArea(dtPolyRef ref, unsigned char area) dtMeshTile* tile = &m_tiles[it]; if (ip >= (unsigned int)tile->header->polyCount) return; dtPoly* poly = &tile->polys[ip]; - poly->area = area; + poly->setArea(area); } unsigned char dtNavMesh::getPolyArea(dtPolyRef ref) const @@ -1189,6 +1189,6 @@ unsigned char dtNavMesh::getPolyArea(dtPolyRef ref) const const dtMeshTile* tile = &m_tiles[it]; if (ip >= (unsigned int)tile->header->polyCount) return 0; const dtPoly* poly = &tile->polys[ip]; - return poly->area; + return poly->getArea(); } diff --git a/Detour/Source/DetourNavMeshBuilder.cpp b/Detour/Source/DetourNavMeshBuilder.cpp index ab69952..7f83a99 100644 --- a/Detour/Source/DetourNavMeshBuilder.cpp +++ b/Detour/Source/DetourNavMeshBuilder.cpp @@ -430,8 +430,8 @@ bool dtCreateNavMeshData(dtNavMeshCreateParams* params, unsigned char** outData, dtPoly* p = &navPolys[i]; p->vertCount = 0; p->flags = params->polyFlags[i]; - p->area = params->polyAreas[i]; - p->type = DT_POLYTYPE_GROUND; + p->setArea(params->polyAreas[i]); + p->setType(DT_POLYTYPE_GROUND); for (int j = 0; j < nvp; ++j) { if (src[j] == MESH_NULL_IDX) break; @@ -453,8 +453,8 @@ bool dtCreateNavMeshData(dtNavMeshCreateParams* params, unsigned char** outData, p->verts[0] = (unsigned short)(offMeshVertsBase + n*2+0); p->verts[1] = (unsigned short)(offMeshVertsBase + n*2+1); p->flags = params->offMeshConFlags[i]; - p->area = params->offMeshConAreas[i]; - p->type = DT_POLYTYPE_OFFMESH_CONNECTION; + p->setArea(params->offMeshConAreas[i]); + p->setType(DT_POLYTYPE_OFFMESH_CONNECTION); n++; } } diff --git a/Detour/Source/DetourNavMeshQuery.cpp b/Detour/Source/DetourNavMeshQuery.cpp index 727a392..c02ce47 100644 --- a/Detour/Source/DetourNavMeshQuery.cpp +++ b/Detour/Source/DetourNavMeshQuery.cpp @@ -64,7 +64,7 @@ inline float dtQueryFilter::getCost(const float* pa, const float* pb, const dtPolyRef /*curRef*/, const dtMeshTile* /*curTile*/, const dtPoly* curPoly, const dtPolyRef /*nextRef*/, const dtMeshTile* /*nextTile*/, const dtPoly* /*nextPoly*/) const { - return dtVdist(pa, pb) * m_areaCost[curPoly->area]; + return dtVdist(pa, pb) * m_areaCost[curPoly->getArea()]; } #endif @@ -311,7 +311,7 @@ bool dtNavMeshQuery::getPolyHeight(dtPolyRef ref, const float* pos, float* heigh if (!m_nav->getTileAndPolyByRef(ref, &tile, &poly)) return false; - if (poly->type == DT_POLYTYPE_OFFMESH_CONNECTION) + if (poly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) { const float* v0 = &tile->verts[poly->verts[0]*3]; const float* v1 = &tile->verts[poly->verts[1]*3]; @@ -1398,13 +1398,13 @@ bool dtNavMeshQuery::getPortalPoints(dtPolyRef from, dtPolyRef to, float* left, const dtPoly* fromPoly = 0; if (!m_nav->getTileAndPolyByRef(from, &fromTile, &fromPoly)) return false; - fromType = fromPoly->type; + fromType = fromPoly->getType(); const dtMeshTile* toTile = 0; const dtPoly* toPoly = 0; if (!m_nav->getTileAndPolyByRef(to, &toTile, &toPoly)) return false; - toType = toPoly->type; + toType = toPoly->getType(); return getPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, left, right); } @@ -1428,7 +1428,7 @@ bool dtNavMeshQuery::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, con return false; // Handle off-mesh connections. - if (fromPoly->type == DT_POLYTYPE_OFFMESH_CONNECTION) + if (fromPoly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) { // Find link that points to first vertex. for (unsigned int i = fromPoly->firstLink; i != DT_NULL_LINK; i = fromTile->links[i].next) @@ -1444,7 +1444,7 @@ bool dtNavMeshQuery::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, con return false; } - if (toPoly->type == DT_POLYTYPE_OFFMESH_CONNECTION) + if (toPoly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) { for (unsigned int i = toPoly->firstLink; i != DT_NULL_LINK; i = toTile->links[i].next) { @@ -1583,7 +1583,7 @@ int dtNavMeshQuery::raycast(dtPolyRef centerRef, const float* startPos, const fl m_nav->getTileAndPolyByRefUnsafe(link->ref, &nextTile, &nextPoly); // Skip off-mesh connections. - if (nextPoly->type == DT_POLYTYPE_OFFMESH_CONNECTION) + if (nextPoly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) continue; // Skip links based on filter. @@ -2025,7 +2025,7 @@ int dtNavMeshQuery::findLocalNeighbourhood(dtPolyRef centerRef, const float* cen m_nav->getTileAndPolyByRefUnsafe(neighbourRef, &neighbourTile, &neighbourPoly); // Skip off-mesh connections. - if (neighbourPoly->type == DT_POLYTYPE_OFFMESH_CONNECTION) + if (neighbourPoly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) continue; // Do not advance if the polygon is excluded by the filter. @@ -2341,7 +2341,7 @@ float dtNavMeshQuery::findDistanceToWall(dtPolyRef centerRef, const float* cente m_nav->getTileAndPolyByRefUnsafe(neighbourRef, &neighbourTile, &neighbourPoly); // Skip off-mesh connections. - if (neighbourPoly->type == DT_POLYTYPE_OFFMESH_CONNECTION) + if (neighbourPoly->getType() == DT_POLYTYPE_OFFMESH_CONNECTION) continue; // Calc distance to the edge. diff --git a/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast b/RecastDemo/Bin/Recast.app/Contents/MacOS/Recast index 9ee9cafadb23c034fdba3ffb56016f0ffb367638..bdef8d49335997b2e19199690e940a346f6a14e3 100755 GIT binary patch delta 101906 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