aboutsummaryrefslogtreecommitdiff
path: root/dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2017-11-18 15:35:44 +0100
committerfunjoker <funjoker109@gmail.com>2021-02-15 19:13:25 +0100
commit159aa97d727793fc075928ce3222bf720d19212b (patch)
tree632e6f24cb95fef4afde8ac4e12f4e60f6a731e7 /dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp
parent94a8be619e8b4a6011130e6ba548a2b408906a19 (diff)
Dep/Recast: Update recastnavigation to https://github.com/recastnavigation/recastnavigation/commit/2c85309280dbc9c82029e7ab16dfb01b9235c74e
(cherry picked from commit 7ef22e43057080926685eb45f0fce3f2f3d58c61)
Diffstat (limited to 'dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp')
-rw-r--r--dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp89
1 files changed, 57 insertions, 32 deletions
diff --git a/dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp b/dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp
index 965e6cdc5c5..e93a97629b8 100644
--- a/dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp
+++ b/dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp
@@ -168,45 +168,72 @@ static void subdivide(BVItem* items, int nitems, int imin, int imax, int& curNod
}
}
-static int createBVTree(const unsigned short* verts, const int /*nverts*/,
- const unsigned short* polys, const int npolys, const int nvp,
- const float cs, const float ch,
- const int /*nnodes*/, dtBVNode* nodes)
+static int createBVTree(dtNavMeshCreateParams* params, dtBVNode* nodes, int /*nnodes*/)
{
// Build tree
- BVItem* items = (BVItem*)dtAlloc(sizeof(BVItem)*npolys, DT_ALLOC_TEMP);
- for (int i = 0; i < npolys; i++)
+ float quantFactor = 1 / params->cs;
+ BVItem* items = (BVItem*)dtAlloc(sizeof(BVItem)*params->polyCount, DT_ALLOC_TEMP);
+ for (int i = 0; i < params->polyCount; i++)
{
BVItem& it = items[i];
it.i = i;
- // Calc polygon bounds.
- const unsigned short* p = &polys[i*nvp*2];
- it.bmin[0] = it.bmax[0] = verts[p[0]*3+0];
- it.bmin[1] = it.bmax[1] = verts[p[0]*3+1];
- it.bmin[2] = it.bmax[2] = verts[p[0]*3+2];
-
- for (int j = 1; j < nvp; ++j)
+ // Calc polygon bounds. Use detail meshes if available.
+ if (params->detailMeshes)
{
- if (p[j] == MESH_NULL_IDX) break;
- unsigned short x = verts[p[j]*3+0];
- unsigned short y = verts[p[j]*3+1];
- unsigned short z = verts[p[j]*3+2];
-
- if (x < it.bmin[0]) it.bmin[0] = x;
- if (y < it.bmin[1]) it.bmin[1] = y;
- if (z < it.bmin[2]) it.bmin[2] = z;
-
- if (x > it.bmax[0]) it.bmax[0] = x;
- if (y > it.bmax[1]) it.bmax[1] = y;
- if (z > it.bmax[2]) it.bmax[2] = z;
+ int vb = (int)params->detailMeshes[i*4+0];
+ int ndv = (int)params->detailMeshes[i*4+1];
+ float bmin[3];
+ float bmax[3];
+
+ const float* dv = &params->detailVerts[vb*3];
+ dtVcopy(bmin, dv);
+ dtVcopy(bmax, dv);
+
+ for (int j = 1; j < ndv; j++)
+ {
+ dtVmin(bmin, &dv[j * 3]);
+ dtVmax(bmax, &dv[j * 3]);
+ }
+
+ // BV-tree uses cs for all dimensions
+ it.bmin[0] = (unsigned short)dtClamp((int)((bmin[0] - params->bmin[0])*quantFactor), 0, 0xffff);
+ it.bmin[1] = (unsigned short)dtClamp((int)((bmin[1] - params->bmin[1])*quantFactor), 0, 0xffff);
+ it.bmin[2] = (unsigned short)dtClamp((int)((bmin[2] - params->bmin[2])*quantFactor), 0, 0xffff);
+
+ it.bmax[0] = (unsigned short)dtClamp((int)((bmax[0] - params->bmin[0])*quantFactor), 0, 0xffff);
+ it.bmax[1] = (unsigned short)dtClamp((int)((bmax[1] - params->bmin[1])*quantFactor), 0, 0xffff);
+ it.bmax[2] = (unsigned short)dtClamp((int)((bmax[2] - params->bmin[2])*quantFactor), 0, 0xffff);
+ }
+ else
+ {
+ const unsigned short* p = &params->polys[i*params->nvp * 2];
+ it.bmin[0] = it.bmax[0] = params->verts[p[0] * 3 + 0];
+ it.bmin[1] = it.bmax[1] = params->verts[p[0] * 3 + 1];
+ it.bmin[2] = it.bmax[2] = params->verts[p[0] * 3 + 2];
+
+ for (int j = 1; j < params->nvp; ++j)
+ {
+ if (p[j] == MESH_NULL_IDX) break;
+ unsigned short x = params->verts[p[j] * 3 + 0];
+ unsigned short y = params->verts[p[j] * 3 + 1];
+ unsigned short z = params->verts[p[j] * 3 + 2];
+
+ if (x < it.bmin[0]) it.bmin[0] = x;
+ if (y < it.bmin[1]) it.bmin[1] = y;
+ if (z < it.bmin[2]) it.bmin[2] = z;
+
+ if (x > it.bmax[0]) it.bmax[0] = x;
+ if (y > it.bmax[1]) it.bmax[1] = y;
+ if (z > it.bmax[2]) it.bmax[2] = z;
+ }
+ // Remap y
+ it.bmin[1] = (unsigned short)dtMathFloorf((float)it.bmin[1] * params->ch / params->cs);
+ it.bmax[1] = (unsigned short)dtMathCeilf((float)it.bmax[1] * params->ch / params->cs);
}
- // Remap y
- it.bmin[1] = (unsigned short)dtMathFloorf((float)it.bmin[1]*ch/cs);
- it.bmax[1] = (unsigned short)dtMathCeilf((float)it.bmax[1]*ch/cs);
}
int curNode = 0;
- subdivide(items, npolys, 0, npolys, curNode, nodes);
+ subdivide(items, params->polyCount, 0, params->polyCount, curNode, nodes);
dtFree(items);
@@ -595,11 +622,9 @@ bool dtCreateNavMeshData(dtNavMeshCreateParams* params, unsigned char** outData,
}
// Store and create BVtree.
- // TODO: take detail mesh into account! use byte per bbox extent?
if (params->buildBvTree)
{
- createBVTree(params->verts, params->vertCount, params->polys, params->polyCount,
- nvp, params->cs, params->ch, params->polyCount*2, navBvtree);
+ createBVTree(params, navBvtree, 2*params->polyCount);
}
// Store Off-Mesh connections.