Changed link bmin/bmax to fraction along the edge. Fixed moveAlong to work with multiple links per edge. Use flat delta for path iterator.

This commit is contained in:
Mikko Mononen 2010-08-10 10:43:28 +00:00
parent 47a572d42e
commit 474a3ddc67
8 changed files with 3039 additions and 429 deletions

View File

@ -415,17 +415,21 @@ void dtNavMesh::connectExtLinks(dtMeshTile* tile, dtMeshTile* target, int side)
// Compress portal limits to a byte value.
if (side == 0 || side == 4)
{
const float lmin = dtMin(va[2], vb[2]);
const float lmax = dtMax(va[2], vb[2]);
link->bmin = (unsigned char)(dtClamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
link->bmax = (unsigned char)(dtClamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
float tmin = (neia[k*2+0]-va[2]) / (vb[2]-va[2]);
float tmax = (neia[k*2+1]-va[2]) / (vb[2]-va[2]);
if (tmin > tmax)
dtSwap(tmin,tmax);
link->bmin = (unsigned char)(dtClamp(tmin, 0.0f, 1.0f)*255.0f);
link->bmax = (unsigned char)(dtClamp(tmax, 0.0f, 1.0f)*255.0f);
}
else if (side == 2 || side == 6)
{
const float lmin = dtMin(va[0], vb[0]);
const float lmax = dtMax(va[0], vb[0]);
link->bmin = (unsigned char)(dtClamp((neia[k*2+0]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
link->bmax = (unsigned char)(dtClamp((neia[k*2+1]-lmin)/(lmax-lmin), 0.0f, 1.0f)*255.0f);
float tmin = (neia[k*2+0]-va[0]) / (vb[0]-va[0]);
float tmax = (neia[k*2+1]-va[0]) / (vb[0]-va[0]);
if (tmin > tmax)
dtSwap(tmin,tmax);
link->bmin = (unsigned char)(dtClamp(tmin, 0.0f, 1.0f)*255.0f);
link->bmax = (unsigned char)(dtClamp(tmax, 0.0f, 1.0f)*255.0f);
}
}
}
@ -1839,8 +1843,11 @@ int dtNavMesh::moveAlongSurface(dtPolyRef startRef, const float* startPos, const
// Find wall edges and find nearest point inside the walls.
for (int i = 0, j = (int)curPoly->vertCount-1; i < (int)curPoly->vertCount; j = i++)
{
// Skip non-solid edges.
dtPolyRef neighbourRef = 0;
// Find links to neighbours.
static const int MAX_NEIS = 8;
int nneis = 0;
dtPolyRef neis[MAX_NEIS];
if (curPoly->neis[j] & DT_EXT_LINK)
{
// Tile border.
@ -1850,18 +1857,20 @@ int dtNavMesh::moveAlongSurface(dtPolyRef startRef, const float* startPos, const
if (link->edge == j)
{
if (link->ref != 0 && passFilter(filter, getPolyFlags(link->ref)))
neighbourRef = link->ref;
break;
{
if (nneis < MAX_NEIS)
neis[nneis++] = link->ref;
}
}
}
}
else if (curPoly->neis[j] && passFilter(filter, curTile->polys[curPoly->neis[j]-1].flags))
{
// Internal edge, encode id.
neighbourRef = getTilePolyRefBase(curTile) | (unsigned int)(curPoly->neis[j]-1);
neis[nneis++] = getTilePolyRefBase(curTile) | (unsigned int)(curPoly->neis[j]-1);
}
if (!neighbourRef)
if (!nneis)
{
// Wall edge, calc distance.
const float* vj = &verts[j*3];
@ -1878,28 +1887,32 @@ int dtNavMesh::moveAlongSurface(dtPolyRef startRef, const float* startPos, const
}
else
{
// Skip if no node can be allocated.
dtNode* neighbourNode = m_tinyNodePool->getNode(neighbourRef);
if (!neighbourNode)
continue;
// Skip if already visited.
if (neighbourNode->flags & DT_NODE_CLOSED)
continue;
// Skip the link if it is too far from search constraint.
const float* vj = &verts[j*3];
const float* vi = &verts[i*3];
float tseg;
float distSqr = dtDistancePtSegSqr2D(searchPos, vj, vi, tseg);
if (distSqr > searchRadSqr)
continue;
// Mark as the node as visited and push to queue.
if (nstack < MAX_STACK)
for (int k = 0; k < nneis; ++k)
{
neighbourNode->pidx = m_tinyNodePool->getNodeIdx(curNode);
neighbourNode->flags |= DT_NODE_CLOSED;
stack[nstack++] = neighbourNode;
// Skip if no node can be allocated.
dtNode* neighbourNode = m_tinyNodePool->getNode(neis[k]);
if (!neighbourNode)
continue;
// Skip if already visited.
if (neighbourNode->flags & DT_NODE_CLOSED)
continue;
// Skip the link if it is too far from search constraint.
// TODO: Maybe should use getPortalPoints(), but this one is way faster.
const float* vj = &verts[j*3];
const float* vi = &verts[i*3];
float tseg;
float distSqr = dtDistancePtSegSqr2D(searchPos, vj, vi, tseg);
if (distSqr > searchRadSqr)
continue;
// Mark as the node as visited and push to queue.
if (nstack < MAX_STACK)
{
neighbourNode->pidx = m_tinyNodePool->getNodeIdx(curNode);
neighbourNode->flags |= DT_NODE_CLOSED;
stack[nstack++] = neighbourNode;
}
}
}
}
@ -2019,31 +2032,17 @@ bool dtNavMesh::getPortalPoints(dtPolyRef from, const dtPoly* fromPoly, const dt
// If the link is at tile boundary, dtClamp the vertices to
// the link width.
if (link->side == 0 || link->side == 4)
if (link->side != 0xff)
{
// Unpack portal limits.
const float smin = dtMin(left[2],right[2]);
const float smax = dtMax(left[2],right[2]);
const float s = (smax-smin) / 255.0f;
const float lmin = smin + link->bmin*s;
const float lmax = smin + link->bmax*s;
left[2] = dtMax(left[2],lmin);
left[2] = dtMin(left[2],lmax);
right[2] = dtMax(right[2],lmin);
right[2] = dtMin(right[2],lmax);
}
else if (link->side == 2 || link->side == 6)
{
// Unpack portal limits.
const float smin = dtMin(left[0],right[0]);
const float smax = dtMax(left[0],right[0]);
const float s = (smax-smin) / 255.0f;
const float lmin = smin + link->bmin*s;
const float lmax = smin + link->bmax*s;
left[0] = dtMax(left[0],lmin);
left[0] = dtMin(left[0],lmax);
right[0] = dtMax(right[0],lmin);
right[0] = dtMin(right[0],lmax);
if (link->bmin != 0 || link->bmax != 255)
{
const float s = 1.0f/255.0f;
const float tmin = link->bmin*s;
const float tmax = link->bmax*s;
dtVlerp(left, &fromTile->verts[v0*3], &fromTile->verts[v1*3], tmin);
dtVlerp(right, &fromTile->verts[v0*3], &fromTile->verts[v1*3], tmax);
}
}
return true;
@ -2212,6 +2211,15 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float*
}
// If the link is at tile boundary,
// Check if the link spans the whole edge, and accept.
if (link->bmin == 0 && link->bmax == 255)
{
nextRef = link->ref;
break;
}
// Check for partial edge links.
const int v0 = poly->verts[link->edge];
const int v1 = poly->verts[(link->edge+1) % poly->vertCount];
const float* left = &tile->verts[v0*3];
@ -2221,11 +2229,11 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float*
if (link->side == 0 || link->side == 4)
{
// Calculate link size.
const float smin = dtMin(left[2],right[2]);
const float smax = dtMax(left[2],right[2]);
const float s = (smax-smin) / 255.0f;
const float lmin = smin + link->bmin*s;
const float lmax = smin + link->bmax*s;
const float s = 1.0f/255.0f;
float lmin = left[2] + (right[2] - left[2])*(link->bmin*s);
float lmax = left[2] + (right[2] - left[2])*(link->bmax*s);
if (lmin > lmax) dtSwap(lmin, lmax);
// Find Z intersection.
float z = startPos[2] + (endPos[2]-startPos[2])*tmax;
if (z >= lmin && z <= lmax)
@ -2237,11 +2245,11 @@ int dtNavMesh::raycast(dtPolyRef centerRef, const float* startPos, const float*
else if (link->side == 2 || link->side == 6)
{
// Calculate link size.
const float smin = dtMin(left[0],right[0]);
const float smax = dtMax(left[0],right[0]);
const float s = (smax-smin) / 255.0f;
const float lmin = smin + link->bmin*s;
const float lmax = smin + link->bmax*s;
const float s = 1.0f/255.0f;
float lmin = left[0] + (right[0] - left[0])*(link->bmin*s);
float lmax = left[0] + (right[0] - left[0])*(link->bmax*s);
if (lmin > lmax) dtSwap(lmin, lmax);
// Find X intersection.
float x = startPos[0] + (endPos[0]-startPos[0])*tmax;
if (x >= lmin && x <= lmax)
@ -2740,6 +2748,33 @@ int dtNavMesh::findLocalNeighbourhood(dtPolyRef centerRef, const float* centerPo
return n;
}
struct dtSegInterval
{
short tmin, tmax;
};
static void insertInterval(dtSegInterval* ints, int& nints, const int maxInts,
const short tmin, const short tmax)
{
if (nints+1 > maxInts) return;
// Find insertion point.
int idx = 0;
while (idx < nints)
{
if (tmax <= ints[idx].tmin)
break;
idx++;
}
// Move current results.
if (nints-idx)
memmove(ints+idx+1, ints+idx, sizeof(dtSegInterval)*(nints-idx));
// Store
ints[idx].tmin = tmin;
ints[idx].tmax = tmax;
nints++;
}
int dtNavMesh::getPolyWallSegments(dtPolyRef ref, const dtQueryFilter* filter, float* segments)
{
unsigned int salt, it, ip;
@ -2751,25 +2786,28 @@ int dtNavMesh::getPolyWallSegments(dtPolyRef ref, const dtQueryFilter* filter, f
const dtPoly* poly = &tile->polys[ip];
int n = 0;
static const int MAX_INTERVAL = 16;
dtSegInterval ints[MAX_INTERVAL];
int nints;
for (int i = 0, j = (int)poly->vertCount-1; i < (int)poly->vertCount; j = i++)
{
// Skip non-solid edges.
nints = 0;
if (poly->neis[j] & DT_EXT_LINK)
{
// Tile border.
bool solid = true;
for (unsigned int k = poly->firstLink; k != DT_NULL_LINK; k = tile->links[k].next)
{
const dtLink* link = &tile->links[k];
if (link->edge == j)
{
if (link->ref != 0 && passFilter(filter, getPolyFlags(link->ref)))
solid = false;
break;
{
insertInterval(ints, nints, MAX_INTERVAL, link->bmin, link->bmax);
}
}
}
if (!solid) continue;
}
else if (poly->neis[j] && passFilter(filter, tile->polys[poly->neis[j]-1].flags))
{
@ -2777,13 +2815,42 @@ int dtNavMesh::getPolyWallSegments(dtPolyRef ref, const dtQueryFilter* filter, f
continue;
}
// Add sentinels
insertInterval(ints, nints, MAX_INTERVAL, -1, 0);
insertInterval(ints, nints, MAX_INTERVAL, 255, 256);
// Store segment.
const float* vj = &tile->verts[poly->verts[j]*3];
const float* vi = &tile->verts[poly->verts[i]*3];
float* seg = &segments[n*6];
n++;
dtVcopy(seg+0, vj);
dtVcopy(seg+3, vi);
for (int k = 1; k < nints; ++k)
{
// Find the space inbetween the opening areas.
const int imin = ints[k-1].tmax;
const int imax = ints[k].tmin;
if (imin == imax) continue;
if (imin == 0 && imax == 255)
{
if (n < DT_VERTS_PER_POLYGON)
{
float* seg = &segments[n*6];
n++;
dtVcopy(seg+0, vj);
dtVcopy(seg+3, vi);
}
}
else
{
const float tmin = imin/255.0f;
const float tmax = imax/255.0f;
if (n < DT_VERTS_PER_POLYGON)
{
float* seg = &segments[n*6];
n++;
dtVlerp(seg+0, vj,vi, tmin);
dtVlerp(seg+3, vj,vi, tmax);
}
}
}
}
return n;

File diff suppressed because it is too large Load Diff

View File

@ -283,14 +283,14 @@
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
<integer>10</integer>
<integer>2</integer>
<integer>15</integer>
<integer>11</integer>
<integer>1</integer>
<integer>0</integer>
</array>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
<string>{{0, 0}, {264, 632}}</string>
<string>{{0, 49}, {264, 632}}</string>
</dict>
<key>PBXTopSmartGroupGIDs</key>
<array/>
@ -307,7 +307,7 @@
<real>264</real>
</array>
<key>RubberWindowFrame</key>
<string>33 87 1173 691 0 0 1280 778 </string>
<string>34 87 1173 691 0 0 1280 778 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
@ -325,7 +325,7 @@
<key>PBXProjectModuleGUID</key>
<string>6B8632A30F78115100E2684A</string>
<key>PBXProjectModuleLabel</key>
<string>DetourNavMesh.h</string>
<string>DetourNavMesh.cpp</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@ -333,11 +333,11 @@
<key>PBXProjectModuleGUID</key>
<string>6B8632A40F78115100E2684A</string>
<key>PBXProjectModuleLabel</key>
<string>DetourNavMesh.h</string>
<string>DetourNavMesh.cpp</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
<string>6BAF3AC3121039C7008CFCDF</string>
<string>6BAF3C56121163FD008CFCDF</string>
<key>history</key>
<array>
<string>6BBB4AA1115B4F3400CF791D</string>
@ -375,39 +375,39 @@
<string>6BF9B13611EB8CF20043574C</string>
<string>6BF9B13711EB8CF20043574C</string>
<string>6BF9B18811EC2D470043574C</string>
<string>6BF9B1D111EC3DD80043574C</string>
<string>6BF9B1F211EC43FC0043574C</string>
<string>6BF9B20B11EC450E0043574C</string>
<string>6BF9B21211EC49A30043574C</string>
<string>6BF9B21B11EC49F90043574C</string>
<string>6BAF37D411FEAC16008CFCDF</string>
<string>6BAF37F911FEB4BB008CFCDF</string>
<string>6BAF382112019EDA008CFCDF</string>
<string>6BAF382212019EDA008CFCDF</string>
<string>6BAF38471202CC9B008CFCDF</string>
<string>6BAF385A120A8A8E008CFCDF</string>
<string>6BAF385B120A8A8E008CFCDF</string>
<string>6BAF385C120A8A8E008CFCDF</string>
<string>6BAF386A120A8B78008CFCDF</string>
<string>6BAF3872120AD32F008CFCDF</string>
<string>6BAF3873120AD32F008CFCDF</string>
<string>6BAF3874120AD32F008CFCDF</string>
<string>6BAF3875120AD32F008CFCDF</string>
<string>6BAF390F120FEB27008CFCDF</string>
<string>6BAF3910120FEB27008CFCDF</string>
<string>6BAF3971120FF609008CFCDF</string>
<string>6BAF39D112100A22008CFCDF</string>
<string>6BAF39D212100A22008CFCDF</string>
<string>6BAF39E712100DE4008CFCDF</string>
<string>6BAF39F012100ED1008CFCDF</string>
<string>6BAF3A5F12102BB9008CFCDF</string>
<string>6BAF3A7812103373008CFCDF</string>
<string>6BAF3AAB1210369A008CFCDF</string>
<string>6BAF3AB3121038F9008CFCDF</string>
<string>6BAF3AB4121038F9008CFCDF</string>
<string>6BAF3AB5121038F9008CFCDF</string>
<string>6BAF3AB6121038F9008CFCDF</string>
<string>6BAF3AC2121039C7008CFCDF</string>
<string>6BAF3ADA12112A65008CFCDF</string>
<string>6BAF3B0112112E63008CFCDF</string>
<string>6BAF3B0312112E63008CFCDF</string>
<string>6BAF3B3F121137C7008CFCDF</string>
<string>6BAF3BA51211425E008CFCDF</string>
<string>6BAF3BA912114288008CFCDF</string>
<string>6BAF3BAF12114389008CFCDF</string>
<string>6BAF3BB012114389008CFCDF</string>
<string>6BAF3BB8121146D8008CFCDF</string>
<string>6BAF3BB9121146D8008CFCDF</string>
<string>6BAF3BC91211472E008CFCDF</string>
<string>6BAF3BFE121151C3008CFCDF</string>
<string>6BAF3C4312116225008CFCDF</string>
</array>
<key>prevStack</key>
<array>
@ -433,7 +433,6 @@
<string>6BBB4AFA115B4F3400CF791D</string>
<string>6BBB4AFB115B4F3400CF791D</string>
<string>6BBB4AFD115B4F3400CF791D</string>
<string>6BBB4B03115B4F3400CF791D</string>
<string>6BBB4B07115B4F3400CF791D</string>
<string>6BBB4B08115B4F3400CF791D</string>
<string>6BBB4B0A115B4F3400CF791D</string>
@ -447,7 +446,6 @@
<string>6B4215D1118066FE006C347B</string>
<string>6B4215DF1180672F006C347B</string>
<string>6B5562681193EF2F00843384</string>
<string>6B2CDD181197FE370090FA4D</string>
<string>6B10005C11AD08FA0098A59A</string>
<string>6B10011E11AD19F90098A59A</string>
<string>6B10011F11AD19F90098A59A</string>
@ -467,7 +465,6 @@
<string>6BF9B15511EB8CF20043574C</string>
<string>6BF9B18B11EC2D470043574C</string>
<string>6BF9B1EB11EC43120043574C</string>
<string>6BF9B1FE11EC442C0043574C</string>
<string>6BF9B14911EB8CF20043574C</string>
<string>6BAF37D611FEAC16008CFCDF</string>
<string>6BAF37FE11FEB4BB008CFCDF</string>
@ -481,8 +478,6 @@
<string>6BAF3863120A8A8E008CFCDF</string>
<string>6BAF3864120A8A8E008CFCDF</string>
<string>6BAF386B120A8B78008CFCDF</string>
<string>6BAF386C120A8B78008CFCDF</string>
<string>6BAF3877120AD32F008CFCDF</string>
<string>6BAF3878120AD32F008CFCDF</string>
<string>6BAF3879120AD32F008CFCDF</string>
<string>6BAF387A120AD32F008CFCDF</string>
@ -501,20 +496,15 @@
<string>6BAF3919120FEB27008CFCDF</string>
<string>6BAF391B120FEB27008CFCDF</string>
<string>6BAF391C120FEB27008CFCDF</string>
<string>6BAF3944120FEF7A008CFCDF</string>
<string>6BBB4AD2115B4F3400CF791D</string>
<string>6BAF3974120FF609008CFCDF</string>
<string>6BAF3983120FF75F008CFCDF</string>
<string>6BAF398E120FF809008CFCDF</string>
<string>6BAF3990120FF809008CFCDF</string>
<string>6BAF3992120FF809008CFCDF</string>
<string>6BAF39CA1210074E008CFCDF</string>
<string>6BAF39D512100A22008CFCDF</string>
<string>6BAF39DE12100D84008CFCDF</string>
<string>6BAF39E412100DA6008CFCDF</string>
<string>6BAF39E912100DE4008CFCDF</string>
<string>6BAF39EA12100DE4008CFCDF</string>
<string>6BAF39F312100ED1008CFCDF</string>
<string>6BAF3A3412102220008CFCDF</string>
<string>6BAF3A3B1210235F008CFCDF</string>
<string>6BAF3A3D1210235F008CFCDF</string>
@ -558,6 +548,40 @@
<string>6BAF3ABB121038F9008CFCDF</string>
<string>6BAF3ABC121038F9008CFCDF</string>
<string>6BAF3ABD121038F9008CFCDF</string>
<string>6BAF3ACB12112937008CFCDF</string>
<string>6BAF3ADD12112A65008CFCDF</string>
<string>6BAF3ADE12112A65008CFCDF</string>
<string>6BAF3ADF12112A65008CFCDF</string>
<string>6BAF3AE012112A65008CFCDF</string>
<string>6BAF3AE912112BBF008CFCDF</string>
<string>6BAF3AF512112C6C008CFCDF</string>
<string>6BAF3B0512112E63008CFCDF</string>
<string>6BAF3B0612112E63008CFCDF</string>
<string>6BAF3B1512112F65008CFCDF</string>
<string>6BAF3B21121130D9008CFCDF</string>
<string>6BAF3B291211334A008CFCDF</string>
<string>6BAF3B38121137A7008CFCDF</string>
<string>6BAF3B39121137A7008CFCDF</string>
<string>6BAF3B3A121137A7008CFCDF</string>
<string>6BAF3B41121137C7008CFCDF</string>
<string>6BAF3B42121137C7008CFCDF</string>
<string>6BAF3B47121138BE008CFCDF</string>
<string>6BAF3B6312113D2F008CFCDF</string>
<string>6BAF3B6412113D2F008CFCDF</string>
<string>6BAF3B6F12113E1F008CFCDF</string>
<string>6BAF3BA71211425E008CFCDF</string>
<string>6BAF3BAB12114288008CFCDF</string>
<string>6BAF3BB212114389008CFCDF</string>
<string>6BAF3BB312114389008CFCDF</string>
<string>6BAF3BBB121146D8008CFCDF</string>
<string>6BAF3BBC121146D8008CFCDF</string>
<string>6BAF3BC212114716008CFCDF</string>
<string>6BAF3BC312114716008CFCDF</string>
<string>6BAF3BCB1211472E008CFCDF</string>
<string>6BAF3BDC12114B45008CFCDF</string>
<string>6BAF3BDD12114B45008CFCDF</string>
<string>6BAF3C00121151C3008CFCDF</string>
<string>6BAF3C01121151C3008CFCDF</string>
</array>
</dict>
<key>SplitCount</key>
@ -571,18 +595,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {887, 530}}</string>
<string>{{0, 0}, {887, 558}}</string>
<key>RubberWindowFrame</key>
<string>33 87 1173 691 0 0 1280 778 </string>
<string>34 87 1173 691 0 0 1280 778 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
<string>530pt</string>
<string>558pt</string>
</dict>
<dict>
<key>Proportion</key>
<string>116pt</string>
<string>88pt</string>
<key>Tabs</key>
<array>
<dict>
@ -650,9 +674,9 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{10, 27}, {887, 89}}</string>
<string>{{10, 27}, {887, 61}}</string>
<key>RubberWindowFrame</key>
<string>33 87 1173 691 0 0 1280 778 </string>
<string>34 87 1173 691 0 0 1280 778 </string>
</dict>
<key>Module</key>
<string>PBXBuildResultsModule</string>
@ -735,12 +759,12 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
<string>{{0, 0}, {1173, 344}}</string>
<string>{{0, 0}, {1173, 323}}</string>
</dict>
<key>Module</key>
<string>PBXDebugCLIModule</string>
<key>Proportion</key>
<string>344pt</string>
<string>323pt</string>
</dict>
<dict>
<key>ContentConfiguration</key>
@ -759,8 +783,8 @@
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {532, 119}}</string>
<string>{{532, 0}, {641, 119}}</string>
<string>{{0, 0}, {536, 112}}</string>
<string>{{536, 0}, {637, 112}}</string>
</array>
</dict>
<key>VerticalSplitView</key>
@ -775,8 +799,8 @@
<string>yes</string>
<key>sizes</key>
<array>
<string>{{0, 0}, {1173, 119}}</string>
<string>{{0, 119}, {1173, 182}}</string>
<string>{{0, 0}, {1173, 112}}</string>
<string>{{0, 112}, {1173, 210}}</string>
</array>
</dict>
</dict>
@ -796,7 +820,7 @@
<key>DebugSTDIOWindowFrame</key>
<string>{{200, 200}, {500, 300}}</string>
<key>Frame</key>
<string>{{0, 349}, {1173, 301}}</string>
<string>{{0, 328}, {1173, 322}}</string>
<key>PBXDebugSessionStackFrameViewKey</key>
<dict>
<key>DebugVariablesTableConfiguration</key>
@ -806,16 +830,16 @@
<string>Value</string>
<real>85</real>
<string>Summary</string>
<real>348</real>
<real>344</real>
</array>
<key>Frame</key>
<string>{{532, 0}, {641, 119}}</string>
<string>{{536, 0}, {637, 112}}</string>
</dict>
</dict>
<key>Module</key>
<string>PBXDebugSessionModule</string>
<key>Proportion</key>
<string>301pt</string>
<string>322pt</string>
</dict>
</array>
<key>Name</key>
@ -872,13 +896,12 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
<string>6BAF3AC4121039C7008CFCDF</string>
<string>6BAF394F120FF023008CFCDF</string>
<string>6BAF3950120FF023008CFCDF</string>
<string>/Users/memon/Code/recastnavigation/RecastDemo/Build/Xcode/Recast.xcodeproj</string>
</array>
<key>WindowString</key>
<string>33 87 1173 691 0 0 1280 778 </string>
<string>34 87 1173 691 0 0 1280 778 </string>
<key>WindowToolsV3</key>
<array>
<dict>

View File

@ -30,6 +30,7 @@ class Sample_Debug : public Sample
protected:
rcCompactHeightfield* m_chf;
rcContourSet* m_cset;
rcPolyMesh* m_pmesh;
float m_ext[3];
float m_center[3];

View File

@ -133,6 +133,7 @@ static bool getSteerTarget(dtNavMesh* navMesh, const float* startPos, const floa
return false;
rcVcopy(steerPos, &steerPath[ns*3]);
steerPos[1] = startPos[1];
steerPosFlag = steerPathFlags[ns];
steerPosRef = steerPathPolys[ns];

View File

@ -52,7 +52,8 @@ static int loadBin(const char* path, unsigned char** data)
Sample_Debug::Sample_Debug() :
m_chf(0),
m_cset(0)
m_cset(0),
m_pmesh(0)
{
resetCommonSettings();
@ -138,9 +139,14 @@ Sample_Debug::Sample_Debug() :
if (m_cset)
{
FileIO io;
if (io.openForRead("test.cset"))
if (io.openForRead("remove_vertex_issue_contour_cache.rc"))
{
duReadContourSet(*m_cset, &io);
printf("bmin=(%f,%f,%f) bmax=(%f,%f,%f)\n",
m_cset->bmin[0], m_cset->bmin[1], m_cset->bmin[2],
m_cset->bmax[0], m_cset->bmax[1], m_cset->bmax[2]);
printf("cs=%f ch=%f\n", m_cset->cs, m_cset->ch);
}
else
{
@ -151,6 +157,16 @@ Sample_Debug::Sample_Debug() :
{
printf("Could not alloc cset\n");
}
if (m_cset)
{
m_pmesh = rcAllocPolyMesh();
if (m_pmesh)
{
rcBuildPolyMesh(*m_cset, 6, *m_pmesh);
}
}
}
}
@ -159,6 +175,7 @@ Sample_Debug::~Sample_Debug()
{
rcFreeCompactHeightfield(m_chf);
rcFreeContourSet(m_cset);
rcFreePolyMesh(m_pmesh);
}
void Sample_Debug::handleSettings()
@ -196,7 +213,16 @@ void Sample_Debug::handleRender()
duDebugDrawCross(&dd, m_center[0], m_center[1], m_center[2], 1.0f, duRGBA(255,255,255,128), 2.0f);*/
if (m_cset)
duDebugDrawRawContours(&dd, *m_cset);
{
duDebugDrawRawContours(&dd, *m_cset, 0.25f);
// duDebugDrawContours(&dd, *m_cset);
}
if (m_pmesh)
{
duDebugDrawPolyMesh(&dd, *m_pmesh);
}
/*
dd.depthMask(false);
{
@ -306,20 +332,24 @@ void Sample_Debug::handleMeshChanged(InputGeom* geom)
const float* Sample_Debug::getBoundsMin()
{
if (m_cset)
return m_cset->bmin;
if (m_chf)
return m_chf->bmin;
if (m_navMesh)
return m_bmin;
if (!m_chf) return 0;
return m_chf->bmin;
return 0;
}
const float* Sample_Debug::getBoundsMax()
{
if (m_cset)
return m_cset->bmax;
if (m_chf)
return m_chf->bmax;
if (m_navMesh)
return m_bmax;
if (!m_chf) return 0;
return m_chf->bmax;
return 0;
}
void Sample_Debug::handleClick(const float* p, bool shift)
@ -357,6 +387,6 @@ bool Sample_Debug::handleBuild()
return false;
}
}
return true;
}

View File

@ -709,7 +709,7 @@ bool Sample_SoloMeshTiled::handleBuild()
m_cfg.mergeRegionSize = (int)rcSqr(m_regionMergeSize);
m_cfg.maxVertsPerPoly = (int)m_vertsPerPoly;
m_cfg.tileSize = (int)m_tileSize;
m_cfg.borderSize = m_cfg.walkableRadius + 4; // Reserve enough padding.
m_cfg.borderSize = m_cfg.walkableRadius + 3; // Reserve enough padding.
m_cfg.detailSampleDist = m_detailSampleDist < 0.9f ? 0 : m_cellSize * m_detailSampleDist;
m_cfg.detailSampleMaxError = m_cellHeight * m_detailSampleMaxError;