fix for Issue 94:rcBuildContours fails when small area is marked near tile edge
This commit is contained in:
parent
122ee3a7a1
commit
5d91c09e00
@ -231,17 +231,36 @@ static void simplifyContour(rcIntArray& points, rcIntArray& simplified,
|
|||||||
const float maxError, const int maxEdgeLen, const int buildFlags)
|
const float maxError, const int maxEdgeLen, const int buildFlags)
|
||||||
{
|
{
|
||||||
// Add initial points.
|
// Add initial points.
|
||||||
bool noConnections = true;
|
bool hasConnections = false;
|
||||||
for (int i = 0; i < points.size(); i += 4)
|
for (int i = 0; i < points.size(); i += 4)
|
||||||
{
|
{
|
||||||
if ((points[i+3] & RC_CONTOUR_REG_MASK) != 0)
|
if ((points[i+3] & RC_CONTOUR_REG_MASK) != 0)
|
||||||
{
|
{
|
||||||
noConnections = false;
|
hasConnections = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (noConnections)
|
if (hasConnections)
|
||||||
|
{
|
||||||
|
// The contour has some portals to other regions.
|
||||||
|
// Add a new point to every location where the region changes.
|
||||||
|
for (int i = 0, ni = points.size()/4; i < ni; ++i)
|
||||||
|
{
|
||||||
|
int ii = (i+1) % ni;
|
||||||
|
const bool differentRegs = (points[i*4+3] & RC_CONTOUR_REG_MASK) != (points[ii*4+3] & RC_CONTOUR_REG_MASK);
|
||||||
|
const bool areaBorders = (points[i*4+3] & RC_AREA_BORDER) != (points[ii*4+3] & RC_AREA_BORDER);
|
||||||
|
if (differentRegs || areaBorders)
|
||||||
|
{
|
||||||
|
simplified.push(points[i*4+0]);
|
||||||
|
simplified.push(points[i*4+1]);
|
||||||
|
simplified.push(points[i*4+2]);
|
||||||
|
simplified.push(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (simplified.size() == 0)
|
||||||
{
|
{
|
||||||
// If there is no connections at all,
|
// If there is no connections at all,
|
||||||
// create some initial points for the simplification process.
|
// create some initial points for the simplification process.
|
||||||
@ -284,24 +303,6 @@ static void simplifyContour(rcIntArray& points, rcIntArray& simplified,
|
|||||||
simplified.push(urz);
|
simplified.push(urz);
|
||||||
simplified.push(uri);
|
simplified.push(uri);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// The contour has some portals to other regions.
|
|
||||||
// Add a new point to every location where the region changes.
|
|
||||||
for (int i = 0, ni = points.size()/4; i < ni; ++i)
|
|
||||||
{
|
|
||||||
int ii = (i+1) % ni;
|
|
||||||
const bool differentRegs = (points[i*4+3] & RC_CONTOUR_REG_MASK) != (points[ii*4+3] & RC_CONTOUR_REG_MASK);
|
|
||||||
const bool areaBorders = (points[i*4+3] & RC_AREA_BORDER) != (points[ii*4+3] & RC_AREA_BORDER);
|
|
||||||
if (differentRegs || areaBorders)
|
|
||||||
{
|
|
||||||
simplified.push(points[i*4+0]);
|
|
||||||
simplified.push(points[i*4+1]);
|
|
||||||
simplified.push(points[i*4+2]);
|
|
||||||
simplified.push(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add points until all raw points are within
|
// Add points until all raw points are within
|
||||||
// error tolerance to the simplified shape.
|
// error tolerance to the simplified shape.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user