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 readonly OffMeshConnectionToolImpl _impl;
|
||||||
private bool hitPosSet;
|
private bool hitPosSet;
|
||||||
private RcVec3f hitPos;
|
private RcVec3f hitPos;
|
||||||
private int bidir;
|
|
||||||
|
|
||||||
public OffMeshConnectionTool()
|
public OffMeshConnectionTool()
|
||||||
{
|
{
|
||||||
|
@ -46,7 +45,7 @@ public class OffMeshConnectionTool : IRcTool
|
||||||
{
|
{
|
||||||
return _impl;
|
return _impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnSampleChanged()
|
public void OnSampleChanged()
|
||||||
{
|
{
|
||||||
// ..
|
// ..
|
||||||
|
@ -62,24 +61,7 @@ public class OffMeshConnectionTool : IRcTool
|
||||||
|
|
||||||
if (shift)
|
if (shift)
|
||||||
{
|
{
|
||||||
// Delete
|
_impl.Remove(p);
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -91,9 +73,7 @@ public class OffMeshConnectionTool : IRcTool
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int area = SampleAreaModifications.SAMPLE_POLYAREA_TYPE_JUMP;
|
_impl.Add(hitPos, p);
|
||||||
int flags = SampleAreaModifications.SAMPLE_POLYFLAGS_JUMP;
|
|
||||||
geom.AddOffMeshConnection(hitPos, p, _impl.GetSample().GetSettings().agentRadius, 0 == bidir, area, flags);
|
|
||||||
hitPosSet = false;
|
hitPosSet = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,8 +103,9 @@ public class OffMeshConnectionTool : IRcTool
|
||||||
|
|
||||||
public void Layout()
|
public void Layout()
|
||||||
{
|
{
|
||||||
ImGui.RadioButton("One Way", ref bidir, 0);
|
var options = _impl.GetOptions();
|
||||||
ImGui.RadioButton("Bidirectional", ref bidir, 1);
|
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
|
public class OffMeshConnectionToolImpl : ISampleTool
|
||||||
{
|
{
|
||||||
private Sample _sample;
|
private Sample _sample;
|
||||||
|
private readonly OffMeshConnectionToolOptions _options;
|
||||||
|
|
||||||
|
public OffMeshConnectionToolImpl()
|
||||||
|
{
|
||||||
|
_options = new OffMeshConnectionToolOptions();
|
||||||
|
}
|
||||||
|
|
||||||
public string GetName()
|
public string GetName()
|
||||||
{
|
{
|
||||||
return "Create Off-Mesh Links";
|
return "Create Off-Mesh Links";
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetSample(Sample sample)
|
public void SetSample(Sample sample)
|
||||||
{
|
{
|
||||||
_sample = sample;
|
_sample = sample;
|
||||||
|
@ -19,5 +30,47 @@
|
||||||
return _sample;
|
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