1
0
mirror of https://github.com/Mauler125/r5sdk.git synced 2025-02-09 19:15:03 +01:00

Recast: deduplicate XX_VERTS_PER_POLYGON constant

Must be synced between Recast & Detour.
This commit is contained in:
Kawe Mazidjatari 2024-09-23 12:25:25 +02:00
parent 0298591068
commit da37f898cf
12 changed files with 92 additions and 93 deletions

@ -299,8 +299,8 @@ bool Editor_SoloMesh::handleBuild()
}
// (Optional) Mark areas.
const ShapeVolume* vols = m_geom->getConvexVolumes();
for (int i = 0; i < m_geom->getConvexVolumeCount(); ++i)
const ShapeVolume* vols = m_geom->getShapeVolumes();
for (int i = 0; i < m_geom->getShapeVolumeCount(); ++i)
rcMarkConvexPolyArea(m_ctx, vols[i].verts, vols[i].nverts, vols[i].hmin, vols[i].hmax, (unsigned short)vols[i].flags, (unsigned char)vols[i].area, *m_chf);
@ -437,7 +437,7 @@ bool Editor_SoloMesh::handleBuild()
const int traverseTableCount = NavMesh_GetTraverseTableCountForNavMeshType(m_selectedNavMeshType);
if (m_cfg.maxVertsPerPoly <= DT_VERTS_PER_POLYGON)
if (m_cfg.maxVertsPerPoly <= RD_VERTS_PER_POLYGON)
{
unsigned char* navData = 0;
int navDataSize = 0;

@ -360,8 +360,8 @@ int Editor_TempObstacles::rasterizeTileLayers(
}
// (Optional) Mark areas.
const ShapeVolume* vols = m_geom->getConvexVolumes();
for (int i = 0; i < m_geom->getConvexVolumeCount(); ++i)
const ShapeVolume* vols = m_geom->getShapeVolumes();
for (int i = 0; i < m_geom->getShapeVolumeCount(); ++i)
{
rcMarkConvexPolyArea(m_ctx, vols[i].verts, vols[i].nverts,
vols[i].hmin, vols[i].hmax,

@ -1103,8 +1103,8 @@ unsigned char* Editor_TileMesh::buildTileMesh(const int tx, const int ty, const
}
// (Optional) Mark areas.
const ShapeVolume* vols = m_geom->getConvexVolumes();
for (int i = 0; i < m_geom->getConvexVolumeCount(); ++i)
const ShapeVolume* vols = m_geom->getShapeVolumes();
for (int i = 0; i < m_geom->getShapeVolumeCount(); ++i)
{
const ShapeVolume& vol = vols[i];
@ -1244,7 +1244,7 @@ unsigned char* Editor_TileMesh::buildTileMesh(const int tx, const int ty, const
unsigned char* navData = 0;
int navDataSize = 0;
if (m_cfg.maxVertsPerPoly <= DT_VERTS_PER_POLYGON)
if (m_cfg.maxVertsPerPoly <= RD_VERTS_PER_POLYGON)
{
if (m_pmesh->nverts >= 0xffff)
{

@ -1316,7 +1316,7 @@ void NavMeshTesterTool::handleRender()
dd.depthMask(true);
}
static const int MAX_SEGS = DT_VERTS_PER_POLYGON*4;
static const int MAX_SEGS = RD_VERTS_PER_POLYGON*4;
float segs[MAX_SEGS*6];
dtPolyRef refs[MAX_SEGS];
memset(refs, 0, sizeof(dtPolyRef)*MAX_SEGS);

@ -20,6 +20,7 @@
#define DETOURNAVMESH_H
#include "Shared/Include/SharedAlloc.h"
#include "Shared/Include/SharedConst.h"
#include "Detour/Include/DetourStatus.h"
// NOTE: these are defines as we need to be able to switch between code that is
@ -72,10 +73,6 @@ static const int DT_FULL_UNLINKED_TILE_USER_ID = 1;
/// to anything (tagged as #DT_UNLINKED_POLY_GROUP), and 1 that does link to something.
static const int DT_SEMI_UNLINKED_TILE_USER_ID = 2;
/// The maximum number of vertices per navigation polygon.
/// @ingroup detour
static const int DT_VERTS_PER_POLYGON = 6;
/// A value that indicates that this poly hasn't been assigned to a group yet.
static const unsigned short DT_NULL_POLY_GROUP = 0;
@ -287,10 +284,10 @@ struct dtPoly
/// The indices of the polygon's vertices.
/// The actual vertices are located in dtMeshTile::verts.
unsigned short verts[DT_VERTS_PER_POLYGON];
unsigned short verts[RD_VERTS_PER_POLYGON];
/// Packed data representing neighbor polygons references and flags for each edge.
unsigned short neis[DT_VERTS_PER_POLYGON];
unsigned short neis[RD_VERTS_PER_POLYGON];
/// The user defined polygon flags.
unsigned short flags;

@ -1101,7 +1101,7 @@ bool dtNavMesh::getPolyHeight(const dtMeshTile* tile, const dtPoly* poly, const
const unsigned int ip = (unsigned int)(poly - tile->polys);
const dtPolyDetail* pd = &tile->detailMeshes[ip];
float verts[DT_VERTS_PER_POLYGON*3];
float verts[RD_VERTS_PER_POLYGON*3];
const int nv = poly->vertCount;
for (int i = 0; i < nv; ++i)
rdVcopy(&verts[i*3], &tile->verts[poly->verts[i]*3]);

@ -181,7 +181,7 @@ static bool createBVTree(dtNavMeshCreateParams* params, rdTempVector<BVItem>& no
BVItem& it = items[i];
it.i = i;
float polyVerts[DT_VERTS_PER_POLYGON*3];
float polyVerts[RD_VERTS_PER_POLYGON*3];
const float* targetVert;
int vertCount;
@ -552,7 +552,7 @@ static bool createPolyMeshCells(const dtNavMeshCreateParams* params, rdTempVecto
const unsigned int tb = params->detailMeshes[i*4+2];
const unsigned int tc = params->detailMeshes[i*4+3];
float polyVerts[DT_VERTS_PER_POLYGON*3];
float polyVerts[RD_VERTS_PER_POLYGON*3];
for (int j = 0; j < nv; ++j)
{
@ -713,7 +713,7 @@ static bool createPolyMeshCells(const dtNavMeshCreateParams* params, rdTempVecto
/// @see dtNavMesh, dtNavMesh::addTile()
bool dtCreateNavMeshData(dtNavMeshCreateParams* params, unsigned char** outData, int* outDataSize)
{
if (params->nvp > DT_VERTS_PER_POLYGON)
if (params->nvp > RD_VERTS_PER_POLYGON)
return false;
if (params->vertCount >= 0xffff)
return false;
@ -1265,7 +1265,7 @@ bool dtNavMeshDataSwapEndian(unsigned char* data, const int /*dataSize*/)
{
dtPoly* p = &polys[i];
// poly->firstLink is update when tile is added, no need to swap.
for (int j = 0; j < DT_VERTS_PER_POLYGON; ++j)
for (int j = 0; j < RD_VERTS_PER_POLYGON; ++j)
{
rdSwapEndian(&p->verts[j]);
rdSwapEndian(&p->neis[j]);

@ -288,8 +288,8 @@ dtStatus dtNavMeshQuery::findRandomPoint(const dtQueryFilter* filter, float (*fr
// Randomly pick point on polygon.
const float* v = &tile->verts[poly->verts[0]*3];
float verts[3*DT_VERTS_PER_POLYGON];
float areas[DT_VERTS_PER_POLYGON];
float verts[3*RD_VERTS_PER_POLYGON];
float areas[RD_VERTS_PER_POLYGON];
rdVcopy(&verts[0*3],v);
for (int j = 1; j < poly->vertCount; ++j)
{
@ -468,8 +468,8 @@ dtStatus dtNavMeshQuery::findRandomPointAroundCircle(dtPolyRef startRef, const f
// Randomly pick point on polygon.
const float* v = &randomTile->verts[randomPoly->verts[0]*3];
float verts[3*DT_VERTS_PER_POLYGON];
float areas[DT_VERTS_PER_POLYGON];
float verts[3*RD_VERTS_PER_POLYGON];
float areas[RD_VERTS_PER_POLYGON];
rdVcopy(&verts[0*3],v);
for (int j = 1; j < randomPoly->vertCount; ++j)
{
@ -540,9 +540,9 @@ dtStatus dtNavMeshQuery::closestPointOnPolyBoundary(dtPolyRef ref, const float*
return DT_FAILURE | DT_INVALID_PARAM;
// Collect vertices.
float verts[DT_VERTS_PER_POLYGON*3];
float edged[DT_VERTS_PER_POLYGON];
float edget[DT_VERTS_PER_POLYGON];
float verts[RD_VERTS_PER_POLYGON*3];
float edged[RD_VERTS_PER_POLYGON];
float edget[RD_VERTS_PER_POLYGON];
int nv = 0;
for (int i = 0; i < (int)poly->vertCount; ++i)
{
@ -2094,7 +2094,7 @@ dtStatus dtNavMeshQuery::moveAlongSurface(dtPolyRef startRef, const float* start
rdVlerp(searchPos, startPos, endPos, 0.5f);
searchRadSqr = rdSqr(rdVdist(startPos, endPos)/2.0f + 0.001f);
float verts[DT_VERTS_PER_POLYGON*3];
float verts[RD_VERTS_PER_POLYGON*3];
while (nstack)
{
@ -2518,7 +2518,7 @@ dtStatus dtNavMeshQuery::raycast(dtPolyRef startRef, const float* startPos, cons
}
float dir[3], curPos[3], lastPos[3];
float verts[DT_VERTS_PER_POLYGON*3+3];
float verts[RD_VERTS_PER_POLYGON*3+3];
int n = 0;
rdVcopy(curPos, startPos);
@ -3155,8 +3155,8 @@ dtStatus dtNavMeshQuery::findLocalNeighbourhood(dtPolyRef startRef, const float*
const float radiusSqr = rdSqr(radius);
float pa[DT_VERTS_PER_POLYGON*3];
float pb[DT_VERTS_PER_POLYGON*3];
float pa[RD_VERTS_PER_POLYGON*3];
float pb[RD_VERTS_PER_POLYGON*3];
dtStatus status = DT_SUCCESS;

@ -82,7 +82,7 @@ void dtLocalBoundary::addSegment(const float dist, const float* s)
void dtLocalBoundary::update(dtPolyRef ref, const float* pos, const float collisionQueryRange,
dtNavMeshQuery* navquery, const dtQueryFilter* filter)
{
static const int MAX_SEGS_PER_POLY = DT_VERTS_PER_POLYGON*3;
static const int MAX_SEGS_PER_POLY = RD_VERTS_PER_POLYGON*3;
if (!ref)
{

@ -732,7 +732,7 @@ dtStatus dtTileCache::buildNavMeshTile(const dtCompressedTileRef ref, dtNavMesh*
params.polyAreas = bc.lmesh->areas;
params.polyFlags = bc.lmesh->flags;
params.polyCount = bc.lmesh->npolys;
params.nvp = DT_VERTS_PER_POLYGON;
params.nvp = RD_VERTS_PER_POLYGON;
params.walkableHeight = m_params.walkableHeight;
params.walkableRadius = m_params.walkableRadius;
params.walkableClimb = m_params.walkableClimb;

@ -49,7 +49,6 @@ inline int getDirOffsetY(int dir)
return offset[dir&0x03];
}
static const int MAX_VERTS_PER_POLY = 6; // TODO: use the DT_VERTS_PER_POLYGON
static const int MAX_REM_EDGES = 48; // TODO: make this an expression.
@ -882,7 +881,7 @@ static bool buildMeshAdjacency(dtTileCacheAlloc* alloc,
// Based on code by Eric Lengyel from:
// http://www.terathon.com/code/edges.php
const int maxEdgeCount = npolys*MAX_VERTS_PER_POLY;
const int maxEdgeCount = npolys*RD_VERTS_PER_POLYGON;
dtFixedArray<unsigned short> firstEdge(alloc, nverts + maxEdgeCount);
if (!firstEdge)
return false;
@ -898,12 +897,12 @@ static bool buildMeshAdjacency(dtTileCacheAlloc* alloc,
for (int i = 0; i < npolys; ++i)
{
unsigned short* t = &polys[i*MAX_VERTS_PER_POLY*2];
for (int j = 0; j < MAX_VERTS_PER_POLY; ++j)
unsigned short* t = &polys[i*RD_VERTS_PER_POLYGON*2];
for (int j = 0; j < RD_VERTS_PER_POLYGON; ++j)
{
if (t[j] == DT_TILECACHE_NULL_IDX) break;
unsigned short v0 = t[j];
unsigned short v1 = (j+1 >= MAX_VERTS_PER_POLY || t[j+1] == DT_TILECACHE_NULL_IDX) ? t[0] : t[j+1];
unsigned short v1 = (j+1 >= RD_VERTS_PER_POLYGON || t[j+1] == DT_TILECACHE_NULL_IDX) ? t[0] : t[j+1];
if (v0 < v1)
{
rcEdge& edge = edges[edgeCount];
@ -923,12 +922,12 @@ static bool buildMeshAdjacency(dtTileCacheAlloc* alloc,
for (int i = 0; i < npolys; ++i)
{
unsigned short* t = &polys[i*MAX_VERTS_PER_POLY*2];
for (int j = 0; j < MAX_VERTS_PER_POLY; ++j)
unsigned short* t = &polys[i*RD_VERTS_PER_POLYGON*2];
for (int j = 0; j < RD_VERTS_PER_POLYGON; ++j)
{
if (t[j] == DT_TILECACHE_NULL_IDX) break;
unsigned short v0 = t[j];
unsigned short v1 = (j+1 >= MAX_VERTS_PER_POLY || t[j+1] == DT_TILECACHE_NULL_IDX) ? t[0] : t[j+1];
unsigned short v1 = (j+1 >= RD_VERTS_PER_POLYGON || t[j+1] == DT_TILECACHE_NULL_IDX) ? t[0] : t[j+1];
if (v0 > v1)
{
bool found = false;
@ -1048,15 +1047,15 @@ static bool buildMeshAdjacency(dtTileCacheAlloc* alloc,
const rcEdge& e = edges[i];
if (e.poly[0] != e.poly[1])
{
unsigned short* p0 = &polys[e.poly[0]*MAX_VERTS_PER_POLY*2];
unsigned short* p1 = &polys[e.poly[1]*MAX_VERTS_PER_POLY*2];
p0[MAX_VERTS_PER_POLY + e.polyEdge[0]] = e.poly[1];
p1[MAX_VERTS_PER_POLY + e.polyEdge[1]] = e.poly[0];
unsigned short* p0 = &polys[e.poly[0]*RD_VERTS_PER_POLYGON*2];
unsigned short* p1 = &polys[e.poly[1]*RD_VERTS_PER_POLYGON*2];
p0[RD_VERTS_PER_POLYGON + e.polyEdge[0]] = e.poly[1];
p1[RD_VERTS_PER_POLYGON + e.polyEdge[1]] = e.poly[0];
}
else if (e.polyEdge[1] != 0xff)
{
unsigned short* p0 = &polys[e.poly[0]*MAX_VERTS_PER_POLY*2];
p0[MAX_VERTS_PER_POLY + e.polyEdge[0]] = 0x8000 | (unsigned short)e.polyEdge[1];
unsigned short* p0 = &polys[e.poly[0]*RD_VERTS_PER_POLYGON*2];
p0[RD_VERTS_PER_POLYGON + e.polyEdge[0]] = 0x8000 | (unsigned short)e.polyEdge[1];
}
}
@ -1317,10 +1316,10 @@ static int triangulate(int n, const unsigned char* verts, unsigned short* indice
static int countPolyVerts(const unsigned short* p)
{
for (int i = 0; i < MAX_VERTS_PER_POLY; ++i)
for (int i = 0; i < RD_VERTS_PER_POLYGON; ++i)
if (p[i] == DT_TILECACHE_NULL_IDX)
return i;
return MAX_VERTS_PER_POLY;
return RD_VERTS_PER_POLYGON;
}
inline bool uleft(const unsigned short* a, const unsigned short* b, const unsigned short* c)
@ -1341,7 +1340,7 @@ static int getPolyMergeValue(unsigned short* pa, unsigned short* pb,
const int nb = countPolyVerts(pb);
// If the merged polygon would be too big, do not merge.
if (na+nb-2 > MAX_VERTS_PER_POLY)
if (na+nb-2 > RD_VERTS_PER_POLYGON)
return -1;
// Check if the polygons share an edge.
@ -1407,13 +1406,13 @@ static int getPolyMergeValue(unsigned short* pa, unsigned short* pb,
static void mergePolys(unsigned short* pa, unsigned short* pb, int ea, int eb)
{
unsigned short tmp[MAX_VERTS_PER_POLY*2];
unsigned short tmp[RD_VERTS_PER_POLYGON*2];
const int na = countPolyVerts(pa);
const int nb = countPolyVerts(pb);
// Merge polygons.
memset(tmp, 0xff, sizeof(unsigned short)*MAX_VERTS_PER_POLY*2);
memset(tmp, 0xff, sizeof(unsigned short)*RD_VERTS_PER_POLYGON*2);
int n = 0;
// Add pa
for (int i = 0; i < na-1; ++i)
@ -1422,7 +1421,7 @@ static void mergePolys(unsigned short* pa, unsigned short* pb, int ea, int eb)
for (int i = 0; i < nb-1; ++i)
tmp[n++] = pb[(eb+1+i) % nb];
memcpy(pa, tmp, sizeof(unsigned short)*MAX_VERTS_PER_POLY);
memcpy(pa, tmp, sizeof(unsigned short)*RD_VERTS_PER_POLYGON);
}
@ -1448,7 +1447,7 @@ static bool canRemoveVertex(dtTileCachePolyMesh& mesh, const unsigned short rem)
int numRemainingEdges = 0;
for (int i = 0; i < mesh.npolys; ++i)
{
unsigned short* p = &mesh.polys[i*MAX_VERTS_PER_POLY*2];
unsigned short* p = &mesh.polys[i*RD_VERTS_PER_POLYGON*2];
const int nv = countPolyVerts(p);
int numRemoved = 0;
int numVerts = 0;
@ -1486,7 +1485,7 @@ static bool canRemoveVertex(dtTileCachePolyMesh& mesh, const unsigned short rem)
for (int i = 0; i < mesh.npolys; ++i)
{
unsigned short* p = &mesh.polys[i*MAX_VERTS_PER_POLY*2];
unsigned short* p = &mesh.polys[i*RD_VERTS_PER_POLYGON*2];
const int nv = countPolyVerts(p);
// Collect edges which touches the removed vertex.
@ -1554,7 +1553,7 @@ static dtStatus removeVertex(dtTileCachePolyMesh& mesh, const unsigned short rem
int numRemovedVerts = 0;
for (int i = 0; i < mesh.npolys; ++i)
{
unsigned short* p = &mesh.polys[i*MAX_VERTS_PER_POLY*2];
unsigned short* p = &mesh.polys[i*RD_VERTS_PER_POLYGON*2];
const int nv = countPolyVerts(p);
for (int j = 0; j < nv; ++j)
{
@ -1572,7 +1571,7 @@ static dtStatus removeVertex(dtTileCachePolyMesh& mesh, const unsigned short rem
for (int i = 0; i < mesh.npolys; ++i)
{
unsigned short* p = &mesh.polys[i*MAX_VERTS_PER_POLY*2];
unsigned short* p = &mesh.polys[i*RD_VERTS_PER_POLYGON*2];
const int nv = countPolyVerts(p);
bool hasRem = false;
for (int j = 0; j < nv; ++j)
@ -1594,9 +1593,9 @@ static dtStatus removeVertex(dtTileCachePolyMesh& mesh, const unsigned short rem
}
}
// Remove the polygon.
unsigned short* p2 = &mesh.polys[(mesh.npolys-1)*MAX_VERTS_PER_POLY*2];
memcpy(p,p2,sizeof(unsigned short)*MAX_VERTS_PER_POLY);
memset(p+MAX_VERTS_PER_POLY,0xff,sizeof(unsigned short)*MAX_VERTS_PER_POLY);
unsigned short* p2 = &mesh.polys[(mesh.npolys-1)*RD_VERTS_PER_POLYGON*2];
memcpy(p,p2,sizeof(unsigned short)*RD_VERTS_PER_POLYGON);
memset(p+RD_VERTS_PER_POLYGON,0xff,sizeof(unsigned short)*RD_VERTS_PER_POLYGON);
mesh.areas[i] = mesh.areas[mesh.npolys-1];
mesh.npolys--;
--i;
@ -1615,7 +1614,7 @@ static dtStatus removeVertex(dtTileCachePolyMesh& mesh, const unsigned short rem
// Adjust indices to match the removed vertex layout.
for (int i = 0; i < mesh.npolys; ++i)
{
unsigned short* p = &mesh.polys[i*MAX_VERTS_PER_POLY*2];
unsigned short* p = &mesh.polys[i*RD_VERTS_PER_POLYGON*2];
const int nv = countPolyVerts(p);
for (int j = 0; j < nv; ++j)
if (p[j] > rem) p[j]--;
@ -1705,20 +1704,20 @@ static dtStatus removeVertex(dtTileCachePolyMesh& mesh, const unsigned short rem
if (ntris > MAX_REM_EDGES)
return DT_FAILURE | DT_BUFFER_TOO_SMALL;
unsigned short polys[MAX_REM_EDGES*MAX_VERTS_PER_POLY];
unsigned short polys[MAX_REM_EDGES*RD_VERTS_PER_POLYGON];
unsigned char pareas[MAX_REM_EDGES];
// Build initial polygons.
int npolys = 0;
memset(polys, 0xff, ntris*MAX_VERTS_PER_POLY*sizeof(unsigned short));
memset(polys, 0xff, ntris*RD_VERTS_PER_POLYGON*sizeof(unsigned short));
for (int j = 0; j < ntris; ++j)
{
unsigned short* t = &tris[j*3];
if (t[0] != t[1] && t[0] != t[2] && t[1] != t[2])
{
polys[npolys*MAX_VERTS_PER_POLY+0] = hole[t[0]];
polys[npolys*MAX_VERTS_PER_POLY+1] = hole[t[1]];
polys[npolys*MAX_VERTS_PER_POLY+2] = hole[t[2]];
polys[npolys*RD_VERTS_PER_POLYGON+0] = hole[t[0]];
polys[npolys*RD_VERTS_PER_POLYGON+1] = hole[t[1]];
polys[npolys*RD_VERTS_PER_POLYGON+2] = hole[t[2]];
pareas[npolys] = (unsigned char)harea[t[0]];
npolys++;
}
@ -1727,7 +1726,7 @@ static dtStatus removeVertex(dtTileCachePolyMesh& mesh, const unsigned short rem
return DT_SUCCESS;
// Merge polygons.
int maxVertsPerPoly = MAX_VERTS_PER_POLY;
int maxVertsPerPoly = RD_VERTS_PER_POLYGON;
if (maxVertsPerPoly > 3)
{
for (;;)
@ -1738,10 +1737,10 @@ static dtStatus removeVertex(dtTileCachePolyMesh& mesh, const unsigned short rem
for (int j = 0; j < npolys-1; ++j)
{
unsigned short* pj = &polys[j*MAX_VERTS_PER_POLY];
unsigned short* pj = &polys[j*RD_VERTS_PER_POLYGON];
for (int k = j+1; k < npolys; ++k)
{
unsigned short* pk = &polys[k*MAX_VERTS_PER_POLY];
unsigned short* pk = &polys[k*RD_VERTS_PER_POLYGON];
int ea, eb;
int v = getPolyMergeValue(pj, pk, mesh.verts, ea, eb);
if (v > bestMergeVal)
@ -1758,10 +1757,10 @@ static dtStatus removeVertex(dtTileCachePolyMesh& mesh, const unsigned short rem
if (bestMergeVal > 0)
{
// Found best, merge.
unsigned short* pa = &polys[bestPa*MAX_VERTS_PER_POLY];
unsigned short* pb = &polys[bestPb*MAX_VERTS_PER_POLY];
unsigned short* pa = &polys[bestPa*RD_VERTS_PER_POLYGON];
unsigned short* pb = &polys[bestPb*RD_VERTS_PER_POLYGON];
mergePolys(pa, pb, bestEa, bestEb);
memcpy(pb, &polys[(npolys-1)*MAX_VERTS_PER_POLY], sizeof(unsigned short)*MAX_VERTS_PER_POLY);
memcpy(pb, &polys[(npolys-1)*RD_VERTS_PER_POLYGON], sizeof(unsigned short)*RD_VERTS_PER_POLYGON);
pareas[bestPb] = pareas[npolys-1];
npolys--;
}
@ -1777,10 +1776,10 @@ static dtStatus removeVertex(dtTileCachePolyMesh& mesh, const unsigned short rem
for (int i = 0; i < npolys; ++i)
{
if (mesh.npolys >= maxTris) break;
unsigned short* p = &mesh.polys[mesh.npolys*MAX_VERTS_PER_POLY*2];
memset(p,0xff,sizeof(unsigned short)*MAX_VERTS_PER_POLY*2);
for (int j = 0; j < MAX_VERTS_PER_POLY; ++j)
p[j] = polys[i*MAX_VERTS_PER_POLY+j];
unsigned short* p = &mesh.polys[mesh.npolys*RD_VERTS_PER_POLYGON*2];
memset(p,0xff,sizeof(unsigned short)*RD_VERTS_PER_POLYGON*2);
for (int j = 0; j < RD_VERTS_PER_POLYGON; ++j)
p[j] = polys[i*RD_VERTS_PER_POLYGON+j];
mesh.areas[mesh.npolys] = pareas[i];
mesh.npolys++;
if (mesh.npolys > maxTris)
@ -1811,7 +1810,7 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc,
// TODO: warn about too many vertices?
mesh.nvp = MAX_VERTS_PER_POLY;
mesh.nvp = RD_VERTS_PER_POLYGON;
dtFixedArray<unsigned char> vflags(alloc, maxVertices);
if (!vflags)
@ -1822,7 +1821,7 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc,
if (!mesh.verts)
return DT_FAILURE | DT_OUT_OF_MEMORY;
mesh.polys = (unsigned short*)alloc->alloc(sizeof(unsigned short)*maxTris*MAX_VERTS_PER_POLY*2);
mesh.polys = (unsigned short*)alloc->alloc(sizeof(unsigned short)*maxTris*RD_VERTS_PER_POLYGON*2);
if (!mesh.polys)
return DT_FAILURE | DT_OUT_OF_MEMORY;
@ -1841,7 +1840,7 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc,
mesh.npolys = 0;
memset(mesh.verts, 0, sizeof(unsigned short)*maxVertices*3);
memset(mesh.polys, 0xff, sizeof(unsigned short)*maxTris*MAX_VERTS_PER_POLY*2);
memset(mesh.polys, 0xff, sizeof(unsigned short)*maxTris*RD_VERTS_PER_POLYGON*2);
memset(mesh.areas, 0, sizeof(unsigned char)*maxTris);
unsigned short firstVert[VERTEX_BUCKET_COUNT2];
@ -1861,7 +1860,7 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc,
if (!tris)
return DT_FAILURE | DT_OUT_OF_MEMORY;
dtFixedArray<unsigned short> polys(alloc, maxVertsPerCont*MAX_VERTS_PER_POLY);
dtFixedArray<unsigned short> polys(alloc, maxVertsPerCont*RD_VERTS_PER_POLYGON);
if (!polys)
return DT_FAILURE | DT_OUT_OF_MEMORY;
@ -1899,15 +1898,15 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc,
// Build initial polygons.
int npolys = 0;
memset(polys, 0xff, sizeof(unsigned short) * maxVertsPerCont * MAX_VERTS_PER_POLY);
memset(polys, 0xff, sizeof(unsigned short) * maxVertsPerCont * RD_VERTS_PER_POLYGON);
for (int j = 0; j < ntris; ++j)
{
const unsigned short* t = &tris[j*3];
if (t[0] != t[1] && t[0] != t[2] && t[1] != t[2])
{
polys[npolys*MAX_VERTS_PER_POLY+0] = indices[t[0]];
polys[npolys*MAX_VERTS_PER_POLY+1] = indices[t[1]];
polys[npolys*MAX_VERTS_PER_POLY+2] = indices[t[2]];
polys[npolys*RD_VERTS_PER_POLYGON+0] = indices[t[0]];
polys[npolys*RD_VERTS_PER_POLYGON+1] = indices[t[1]];
polys[npolys*RD_VERTS_PER_POLYGON+2] = indices[t[2]];
npolys++;
}
}
@ -1915,7 +1914,7 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc,
continue;
// Merge polygons.
int maxVertsPerPoly =MAX_VERTS_PER_POLY ;
int maxVertsPerPoly =RD_VERTS_PER_POLYGON ;
if (maxVertsPerPoly > 3)
{
for(;;)
@ -1926,10 +1925,10 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc,
for (int j = 0; j < npolys-1; ++j)
{
unsigned short* pj = &polys[j*MAX_VERTS_PER_POLY];
unsigned short* pj = &polys[j*RD_VERTS_PER_POLYGON];
for (int k = j+1; k < npolys; ++k)
{
unsigned short* pk = &polys[k*MAX_VERTS_PER_POLY];
unsigned short* pk = &polys[k*RD_VERTS_PER_POLYGON];
int ea, eb;
int v = getPolyMergeValue(pj, pk, mesh.verts, ea, eb);
if (v > bestMergeVal)
@ -1946,10 +1945,10 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc,
if (bestMergeVal > 0)
{
// Found best, merge.
unsigned short* pa = &polys[bestPa*MAX_VERTS_PER_POLY];
unsigned short* pb = &polys[bestPb*MAX_VERTS_PER_POLY];
unsigned short* pa = &polys[bestPa*RD_VERTS_PER_POLYGON];
unsigned short* pb = &polys[bestPb*RD_VERTS_PER_POLYGON];
mergePolys(pa, pb, bestEa, bestEb);
memcpy(pb, &polys[(npolys-1)*MAX_VERTS_PER_POLY], sizeof(unsigned short)*MAX_VERTS_PER_POLY);
memcpy(pb, &polys[(npolys-1)*RD_VERTS_PER_POLYGON], sizeof(unsigned short)*RD_VERTS_PER_POLYGON);
npolys--;
}
else
@ -1963,9 +1962,9 @@ dtStatus dtBuildTileCachePolyMesh(dtTileCacheAlloc* alloc,
// Store polygons.
for (int j = 0; j < npolys; ++j)
{
unsigned short* p = &mesh.polys[mesh.npolys*MAX_VERTS_PER_POLY*2];
unsigned short* q = &polys[j*MAX_VERTS_PER_POLY];
for (int k = 0; k < MAX_VERTS_PER_POLY; ++k)
unsigned short* p = &mesh.polys[mesh.npolys*RD_VERTS_PER_POLYGON*2];
unsigned short* q = &polys[j*RD_VERTS_PER_POLYGON];
for (int k = 0; k < RD_VERTS_PER_POLYGON; ++k)
p[k] = q[k];
mesh.areas[mesh.npolys] = cont.area;
mesh.npolys++;

@ -27,6 +27,9 @@ static const int RD_BITS_PER_BIT_CELL = 32;
/// @see rcPolyMesh::polys
static const unsigned short RD_MESH_NULL_IDX = 0xffff;
/// The maximum number of vertices per navigation polygon.
static const int RD_VERTS_PER_POLYGON = 6;
/// Detail triangle edge flags used for various functions and fields.
/// For an example, see dtNavMesh::connectTraverseLinks().
enum rdDetailTriEdgeFlags