forked from mirror/DotRecast
fix: bidir
This commit is contained in:
parent
4f3804ae3d
commit
4f3580d3f4
|
@ -33,13 +33,23 @@ public class JumpLinkBuilderSampleTool : ISampleTool
|
||||||
private static readonly ILogger Logger = Log.ForContext<JumpLinkBuilderSampleTool>();
|
private static readonly ILogger Logger = Log.ForContext<JumpLinkBuilderSampleTool>();
|
||||||
private DemoSample _sample;
|
private DemoSample _sample;
|
||||||
|
|
||||||
|
public const int DRAW_WALKABLE_SURFACE = 1 << 0;
|
||||||
|
public const int DRAW_WALKABLE_BORDER = 1 << 1;
|
||||||
|
public const int DRAW_SELECTED_EDGE = 1 << 2;
|
||||||
|
public const int DRAW_ANIM_TRAJECTORY = 1 << 3;
|
||||||
|
public const int DRAW_LAND_SAMPLES = 1 << 4;
|
||||||
|
public const int DRAW_COLLISION_SLICES = 1 << 5;
|
||||||
|
public const int DRAW_ANNOTATIONS = 1 << 6;
|
||||||
|
|
||||||
|
private int _drawFlags = DRAW_WALKABLE_SURFACE | DRAW_WALKABLE_BORDER | DRAW_SELECTED_EDGE | DRAW_ANIM_TRAJECTORY | DRAW_LAND_SAMPLES | DRAW_ANNOTATIONS;
|
||||||
|
|
||||||
private readonly RcJumpLinkBuilderTool _tool;
|
private readonly RcJumpLinkBuilderTool _tool;
|
||||||
private readonly RcJumpLinkBuilderToolOption _option;
|
private readonly RcJumpLinkBuilderToolConfig _cfg;
|
||||||
|
|
||||||
public JumpLinkBuilderSampleTool()
|
public JumpLinkBuilderSampleTool()
|
||||||
{
|
{
|
||||||
_tool = new();
|
_tool = new();
|
||||||
_option = new();
|
_cfg = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Layout()
|
public void Layout()
|
||||||
|
@ -49,32 +59,33 @@ public class JumpLinkBuilderSampleTool : ISampleTool
|
||||||
|
|
||||||
ImGui.Text("Options");
|
ImGui.Text("Options");
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.SliderFloat("Ground Tolerance", ref _option.groundTolerance, 0f, 2f, "%.2f");
|
ImGui.SliderFloat("Ground Tolerance", ref _cfg.groundTolerance, 0f, 2f, "%.2f");
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
|
|
||||||
ImGui.Text("Climb Down");
|
ImGui.Text("Climb Down");
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.SliderFloat("Distance", ref _option.climbDownDistance, 0f, 5f, "%.2f");
|
ImGui.SliderFloat("Distance", ref _cfg.climbDownDistance, 0f, 5f, "%.2f");
|
||||||
ImGui.SliderFloat("Min Cliff Height", ref _option.climbDownMinHeight, 0f, 10f, "%.2f");
|
ImGui.SliderFloat("Min Cliff Height", ref _cfg.climbDownMinHeight, 0f, 10f, "%.2f");
|
||||||
ImGui.SliderFloat("Max Cliff Height", ref _option.climbDownMaxHeight, 0f, 10f, "%.2f");
|
ImGui.SliderFloat("Max Cliff Height", ref _cfg.climbDownMaxHeight, 0f, 10f, "%.2f");
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
|
|
||||||
ImGui.Text("Jump Down");
|
ImGui.Text("Jump Down");
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
ImGui.SliderFloat("Max Distance", ref _option.edgeJumpEndDistance, 0f, 10f, "%.2f");
|
ImGui.SliderFloat("Max Distance", ref _cfg.edgeJumpEndDistance, 0f, 10f, "%.2f");
|
||||||
ImGui.SliderFloat("Jump Height", ref _option.edgeJumpHeight, 0f, 10f, "%.2f");
|
ImGui.SliderFloat("Jump Height", ref _cfg.edgeJumpHeight, 0f, 10f, "%.2f");
|
||||||
ImGui.SliderFloat("Max Jump Down", ref _option.edgeJumpDownMaxHeight, 0f, 10f, "%.2f");
|
ImGui.SliderFloat("Max Jump Down", ref _cfg.edgeJumpDownMaxHeight, 0f, 10f, "%.2f");
|
||||||
ImGui.SliderFloat("Max Jump Up", ref _option.edgeJumpUpMaxHeight, 0f, 10f, "%.2f");
|
ImGui.SliderFloat("Max Jump Up", ref _cfg.edgeJumpUpMaxHeight, 0f, 10f, "%.2f");
|
||||||
ImGui.NewLine();
|
ImGui.NewLine();
|
||||||
|
|
||||||
ImGui.Text("Mode");
|
ImGui.Text("Mode");
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
//int buildTypes = 0;
|
//int buildTypes = 0;
|
||||||
ImGui.CheckboxFlags("Climb Down", ref _option.buildTypes, JumpLinkType.EDGE_CLIMB_DOWN.Bit);
|
ImGui.CheckboxFlags("Climb Down", ref _cfg.buildTypes, JumpLinkType.EDGE_CLIMB_DOWN.Bit);
|
||||||
ImGui.CheckboxFlags("Edge Jump", ref _option.buildTypes, JumpLinkType.EDGE_JUMP.Bit);
|
ImGui.CheckboxFlags("Edge Jump", ref _cfg.buildTypes, JumpLinkType.EDGE_JUMP.Bit);
|
||||||
//option.buildTypes = buildTypes;
|
//option.buildTypes = buildTypes;
|
||||||
|
|
||||||
bool build = false;
|
bool build = false;
|
||||||
bool buildOffMeshConnections = false;
|
_cfg.buildOffMeshConnections = false;
|
||||||
if (ImGui.Button("Build Jump Link"))
|
if (ImGui.Button("Build Jump Link"))
|
||||||
{
|
{
|
||||||
build = true;
|
build = true;
|
||||||
|
@ -82,37 +93,25 @@ public class JumpLinkBuilderSampleTool : ISampleTool
|
||||||
|
|
||||||
if (ImGui.Button("Build Off-Mesh Links"))
|
if (ImGui.Button("Build Off-Mesh Links"))
|
||||||
{
|
{
|
||||||
buildOffMeshConnections = true;
|
_cfg.buildOffMeshConnections = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (build || buildOffMeshConnections)
|
if (build || _cfg.buildOffMeshConnections)
|
||||||
{
|
{
|
||||||
var geom = _sample.GetInputGeom();
|
var geom = _sample.GetInputGeom();
|
||||||
var settings = _sample.GetSettings();
|
var settings = _sample.GetSettings();
|
||||||
|
|
||||||
_tool.Build(
|
_tool.Build(geom, settings, _sample.GetRecastResults(), _cfg);
|
||||||
geom, settings, _sample.GetRecastResults(),
|
|
||||||
buildOffMeshConnections,
|
|
||||||
_option.buildTypes,
|
|
||||||
_option.groundTolerance,
|
|
||||||
_option.climbDownDistance,
|
|
||||||
_option.climbDownMaxHeight,
|
|
||||||
_option.climbDownMinHeight,
|
|
||||||
_option.edgeJumpEndDistance,
|
|
||||||
_option.edgeJumpHeight,
|
|
||||||
_option.edgeJumpDownMaxHeight,
|
|
||||||
_option.edgeJumpUpMaxHeight
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.Text("Debug Draw Options");
|
ImGui.Text("Debug Draw Options");
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
//int newFlags = 0;
|
//int newFlags = 0;
|
||||||
ImGui.CheckboxFlags("Walkable Border", ref _option.flags, RcJumpLinkBuilderToolOption.DRAW_WALKABLE_BORDER);
|
ImGui.CheckboxFlags("Walkable Border", ref _drawFlags, DRAW_WALKABLE_BORDER);
|
||||||
ImGui.CheckboxFlags("Selected Edge", ref _option.flags, RcJumpLinkBuilderToolOption.DRAW_SELECTED_EDGE);
|
ImGui.CheckboxFlags("Selected Edge", ref _drawFlags, DRAW_SELECTED_EDGE);
|
||||||
ImGui.CheckboxFlags("Anim Trajectory", ref _option.flags, RcJumpLinkBuilderToolOption.DRAW_ANIM_TRAJECTORY);
|
ImGui.CheckboxFlags("Anim Trajectory", ref _drawFlags, DRAW_ANIM_TRAJECTORY);
|
||||||
ImGui.CheckboxFlags("Land Samples", ref _option.flags, RcJumpLinkBuilderToolOption.DRAW_LAND_SAMPLES);
|
ImGui.CheckboxFlags("Land Samples", ref _drawFlags, DRAW_LAND_SAMPLES);
|
||||||
ImGui.CheckboxFlags("All Annotations", ref _option.flags, RcJumpLinkBuilderToolOption.DRAW_ANNOTATIONS);
|
ImGui.CheckboxFlags("All Annotations", ref _drawFlags, DRAW_ANNOTATIONS);
|
||||||
//option.flags = newFlags;
|
//option.flags = newFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +124,7 @@ public class JumpLinkBuilderSampleTool : ISampleTool
|
||||||
|
|
||||||
var annotationBuilder = _tool.GetAnnotationBuilder();
|
var annotationBuilder = _tool.GetAnnotationBuilder();
|
||||||
|
|
||||||
if ((_option.flags & RcJumpLinkBuilderToolOption.DRAW_WALKABLE_BORDER) != 0)
|
if ((_drawFlags & DRAW_WALKABLE_BORDER) != 0)
|
||||||
{
|
{
|
||||||
if (annotationBuilder != null)
|
if (annotationBuilder != null)
|
||||||
{
|
{
|
||||||
|
@ -183,7 +182,7 @@ public class JumpLinkBuilderSampleTool : ISampleTool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((_option.flags & RcJumpLinkBuilderToolOption.DRAW_ANNOTATIONS) != 0)
|
if ((_drawFlags & DRAW_ANNOTATIONS) != 0)
|
||||||
{
|
{
|
||||||
dd.Begin(QUADS);
|
dd.Begin(QUADS);
|
||||||
foreach (JumpLink link in _tool.GetLinks())
|
foreach (JumpLink link in _tool.GetLinks())
|
||||||
|
@ -228,7 +227,7 @@ public class JumpLinkBuilderSampleTool : ISampleTool
|
||||||
{
|
{
|
||||||
foreach (JumpLink link in _tool.GetLinks())
|
foreach (JumpLink link in _tool.GetLinks())
|
||||||
{
|
{
|
||||||
if ((_option.flags & RcJumpLinkBuilderToolOption.DRAW_ANIM_TRAJECTORY) != 0)
|
if ((_drawFlags & DRAW_ANIM_TRAJECTORY) != 0)
|
||||||
{
|
{
|
||||||
float r = link.start.height;
|
float r = link.start.height;
|
||||||
|
|
||||||
|
@ -293,7 +292,7 @@ public class JumpLinkBuilderSampleTool : ISampleTool
|
||||||
dd.End();
|
dd.End();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((_option.flags & RcJumpLinkBuilderToolOption.DRAW_LAND_SAMPLES) != 0)
|
if ((_drawFlags & DRAW_LAND_SAMPLES) != 0)
|
||||||
{
|
{
|
||||||
dd.Begin(POINTS, 8.0f);
|
dd.Begin(POINTS, 8.0f);
|
||||||
for (int i = 0; i < link.start.gsamples.Length; ++i)
|
for (int i = 0; i < link.start.gsamples.Length; ++i)
|
||||||
|
|
|
@ -37,6 +37,8 @@ public class OffMeshConnectionSampleTool : ISampleTool
|
||||||
private DemoSample _sample;
|
private DemoSample _sample;
|
||||||
|
|
||||||
private readonly RcOffMeshConnectionTool _tool;
|
private readonly RcOffMeshConnectionTool _tool;
|
||||||
|
|
||||||
|
public int bidir;
|
||||||
private bool hitPosSet;
|
private bool hitPosSet;
|
||||||
private RcVec3f hitPos;
|
private RcVec3f hitPos;
|
||||||
|
|
||||||
|
@ -47,9 +49,8 @@ public class OffMeshConnectionSampleTool : ISampleTool
|
||||||
|
|
||||||
public void Layout()
|
public void Layout()
|
||||||
{
|
{
|
||||||
var options = _tool.GetOption();
|
ImGui.RadioButton("One Way", ref bidir, 0);
|
||||||
ImGui.RadioButton("One Way", ref options.bidir, 0);
|
ImGui.RadioButton("Bidirectional", ref bidir, 1);
|
||||||
ImGui.RadioButton("Bidirectional", ref options.bidir, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void HandleRender(NavMeshRenderer renderer)
|
public void HandleRender(NavMeshRenderer renderer)
|
||||||
|
@ -111,7 +112,7 @@ public class OffMeshConnectionSampleTool : ISampleTool
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_tool.Add(geom, settings, hitPos, p);
|
_tool.Add(geom, settings, hitPos, p, 1 == bidir);
|
||||||
hitPosSet = false;
|
hitPosSet = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,10 +44,7 @@ namespace DotRecast.Recast.Toolset.Tools
|
||||||
return _links;
|
return _links;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Build(IInputGeomProvider geom, RcNavMeshBuildSettings settings, IList<RecastBuilderResult> results,
|
public void Build(IInputGeomProvider geom, RcNavMeshBuildSettings settings, IList<RecastBuilderResult> results, RcJumpLinkBuilderToolConfig cfg)
|
||||||
bool buildOffMeshConnections, int buildTypes,
|
|
||||||
float groundTolerance, float climbDownDistance, float climbDownMaxHeight, float climbDownMinHeight,
|
|
||||||
float edgeJumpEndDistance, float edgeJumpHeight, float edgeJumpDownMaxHeight, float edgeJumpUpMaxHeight)
|
|
||||||
{
|
{
|
||||||
if (_annotationBuilder == null)
|
if (_annotationBuilder == null)
|
||||||
{
|
{
|
||||||
|
@ -66,7 +63,7 @@ namespace DotRecast.Recast.Toolset.Tools
|
||||||
float agentClimb = settings.agentMaxClimb;
|
float agentClimb = settings.agentMaxClimb;
|
||||||
float cellHeight = settings.cellHeight;
|
float cellHeight = settings.cellHeight;
|
||||||
|
|
||||||
if ((buildTypes & JumpLinkType.EDGE_CLIMB_DOWN.Bit) != 0)
|
if ((cfg.buildTypes & JumpLinkType.EDGE_CLIMB_DOWN.Bit) != 0)
|
||||||
{
|
{
|
||||||
JumpLinkBuilderConfig config = new JumpLinkBuilderConfig(
|
JumpLinkBuilderConfig config = new JumpLinkBuilderConfig(
|
||||||
cellSize,
|
cellSize,
|
||||||
|
@ -74,17 +71,17 @@ namespace DotRecast.Recast.Toolset.Tools
|
||||||
agentRadius,
|
agentRadius,
|
||||||
agentHeight,
|
agentHeight,
|
||||||
agentClimb,
|
agentClimb,
|
||||||
groundTolerance,
|
cfg.groundTolerance,
|
||||||
-agentRadius * 0.2f,
|
-agentRadius * 0.2f,
|
||||||
cellSize + 2 * agentRadius + climbDownDistance,
|
cellSize + 2 * agentRadius + cfg.climbDownDistance,
|
||||||
-climbDownMaxHeight,
|
-cfg.climbDownMaxHeight,
|
||||||
-climbDownMinHeight,
|
-cfg.climbDownMinHeight,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
_links.AddRange(_annotationBuilder.Build(config, JumpLinkType.EDGE_CLIMB_DOWN));
|
_links.AddRange(_annotationBuilder.Build(config, JumpLinkType.EDGE_CLIMB_DOWN));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((buildTypes & JumpLinkType.EDGE_JUMP.Bit) != 0)
|
if ((cfg.buildTypes & JumpLinkType.EDGE_JUMP.Bit) != 0)
|
||||||
{
|
{
|
||||||
JumpLinkBuilderConfig config = new JumpLinkBuilderConfig(
|
JumpLinkBuilderConfig config = new JumpLinkBuilderConfig(
|
||||||
cellSize,
|
cellSize,
|
||||||
|
@ -92,17 +89,17 @@ namespace DotRecast.Recast.Toolset.Tools
|
||||||
agentRadius,
|
agentRadius,
|
||||||
agentHeight,
|
agentHeight,
|
||||||
agentClimb,
|
agentClimb,
|
||||||
groundTolerance,
|
cfg.groundTolerance,
|
||||||
-agentRadius * 0.2f,
|
-agentRadius * 0.2f,
|
||||||
edgeJumpEndDistance,
|
cfg.edgeJumpEndDistance,
|
||||||
-edgeJumpDownMaxHeight,
|
-cfg.edgeJumpDownMaxHeight,
|
||||||
edgeJumpUpMaxHeight,
|
cfg.edgeJumpUpMaxHeight,
|
||||||
edgeJumpHeight
|
cfg.edgeJumpHeight
|
||||||
);
|
);
|
||||||
_links.AddRange(_annotationBuilder.Build(config, JumpLinkType.EDGE_JUMP));
|
_links.AddRange(_annotationBuilder.Build(config, JumpLinkType.EDGE_JUMP));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buildOffMeshConnections)
|
if (cfg.buildOffMeshConnections)
|
||||||
{
|
{
|
||||||
int area = SampleAreaModifications.SAMPLE_POLYAREA_TYPE_JUMP_AUTO;
|
int area = SampleAreaModifications.SAMPLE_POLYAREA_TYPE_JUMP_AUTO;
|
||||||
geom.RemoveOffMeshConnections(c => c.area == area);
|
geom.RemoveOffMeshConnections(c => c.area == area);
|
||||||
|
|
|
@ -20,17 +20,11 @@ using DotRecast.Detour.Extras.Jumplink;
|
||||||
|
|
||||||
namespace DotRecast.Recast.Toolset.Tools
|
namespace DotRecast.Recast.Toolset.Tools
|
||||||
{
|
{
|
||||||
public class RcJumpLinkBuilderToolOption
|
public class RcJumpLinkBuilderToolConfig
|
||||||
{
|
{
|
||||||
public const int DRAW_WALKABLE_SURFACE = 1 << 0;
|
public int buildTypes = JumpLinkType.EDGE_CLIMB_DOWN.Bit | JumpLinkType.EDGE_JUMP.Bit;
|
||||||
public const int DRAW_WALKABLE_BORDER = 1 << 1;
|
public bool buildOffMeshConnections = false;
|
||||||
public const int DRAW_SELECTED_EDGE = 1 << 2;
|
|
||||||
public const int DRAW_ANIM_TRAJECTORY = 1 << 3;
|
|
||||||
public const int DRAW_LAND_SAMPLES = 1 << 4;
|
|
||||||
public const int DRAW_COLLISION_SLICES = 1 << 5;
|
|
||||||
public const int DRAW_ANNOTATIONS = 1 << 6;
|
|
||||||
|
|
||||||
public int flags = DRAW_WALKABLE_SURFACE | DRAW_WALKABLE_BORDER | DRAW_SELECTED_EDGE | DRAW_ANIM_TRAJECTORY | DRAW_LAND_SAMPLES | DRAW_ANNOTATIONS;
|
|
||||||
public float groundTolerance = 0.3f;
|
public float groundTolerance = 0.3f;
|
||||||
public float climbDownDistance = 0.4f;
|
public float climbDownDistance = 0.4f;
|
||||||
public float climbDownMaxHeight = 3.2f;
|
public float climbDownMaxHeight = 3.2f;
|
||||||
|
@ -39,6 +33,5 @@ namespace DotRecast.Recast.Toolset.Tools
|
||||||
public float edgeJumpHeight = 0.4f;
|
public float edgeJumpHeight = 0.4f;
|
||||||
public float edgeJumpDownMaxHeight = 2.5f;
|
public float edgeJumpDownMaxHeight = 2.5f;
|
||||||
public float edgeJumpUpMaxHeight = 0.3f;
|
public float edgeJumpUpMaxHeight = 0.3f;
|
||||||
public int buildTypes = JumpLinkType.EDGE_CLIMB_DOWN.Bit | JumpLinkType.EDGE_JUMP.Bit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -7,11 +7,8 @@ namespace DotRecast.Recast.Toolset.Tools
|
||||||
{
|
{
|
||||||
public class RcOffMeshConnectionTool : IRcToolable
|
public class RcOffMeshConnectionTool : IRcToolable
|
||||||
{
|
{
|
||||||
private readonly RcOffMeshConnectionToolOption _option;
|
|
||||||
|
|
||||||
public RcOffMeshConnectionTool()
|
public RcOffMeshConnectionTool()
|
||||||
{
|
{
|
||||||
_option = new RcOffMeshConnectionToolOption();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetName()
|
public string GetName()
|
||||||
|
@ -19,19 +16,14 @@ namespace DotRecast.Recast.Toolset.Tools
|
||||||
return "Off-Mesh Links";
|
return "Off-Mesh Links";
|
||||||
}
|
}
|
||||||
|
|
||||||
public RcOffMeshConnectionToolOption GetOption()
|
public void Add(IInputGeomProvider geom, RcNavMeshBuildSettings settings, RcVec3f start, RcVec3f end, bool bidir)
|
||||||
{
|
|
||||||
return _option;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Add(IInputGeomProvider geom, RcNavMeshBuildSettings settings, RcVec3f start, RcVec3f end)
|
|
||||||
{
|
{
|
||||||
if (null == geom)
|
if (null == geom)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int area = SampleAreaModifications.SAMPLE_POLYAREA_TYPE_JUMP;
|
int area = SampleAreaModifications.SAMPLE_POLYAREA_TYPE_JUMP;
|
||||||
int flags = SampleAreaModifications.SAMPLE_POLYFLAGS_JUMP;
|
int flags = SampleAreaModifications.SAMPLE_POLYFLAGS_JUMP;
|
||||||
geom.AddOffMeshConnection(start, end, settings.agentRadius, 0 == _option.bidir, area, flags);
|
geom.AddOffMeshConnection(start, end, settings.agentRadius, bidir, area, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Remove(IInputGeomProvider geom, RcNavMeshBuildSettings settings, RcVec3f p)
|
public void Remove(IInputGeomProvider geom, RcNavMeshBuildSettings settings, RcVec3f p)
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
namespace DotRecast.Recast.Toolset.Tools
|
|
||||||
{
|
|
||||||
public class RcOffMeshConnectionToolOption
|
|
||||||
{
|
|
||||||
public int bidir;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue