diff --git a/src/DotRecast.Recast.Demo/Tools/ConvexVolumeSampleTool.cs b/src/DotRecast.Recast.Demo/Tools/ConvexVolumeSampleTool.cs index 1777b6f..9dbbc7b 100644 --- a/src/DotRecast.Recast.Demo/Tools/ConvexVolumeSampleTool.cs +++ b/src/DotRecast.Recast.Demo/Tools/ConvexVolumeSampleTool.cs @@ -19,13 +19,10 @@ freely, subject to the following restrictions: */ using System; -using System.Collections.Generic; using DotRecast.Core; using DotRecast.Recast.Toolset.Builder; using DotRecast.Recast.Demo.Draw; -using DotRecast.Recast.Geom; using DotRecast.Recast.Toolset; -using DotRecast.Recast.Toolset.Geom; using DotRecast.Recast.Toolset.Tools; using ImGuiNET; using Serilog; @@ -41,13 +38,13 @@ public class ConvexVolumeSampleTool : ISampleTool private DemoSample _sample; private readonly RcConvexVolumeTool _tool; - private int areaTypeValue = SampleAreaModifications.SAMPLE_AREAMOD_GRASS.Value; - private RcAreaModification areaType = SampleAreaModifications.SAMPLE_AREAMOD_GRASS; - private float boxHeight = 6f; - private float boxDescent = 1f; - private float polyOffset = 0f; - private readonly List pts = new(); - private readonly List hull = new(); + private float _boxHeight = 6f; + private float _boxDescent = 1f; + private float _polyOffset = 0f; + + private int _areaTypeValue = SampleAreaModifications.SAMPLE_AREAMOD_GRASS.Value; + private RcAreaModification _areaType = SampleAreaModifications.SAMPLE_AREAMOD_GRASS; + public ConvexVolumeSampleTool() { @@ -56,37 +53,36 @@ public class ConvexVolumeSampleTool : ISampleTool public void Layout() { - ImGui.SliderFloat("Shape Height", ref boxHeight, 0.1f, 20f, "%.1f"); - ImGui.SliderFloat("Shape Descent", ref boxDescent, 0.1f, 20f, "%.1f"); - ImGui.SliderFloat("Poly Offset", ref polyOffset, 0.1f, 10f, "%.1f"); + ImGui.SliderFloat("Shape Height", ref _boxHeight, 0.1f, 20f, "%.1f"); + ImGui.SliderFloat("Shape Descent", ref _boxDescent, 0.1f, 20f, "%.1f"); + ImGui.SliderFloat("Poly Offset", ref _polyOffset, 0.1f, 10f, "%.1f"); ImGui.NewLine(); + int prevAreaTypeValue = _areaTypeValue; + ImGui.Text("Area Type"); ImGui.Separator(); - int prevAreaTypeValue = areaTypeValue; - ImGui.RadioButton("Ground", ref areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_GROUND.Value); - ImGui.RadioButton("Water", ref areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_WATER.Value); - ImGui.RadioButton("Road", ref areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_ROAD.Value); - ImGui.RadioButton("Door", ref areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_DOOR.Value); - ImGui.RadioButton("Grass", ref areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_GRASS.Value); - ImGui.RadioButton("Jump", ref areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_JUMP.Value); + ImGui.RadioButton("Ground", ref _areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_GROUND.Value); + ImGui.RadioButton("Water", ref _areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_WATER.Value); + ImGui.RadioButton("Road", ref _areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_ROAD.Value); + ImGui.RadioButton("Door", ref _areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_DOOR.Value); + ImGui.RadioButton("Grass", ref _areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_GRASS.Value); + ImGui.RadioButton("Jump", ref _areaTypeValue, SampleAreaModifications.SAMPLE_AREAMOD_JUMP.Value); ImGui.NewLine(); - if (prevAreaTypeValue != areaTypeValue) + if (prevAreaTypeValue != _areaTypeValue) { - areaType = SampleAreaModifications.OfValue(areaTypeValue); + _areaType = SampleAreaModifications.OfValue(_areaTypeValue); } if (ImGui.Button("Clear Shape")) { - hull.Clear(); - pts.Clear(); + _tool.ClearShape(); } if (ImGui.Button("Remove All")) { - hull.Clear(); - pts.Clear(); + _tool.ClearShape(); var geom = _sample.GetInputGeom(); if (geom != null) @@ -99,6 +95,10 @@ public class ConvexVolumeSampleTool : ISampleTool public void HandleRender(NavMeshRenderer renderer) { RecastDebugDraw dd = renderer.GetDebugDraw(); + + var pts = _tool.GetShapePoint(); + var hull = _tool.GetShapeHull(); + // Find height extent of the shape. float minh = float.MaxValue, maxh = 0; for (int i = 0; i < pts.Count; ++i) @@ -106,8 +106,8 @@ public class ConvexVolumeSampleTool : ISampleTool minh = Math.Min(minh, pts[i].y); } - minh -= boxDescent; - maxh = minh + boxHeight; + minh -= _boxDescent; + maxh = minh + _boxHeight; dd.Begin(POINTS, 4.0f); for (int i = 0; i < pts.Count; ++i) @@ -158,44 +158,16 @@ public class ConvexVolumeSampleTool : ISampleTool public void HandleClick(RcVec3f s, RcVec3f p, bool shift) { var geom = _sample.GetInputGeom(); - var settings = _sample.GetSettings(); - var navMesh = _sample.GetNavMesh(); - if (shift) { _tool.RemoveByPos(geom, p); } else { - // Create - - // If clicked on that last pt, create the shape. - if (pts.Count > 0 && RcVec3f.DistSqr(p, pts[pts.Count - 1]) < 0.2f * 0.2f) + if (_tool.PlottingShape(p, out var pts, out var hull)) { - var vol = RcConvexVolumeTool.CreateConvexVolume(pts, hull, areaType, boxDescent, boxHeight, polyOffset); - if (null != vol) - { - _tool.Add(geom, vol); - } - - pts.Clear(); - hull.Clear(); - } - else - { - // Add new point - pts.Add(p); - - // Update hull. - if (pts.Count > 3) - { - hull.Clear(); - hull.AddRange(RcConvexUtils.Convexhull(pts)); - } - else - { - hull.Clear(); - } + var vol = RcConvexVolumeTool.CreateConvexVolume(pts, hull, _areaType, _boxDescent, _boxHeight, _polyOffset); + _tool.Add(geom, vol); } } } diff --git a/src/DotRecast.Recast.Toolset/Tools/RcConvexVolumeTool.cs b/src/DotRecast.Recast.Toolset/Tools/RcConvexVolumeTool.cs index 7a2f8e7..74c9987 100644 --- a/src/DotRecast.Recast.Toolset/Tools/RcConvexVolumeTool.cs +++ b/src/DotRecast.Recast.Toolset/Tools/RcConvexVolumeTool.cs @@ -7,11 +7,72 @@ namespace DotRecast.Recast.Toolset.Tools { public class RcConvexVolumeTool : IRcToolable { + private readonly List _pts; + private readonly List _hull; + + public RcConvexVolumeTool() + { + _pts = new List(); + _hull = new List(); + } + public string GetName() { return "Convex Volumes"; } + public List GetShapePoint() + { + return _pts; + } + + public List GetShapeHull() + { + return _hull; + } + + public void ClearShape() + { + _pts.Clear(); + _hull.Clear(); + } + + public bool PlottingShape(RcVec3f p, out List pts, out List hull) + { + pts = null; + hull = null; + + // Create + // If clicked on that last pt, create the shape. + if (_pts.Count > 0 && RcVec3f.DistSqr(p, _pts[_pts.Count - 1]) < 0.2f * 0.2f) + { + pts = new List(_pts); + hull = new List(_hull); + + _pts.Clear(); + _hull.Clear(); + + return true; + } + + // Add new point + _pts.Add(p); + + // Update hull. + if (_pts.Count > 3) + { + _hull.Clear(); + _hull.AddRange(RcConvexUtils.Convexhull(_pts)); + } + else + { + _hull.Clear(); + } + + return false; + } + + public RcConvexVolume RemoveByPos(IInputGeomProvider geom, RcVec3f pos) { // Delete