forked from mirror/DotRecast
test navmesh tool, impl
This commit is contained in:
parent
ddcf05b213
commit
d2661a4318
|
@ -19,8 +19,6 @@ public class TestNavmeshTool : IRcTool
|
||||||
|
|
||||||
private readonly TestNavmeshToolImpl _impl;
|
private readonly TestNavmeshToolImpl _impl;
|
||||||
|
|
||||||
private int m_toolModeIdx = TestNavmeshToolMode.PATHFIND_FOLLOW.Idx;
|
|
||||||
private TestNavmeshToolMode m_toolMode => TestNavmeshToolMode.Values[m_toolModeIdx];
|
|
||||||
private bool m_sposSet;
|
private bool m_sposSet;
|
||||||
private bool m_eposSet;
|
private bool m_eposSet;
|
||||||
private RcVec3f m_spos;
|
private RcVec3f m_spos;
|
||||||
|
@ -33,7 +31,6 @@ public class TestNavmeshTool : IRcTool
|
||||||
private float m_distanceToWall;
|
private float m_distanceToWall;
|
||||||
private RcVec3f m_hitNormal;
|
private RcVec3f m_hitNormal;
|
||||||
private List<StraightPathItem> m_straightPath;
|
private List<StraightPathItem> m_straightPath;
|
||||||
private int m_straightPathOptions;
|
|
||||||
private List<long> m_polys;
|
private List<long> m_polys;
|
||||||
private bool m_hitResult;
|
private bool m_hitResult;
|
||||||
private List<long> m_parent;
|
private List<long> m_parent;
|
||||||
|
@ -41,12 +38,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
private readonly float[] m_queryPoly = new float[12];
|
private readonly float[] m_queryPoly = new float[12];
|
||||||
private List<RcVec3f> m_smoothPath;
|
private List<RcVec3f> m_smoothPath;
|
||||||
private DtStatus m_pathFindStatus = DtStatus.DT_FAILURE;
|
private DtStatus m_pathFindStatus = DtStatus.DT_FAILURE;
|
||||||
private bool enableRaycast = true;
|
|
||||||
private readonly List<RcVec3f> randomPoints = new();
|
private readonly List<RcVec3f> randomPoints = new();
|
||||||
private bool constrainByCircle;
|
|
||||||
|
|
||||||
private int includeFlags = SampleAreaModifications.SAMPLE_POLYFLAGS_ALL;
|
|
||||||
private int excludeFlags = 0;
|
|
||||||
|
|
||||||
public TestNavmeshTool()
|
public TestNavmeshTool()
|
||||||
{
|
{
|
||||||
|
@ -87,46 +79,47 @@ public class TestNavmeshTool : IRcTool
|
||||||
|
|
||||||
public void Layout()
|
public void Layout()
|
||||||
{
|
{
|
||||||
var previousToolMode = m_toolMode;
|
var option = _impl.GetOption();
|
||||||
int previousStraightPathOptions = m_straightPathOptions;
|
var previousToolMode = option.mode;
|
||||||
|
int previousStraightPathOptions = option.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 = option.constrainByCircle;
|
||||||
|
|
||||||
ImGui.Text("Mode");
|
ImGui.Text("Mode");
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.RadioButton(TestNavmeshToolMode.PATHFIND_FOLLOW.Label, ref m_toolModeIdx, TestNavmeshToolMode.PATHFIND_FOLLOW.Idx);
|
ImGui.RadioButton(TestNavmeshToolMode.PATHFIND_FOLLOW.Label, ref option.modeIdx, TestNavmeshToolMode.PATHFIND_FOLLOW.Idx);
|
||||||
ImGui.RadioButton(TestNavmeshToolMode.PATHFIND_STRAIGHT.Label, ref m_toolModeIdx, TestNavmeshToolMode.PATHFIND_STRAIGHT.Idx);
|
ImGui.RadioButton(TestNavmeshToolMode.PATHFIND_STRAIGHT.Label, ref option.modeIdx, TestNavmeshToolMode.PATHFIND_STRAIGHT.Idx);
|
||||||
ImGui.RadioButton(TestNavmeshToolMode.PATHFIND_SLICED.Label, ref m_toolModeIdx, TestNavmeshToolMode.PATHFIND_SLICED.Idx);
|
ImGui.RadioButton(TestNavmeshToolMode.PATHFIND_SLICED.Label, ref option.modeIdx, TestNavmeshToolMode.PATHFIND_SLICED.Idx);
|
||||||
ImGui.RadioButton(TestNavmeshToolMode.DISTANCE_TO_WALL.Label, ref m_toolModeIdx, TestNavmeshToolMode.DISTANCE_TO_WALL.Idx);
|
ImGui.RadioButton(TestNavmeshToolMode.DISTANCE_TO_WALL.Label, ref option.modeIdx, TestNavmeshToolMode.DISTANCE_TO_WALL.Idx);
|
||||||
ImGui.RadioButton(TestNavmeshToolMode.RAYCAST.Label, ref m_toolModeIdx, TestNavmeshToolMode.RAYCAST.Idx);
|
ImGui.RadioButton(TestNavmeshToolMode.RAYCAST.Label, ref option.modeIdx, TestNavmeshToolMode.RAYCAST.Idx);
|
||||||
ImGui.RadioButton(TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE.Label, ref m_toolModeIdx, TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE.Idx);
|
ImGui.RadioButton(TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE.Label, ref option.modeIdx, TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE.Idx);
|
||||||
ImGui.RadioButton(TestNavmeshToolMode.FIND_POLYS_IN_SHAPE.Label, ref m_toolModeIdx, TestNavmeshToolMode.FIND_POLYS_IN_SHAPE.Idx);
|
ImGui.RadioButton(TestNavmeshToolMode.FIND_POLYS_IN_SHAPE.Label, ref option.modeIdx, TestNavmeshToolMode.FIND_POLYS_IN_SHAPE.Idx);
|
||||||
ImGui.RadioButton(TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD.Label, ref m_toolModeIdx, TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD.Idx);
|
ImGui.RadioButton(TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD.Label, ref option.modeIdx, TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD.Idx);
|
||||||
ImGui.RadioButton(TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE.Label, ref m_toolModeIdx, TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE.Idx);
|
ImGui.RadioButton(TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE.Label, ref option.modeIdx, TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE.Idx);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
|
|
||||||
// selecting mode
|
// selecting mode
|
||||||
ImGui.Text(m_toolMode.Label);
|
ImGui.Text(option.mode.Label);
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
|
|
||||||
if (m_toolMode == TestNavmeshToolMode.PATHFIND_FOLLOW)
|
if (option.mode == TestNavmeshToolMode.PATHFIND_FOLLOW)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_toolMode == TestNavmeshToolMode.PATHFIND_STRAIGHT)
|
if (option.mode == TestNavmeshToolMode.PATHFIND_STRAIGHT)
|
||||||
{
|
{
|
||||||
ImGui.Text("Vertices at crossings");
|
ImGui.Text("Vertices at crossings");
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.RadioButton("None", ref m_straightPathOptions, 0);
|
ImGui.RadioButton("None", ref option.straightPathOptions, 0);
|
||||||
ImGui.RadioButton("Area", ref m_straightPathOptions, DtNavMeshQuery.DT_STRAIGHTPATH_AREA_CROSSINGS);
|
ImGui.RadioButton("Area", ref option.straightPathOptions, DtNavMeshQuery.DT_STRAIGHTPATH_AREA_CROSSINGS);
|
||||||
ImGui.RadioButton("All", ref m_straightPathOptions, DtNavMeshQuery.DT_STRAIGHTPATH_ALL_CROSSINGS);
|
ImGui.RadioButton("All", ref option.straightPathOptions, DtNavMeshQuery.DT_STRAIGHTPATH_ALL_CROSSINGS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_toolMode == TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE)
|
if (option.mode == TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE)
|
||||||
{
|
{
|
||||||
ImGui.Checkbox("Constrained", ref constrainByCircle);
|
ImGui.Checkbox("Constrained", ref option.constrainByCircle);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.Text("Common");
|
ImGui.Text("Common");
|
||||||
|
@ -134,30 +127,30 @@ public class TestNavmeshTool : IRcTool
|
||||||
|
|
||||||
ImGui.Text("Include Flags");
|
ImGui.Text("Include Flags");
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.CheckboxFlags("Walk", ref includeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_WALK);
|
ImGui.CheckboxFlags("Walk", ref option.includeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_WALK);
|
||||||
ImGui.CheckboxFlags("Swim", ref includeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_SWIM);
|
ImGui.CheckboxFlags("Swim", ref option.includeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_SWIM);
|
||||||
ImGui.CheckboxFlags("Door", ref includeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_DOOR);
|
ImGui.CheckboxFlags("Door", ref option.includeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_DOOR);
|
||||||
ImGui.CheckboxFlags("Jump", ref includeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_JUMP);
|
ImGui.CheckboxFlags("Jump", ref option.includeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_JUMP);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
|
|
||||||
m_filter.SetIncludeFlags(includeFlags);
|
m_filter.SetIncludeFlags(option.includeFlags);
|
||||||
|
|
||||||
ImGui.Text("Exclude Flags");
|
ImGui.Text("Exclude Flags");
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.CheckboxFlags("Walk", ref excludeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_WALK);
|
ImGui.CheckboxFlags("Walk", ref option.excludeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_WALK);
|
||||||
ImGui.CheckboxFlags("Swim", ref excludeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_SWIM);
|
ImGui.CheckboxFlags("Swim", ref option.excludeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_SWIM);
|
||||||
ImGui.CheckboxFlags("Door", ref excludeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_DOOR);
|
ImGui.CheckboxFlags("Door", ref option.excludeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_DOOR);
|
||||||
ImGui.CheckboxFlags("Jump", ref excludeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_JUMP);
|
ImGui.CheckboxFlags("Jump", ref option.excludeFlags, SampleAreaModifications.SAMPLE_POLYFLAGS_JUMP);
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
|
|
||||||
m_filter.SetExcludeFlags(excludeFlags);
|
m_filter.SetExcludeFlags(option.excludeFlags);
|
||||||
|
|
||||||
bool previousEnableRaycast = enableRaycast;
|
bool previousEnableRaycast = option.enableRaycast;
|
||||||
ImGui.Checkbox("Raycast shortcuts", ref enableRaycast);
|
ImGui.Checkbox("Raycast shortcuts", ref option.enableRaycast);
|
||||||
|
|
||||||
if (previousToolMode != m_toolMode || m_straightPathOptions != previousStraightPathOptions
|
if (previousToolMode != option.mode || option.straightPathOptions != previousStraightPathOptions
|
||||||
|| previousIncludeFlags != includeFlags || previousExcludeFlags != excludeFlags
|
|| previousIncludeFlags != option.includeFlags || previousExcludeFlags != option.excludeFlags
|
||||||
|| previousEnableRaycast != enableRaycast || previousConstrainByCircle != constrainByCircle)
|
|| previousEnableRaycast != option.enableRaycast || previousConstrainByCircle != option.constrainByCircle)
|
||||||
{
|
{
|
||||||
Recalc();
|
Recalc();
|
||||||
}
|
}
|
||||||
|
@ -190,14 +183,16 @@ public class TestNavmeshTool : IRcTool
|
||||||
m_endRef = 0;
|
m_endRef = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var option = _impl.GetOption();
|
||||||
|
|
||||||
DtNavMesh m_navMesh = _impl.GetSample().GetNavMesh();
|
DtNavMesh m_navMesh = _impl.GetSample().GetNavMesh();
|
||||||
if (m_toolMode == TestNavmeshToolMode.PATHFIND_FOLLOW)
|
if (option.mode == 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)
|
||||||
{
|
{
|
||||||
m_polys = new();
|
m_polys = new();
|
||||||
m_navQuery.FindPath(m_startRef, m_endRef, m_spos, m_epos, m_filter, ref m_polys,
|
m_navQuery.FindPath(m_startRef, m_endRef, m_spos, m_epos, m_filter, ref m_polys,
|
||||||
new(enableRaycast ? DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue));
|
new(option.enableRaycast ? DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue));
|
||||||
if (0 < m_polys.Count)
|
if (0 < m_polys.Count)
|
||||||
{
|
{
|
||||||
// Iterate over the path to find smooth path on the detail mesh surface.
|
// Iterate over the path to find smooth path on the detail mesh surface.
|
||||||
|
@ -324,13 +319,13 @@ public class TestNavmeshTool : IRcTool
|
||||||
m_smoothPath = null;
|
m_smoothPath = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.PATHFIND_STRAIGHT)
|
else if (option.mode == 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)
|
||||||
{
|
{
|
||||||
m_polys = new();
|
m_polys = new();
|
||||||
m_navQuery.FindPath(m_startRef, m_endRef, m_spos, m_epos, m_filter, ref m_polys,
|
m_navQuery.FindPath(m_startRef, m_endRef, m_spos, m_epos, m_filter, ref m_polys,
|
||||||
new(enableRaycast ? DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue));
|
new(option.enableRaycast ? DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue));
|
||||||
if (0 < m_polys.Count)
|
if (0 < m_polys.Count)
|
||||||
{
|
{
|
||||||
// In case of partial path, make sure the end point is clamped to the last polygon.
|
// In case of partial path, make sure the end point is clamped to the last polygon.
|
||||||
|
@ -344,7 +339,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_navQuery.FindStraightPath(m_spos, epos, m_polys, ref m_straightPath, MAX_POLYS, m_straightPathOptions);
|
m_navQuery.FindStraightPath(m_spos, epos, m_polys, ref m_straightPath, MAX_POLYS, option.straightPathOptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -352,7 +347,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
m_straightPath = null;
|
m_straightPath = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.PATHFIND_SLICED)
|
else if (option.mode == TestNavmeshToolMode.PATHFIND_SLICED)
|
||||||
{
|
{
|
||||||
m_polys = null;
|
m_polys = null;
|
||||||
m_straightPath = null;
|
m_straightPath = null;
|
||||||
|
@ -360,10 +355,10 @@ public class TestNavmeshTool : IRcTool
|
||||||
if (m_sposSet && m_eposSet && m_startRef != 0 && m_endRef != 0)
|
if (m_sposSet && m_eposSet && m_startRef != 0 && m_endRef != 0)
|
||||||
{
|
{
|
||||||
m_pathFindStatus = m_navQuery.InitSlicedFindPath(m_startRef, m_endRef, m_spos, m_epos, m_filter,
|
m_pathFindStatus = m_navQuery.InitSlicedFindPath(m_startRef, m_endRef, m_spos, m_epos, m_filter,
|
||||||
enableRaycast ? DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue);
|
option.enableRaycast ? DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.RAYCAST)
|
else if (option.mode == TestNavmeshToolMode.RAYCAST)
|
||||||
{
|
{
|
||||||
m_straightPath = null;
|
m_straightPath = null;
|
||||||
if (m_sposSet && m_eposSet && m_startRef != 0)
|
if (m_sposSet && m_eposSet && m_startRef != 0)
|
||||||
|
@ -404,7 +399,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.DISTANCE_TO_WALL)
|
else if (option.mode == TestNavmeshToolMode.DISTANCE_TO_WALL)
|
||||||
{
|
{
|
||||||
m_distanceToWall = 0;
|
m_distanceToWall = 0;
|
||||||
if (m_sposSet && m_startRef != 0)
|
if (m_sposSet && m_startRef != 0)
|
||||||
|
@ -419,7 +414,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE)
|
else if (option.mode == TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE)
|
||||||
{
|
{
|
||||||
if (m_sposSet && m_startRef != 0 && m_eposSet)
|
if (m_sposSet && m_startRef != 0 && m_eposSet)
|
||||||
{
|
{
|
||||||
|
@ -434,7 +429,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.FIND_POLYS_IN_SHAPE)
|
else if (option.mode == TestNavmeshToolMode.FIND_POLYS_IN_SHAPE)
|
||||||
{
|
{
|
||||||
if (m_sposSet && m_startRef != 0 && m_eposSet)
|
if (m_sposSet && m_startRef != 0 && m_eposSet)
|
||||||
{
|
{
|
||||||
|
@ -466,7 +461,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD)
|
else if (option.mode == TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD)
|
||||||
{
|
{
|
||||||
if (m_sposSet && m_startRef != 0)
|
if (m_sposSet && m_startRef != 0)
|
||||||
{
|
{
|
||||||
|
@ -474,7 +469,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
m_navQuery.FindLocalNeighbourhood(m_startRef, m_spos, m_neighbourhoodRadius, m_filter, ref m_polys, ref m_parent);
|
m_navQuery.FindLocalNeighbourhood(m_startRef, m_spos, m_neighbourhoodRadius, m_filter, ref m_polys, ref m_parent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE)
|
else if (option.mode == 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)
|
||||||
|
@ -482,7 +477,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
float dx = m_epos.x - m_spos.x;
|
float dx = m_epos.x - m_spos.x;
|
||||||
float dz = m_epos.z - m_spos.z;
|
float dz = m_epos.z - m_spos.z;
|
||||||
float dist = (float)Math.Sqrt(dx * dx + dz * dz);
|
float dist = (float)Math.Sqrt(dx * dx + dz * dz);
|
||||||
IPolygonByCircleConstraint constraint = constrainByCircle
|
IPolygonByCircleConstraint constraint = option.constrainByCircle
|
||||||
? StrictPolygonByCircleConstraint.Strict
|
? StrictPolygonByCircleConstraint.Strict
|
||||||
: NoOpPolygonByCircleConstraint.Noop;
|
: NoOpPolygonByCircleConstraint.Noop;
|
||||||
|
|
||||||
|
@ -533,7 +528,8 @@ public class TestNavmeshTool : IRcTool
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_toolMode == TestNavmeshToolMode.PATHFIND_FOLLOW)
|
var option = _impl.GetOption();
|
||||||
|
if (option.mode == 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);
|
||||||
|
@ -599,7 +595,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.PATHFIND_STRAIGHT || m_toolMode == TestNavmeshToolMode.PATHFIND_SLICED)
|
else if (option.mode == TestNavmeshToolMode.PATHFIND_STRAIGHT || option.mode == 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);
|
||||||
|
@ -669,7 +665,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
dd.DepthMask(true);
|
dd.DepthMask(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.RAYCAST)
|
else if (option.mode == TestNavmeshToolMode.RAYCAST)
|
||||||
{
|
{
|
||||||
dd.DebugDrawNavMeshPoly(m_navMesh, m_startRef, startCol);
|
dd.DebugDrawNavMeshPoly(m_navMesh, m_startRef, startCol);
|
||||||
|
|
||||||
|
@ -721,7 +717,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
dd.DepthMask(true);
|
dd.DepthMask(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.DISTANCE_TO_WALL)
|
else if (option.mode == TestNavmeshToolMode.DISTANCE_TO_WALL)
|
||||||
{
|
{
|
||||||
dd.DebugDrawNavMeshPoly(m_navMesh, m_startRef, startCol);
|
dd.DebugDrawNavMeshPoly(m_navMesh, m_startRef, startCol);
|
||||||
dd.DepthMask(false);
|
dd.DepthMask(false);
|
||||||
|
@ -741,7 +737,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
|
|
||||||
dd.DepthMask(true);
|
dd.DepthMask(true);
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE)
|
else if (option.mode == TestNavmeshToolMode.FIND_POLYS_IN_CIRCLE)
|
||||||
{
|
{
|
||||||
if (m_polys != null)
|
if (m_polys != null)
|
||||||
{
|
{
|
||||||
|
@ -774,7 +770,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
dd.DepthMask(true);
|
dd.DepthMask(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.FIND_POLYS_IN_SHAPE)
|
else if (option.mode == TestNavmeshToolMode.FIND_POLYS_IN_SHAPE)
|
||||||
{
|
{
|
||||||
if (m_polys != null)
|
if (m_polys != null)
|
||||||
{
|
{
|
||||||
|
@ -811,7 +807,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
dd.DepthMask(true);
|
dd.DepthMask(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD)
|
else if (option.mode == TestNavmeshToolMode.FIND_LOCAL_NEIGHBOURHOOD)
|
||||||
{
|
{
|
||||||
if (m_polys != null)
|
if (m_polys != null)
|
||||||
{
|
{
|
||||||
|
@ -898,7 +894,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_toolMode == TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE)
|
else if (option.mode == TestNavmeshToolMode.RANDOM_POINTS_IN_CIRCLE)
|
||||||
{
|
{
|
||||||
dd.DepthMask(false);
|
dd.DepthMask(false);
|
||||||
dd.Begin(POINTS, 4.0f);
|
dd.Begin(POINTS, 4.0f);
|
||||||
|
@ -972,7 +968,8 @@ public class TestNavmeshTool : IRcTool
|
||||||
public void HandleUpdate(float dt)
|
public void HandleUpdate(float dt)
|
||||||
{
|
{
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
if (m_toolMode == TestNavmeshToolMode.PATHFIND_SLICED)
|
var option = _impl.GetOption();
|
||||||
|
if (option.mode == TestNavmeshToolMode.PATHFIND_SLICED)
|
||||||
{
|
{
|
||||||
DtNavMeshQuery m_navQuery = _impl.GetSample().GetNavMeshQuery();
|
DtNavMeshQuery m_navQuery = _impl.GetSample().GetNavMeshQuery();
|
||||||
if (m_pathFindStatus.InProgress())
|
if (m_pathFindStatus.InProgress())
|
||||||
|
|
|
@ -84,19 +84,37 @@ namespace DotRecast.Recast.DemoTool.Tools
|
||||||
|
|
||||||
if ((_option.buildTypes & JumpLinkType.EDGE_CLIMB_DOWN.Bit) != 0)
|
if ((_option.buildTypes & JumpLinkType.EDGE_CLIMB_DOWN.Bit) != 0)
|
||||||
{
|
{
|
||||||
JumpLinkBuilderConfig config = new JumpLinkBuilderConfig(cellSize, cellHeight, agentRadius,
|
JumpLinkBuilderConfig config = new JumpLinkBuilderConfig(
|
||||||
agentHeight, agentClimb, _option.groundTolerance, -agentRadius * 0.2f,
|
cellSize,
|
||||||
|
cellHeight,
|
||||||
|
agentRadius,
|
||||||
|
agentHeight,
|
||||||
|
agentClimb,
|
||||||
|
_option.groundTolerance,
|
||||||
|
-agentRadius * 0.2f,
|
||||||
cellSize + 2 * agentRadius + _option.climbDownDistance,
|
cellSize + 2 * agentRadius + _option.climbDownDistance,
|
||||||
-_option.climbDownMaxHeight, -_option.climbDownMinHeight, 0);
|
-_option.climbDownMaxHeight,
|
||||||
|
-_option.climbDownMinHeight,
|
||||||
|
0
|
||||||
|
);
|
||||||
_links.AddRange(_annotationBuilder.Build(config, JumpLinkType.EDGE_CLIMB_DOWN));
|
_links.AddRange(_annotationBuilder.Build(config, JumpLinkType.EDGE_CLIMB_DOWN));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((_option.buildTypes & JumpLinkType.EDGE_JUMP.Bit) != 0)
|
if ((_option.buildTypes & JumpLinkType.EDGE_JUMP.Bit) != 0)
|
||||||
{
|
{
|
||||||
JumpLinkBuilderConfig config = new JumpLinkBuilderConfig(cellSize, cellHeight, agentRadius,
|
JumpLinkBuilderConfig config = new JumpLinkBuilderConfig(
|
||||||
agentHeight, agentClimb, _option.groundTolerance, -agentRadius * 0.2f,
|
cellSize,
|
||||||
_option.edgeJumpEndDistance, -_option.edgeJumpDownMaxHeight,
|
cellHeight,
|
||||||
_option.edgeJumpUpMaxHeight, _option.edgeJumpHeight);
|
agentRadius,
|
||||||
|
agentHeight,
|
||||||
|
agentClimb,
|
||||||
|
_option.groundTolerance,
|
||||||
|
-agentRadius * 0.2f,
|
||||||
|
_option.edgeJumpEndDistance,
|
||||||
|
-_option.edgeJumpDownMaxHeight,
|
||||||
|
_option.edgeJumpUpMaxHeight,
|
||||||
|
_option.edgeJumpHeight
|
||||||
|
);
|
||||||
_links.AddRange(_annotationBuilder.Build(config, JumpLinkType.EDGE_JUMP));
|
_links.AddRange(_annotationBuilder.Build(config, JumpLinkType.EDGE_JUMP));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,12 +2,20 @@
|
||||||
{
|
{
|
||||||
public class TestNavmeshToolImpl : ISampleTool
|
public class TestNavmeshToolImpl : ISampleTool
|
||||||
{
|
{
|
||||||
|
private Sample _sample;
|
||||||
|
private readonly TestNavmeshToolOption _option;
|
||||||
|
|
||||||
|
public TestNavmeshToolImpl()
|
||||||
|
{
|
||||||
|
_option = new TestNavmeshToolOption();
|
||||||
|
}
|
||||||
|
|
||||||
public string GetName()
|
public string GetName()
|
||||||
{
|
{
|
||||||
return "Test Navmesh";
|
return "Test Navmesh";
|
||||||
}
|
}
|
||||||
|
|
||||||
private Sample _sample;
|
|
||||||
public void SetSample(Sample sample)
|
public void SetSample(Sample sample)
|
||||||
{
|
{
|
||||||
_sample = sample;
|
_sample = sample;
|
||||||
|
@ -18,5 +26,9 @@
|
||||||
return _sample;
|
return _sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TestNavmeshToolOption GetOption()
|
||||||
|
{
|
||||||
|
return _option;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
using DotRecast.Recast.DemoTool.Builder;
|
||||||
|
|
||||||
|
namespace DotRecast.Recast.DemoTool.Tools
|
||||||
|
{
|
||||||
|
public class TestNavmeshToolOption
|
||||||
|
{
|
||||||
|
public int modeIdx = TestNavmeshToolMode.PATHFIND_FOLLOW.Idx;
|
||||||
|
public TestNavmeshToolMode mode => TestNavmeshToolMode.Values[modeIdx];
|
||||||
|
|
||||||
|
public int straightPathOptions;
|
||||||
|
public bool constrainByCircle;
|
||||||
|
|
||||||
|
public int includeFlags = SampleAreaModifications.SAMPLE_POLYFLAGS_ALL;
|
||||||
|
public int excludeFlags = 0;
|
||||||
|
|
||||||
|
public bool enableRaycast = true;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue