forked from mirror/DotRecast
add RemoveAllTiles, BuildAllTiles
This commit is contained in:
parent
60850b0cbf
commit
2553e40ad3
|
@ -35,14 +35,12 @@ public class TileTool : IRcTool
|
||||||
{
|
{
|
||||||
if (ImGui.Button("Create All Tile"))
|
if (ImGui.Button("Create All Tile"))
|
||||||
{
|
{
|
||||||
// if (m_sample)
|
_impl.BuildAllTiles();
|
||||||
// m_sample->buildAllTiles();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui.Button("Remove All Tile"))
|
if (ImGui.Button("Remove All Tile"))
|
||||||
{
|
{
|
||||||
// if (m_sample)
|
_impl.RemoveAllTiles();
|
||||||
// m_sample->removeAllTiles();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
using System.Collections.Generic;
|
using System.Linq;
|
||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using System.Linq;
|
|
||||||
using DotRecast.Core;
|
using DotRecast.Core;
|
||||||
using DotRecast.Detour.TileCache;
|
|
||||||
using DotRecast.Recast.DemoTool.Builder;
|
using DotRecast.Recast.DemoTool.Builder;
|
||||||
|
|
||||||
namespace DotRecast.Recast.DemoTool.Tools
|
namespace DotRecast.Recast.DemoTool.Tools
|
||||||
|
@ -26,27 +24,74 @@ namespace DotRecast.Recast.DemoTool.Tools
|
||||||
return _sample;
|
return _sample;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool BuildTile(RcVec3f pos, out long tileBuildTicks, out int tileTriCount, out int tileMemUsage)
|
public void RemoveAllTiles()
|
||||||
{
|
{
|
||||||
var settings = _sample.GetSettings();
|
var settings = _sample.GetSettings();
|
||||||
var geom = _sample.GetInputGeom();
|
var geom = _sample.GetInputGeom();
|
||||||
var navMesh = _sample.GetNavMesh();
|
var navMesh = _sample.GetNavMesh();
|
||||||
|
|
||||||
tileBuildTicks = 0;
|
if (null == settings || null == geom || navMesh == null)
|
||||||
tileTriCount = 0;
|
return;
|
||||||
tileMemUsage = 0;
|
|
||||||
|
var bmin = geom.GetMeshBoundsMin();
|
||||||
|
var bmax = geom.GetMeshBoundsMax();
|
||||||
|
int gw = 0, gh = 0;
|
||||||
|
Recast.CalcGridSize(bmin, bmax, settings.cellSize, out gw, out gh);
|
||||||
|
|
||||||
|
int ts = settings.tileSize;
|
||||||
|
int tw = (gw + ts - 1) / ts;
|
||||||
|
int th = (gh + ts - 1) / ts;
|
||||||
|
|
||||||
|
for (int y = 0; y < th; ++y)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < tw; ++x)
|
||||||
|
{
|
||||||
|
var tileRef = navMesh.GetTileRefAt(x, y, 0);
|
||||||
|
navMesh.RemoveTile(tileRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void BuildAllTiles()
|
||||||
|
{
|
||||||
|
var settings = _sample.GetSettings();
|
||||||
|
var geom = _sample.GetInputGeom();
|
||||||
|
var navMesh = _sample.GetNavMesh();
|
||||||
|
|
||||||
if (null == settings || null == geom || navMesh == null)
|
if (null == settings || null == geom || navMesh == null)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
float ts = settings.tileSize * settings.cellSize;
|
var bmin = geom.GetMeshBoundsMin();
|
||||||
|
var bmax = geom.GetMeshBoundsMax();
|
||||||
|
int gw = 0, gh = 0;
|
||||||
|
Recast.CalcGridSize(bmin, bmax, settings.cellSize, out gw, out gh);
|
||||||
|
|
||||||
|
int ts = settings.tileSize;
|
||||||
|
int tw = (gw + ts - 1) / ts;
|
||||||
|
int th = (gh + ts - 1) / ts;
|
||||||
|
|
||||||
|
for (int y = 0; y < th; ++y)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < tw; ++x)
|
||||||
|
{
|
||||||
|
BuildTile(x, y, out var tileBuildTicks, out var tileTriCount, out var tileMemUsage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool BuildTile(int tx, int ty, out long tileBuildTicks, out int tileTriCount, out int tileMemUsage)
|
||||||
|
{
|
||||||
|
tileBuildTicks = 0;
|
||||||
|
tileTriCount = 0; // ...
|
||||||
|
tileMemUsage = 0; // ...
|
||||||
|
|
||||||
|
var settings = _sample.GetSettings();
|
||||||
|
var geom = _sample.GetInputGeom();
|
||||||
|
var navMesh = _sample.GetNavMesh();
|
||||||
|
|
||||||
RcVec3f bmin = geom.GetMeshBoundsMin();
|
RcVec3f bmin = geom.GetMeshBoundsMin();
|
||||||
RcVec3f bmax = geom.GetMeshBoundsMax();
|
RcVec3f bmax = geom.GetMeshBoundsMax();
|
||||||
|
|
||||||
int tx = (int)((pos.x - bmin[0]) / ts);
|
|
||||||
int ty = (int)((pos.z - bmin[2]) / ts);
|
|
||||||
|
|
||||||
RcConfig cfg = new RcConfig(
|
RcConfig cfg = new RcConfig(
|
||||||
true,
|
true,
|
||||||
settings.tileSize,
|
settings.tileSize,
|
||||||
|
@ -73,6 +118,7 @@ namespace DotRecast.Recast.DemoTool.Tools
|
||||||
SampleAreaModifications.SAMPLE_AREAMOD_WALKABLE
|
SampleAreaModifications.SAMPLE_AREAMOD_WALKABLE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
var beginTick = RcFrequency.Ticks;
|
||||||
var rb = new RecastBuilder();
|
var rb = new RecastBuilder();
|
||||||
var result = rb.BuildTile(geom, cfg, bmin, bmax, tx, ty, new RcAtomicInteger(0), 1);
|
var result = rb.BuildTile(geom, cfg, bmin, bmax, tx, ty, new RcAtomicInteger(0), 1);
|
||||||
|
|
||||||
|
@ -80,19 +126,44 @@ namespace DotRecast.Recast.DemoTool.Tools
|
||||||
var meshData = tb.BuildMeshData(geom,
|
var meshData = tb.BuildMeshData(geom,
|
||||||
settings.cellSize, settings.cellHeight, settings.agentHeight, settings.agentRadius, settings.agentMaxClimb,
|
settings.cellSize, settings.cellHeight, settings.agentHeight, settings.agentRadius, settings.agentMaxClimb,
|
||||||
ImmutableArray.Create(result)
|
ImmutableArray.Create(result)
|
||||||
).First();
|
).FirstOrDefault();
|
||||||
|
|
||||||
|
if (null == meshData)
|
||||||
|
return false;
|
||||||
|
|
||||||
navMesh.UpdateTile(meshData, 0);
|
navMesh.UpdateTile(meshData, 0);
|
||||||
|
|
||||||
|
tileBuildTicks = RcFrequency.Ticks - beginTick;
|
||||||
var telemetry = result.GetTelemetry();
|
|
||||||
tileBuildTicks = telemetry.ToList().Sum(x => x.Ticks);
|
|
||||||
tileTriCount = 0; // ...
|
tileTriCount = 0; // ...
|
||||||
tileMemUsage = 0; // ...
|
tileMemUsage = 0; // ...
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool BuildTile(RcVec3f pos, out long tileBuildTicks, out int tileTriCount, out int tileMemUsage)
|
||||||
|
{
|
||||||
|
var settings = _sample.GetSettings();
|
||||||
|
var geom = _sample.GetInputGeom();
|
||||||
|
var navMesh = _sample.GetNavMesh();
|
||||||
|
|
||||||
|
tileBuildTicks = 0;
|
||||||
|
tileTriCount = 0;
|
||||||
|
tileMemUsage = 0;
|
||||||
|
|
||||||
|
if (null == settings || null == geom || navMesh == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
float ts = settings.tileSize * settings.cellSize;
|
||||||
|
|
||||||
|
RcVec3f bmin = geom.GetMeshBoundsMin();
|
||||||
|
RcVec3f bmax = geom.GetMeshBoundsMax();
|
||||||
|
|
||||||
|
int tx = (int)((pos.x - bmin[0]) / ts);
|
||||||
|
int ty = (int)((pos.z - bmin[2]) / ts);
|
||||||
|
|
||||||
|
return BuildTile(tx, ty, out tileBuildTicks, out tileTriCount, out tileMemUsage);
|
||||||
|
}
|
||||||
|
|
||||||
public bool RemoveTile(RcVec3f pos)
|
public bool RemoveTile(RcVec3f pos)
|
||||||
{
|
{
|
||||||
var settings = _sample.GetSettings();
|
var settings = _sample.GetSettings();
|
||||||
|
|
Loading…
Reference in New Issue