This commit is contained in:
ikpil 2023-03-18 14:45:37 +09:00
parent ce5038de78
commit 768d813a1f
3 changed files with 83 additions and 96 deletions

View File

@ -26,7 +26,7 @@ namespace DotRecast.Recast.Demo.Tools;
public static class PathUtils public static class PathUtils
{ {
private readonly static int MAX_STEER_POINTS = 3; private const int MAX_STEER_POINTS = 3;
public static SteerTarget getSteerTarget(NavMeshQuery navQuery, float[] startPos, float[] endPos, public static SteerTarget getSteerTarget(NavMeshQuery navQuery, float[] startPos, float[] endPos,

View File

@ -14,10 +14,13 @@ namespace DotRecast.Recast.Demo.Tools;
public class TestNavmeshTool : Tool public class TestNavmeshTool : Tool
{ {
private readonly static int MAX_POLYS = 256; private const int MAX_POLYS = 256;
private readonly static int MAX_SMOOTH = 2048; private const int MAX_SMOOTH = 2048;
private Sample m_sample; private Sample m_sample;
private ToolMode m_toolMode = ToolMode.PATHFIND_FOLLOW;
private int toolModeIdx = -1;
private TestNavmeshToolMode m_toolMode = TestNavmeshToolMode.PATHFIND_FOLLOW;
private bool m_sposSet; private bool m_sposSet;
private bool m_eposSet; private bool m_eposSet;
private float[] m_spos; private float[] m_spos;
@ -42,18 +45,6 @@ public class TestNavmeshTool : Tool
private readonly List<float[]> randomPoints = new(); private readonly List<float[]> randomPoints = new();
private bool constrainByCircle; private bool constrainByCircle;
private enum ToolMode
{
PATHFIND_FOLLOW,
PATHFIND_STRAIGHT,
PATHFIND_SLICED,
DISTANCE_TO_WALL,
RAYCAST,
FIND_POLYS_IN_CIRCLE,
FIND_POLYS_IN_SHAPE,
FIND_LOCAL_NEIGHBOURHOOD,
RANDOM_POINTS_IN_CIRCLE
}
public TestNavmeshTool() public TestNavmeshTool()
{ {
@ -84,73 +75,55 @@ public class TestNavmeshTool : Tool
public override void layout(IWindow ctx) public override void layout(IWindow ctx)
{ {
ToolMode previousToolMode = m_toolMode; TestNavmeshToolMode previousToolMode = m_toolMode;
int previousStraightPathOptions = m_straightPathOptions; int previousStraightPathOptions = m_straightPathOptions;
int previousIncludeFlags = m_filter.getIncludeFlags(); int previousIncludeFlags = m_filter.getIncludeFlags();
int previousExcludeFlags = m_filter.getExcludeFlags(); int previousExcludeFlags = m_filter.getExcludeFlags();
bool previousConstrainByCircle = constrainByCircle; bool previousConstrainByCircle = constrainByCircle;
// nk_layout_row_dynamic(ctx, 20, 1); ImGui.Text("Mode");
// if (nk_option_label(ctx, "Pathfind Follow", m_toolMode == ToolMode.PATHFIND_FOLLOW)) { ImGui.Separator();
// m_toolMode = ToolMode.PATHFIND_FOLLOW; ImGui.RadioButton("Pathfind Follow", ref toolModeIdx, (int)TestNavmeshToolMode.PATHFIND_FOLLOW);
// } ImGui.RadioButton("Pathfind Straight", ref toolModeIdx, (int)TestNavmeshToolMode.PATHFIND_STRAIGHT);
// nk_layout_row_dynamic(ctx, 20, 1); ImGui.RadioButton("Pathfind Sliced", ref toolModeIdx, (int)TestNavmeshToolMode.PATHFIND_SLICED);
// if (nk_option_label(ctx, "Pathfind Straight", m_toolMode == ToolMode.PATHFIND_STRAIGHT)) { ImGui.RadioButton("Distance to Wall", ref toolModeIdx, (int)TestNavmeshToolMode.DISTANCE_TO_WALL);
// m_toolMode = ToolMode.PATHFIND_STRAIGHT; ImGui.RadioButton("Raycast", ref toolModeIdx, (int)TestNavmeshToolMode.RAYCAST);
// nk_layout_row_dynamic(ctx, 20, 1); ImGui.RadioButton("Find Polys in Circle", ref toolModeIdx, (int)TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE);
ImGui.Text("Vertices at crossings"); ImGui.RadioButton("Find Polys in Shape", ref toolModeIdx, (int)TestNavmeshToolMode.FIND_POLYS_IN_SHAPE);
// nk_layout_row_dynamic(ctx, 20, 1); ImGui.RadioButton("Find Local Neighbourhood", ref toolModeIdx, (int)TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD);
// if (nk_option_label(ctx, "None", m_straightPathOptions == 0)) { ImGui.RadioButton("Random Points in Circle", ref toolModeIdx, (int)TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE);
// m_straightPathOptions = 0; ImGui.NewLine();
// }
// nk_layout_row_dynamic(ctx, 20, 1); if (toolModeIdx == (int)TestNavmeshToolMode.PATHFIND_FOLLOW)
// if (nk_option_label(ctx, "Area", m_straightPathOptions == NavMeshQuery.DT_STRAIGHTPATH_AREA_CROSSINGS)) { {
// m_straightPathOptions = NavMeshQuery.DT_STRAIGHTPATH_AREA_CROSSINGS;
// } }
// nk_layout_row_dynamic(ctx, 20, 1);
// if (nk_option_label(ctx, "All", m_straightPathOptions == NavMeshQuery.DT_STRAIGHTPATH_ALL_CROSSINGS)) { if (toolModeIdx == (int)TestNavmeshToolMode.PATHFIND_STRAIGHT)
// m_straightPathOptions = NavMeshQuery.DT_STRAIGHTPATH_ALL_CROSSINGS; {
// } // m_toolMode = TestNavmeshToolMode.PATHFIND_STRAIGHT;
// nk_layout_row_dynamic(ctx, 5, 1); // nk_layout_row_dynamic(ctx, 20, 1);
// nk_spacing(ctx, 1); ImGui.Text("Vertices at crossings");
// } // nk_layout_row_dynamic(ctx, 20, 1);
// nk_layout_row_dynamic(ctx, 20, 1); // if (nk_option_label(ctx, "None", m_straightPathOptions == 0)) {
// if (nk_option_label(ctx, "Pathfind Sliced", m_toolMode == ToolMode.PATHFIND_SLICED)) { // m_straightPathOptions = 0;
// m_toolMode = ToolMode.PATHFIND_SLICED; // }
// } // nk_layout_row_dynamic(ctx, 20, 1);
// nk_layout_row_dynamic(ctx, 5, 1); // if (nk_option_label(ctx, "Area", m_straightPathOptions == NavMeshQuery.DT_STRAIGHTPATH_AREA_CROSSINGS)) {
// nk_spacing(ctx, 1); // m_straightPathOptions = NavMeshQuery.DT_STRAIGHTPATH_AREA_CROSSINGS;
// nk_layout_row_dynamic(ctx, 20, 1); // }
// if (nk_option_label(ctx, "Distance to Wall", m_toolMode == ToolMode.DISTANCE_TO_WALL)) { // nk_layout_row_dynamic(ctx, 20, 1);
// m_toolMode = ToolMode.DISTANCE_TO_WALL; // if (nk_option_label(ctx, "All", m_straightPathOptions == NavMeshQuery.DT_STRAIGHTPATH_ALL_CROSSINGS)) {
// } // m_straightPathOptions = NavMeshQuery.DT_STRAIGHTPATH_ALL_CROSSINGS;
// nk_layout_row_dynamic(ctx, 5, 1); // }
// nk_spacing(ctx, 1); // nk_layout_row_dynamic(ctx, 5, 1);
// nk_layout_row_dynamic(ctx, 20, 1); // nk_spacing(ctx, 1);
// if (nk_option_label(ctx, "Raycast", m_toolMode == ToolMode.RAYCAST)) { }
// m_toolMode = ToolMode.RAYCAST;
// } if (toolModeIdx == (int)TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE)
// nk_layout_row_dynamic(ctx, 5, 1); {
// nk_spacing(ctx, 1); // constrainByCircle = nk_check_text(ctx, "Constrained", constrainByCircle);
// nk_layout_row_dynamic(ctx, 20, 1); }
// if (nk_option_label(ctx, "Find Polys in Circle", m_toolMode == ToolMode.FIND_POLYS_IN_CIRCLE)) {
// m_toolMode = ToolMode.FIND_POLYS_IN_CIRCLE;
// }
// if (nk_option_label(ctx, "Find Polys in Shape", m_toolMode == ToolMode.FIND_POLYS_IN_SHAPE)) {
// m_toolMode = ToolMode.FIND_POLYS_IN_SHAPE;
// }
// nk_layout_row_dynamic(ctx, 5, 1);
// nk_spacing(ctx, 1);
// nk_layout_row_dynamic(ctx, 20, 1);
// if (nk_option_label(ctx, "Find Local Neighbourhood", m_toolMode == ToolMode.FIND_LOCAL_NEIGHBOURHOOD)) {
// m_toolMode = ToolMode.FIND_LOCAL_NEIGHBOURHOOD;
// }
// if (nk_option_label(ctx, "Random Points in Circle", m_toolMode == ToolMode.RANDOM_POINTS_IN_CIRCLE)) {
// m_toolMode = ToolMode.RANDOM_POINTS_IN_CIRCLE;
// nk_layout_row_dynamic(ctx, 20, 1);
// constrainByCircle = nk_check_text(ctx, "Constrained", constrainByCircle);
// }
//
// nk_layout_row_dynamic(ctx, 5, 1); // nk_layout_row_dynamic(ctx, 5, 1);
// nk_spacing(ctx, 1); // nk_spacing(ctx, 1);
// nk_layout_row_dynamic(ctx, 20, 1); // nk_layout_row_dynamic(ctx, 20, 1);
@ -242,7 +215,7 @@ public class TestNavmeshTool : Tool
} }
NavMesh m_navMesh = m_sample.getNavMesh(); NavMesh m_navMesh = m_sample.getNavMesh();
if (m_toolMode == ToolMode.PATHFIND_FOLLOW) if (m_toolMode == TestNavmeshToolMode.PATHFIND_FOLLOW)
{ {
if (m_sposSet && m_eposSet && m_startRef != 0 && m_endRef != 0) if (m_sposSet && m_eposSet && m_startRef != 0 && m_endRef != 0)
{ {
@ -382,7 +355,7 @@ public class TestNavmeshTool : Tool
m_smoothPath = null; m_smoothPath = null;
} }
} }
else if (m_toolMode == ToolMode.PATHFIND_STRAIGHT) else if (m_toolMode == TestNavmeshToolMode.PATHFIND_STRAIGHT)
{ {
if (m_sposSet && m_eposSet && m_startRef != 0 && m_endRef != 0) if (m_sposSet && m_eposSet && m_startRef != 0 && m_endRef != 0)
{ {
@ -411,7 +384,7 @@ public class TestNavmeshTool : Tool
m_straightPath = null; m_straightPath = null;
} }
} }
else if (m_toolMode == ToolMode.PATHFIND_SLICED) else if (m_toolMode == TestNavmeshToolMode.PATHFIND_SLICED)
{ {
m_polys = null; m_polys = null;
m_straightPath = null; m_straightPath = null;
@ -421,7 +394,7 @@ public class TestNavmeshTool : Tool
enableRaycast ? NavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue); enableRaycast ? NavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue);
} }
} }
else if (m_toolMode == ToolMode.RAYCAST) else if (m_toolMode == TestNavmeshToolMode.RAYCAST)
{ {
m_straightPath = null; m_straightPath = null;
if (m_sposSet && m_eposSet && m_startRef != 0) if (m_sposSet && m_eposSet && m_startRef != 0)
@ -463,7 +436,7 @@ public class TestNavmeshTool : Tool
} }
} }
} }
else if (m_toolMode == ToolMode.DISTANCE_TO_WALL) else if (m_toolMode == TestNavmeshToolMode.DISTANCE_TO_WALL)
{ {
m_distanceToWall = 0; m_distanceToWall = 0;
if (m_sposSet && m_startRef != 0) if (m_sposSet && m_startRef != 0)
@ -479,7 +452,7 @@ public class TestNavmeshTool : Tool
} }
} }
} }
else if (m_toolMode == ToolMode.FIND_POLYS_IN_CIRCLE) else if (m_toolMode == TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE)
{ {
if (m_sposSet && m_startRef != 0 && m_eposSet) if (m_sposSet && m_startRef != 0 && m_eposSet)
{ {
@ -495,7 +468,7 @@ public class TestNavmeshTool : Tool
} }
} }
} }
else if (m_toolMode == ToolMode.FIND_POLYS_IN_SHAPE) else if (m_toolMode == TestNavmeshToolMode.FIND_POLYS_IN_SHAPE)
{ {
if (m_sposSet && m_startRef != 0 && m_eposSet) if (m_sposSet && m_startRef != 0 && m_eposSet)
{ {
@ -527,7 +500,7 @@ public class TestNavmeshTool : Tool
} }
} }
} }
else if (m_toolMode == ToolMode.FIND_LOCAL_NEIGHBOURHOOD) else if (m_toolMode == TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD)
{ {
if (m_sposSet && m_startRef != 0) if (m_sposSet && m_startRef != 0)
{ {
@ -541,7 +514,7 @@ public class TestNavmeshTool : Tool
} }
} }
} }
else if (m_toolMode == ToolMode.RANDOM_POINTS_IN_CIRCLE) else if (m_toolMode == TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE)
{ {
randomPoints.Clear(); randomPoints.Clear();
if (m_sposSet && m_startRef != 0 && m_eposSet) if (m_sposSet && m_startRef != 0 && m_eposSet)
@ -599,7 +572,7 @@ public class TestNavmeshTool : Tool
return; return;
} }
if (m_toolMode == ToolMode.PATHFIND_FOLLOW) if (m_toolMode == TestNavmeshToolMode.PATHFIND_FOLLOW)
{ {
dd.debugDrawNavMeshPoly(m_navMesh, m_startRef, startCol); dd.debugDrawNavMeshPoly(m_navMesh, m_startRef, startCol);
dd.debugDrawNavMeshPoly(m_navMesh, m_endRef, endCol); dd.debugDrawNavMeshPoly(m_navMesh, m_endRef, endCol);
@ -665,7 +638,7 @@ public class TestNavmeshTool : Tool
} }
*/ */
} }
else if (m_toolMode == ToolMode.PATHFIND_STRAIGHT || m_toolMode == ToolMode.PATHFIND_SLICED) else if (m_toolMode == TestNavmeshToolMode.PATHFIND_STRAIGHT || m_toolMode == TestNavmeshToolMode.PATHFIND_SLICED)
{ {
dd.debugDrawNavMeshPoly(m_navMesh, m_startRef, startCol); dd.debugDrawNavMeshPoly(m_navMesh, m_startRef, startCol);
dd.debugDrawNavMeshPoly(m_navMesh, m_endRef, endCol); dd.debugDrawNavMeshPoly(m_navMesh, m_endRef, endCol);
@ -735,7 +708,7 @@ public class TestNavmeshTool : Tool
dd.depthMask(true); dd.depthMask(true);
} }
} }
else if (m_toolMode == ToolMode.RAYCAST) else if (m_toolMode == TestNavmeshToolMode.RAYCAST)
{ {
dd.debugDrawNavMeshPoly(m_navMesh, m_startRef, startCol); dd.debugDrawNavMeshPoly(m_navMesh, m_startRef, startCol);
@ -787,7 +760,7 @@ public class TestNavmeshTool : Tool
dd.depthMask(true); dd.depthMask(true);
} }
} }
else if (m_toolMode == ToolMode.DISTANCE_TO_WALL) else if (m_toolMode == TestNavmeshToolMode.DISTANCE_TO_WALL)
{ {
dd.debugDrawNavMeshPoly(m_navMesh, m_startRef, startCol); dd.debugDrawNavMeshPoly(m_navMesh, m_startRef, startCol);
dd.depthMask(false); dd.depthMask(false);
@ -807,7 +780,7 @@ public class TestNavmeshTool : Tool
dd.depthMask(true); dd.depthMask(true);
} }
else if (m_toolMode == ToolMode.FIND_POLYS_IN_CIRCLE) else if (m_toolMode == TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE)
{ {
if (m_polys != null) if (m_polys != null)
{ {
@ -840,7 +813,7 @@ public class TestNavmeshTool : Tool
dd.depthMask(true); dd.depthMask(true);
} }
} }
else if (m_toolMode == ToolMode.FIND_POLYS_IN_SHAPE) else if (m_toolMode == TestNavmeshToolMode.FIND_POLYS_IN_SHAPE)
{ {
if (m_polys != null) if (m_polys != null)
{ {
@ -877,7 +850,7 @@ public class TestNavmeshTool : Tool
dd.depthMask(true); dd.depthMask(true);
} }
} }
else if (m_toolMode == ToolMode.FIND_LOCAL_NEIGHBOURHOOD) else if (m_toolMode == TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD)
{ {
if (m_polys != null) if (m_polys != null)
{ {
@ -959,7 +932,7 @@ public class TestNavmeshTool : Tool
} }
} }
} }
else if (m_toolMode == ToolMode.RANDOM_POINTS_IN_CIRCLE) else if (m_toolMode == TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE)
{ {
dd.depthMask(false); dd.depthMask(false);
dd.begin(POINTS, 4.0f); dd.begin(POINTS, 4.0f);
@ -1037,7 +1010,7 @@ public class TestNavmeshTool : Tool
public override void handleUpdate(float dt) public override void handleUpdate(float dt)
{ {
// TODO Auto-generated method stub // TODO Auto-generated method stub
if (m_toolMode == ToolMode.PATHFIND_SLICED) if (m_toolMode == TestNavmeshToolMode.PATHFIND_SLICED)
{ {
NavMeshQuery m_navQuery = m_sample.getNavMeshQuery(); NavMeshQuery m_navQuery = m_sample.getNavMeshQuery();
if (m_pathFindStatus.isInProgress()) if (m_pathFindStatus.isInProgress())

View File

@ -0,0 +1,14 @@
namespace DotRecast.Recast.Demo.Tools;
public enum TestNavmeshToolMode
{
PATHFIND_FOLLOW,
PATHFIND_STRAIGHT,
PATHFIND_SLICED,
DISTANCE_TO_WALL,
RAYCAST,
FIND_POLYS_IN_CIRCLE,
FIND_POLYS_IN_SHAPE,
FIND_LOCAL_NEIGHBOURHOOD,
RANDOM_POINTS_IN_CIRCLE
}