Implement more complex area modifications (#260)

This implements rcAreaModification which allows combining of area types when they overlap
and otherwise usage of the area type as a bit mask.
This commit is contained in:
Domenico Albani
2017-03-12 12:18:29 +01:00
committed by Jakob Botsch Nielsen
parent ef3ea40f7a
commit 433986a5a4
15 changed files with 200 additions and 134 deletions
+6 -6
View File
@@ -313,7 +313,7 @@ bool rcMedianFilterWalkableArea(rcContext* ctx, rcCompactHeightfield& chf)
/// The value of spacial parameters are in world units.
///
/// @see rcCompactHeightfield, rcMedianFilterWalkableArea
void rcMarkBoxArea(rcContext* ctx, const float* bmin, const float* bmax, unsigned char areaId,
void rcMarkBoxArea(rcContext* ctx, const float* bmin, const float* bmax, rcAreaModification areaMod,
rcCompactHeightfield& chf)
{
rcAssert(ctx);
@@ -348,7 +348,7 @@ void rcMarkBoxArea(rcContext* ctx, const float* bmin, const float* bmax, unsigne
if ((int)s.y >= miny && (int)s.y <= maxy)
{
if (chf.areas[i] != RC_NULL_AREA)
chf.areas[i] = areaId;
areaMod.apply(chf.areas[i]);
}
}
}
@@ -379,7 +379,7 @@ static int pointInPoly(int nvert, const float* verts, const float* p)
///
/// @see rcCompactHeightfield, rcMedianFilterWalkableArea
void rcMarkConvexPolyArea(rcContext* ctx, const float* verts, const int nverts,
const float hmin, const float hmax, unsigned char areaId,
const float hmin, const float hmax, rcAreaModification areaMod,
rcCompactHeightfield& chf)
{
rcAssert(ctx);
@@ -435,7 +435,7 @@ void rcMarkConvexPolyArea(rcContext* ctx, const float* verts, const int nverts,
if (pointInPoly(nverts, verts, p))
{
chf.areas[i] = areaId;
areaMod.apply(chf.areas[i]);
}
}
}
@@ -527,7 +527,7 @@ int rcOffsetPoly(const float* verts, const int nverts, const float offset,
///
/// @see rcCompactHeightfield, rcMedianFilterWalkableArea
void rcMarkCylinderArea(rcContext* ctx, const float* pos,
const float r, const float h, unsigned char areaId,
const float r, const float h, rcAreaModification areaMod,
rcCompactHeightfield& chf)
{
rcAssert(ctx);
@@ -582,7 +582,7 @@ void rcMarkCylinderArea(rcContext* ctx, const float* pos,
if (dx*dx + dz*dz < r2)
{
chf.areas[i] = areaId;
areaMod.apply(chf.areas[i]);
}
}
}