mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
Recast: expose option to ignore input triangle winding order to user interface
Disabled by default.
This commit is contained in:
parent
0940ad3ce6
commit
67c5145862
@ -142,6 +142,7 @@ Editor::Editor() :
|
||||
m_navMeshDrawFlags(
|
||||
DU_DRAW_DETOURMESH_OFFMESHCONS|DU_DRAW_DETOURMESH_WITH_CLOSED_LIST|
|
||||
DU_DRAW_DETOURMESH_POLY_FACES|DU_DRAW_DETOURMESH_POLY_BOUNDS_OUTER|DU_DRAW_DETOURMESH_ALPHA),
|
||||
m_ignoreWindingOrder(false),
|
||||
m_filterLowHangingObstacles(true),
|
||||
m_filterLedgeSpans(true),
|
||||
m_filterWalkableLowHeightSpans(true),
|
||||
@ -332,6 +333,8 @@ void Editor::handleCommonSettings()
|
||||
ImGui::Text(text);
|
||||
}
|
||||
|
||||
ImGui::Checkbox("Ignore Winding Order", &m_ignoreWindingOrder);
|
||||
|
||||
ImGui::Separator();
|
||||
ImGui::Text("Agent");
|
||||
ImGui::SliderFloat("Height", &m_agentHeight, 0.1f, 500.0f);
|
||||
|
@ -189,6 +189,7 @@ bool Editor_SoloMesh::handleBuild()
|
||||
m_cfg.maxVertsPerPoly = (int)m_vertsPerPoly;
|
||||
m_cfg.detailSampleDist = m_detailSampleDist < 0.9f ? 0 : m_cellSize * m_detailSampleDist;
|
||||
m_cfg.detailSampleMaxError = m_cellHeight * m_detailSampleMaxError;
|
||||
m_cfg.ignoreWindingOrder = m_ignoreWindingOrder;
|
||||
|
||||
// Set the area where the navigation will be build.
|
||||
// Here the bounds of the input mesh are used, but the
|
||||
@ -238,7 +239,7 @@ bool Editor_SoloMesh::handleBuild()
|
||||
// If your input data is multiple meshes, you can transform them here, calculate
|
||||
// the are type for each of the meshes and rasterize them.
|
||||
memset(m_triareas, 0, ntris*sizeof(unsigned char));
|
||||
rcMarkWalkableTriangles(m_ctx, m_cfg.walkableSlopeAngle, verts, nverts, tris, ntris, m_triareas, true);
|
||||
rcMarkWalkableTriangles(m_ctx, m_cfg.walkableSlopeAngle, verts, nverts, tris, ntris, m_triareas, m_cfg.ignoreWindingOrder);
|
||||
if (!rcRasterizeTriangles(m_ctx, verts, nverts, tris, m_triareas, ntris, *m_solid, m_cfg.walkableClimb))
|
||||
{
|
||||
m_ctx->log(RC_LOG_ERROR, "buildNavigation: Could not rasterize triangles.");
|
||||
|
@ -254,6 +254,8 @@ int Editor_TempObstacles::rasterizeTileLayers(
|
||||
tcfg.bmax[0] += tcfg.borderSize*tcfg.cs;
|
||||
tcfg.bmax[1] += tcfg.borderSize*tcfg.cs;
|
||||
|
||||
tcfg.ignoreWindingOrder = m_ignoreWindingOrder;
|
||||
|
||||
// Allocate voxel heightfield where we rasterize our input data to.
|
||||
rc.solid = rcAllocHeightfield();
|
||||
if (!rc.solid)
|
||||
@ -298,7 +300,7 @@ int Editor_TempObstacles::rasterizeTileLayers(
|
||||
|
||||
memset(rc.triareas, 0, ntris*sizeof(unsigned char));
|
||||
rcMarkWalkableTriangles(m_ctx, tcfg.walkableSlopeAngle,
|
||||
verts, nverts, tris, ntris, rc.triareas, false);
|
||||
verts, nverts, tris, ntris, rc.triareas, tcfg.ignoreWindingOrder);
|
||||
|
||||
if (!rcRasterizeTriangles(m_ctx, verts, nverts, tris, rc.triareas, ntris, *rc.solid, tcfg.walkableClimb))
|
||||
return 0;
|
||||
@ -319,7 +321,7 @@ int Editor_TempObstacles::rasterizeTileLayers(
|
||||
|
||||
memset(rc.triareas, 0, ntris * sizeof(unsigned char));
|
||||
rcMarkWalkableTriangles(m_ctx, tcfg.walkableSlopeAngle,
|
||||
verts, nverts, tris, ntris, rc.triareas, true);
|
||||
verts, nverts, tris, ntris, rc.triareas, tcfg.ignoreWindingOrder);
|
||||
|
||||
if (!rcRasterizeTriangles(m_ctx, verts, nverts, tris, rc.triareas, ntris, *rc.solid, tcfg.walkableClimb))
|
||||
return 0;
|
||||
|
@ -966,6 +966,7 @@ unsigned char* Editor_TileMesh::buildTileMesh(const int tx, const int ty, const
|
||||
m_cfg.height = m_cfg.tileSize + m_cfg.borderSize*2;
|
||||
m_cfg.detailSampleDist = m_detailSampleDist < 0.9f ? 0 : m_cellSize * m_detailSampleDist;
|
||||
m_cfg.detailSampleMaxError = m_cellHeight * m_detailSampleMaxError;
|
||||
m_cfg.ignoreWindingOrder = m_ignoreWindingOrder;
|
||||
|
||||
// Expand the heighfield bounding box by border size to find the extents of geometry we need to build this tile.
|
||||
//
|
||||
@ -1051,7 +1052,7 @@ unsigned char* Editor_TileMesh::buildTileMesh(const int tx, const int ty, const
|
||||
|
||||
memset(m_triareas, 0, nctris*sizeof(unsigned char));
|
||||
rcMarkWalkableTriangles(m_ctx, m_cfg.walkableSlopeAngle,
|
||||
verts, nverts, ctris, nctris, m_triareas, false);
|
||||
verts, nverts, ctris, nctris, m_triareas, m_cfg.ignoreWindingOrder);
|
||||
|
||||
if (!rcRasterizeTriangles(m_ctx, verts, nverts, ctris, m_triareas, nctris, *m_solid, m_cfg.walkableClimb))
|
||||
return 0;
|
||||
@ -1075,7 +1076,7 @@ unsigned char* Editor_TileMesh::buildTileMesh(const int tx, const int ty, const
|
||||
|
||||
memset(m_triareas, 0, nctris * sizeof(unsigned char));
|
||||
rcMarkWalkableTriangles(m_ctx, m_cfg.walkableSlopeAngle,
|
||||
verts, nverts, ctris, nctris, m_triareas, true);
|
||||
verts, nverts, ctris, nctris, m_triareas, m_cfg.ignoreWindingOrder);
|
||||
|
||||
if (!rcRasterizeTriangles(m_ctx, verts, nverts, ctris, m_triareas, nctris, *m_solid, m_cfg.walkableClimb))
|
||||
return 0;
|
||||
|
@ -236,6 +236,7 @@ protected:
|
||||
class dtNavMeshQuery* m_navQuery;
|
||||
class dtCrowd* m_crowd;
|
||||
|
||||
bool m_ignoreWindingOrder;
|
||||
bool m_filterLowHangingObstacles;
|
||||
bool m_filterLedgeSpans;
|
||||
bool m_filterWalkableLowHeightSpans;
|
||||
|
@ -274,6 +274,10 @@ struct rcConfig
|
||||
/// The maximum distance the detail mesh surface should deviate from heightfield
|
||||
/// data. (For height detail only.) [Limit: >=0] [Units: wu]
|
||||
float detailSampleMaxError;
|
||||
|
||||
/// Whether to ignore the winding order of the input geometry's triangles. If set, backwards
|
||||
/// facing triangles will still be considered walkable if they meet all other criteria.
|
||||
bool ignoreWindingOrder;
|
||||
};
|
||||
|
||||
/// Defines the number of bits allocated to rcSpan::smin and rcSpan::smax.
|
||||
|
Loading…
x
Reference in New Issue
Block a user