forked from mirror/DotRecast
OffMeshConnectionTool, impl
This commit is contained in:
parent
1cb7bbb7a1
commit
97c426966b
|
@ -35,7 +35,6 @@ public class OffMeshConnectionTool : IRcTool
|
|||
private readonly OffMeshConnectionToolImpl _impl;
|
||||
private bool hitPosSet;
|
||||
private RcVec3f hitPos;
|
||||
private int bidir;
|
||||
|
||||
public OffMeshConnectionTool()
|
||||
{
|
||||
|
@ -46,7 +45,7 @@ public class OffMeshConnectionTool : IRcTool
|
|||
{
|
||||
return _impl;
|
||||
}
|
||||
|
||||
|
||||
public void OnSampleChanged()
|
||||
{
|
||||
// ..
|
||||
|
@ -62,24 +61,7 @@ public class OffMeshConnectionTool : IRcTool
|
|||
|
||||
if (shift)
|
||||
{
|
||||
// Delete
|
||||
// Find nearest link end-point
|
||||
float nearestDist = float.MaxValue;
|
||||
DemoOffMeshConnection nearestConnection = null;
|
||||
foreach (DemoOffMeshConnection offMeshCon in geom.GetOffMeshConnections())
|
||||
{
|
||||
float d = Math.Min(RcVec3f.DistSqr(p, offMeshCon.verts, 0), RcVec3f.DistSqr(p, offMeshCon.verts, 3));
|
||||
if (d < nearestDist && Math.Sqrt(d) < _impl.GetSample().GetSettings().agentRadius)
|
||||
{
|
||||
nearestDist = d;
|
||||
nearestConnection = offMeshCon;
|
||||
}
|
||||
}
|
||||
|
||||
if (nearestConnection != null)
|
||||
{
|
||||
geom.GetOffMeshConnections().Remove(nearestConnection);
|
||||
}
|
||||
_impl.Remove(p);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -91,9 +73,7 @@ public class OffMeshConnectionTool : IRcTool
|
|||
}
|
||||
else
|
||||
{
|
||||
int area = SampleAreaModifications.SAMPLE_POLYAREA_TYPE_JUMP;
|
||||
int flags = SampleAreaModifications.SAMPLE_POLYFLAGS_JUMP;
|
||||
geom.AddOffMeshConnection(hitPos, p, _impl.GetSample().GetSettings().agentRadius, 0 == bidir, area, flags);
|
||||
_impl.Add(hitPos, p);
|
||||
hitPosSet = false;
|
||||
}
|
||||
}
|
||||
|
@ -123,8 +103,9 @@ public class OffMeshConnectionTool : IRcTool
|
|||
|
||||
public void Layout()
|
||||
{
|
||||
ImGui.RadioButton("One Way", ref bidir, 0);
|
||||
ImGui.RadioButton("Bidirectional", ref bidir, 1);
|
||||
var options = _impl.GetOptions();
|
||||
ImGui.RadioButton("One Way", ref options.bidir, 0);
|
||||
ImGui.RadioButton("Bidirectional", ref options.bidir, 1);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,14 +1,25 @@
|
|||
namespace DotRecast.Recast.DemoTool.Tools
|
||||
using System;
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Recast.DemoTool.Builder;
|
||||
using DotRecast.Recast.DemoTool.Geom;
|
||||
|
||||
namespace DotRecast.Recast.DemoTool.Tools
|
||||
{
|
||||
public class OffMeshConnectionToolImpl : ISampleTool
|
||||
{
|
||||
private Sample _sample;
|
||||
|
||||
private readonly OffMeshConnectionToolOptions _options;
|
||||
|
||||
public OffMeshConnectionToolImpl()
|
||||
{
|
||||
_options = new OffMeshConnectionToolOptions();
|
||||
}
|
||||
|
||||
public string GetName()
|
||||
{
|
||||
return "Create Off-Mesh Links";
|
||||
}
|
||||
|
||||
|
||||
public void SetSample(Sample sample)
|
||||
{
|
||||
_sample = sample;
|
||||
|
@ -19,5 +30,47 @@
|
|||
return _sample;
|
||||
}
|
||||
|
||||
|
||||
public OffMeshConnectionToolOptions GetOptions()
|
||||
{
|
||||
return _options;
|
||||
}
|
||||
|
||||
public void Add(RcVec3f start, RcVec3f end)
|
||||
{
|
||||
DemoInputGeomProvider geom = _sample.GetInputGeom();
|
||||
if (null == geom)
|
||||
return;
|
||||
|
||||
int area = SampleAreaModifications.SAMPLE_POLYAREA_TYPE_JUMP;
|
||||
int flags = SampleAreaModifications.SAMPLE_POLYFLAGS_JUMP;
|
||||
geom.AddOffMeshConnection(start, end, _sample.GetSettings().agentRadius, 0 == _options.bidir, area, flags);
|
||||
}
|
||||
|
||||
public void Remove(RcVec3f p)
|
||||
{
|
||||
DemoInputGeomProvider geom = _sample.GetInputGeom();
|
||||
if (null == geom)
|
||||
return;
|
||||
|
||||
// Delete
|
||||
// Find nearest link end-point
|
||||
float nearestDist = float.MaxValue;
|
||||
DemoOffMeshConnection nearestConnection = null;
|
||||
foreach (DemoOffMeshConnection offMeshCon in geom.GetOffMeshConnections())
|
||||
{
|
||||
float d = Math.Min(RcVec3f.DistSqr(p, offMeshCon.verts, 0), RcVec3f.DistSqr(p, offMeshCon.verts, 3));
|
||||
if (d < nearestDist && Math.Sqrt(d) < _sample.GetSettings().agentRadius)
|
||||
{
|
||||
nearestDist = d;
|
||||
nearestConnection = offMeshCon;
|
||||
}
|
||||
}
|
||||
|
||||
if (nearestConnection != null)
|
||||
{
|
||||
geom.GetOffMeshConnections().Remove(nearestConnection);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
namespace DotRecast.Recast.DemoTool.Tools
|
||||
{
|
||||
public class OffMeshConnectionToolOptions
|
||||
{
|
||||
public int bidir;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue