diff --git a/src/DotRecast.Core/RcTelemetry.cs b/src/DotRecast.Core/RcContext.cs similarity index 77% rename from src/DotRecast.Core/RcTelemetry.cs rename to src/DotRecast.Core/RcContext.cs index aaea921..bb6fd2d 100644 --- a/src/DotRecast.Core/RcTelemetry.cs +++ b/src/DotRecast.Core/RcContext.cs @@ -25,12 +25,25 @@ using System.Threading; namespace DotRecast.Core { - public class RcTelemetry + /// Provides an interface for optional logging and performance tracking of the Recast + /// build process. + /// + /// This class does not provide logging or timer functionality on its + /// own. Both must be provided by a concrete implementation + /// by overriding the protected member functions. Also, this class does not + /// provide an interface for extracting log messages. (Only adding them.) + /// So concrete implementations must provide one. + /// + /// If no logging or timers are required, just pass an instance of this + /// class through the Recast build process. + /// + /// @ingroup recast + public class RcContext { private readonly ThreadLocal> _timerStart; private readonly ConcurrentDictionary _timerAccum; - public RcTelemetry() + public RcContext() { _timerStart = new ThreadLocal>(() => new Dictionary()); _timerAccum = new ConcurrentDictionary(); @@ -41,7 +54,7 @@ namespace DotRecast.Core StartTimer(label); return new RcAnonymousDisposable(() => StopTimer(label)); } - + public void StartTimer(RcTimerLabel label) { _timerStart.Value[label.Name] = new RcAtomicLong(RcFrequency.Ticks); diff --git a/src/DotRecast.Detour.Dynamic/Colliders/DtBoxCollider.cs b/src/DotRecast.Detour.Dynamic/Colliders/DtBoxCollider.cs index 239d216..24ffa3d 100644 --- a/src/DotRecast.Detour.Dynamic/Colliders/DtBoxCollider.cs +++ b/src/DotRecast.Detour.Dynamic/Colliders/DtBoxCollider.cs @@ -62,10 +62,10 @@ namespace DotRecast.Detour.Dynamic.Colliders return bounds; } - public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry) + public override void Rasterize(RcHeightfield hf, RcContext context) { RcFilledVolumeRasterization.RasterizeBox( - hf, center, halfEdges, area, (int)MathF.Floor(flagMergeThreshold / hf.ch), telemetry); + hf, center, halfEdges, area, (int)MathF.Floor(flagMergeThreshold / hf.ch), context); } public static RcVec3f[] GetHalfEdges(RcVec3f up, RcVec3f forward, RcVec3f extent) diff --git a/src/DotRecast.Detour.Dynamic/Colliders/DtCapsuleCollider.cs b/src/DotRecast.Detour.Dynamic/Colliders/DtCapsuleCollider.cs index 1745c76..5b0ed35 100644 --- a/src/DotRecast.Detour.Dynamic/Colliders/DtCapsuleCollider.cs +++ b/src/DotRecast.Detour.Dynamic/Colliders/DtCapsuleCollider.cs @@ -38,9 +38,9 @@ namespace DotRecast.Detour.Dynamic.Colliders this.radius = radius; } - public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry) + public override void Rasterize(RcHeightfield hf, RcContext context) { - RcFilledVolumeRasterization.RasterizeCapsule(hf, start, end, radius, area, (int)MathF.Floor(flagMergeThreshold / hf.ch), telemetry); + RcFilledVolumeRasterization.RasterizeCapsule(hf, start, end, radius, area, (int)MathF.Floor(flagMergeThreshold / hf.ch), context); } private static float[] Bounds(RcVec3f start, RcVec3f end, float radius) diff --git a/src/DotRecast.Detour.Dynamic/Colliders/DtCollider.cs b/src/DotRecast.Detour.Dynamic/Colliders/DtCollider.cs index efe16a0..5f964e1 100644 --- a/src/DotRecast.Detour.Dynamic/Colliders/DtCollider.cs +++ b/src/DotRecast.Detour.Dynamic/Colliders/DtCollider.cs @@ -40,6 +40,6 @@ namespace DotRecast.Detour.Dynamic.Colliders return _bounds; } - public abstract void Rasterize(RcHeightfield hf, RcTelemetry telemetry); + public abstract void Rasterize(RcHeightfield hf, RcContext context); } } \ No newline at end of file diff --git a/src/DotRecast.Detour.Dynamic/Colliders/DtCompositeCollider.cs b/src/DotRecast.Detour.Dynamic/Colliders/DtCompositeCollider.cs index b73e4c4..eceff0f 100644 --- a/src/DotRecast.Detour.Dynamic/Colliders/DtCompositeCollider.cs +++ b/src/DotRecast.Detour.Dynamic/Colliders/DtCompositeCollider.cs @@ -68,10 +68,10 @@ namespace DotRecast.Detour.Dynamic.Colliders return bounds; } - public void Rasterize(RcHeightfield hf, RcTelemetry telemetry) + public void Rasterize(RcHeightfield hf, RcContext context) { foreach (var c in colliders) - c.Rasterize(hf, telemetry); + c.Rasterize(hf, context); } } } \ No newline at end of file diff --git a/src/DotRecast.Detour.Dynamic/Colliders/DtConvexTrimeshCollider.cs b/src/DotRecast.Detour.Dynamic/Colliders/DtConvexTrimeshCollider.cs index b333be9..09fce01 100644 --- a/src/DotRecast.Detour.Dynamic/Colliders/DtConvexTrimeshCollider.cs +++ b/src/DotRecast.Detour.Dynamic/Colliders/DtConvexTrimeshCollider.cs @@ -42,10 +42,10 @@ namespace DotRecast.Detour.Dynamic.Colliders this.triangles = triangles; } - public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry) + public override void Rasterize(RcHeightfield hf, RcContext context) { RcFilledVolumeRasterization.RasterizeConvex(hf, vertices, triangles, area, - (int)MathF.Floor(flagMergeThreshold / hf.ch), telemetry); + (int)MathF.Floor(flagMergeThreshold / hf.ch), context); } } } \ No newline at end of file diff --git a/src/DotRecast.Detour.Dynamic/Colliders/DtCylinderCollider.cs b/src/DotRecast.Detour.Dynamic/Colliders/DtCylinderCollider.cs index 2067a2b..36dc374 100644 --- a/src/DotRecast.Detour.Dynamic/Colliders/DtCylinderCollider.cs +++ b/src/DotRecast.Detour.Dynamic/Colliders/DtCylinderCollider.cs @@ -38,10 +38,10 @@ namespace DotRecast.Detour.Dynamic.Colliders this.radius = radius; } - public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry) + public override void Rasterize(RcHeightfield hf, RcContext context) { RcFilledVolumeRasterization.RasterizeCylinder(hf, start, end, radius, area, (int)MathF.Floor(flagMergeThreshold / hf.ch), - telemetry); + context); } private static float[] Bounds(RcVec3f start, RcVec3f end, float radius) diff --git a/src/DotRecast.Detour.Dynamic/Colliders/DtSphereCollider.cs b/src/DotRecast.Detour.Dynamic/Colliders/DtSphereCollider.cs index f90b6d8..a5f2be1 100644 --- a/src/DotRecast.Detour.Dynamic/Colliders/DtSphereCollider.cs +++ b/src/DotRecast.Detour.Dynamic/Colliders/DtSphereCollider.cs @@ -36,10 +36,10 @@ namespace DotRecast.Detour.Dynamic.Colliders this.radius = radius; } - public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry) + public override void Rasterize(RcHeightfield hf, RcContext context) { RcFilledVolumeRasterization.RasterizeSphere(hf, center, radius, area, (int)MathF.Floor(flagMergeThreshold / hf.ch), - telemetry); + context); } private static float[] Bounds(RcVec3f center, float radius) diff --git a/src/DotRecast.Detour.Dynamic/Colliders/DtTrimeshCollider.cs b/src/DotRecast.Detour.Dynamic/Colliders/DtTrimeshCollider.cs index cc3a58e..9c76a5d 100644 --- a/src/DotRecast.Detour.Dynamic/Colliders/DtTrimeshCollider.cs +++ b/src/DotRecast.Detour.Dynamic/Colliders/DtTrimeshCollider.cs @@ -58,11 +58,11 @@ namespace DotRecast.Detour.Dynamic.Colliders return bounds; } - public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry) + public override void Rasterize(RcHeightfield hf, RcContext context) { for (int i = 0; i < triangles.Length; i += 3) { - RcRasterizations.RasterizeTriangle(telemetry, vertices, triangles[i], triangles[i + 1], triangles[i + 2], area, + RcRasterizations.RasterizeTriangle(context, vertices, triangles[i], triangles[i + 1], triangles[i + 2], area, hf, (int)MathF.Floor(flagMergeThreshold / hf.ch)); } } diff --git a/src/DotRecast.Detour.Dynamic/Colliders/IDtCollider.cs b/src/DotRecast.Detour.Dynamic/Colliders/IDtCollider.cs index a0bc77c..0010bb2 100644 --- a/src/DotRecast.Detour.Dynamic/Colliders/IDtCollider.cs +++ b/src/DotRecast.Detour.Dynamic/Colliders/IDtCollider.cs @@ -25,6 +25,6 @@ namespace DotRecast.Detour.Dynamic.Colliders public interface IDtCollider { float[] Bounds(); - void Rasterize(RcHeightfield hf, RcTelemetry telemetry); + void Rasterize(RcHeightfield hf, RcContext context); } } \ No newline at end of file diff --git a/src/DotRecast.Detour.Dynamic/DtDynamicNavMesh.cs b/src/DotRecast.Detour.Dynamic/DtDynamicNavMesh.cs index 1549581..a8a4aee 100644 --- a/src/DotRecast.Detour.Dynamic/DtDynamicNavMesh.cs +++ b/src/DotRecast.Detour.Dynamic/DtDynamicNavMesh.cs @@ -35,7 +35,7 @@ namespace DotRecast.Detour.Dynamic public readonly DtDynamicNavMeshConfig config; private readonly RcBuilder builder; private readonly Dictionary _tiles = new Dictionary(); - private readonly RcTelemetry telemetry; + private readonly RcContext _context; private readonly DtNavMeshParams navMeshParams; private readonly BlockingCollection updateQueue = new BlockingCollection(); private readonly RcAtomicLong currentColliderId = new RcAtomicLong(0); @@ -72,7 +72,7 @@ namespace DotRecast.Detour.Dynamic } ; - telemetry = new RcTelemetry(); + _context = new RcContext(); } public DtNavMesh NavMesh() @@ -218,7 +218,7 @@ namespace DotRecast.Detour.Dynamic { DtNavMeshCreateParams option = new DtNavMeshCreateParams(); option.walkableHeight = config.walkableHeight; - dirty = dirty | tile.Build(builder, config, telemetry); + dirty = dirty | tile.Build(builder, config, _context); } private bool UpdateNavMesh() diff --git a/src/DotRecast.Detour.Dynamic/DtDynamicTile.cs b/src/DotRecast.Detour.Dynamic/DtDynamicTile.cs index 896ce12..e038fed 100644 --- a/src/DotRecast.Detour.Dynamic/DtDynamicTile.cs +++ b/src/DotRecast.Detour.Dynamic/DtDynamicTile.cs @@ -44,12 +44,12 @@ namespace DotRecast.Detour.Dynamic this.voxelTile = voxelTile; } - public bool Build(RcBuilder builder, DtDynamicNavMeshConfig config, RcTelemetry telemetry) + public bool Build(RcBuilder builder, DtDynamicNavMeshConfig config, RcContext context) { if (dirty) { - RcHeightfield heightfield = BuildHeightfield(config, telemetry); - RcBuilderResult r = BuildRecast(builder, config, voxelTile, heightfield, telemetry); + RcHeightfield heightfield = BuildHeightfield(config, context); + RcBuilderResult r = BuildRecast(builder, config, voxelTile, heightfield, context); DtNavMeshCreateParams option = NavMeshCreateParams(voxelTile.tileX, voxelTile.tileZ, voxelTile.cellSize, voxelTile.cellHeight, config, r); meshData = DtNavMeshBuilder.CreateNavMeshData(option); @@ -59,7 +59,7 @@ namespace DotRecast.Detour.Dynamic return false; } - private RcHeightfield BuildHeightfield(DtDynamicNavMeshConfig config, RcTelemetry telemetry) + private RcHeightfield BuildHeightfield(DtDynamicNavMeshConfig config, RcContext context) { ICollection rasterizedColliders = checkpoint != null ? checkpoint.colliders as ICollection @@ -74,7 +74,7 @@ namespace DotRecast.Detour.Dynamic if (!rasterizedColliders.Contains(cid)) { heightfield.bmax.Y = Math.Max(heightfield.bmax.Y, c.Bounds()[4] + heightfield.ch * 2); - c.Rasterize(heightfield, telemetry); + c.Rasterize(heightfield, context); } } @@ -87,7 +87,7 @@ namespace DotRecast.Detour.Dynamic } private RcBuilderResult BuildRecast(RcBuilder builder, DtDynamicNavMeshConfig config, DtVoxelTile vt, - RcHeightfield heightfield, RcTelemetry telemetry) + RcHeightfield heightfield, RcContext context) { RcConfig rcConfig = new RcConfig( config.useTiles, config.tileSizeX, config.tileSizeZ, @@ -100,7 +100,7 @@ namespace DotRecast.Detour.Dynamic Math.Min(DtDynamicNavMesh.MAX_VERTS_PER_POLY, config.vertsPerPoly), config.detailSampleDistance, config.detailSampleMaxError, true, true, true, default, true); - RcBuilderResult r = builder.Build(vt.tileX, vt.tileZ, null, rcConfig, heightfield, telemetry); + RcBuilderResult r = builder.Build(vt.tileX, vt.tileZ, null, rcConfig, heightfield, context); if (config.keepIntermediateResults) { recastResult = r; diff --git a/src/DotRecast.Recast/RcAreas.cs b/src/DotRecast.Recast/RcAreas.cs index 05d8e2c..08c96f6 100644 --- a/src/DotRecast.Recast/RcAreas.cs +++ b/src/DotRecast.Recast/RcAreas.cs @@ -44,7 +44,7 @@ namespace DotRecast.Recast /// @param[in] erosionRadius The radius of erosion. [Limits: 0 < value < 255] [Units: vx] /// @param[in,out] compactHeightfield The populated compact heightfield to erode. /// @returns True if the operation completed successfully. - public static void ErodeWalkableArea(RcTelemetry context, int erosionRadius, RcCompactHeightfield compactHeightfield) + public static void ErodeWalkableArea(RcContext context, int erosionRadius, RcCompactHeightfield compactHeightfield) { int xSize = compactHeightfield.width; int zSize = compactHeightfield.height; @@ -261,7 +261,7 @@ namespace DotRecast.Recast /// @param[in,out] context The build context to use during the operation. /// @param[in,out] compactHeightfield A populated compact heightfield. /// @returns True if the operation completed successfully. - public static bool MedianFilterWalkableArea(RcTelemetry context, RcCompactHeightfield compactHeightfield) + public static bool MedianFilterWalkableArea(RcContext context, RcCompactHeightfield compactHeightfield) { int xSize = compactHeightfield.width; int zSize = compactHeightfield.height; @@ -344,7 +344,7 @@ namespace DotRecast.Recast /// @param[in] boxMaxBounds The maximum extents of the bounding box. [(x, y, z)] [Units: wu] /// @param[in] areaId The area id to apply. [Limit: <= #RC_WALKABLE_AREA] /// @param[in,out] compactHeightfield A populated compact heightfield. - public static void MarkBoxArea(RcTelemetry context, float[] boxMinBounds, float[] boxMaxBounds, RcAreaModification areaId, RcCompactHeightfield compactHeightfield) + public static void MarkBoxArea(RcContext context, float[] boxMinBounds, float[] boxMaxBounds, RcAreaModification areaId, RcCompactHeightfield compactHeightfield) { using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_MARK_BOX_AREA); @@ -446,7 +446,7 @@ namespace DotRecast.Recast /// @param[in] maxY The height of the top of the polygon. [Units: wu] /// @param[in] areaId The area id to apply. [Limit: <= #RC_WALKABLE_AREA] /// @param[in,out] compactHeightfield A populated compact heightfield. - public static void MarkConvexPolyArea(RcTelemetry context, float[] verts, + public static void MarkConvexPolyArea(RcContext context, float[] verts, float minY, float maxY, RcAreaModification areaId, RcCompactHeightfield compactHeightfield) { @@ -567,7 +567,7 @@ namespace DotRecast.Recast /// @param[in] height The height of the cylinder. [Units: wu] [Limit: > 0] /// @param[in] areaId The area id to apply. [Limit: <= #RC_WALKABLE_AREA] /// @param[in,out] compactHeightfield A populated compact heightfield. - public static void MarkCylinderArea(RcTelemetry context, float[] position, float radius, float height, + public static void MarkCylinderArea(RcContext context, float[] position, float radius, float height, RcAreaModification areaId, RcCompactHeightfield compactHeightfield) { using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_MARK_CYLINDER_AREA); diff --git a/src/DotRecast.Recast/RcBuilder.cs b/src/DotRecast.Recast/RcBuilder.cs index 202922c..0977f9f 100644 --- a/src/DotRecast.Recast/RcBuilder.cs +++ b/src/DotRecast.Recast/RcBuilder.cs @@ -162,7 +162,7 @@ namespace DotRecast.Recast public RcBuilderResult Build(IInputGeomProvider geom, RcBuilderConfig builderCfg) { RcConfig cfg = builderCfg.cfg; - RcTelemetry ctx = new RcTelemetry(); + RcContext ctx = new RcContext(); // // Step 1. Rasterize input polygon soup. // @@ -170,7 +170,7 @@ namespace DotRecast.Recast return Build(builderCfg.tileX, builderCfg.tileZ, geom, cfg, solid, ctx); } - public RcBuilderResult Build(int tileX, int tileZ, IInputGeomProvider geom, RcConfig cfg, RcHeightfield solid, RcTelemetry ctx) + public RcBuilderResult Build(int tileX, int tileZ, IInputGeomProvider geom, RcConfig cfg, RcHeightfield solid, RcContext ctx) { FilterHeightfield(solid, cfg, ctx); RcCompactHeightfield chf = BuildCompactHeightfield(geom, cfg, ctx, solid); @@ -259,7 +259,7 @@ namespace DotRecast.Recast /* * Step 2. Filter walkable surfaces. */ - private void FilterHeightfield(RcHeightfield solid, RcConfig cfg, RcTelemetry ctx) + private void FilterHeightfield(RcHeightfield solid, RcConfig cfg, RcContext ctx) { // Once all geometry is rasterized, we do initial pass of filtering to // remove unwanted overhangs caused by the conservative rasterization @@ -283,7 +283,7 @@ namespace DotRecast.Recast /* * Step 3. Partition walkable surface to simple regions. */ - private RcCompactHeightfield BuildCompactHeightfield(IInputGeomProvider geom, RcConfig cfg, RcTelemetry ctx, RcHeightfield solid) + private RcCompactHeightfield BuildCompactHeightfield(IInputGeomProvider geom, RcConfig cfg, RcContext ctx, RcHeightfield solid) { // Compact the heightfield so that it is faster to handle from now on. // This will result more cache coherent data as well as the neighbours @@ -306,7 +306,7 @@ namespace DotRecast.Recast public RcHeightfieldLayerSet BuildLayers(IInputGeomProvider geom, RcBuilderConfig builderCfg) { - RcTelemetry ctx = new RcTelemetry(); + RcContext ctx = new RcContext(); RcHeightfield solid = RcVoxelizations.BuildSolidHeightfield(geom, builderCfg, ctx); FilterHeightfield(solid, builderCfg.cfg, ctx); RcCompactHeightfield chf = BuildCompactHeightfield(geom, builderCfg.cfg, ctx, solid); diff --git a/src/DotRecast.Recast/RcBuilderResult.cs b/src/DotRecast.Recast/RcBuilderResult.cs index 7a8264b..b83c1f5 100644 --- a/src/DotRecast.Recast/RcBuilderResult.cs +++ b/src/DotRecast.Recast/RcBuilderResult.cs @@ -12,9 +12,9 @@ namespace DotRecast.Recast private readonly RcPolyMesh pmesh; private readonly RcPolyMeshDetail dmesh; private readonly RcHeightfield solid; - private readonly RcTelemetry telemetry; + private readonly RcContext _context; - public RcBuilderResult(int tileX, int tileZ, RcHeightfield solid, RcCompactHeightfield chf, RcContourSet cs, RcPolyMesh pmesh, RcPolyMeshDetail dmesh, RcTelemetry ctx) + public RcBuilderResult(int tileX, int tileZ, RcHeightfield solid, RcCompactHeightfield chf, RcContourSet cs, RcPolyMesh pmesh, RcPolyMeshDetail dmesh, RcContext ctx) { this.tileX = tileX; this.tileZ = tileZ; @@ -23,7 +23,7 @@ namespace DotRecast.Recast this.cs = cs; this.pmesh = pmesh; this.dmesh = dmesh; - telemetry = ctx; + _context = ctx; } public RcPolyMesh GetMesh() @@ -51,9 +51,9 @@ namespace DotRecast.Recast return solid; } - public RcTelemetry GetTelemetry() + public RcContext GetTelemetry() { - return telemetry; + return _context; } } } \ No newline at end of file diff --git a/src/DotRecast.Recast/RcCommons.cs b/src/DotRecast.Recast/RcCommons.cs index f35b4f0..cbebebf 100644 --- a/src/DotRecast.Recast/RcCommons.cs +++ b/src/DotRecast.Recast/RcCommons.cs @@ -119,7 +119,7 @@ namespace DotRecast.Recast /// See the #rcConfig documentation for more information on the configuration parameters. /// /// @see rcHeightfield, rcClearUnwalkableTriangles, rcRasterizeTriangles - public static int[] MarkWalkableTriangles(RcTelemetry ctx, float walkableSlopeAngle, float[] verts, int[] tris, int nt, RcAreaModification areaMod) + public static int[] MarkWalkableTriangles(RcContext ctx, float walkableSlopeAngle, float[] verts, int[] tris, int nt, RcAreaModification areaMod) { int[] areas = new int[nt]; float walkableThr = MathF.Cos(walkableSlopeAngle / 180.0f * MathF.PI); @@ -153,7 +153,7 @@ namespace DotRecast.Recast /// See the #rcConfig documentation for more information on the configuration parameters. /// /// @see rcHeightfield, rcClearUnwalkableTriangles, rcRasterizeTriangles - public static void ClearUnwalkableTriangles(RcTelemetry ctx, float walkableSlopeAngle, float[] verts, int nv, int[] tris, int nt, int[] areas) + public static void ClearUnwalkableTriangles(RcContext ctx, float walkableSlopeAngle, float[] verts, int nv, int[] tris, int nt, int[] areas) { float walkableThr = MathF.Cos(walkableSlopeAngle / 180.0f * MathF.PI); diff --git a/src/DotRecast.Recast/RcCompacts.cs b/src/DotRecast.Recast/RcCompacts.cs index dccd456..bfd79d5 100644 --- a/src/DotRecast.Recast/RcCompacts.cs +++ b/src/DotRecast.Recast/RcCompacts.cs @@ -57,7 +57,7 @@ namespace DotRecast.Recast /// @param[in] heightfield The heightfield to be compacted. /// @param[out] compactHeightfield The resulting compact heightfield. (Must be pre-allocated.) /// @returns True if the operation completed successfully. - public static RcCompactHeightfield BuildCompactHeightfield(RcTelemetry context, int walkableHeight, int walkableClimb, RcHeightfield heightfield) + public static RcCompactHeightfield BuildCompactHeightfield(RcContext context, int walkableHeight, int walkableClimb, RcHeightfield heightfield) { using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_BUILD_COMPACTHEIGHTFIELD); @@ -187,7 +187,7 @@ namespace DotRecast.Recast /// @param[in,out] context The build context to use during the operation. /// @param[in] heightfield An initialized heightfield. /// @returns The number of spans in the heightfield. - private static int GetHeightFieldSpanCount(RcTelemetry context, RcHeightfield heightfield) + private static int GetHeightFieldSpanCount(RcContext context, RcHeightfield heightfield) { int w = heightfield.width; int h = heightfield.height; diff --git a/src/DotRecast.Recast/RcContours.cs b/src/DotRecast.Recast/RcContours.cs index 0891087..2adba4f 100644 --- a/src/DotRecast.Recast/RcContours.cs +++ b/src/DotRecast.Recast/RcContours.cs @@ -614,7 +614,7 @@ namespace DotRecast.Recast return new int[] { minx, minz, leftmost }; } - private static void MergeRegionHoles(RcTelemetry ctx, RcContourRegion region) + private static void MergeRegionHoles(RcContext ctx, RcContourRegion region) { // Sort holes from left to right. for (int i = 0; i < region.nholes; i++) @@ -715,7 +715,7 @@ namespace DotRecast.Recast /// See the #rcConfig documentation for more information on the configuration parameters. /// /// @see rcAllocContourSet, rcCompactHeightfield, rcContourSet, rcConfig - public static RcContourSet BuildContours(RcTelemetry ctx, RcCompactHeightfield chf, float maxError, int maxEdgeLen, + public static RcContourSet BuildContours(RcContext ctx, RcCompactHeightfield chf, float maxError, int maxEdgeLen, int buildFlags) { int w = chf.width; diff --git a/src/DotRecast.Recast/RcFilledVolumeRasterization.cs b/src/DotRecast.Recast/RcFilledVolumeRasterization.cs index 4e0b222..ddc11ae 100644 --- a/src/DotRecast.Recast/RcFilledVolumeRasterization.cs +++ b/src/DotRecast.Recast/RcFilledVolumeRasterization.cs @@ -30,7 +30,7 @@ namespace DotRecast.Recast private const float EPSILON = 0.00001f; private static readonly int[] BOX_EDGES = new[] { 0, 1, 0, 2, 0, 4, 1, 3, 1, 5, 2, 3, 2, 6, 3, 7, 4, 5, 4, 6, 5, 7, 6, 7 }; - public static void RasterizeSphere(RcHeightfield hf, RcVec3f center, float radius, int area, int flagMergeThr, RcTelemetry ctx) + public static void RasterizeSphere(RcHeightfield hf, RcVec3f center, float radius, int area, int flagMergeThr, RcContext ctx) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_SPHERE); float[] bounds = @@ -42,7 +42,7 @@ namespace DotRecast.Recast rectangle => IntersectSphere(rectangle, center, radius * radius)); } - public static void RasterizeCapsule(RcHeightfield hf, RcVec3f start, RcVec3f end, float radius, int area, int flagMergeThr, RcTelemetry ctx) + public static void RasterizeCapsule(RcHeightfield hf, RcVec3f start, RcVec3f end, float radius, int area, int flagMergeThr, RcContext ctx) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_CAPSULE); float[] bounds = @@ -56,7 +56,7 @@ namespace DotRecast.Recast rectangle => IntersectCapsule(rectangle, start, end, axis, radius * radius)); } - public static void RasterizeCylinder(RcHeightfield hf, RcVec3f start, RcVec3f end, float radius, int area, int flagMergeThr, RcTelemetry ctx) + public static void RasterizeCylinder(RcHeightfield hf, RcVec3f start, RcVec3f end, float radius, int area, int flagMergeThr, RcContext ctx) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_CYLINDER); float[] bounds = @@ -70,7 +70,7 @@ namespace DotRecast.Recast rectangle => IntersectCylinder(rectangle, start, end, axis, radius * radius)); } - public static void RasterizeBox(RcHeightfield hf, RcVec3f center, RcVec3f[] halfEdges, int area, int flagMergeThr, RcTelemetry ctx) + public static void RasterizeBox(RcHeightfield hf, RcVec3f center, RcVec3f[] halfEdges, int area, int flagMergeThr, RcContext ctx) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_BOX); RcVec3f[] normals = @@ -120,7 +120,7 @@ namespace DotRecast.Recast RasterizationFilledShape(hf, bounds, area, flagMergeThr, rectangle => IntersectBox(rectangle, vertices, planes)); } - public static void RasterizeConvex(RcHeightfield hf, float[] vertices, int[] triangles, int area, int flagMergeThr, RcTelemetry ctx) + public static void RasterizeConvex(RcHeightfield hf, float[] vertices, int[] triangles, int area, int flagMergeThr, RcContext ctx) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_CONVEX); float[] bounds = new float[] { vertices[0], vertices[1], vertices[2], vertices[0], vertices[1], vertices[2] }; diff --git a/src/DotRecast.Recast/RcFilters.cs b/src/DotRecast.Recast/RcFilters.cs index 09437ee..f373677 100644 --- a/src/DotRecast.Recast/RcFilters.cs +++ b/src/DotRecast.Recast/RcFilters.cs @@ -45,7 +45,7 @@ namespace DotRecast.Recast /// @param[in] walkableClimb Maximum ledge height that is considered to still be traversable. /// [Limit: >=0] [Units: vx] /// @param[in,out] heightfield A fully built heightfield. (All spans have been added.) - public static void FilterLowHangingWalkableObstacles(RcTelemetry context, int walkableClimb, RcHeightfield heightfield) + public static void FilterLowHangingWalkableObstacles(RcContext context, int walkableClimb, RcHeightfield heightfield) { using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_FILTER_LOW_OBSTACLES); @@ -98,7 +98,7 @@ namespace DotRecast.Recast /// @param[in] walkableClimb Maximum ledge height that is considered to still be traversable. /// [Limit: >=0] [Units: vx] /// @param[in,out] heightfield A fully built heightfield. (All spans have been added.) - public static void FilterLedgeSpans(RcTelemetry context, int walkableHeight, int walkableClimb, RcHeightfield heightfield) + public static void FilterLedgeSpans(RcContext context, int walkableHeight, int walkableClimb, RcHeightfield heightfield) { using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_FILTER_BORDER); @@ -219,7 +219,7 @@ namespace DotRecast.Recast /// @param[in] walkableHeight Minimum floor to 'ceiling' height that will still allow the floor area to /// be considered walkable. [Limit: >= 3] [Units: vx] /// @param[in,out] heightfield A fully built heightfield. (All spans have been added.) - public static void FilterWalkableLowHeightSpans(RcTelemetry context, int walkableHeight, RcHeightfield heightfield) + public static void FilterWalkableLowHeightSpans(RcContext context, int walkableHeight, RcHeightfield heightfield) { using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_FILTER_WALKABLE); diff --git a/src/DotRecast.Recast/RcLayers.cs b/src/DotRecast.Recast/RcLayers.cs index bffb989..7b347a9 100644 --- a/src/DotRecast.Recast/RcLayers.cs +++ b/src/DotRecast.Recast/RcLayers.cs @@ -52,7 +52,7 @@ namespace DotRecast.Recast return (amin > bmax || amax < bmin) ? false : true; } - public static RcHeightfieldLayerSet BuildHeightfieldLayers(RcTelemetry ctx, RcCompactHeightfield chf, int walkableHeight) + public static RcHeightfieldLayerSet BuildHeightfieldLayers(RcContext ctx, RcCompactHeightfield chf, int walkableHeight) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_BUILD_LAYERS); diff --git a/src/DotRecast.Recast/RcMeshDetails.cs b/src/DotRecast.Recast/RcMeshDetails.cs index 257f147..f3fbcca 100644 --- a/src/DotRecast.Recast/RcMeshDetails.cs +++ b/src/DotRecast.Recast/RcMeshDetails.cs @@ -439,7 +439,7 @@ namespace DotRecast.Recast return EV_UNDEF; } - private static void AddEdge(RcTelemetry ctx, List edges, int maxEdges, int s, int t, int l, int r) + private static void AddEdge(RcContext ctx, List edges, int maxEdges, int s, int t, int l, int r) { if (edges.Count / 4 >= maxEdges) { @@ -507,7 +507,7 @@ namespace DotRecast.Recast return false; } - static int CompleteFacet(RcTelemetry ctx, float[] pts, int npts, List edges, int maxEdges, int nfaces, int e) + static int CompleteFacet(RcContext ctx, float[] pts, int npts, List edges, int maxEdges, int nfaces, int e) { const float EPS = 1e-5f; @@ -624,7 +624,7 @@ namespace DotRecast.Recast return nfaces; } - private static void DelaunayHull(RcTelemetry ctx, int npts, float[] pts, int nhull, int[] hull, List tris) + private static void DelaunayHull(RcContext ctx, int npts, float[] pts, int nhull, int[] hull, List tris) { int nfaces = 0; int maxEdges = npts * 10; @@ -828,7 +828,7 @@ namespace DotRecast.Recast return (((i * 0xd8163841) & 0xffff) / 65535.0f * 2.0f) - 1.0f; } - static int BuildPolyDetail(RcTelemetry ctx, float[] @in, int nin, float sampleDist, float sampleMaxError, + static int BuildPolyDetail(RcContext ctx, float[] @in, int nin, float sampleDist, float sampleMaxError, int heightSearchRadius, RcCompactHeightfield chf, RcHeightPatch hp, float[] verts, List tris) { List samples = new List(512); @@ -1140,7 +1140,7 @@ namespace DotRecast.Recast } - static void SeedArrayWithPolyCenter(RcTelemetry ctx, RcCompactHeightfield chf, int[] meshpoly, int poly, int npoly, + static void SeedArrayWithPolyCenter(RcContext ctx, RcCompactHeightfield chf, int[] meshpoly, int poly, int npoly, int[] verts, int bs, RcHeightPatch hp, List array) { // Note: Reads to the compact heightfield are offset by border size (bs) @@ -1298,7 +1298,7 @@ namespace DotRecast.Recast queue.Add(v3); } - static void GetHeightData(RcTelemetry ctx, RcCompactHeightfield chf, int[] meshpolys, int poly, int npoly, int[] verts, + static void GetHeightData(RcContext ctx, RcCompactHeightfield chf, int[] meshpolys, int poly, int npoly, int[] verts, int bs, RcHeightPatch hp, int region) { // Note: Reads to the compact heightfield are offset by border size (bs) @@ -1424,7 +1424,7 @@ namespace DotRecast.Recast /// See the #rcConfig documentation for more information on the configuration parameters. /// /// @see rcAllocPolyMeshDetail, rcPolyMesh, rcCompactHeightfield, rcPolyMeshDetail, rcConfig - public static RcPolyMeshDetail BuildPolyMeshDetail(RcTelemetry ctx, RcPolyMesh mesh, RcCompactHeightfield chf, + public static RcPolyMeshDetail BuildPolyMeshDetail(RcContext ctx, RcPolyMesh mesh, RcCompactHeightfield chf, float sampleDist, float sampleMaxError) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_BUILD_POLYMESHDETAIL); @@ -1614,7 +1614,7 @@ namespace DotRecast.Recast } /// @see rcAllocPolyMeshDetail, rcPolyMeshDetail - private static RcPolyMeshDetail MergePolyMeshDetails(RcTelemetry ctx, RcPolyMeshDetail[] meshes, int nmeshes) + private static RcPolyMeshDetail MergePolyMeshDetails(RcContext ctx, RcPolyMeshDetail[] meshes, int nmeshes) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_MERGE_POLYMESHDETAIL); diff --git a/src/DotRecast.Recast/RcMeshs.cs b/src/DotRecast.Recast/RcMeshs.cs index 40e1cf8..269be05 100644 --- a/src/DotRecast.Recast/RcMeshs.cs +++ b/src/DotRecast.Recast/RcMeshs.cs @@ -577,7 +577,7 @@ namespace DotRecast.Recast return an; } - private static bool CanRemoveVertex(RcTelemetry ctx, RcPolyMesh mesh, int rem) + private static bool CanRemoveVertex(RcContext ctx, RcPolyMesh mesh, int rem) { int nvp = mesh.nvp; @@ -680,7 +680,7 @@ namespace DotRecast.Recast return true; } - private static void RemoveVertex(RcTelemetry ctx, RcPolyMesh mesh, int rem, int maxTris) + private static void RemoveVertex(RcContext ctx, RcPolyMesh mesh, int rem, int maxTris) { int nvp = mesh.nvp; @@ -967,7 +967,7 @@ namespace DotRecast.Recast /// limit must be restricted to <= #DT_VERTS_PER_POLYGON. /// /// @see rcAllocPolyMesh, rcContourSet, rcPolyMesh, rcConfig - public static RcPolyMesh BuildPolyMesh(RcTelemetry ctx, RcContourSet cset, int nvp) + public static RcPolyMesh BuildPolyMesh(RcContext ctx, RcContourSet cset, int nvp) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_BUILD_POLYMESH); @@ -1212,7 +1212,7 @@ namespace DotRecast.Recast } /// @see rcAllocPolyMesh, rcPolyMesh - public static RcPolyMesh MergePolyMeshes(RcTelemetry ctx, RcPolyMesh[] meshes, int nmeshes) + public static RcPolyMesh MergePolyMeshes(RcContext ctx, RcPolyMesh[] meshes, int nmeshes) { if (nmeshes == 0 || meshes == null) return null; @@ -1340,7 +1340,7 @@ namespace DotRecast.Recast return mesh; } - public static RcPolyMesh CopyPolyMesh(RcTelemetry ctx, RcPolyMesh src) + public static RcPolyMesh CopyPolyMesh(RcContext ctx, RcPolyMesh src) { RcPolyMesh dst = new RcPolyMesh(); diff --git a/src/DotRecast.Recast/RcRasterizations.cs b/src/DotRecast.Recast/RcRasterizations.cs index b757f3d..afa6a4e 100644 --- a/src/DotRecast.Recast/RcRasterizations.cs +++ b/src/DotRecast.Recast/RcRasterizations.cs @@ -393,7 +393,7 @@ namespace DotRecast.Recast /// @param[in] flagMergeThreshold The distance where the walkable flag is favored over the non-walkable flag. /// [Limit: >= 0] [Units: vx] /// @returns True if the operation completed successfully. - public static void RasterizeTriangle(RcTelemetry context, float[] verts, int v0, int v1, int v2, int areaID, + public static void RasterizeTriangle(RcContext context, float[] verts, int v0, int v1, int v2, int areaID, RcHeightfield heightfield, int flagMergeThreshold) { using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_TRIANGLES); @@ -421,7 +421,7 @@ namespace DotRecast.Recast /// @param[in] flagMergeThreshold The distance where the walkable flag is favored over the non-walkable flag. /// [Limit: >= 0] [Units: vx] /// @returns True if the operation completed successfully. - public static void RasterizeTriangles(RcTelemetry context, float[] verts, int[] tris, int[] triAreaIDs, int numTris, + public static void RasterizeTriangles(RcContext context, float[] verts, int[] tris, int[] triAreaIDs, int numTris, RcHeightfield heightfield, int flagMergeThreshold) { using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_TRIANGLES); @@ -454,7 +454,7 @@ namespace DotRecast.Recast /// @param[in] flagMergeThreshold The distance where the walkable flag is favored over the non-walkable flag. /// [Limit: >= 0] [Units: vx] /// @returns True if the operation completed successfully. - public static void RasterizeTriangles(RcTelemetry context, float[] verts, int[] triAreaIDs, int numTris, RcHeightfield heightfield, int flagMergeThreshold) + public static void RasterizeTriangles(RcContext context, float[] verts, int[] triAreaIDs, int numTris, RcHeightfield heightfield, int flagMergeThreshold) { using var timer = context.ScopedTimer(RcTimerLabel.RC_TIMER_RASTERIZE_TRIANGLES); diff --git a/src/DotRecast.Recast/RcRegions.cs b/src/DotRecast.Recast/RcRegions.cs index dd25089..4c08a21 100644 --- a/src/DotRecast.Recast/RcRegions.cs +++ b/src/DotRecast.Recast/RcRegions.cs @@ -847,7 +847,7 @@ namespace DotRecast.Recast } } - private static int MergeAndFilterRegions(RcTelemetry ctx, int minRegionArea, int mergeRegionSize, int maxRegionId, + private static int MergeAndFilterRegions(RcContext ctx, int minRegionArea, int mergeRegionSize, int maxRegionId, RcCompactHeightfield chf, int[] srcReg, List overlaps) { int w = chf.width; @@ -1169,7 +1169,7 @@ namespace DotRecast.Recast } } - private static int MergeAndFilterLayerRegions(RcTelemetry ctx, int minRegionArea, int maxRegionId, RcCompactHeightfield chf, int[] srcReg, List overlaps) + private static int MergeAndFilterLayerRegions(RcContext ctx, int minRegionArea, int maxRegionId, RcCompactHeightfield chf, int[] srcReg, List overlaps) { int w = chf.width; int h = chf.height; @@ -1417,7 +1417,7 @@ namespace DotRecast.Recast /// and rcCompactHeightfield::dist fields. /// /// @see rcCompactHeightfield, rcBuildRegions, rcBuildRegionsMonotone - public static void BuildDistanceField(RcTelemetry ctx, RcCompactHeightfield chf) + public static void BuildDistanceField(RcContext ctx, RcCompactHeightfield chf) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_BUILD_DISTANCEFIELD); @@ -1478,7 +1478,7 @@ namespace DotRecast.Recast /// @warning The distance field must be created using #rcBuildDistanceField before attempting to build regions. /// /// @see rcCompactHeightfield, rcCompactSpan, rcBuildDistanceField, rcBuildRegionsMonotone, rcConfig - public static void BuildRegionsMonotone(RcTelemetry ctx, RcCompactHeightfield chf, int minRegionArea, + public static void BuildRegionsMonotone(RcContext ctx, RcCompactHeightfield chf, int minRegionArea, int mergeRegionArea) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_BUILD_REGIONS); @@ -1660,7 +1660,7 @@ namespace DotRecast.Recast /// @warning The distance field must be created using #rcBuildDistanceField before attempting to build regions. /// /// @see rcCompactHeightfield, rcCompactSpan, rcBuildDistanceField, rcBuildRegionsMonotone, rcConfig - public static void BuildRegions(RcTelemetry ctx, RcCompactHeightfield chf, int minRegionArea, + public static void BuildRegions(RcContext ctx, RcCompactHeightfield chf, int minRegionArea, int mergeRegionArea) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_BUILD_REGIONS); @@ -1786,7 +1786,7 @@ namespace DotRecast.Recast } } - public static void BuildLayerRegions(RcTelemetry ctx, RcCompactHeightfield chf, int minRegionArea) + public static void BuildLayerRegions(RcContext ctx, RcCompactHeightfield chf, int minRegionArea) { using var timer = ctx.ScopedTimer(RcTimerLabel.RC_TIMER_BUILD_REGIONS); diff --git a/src/DotRecast.Recast/RcVoxelizations.cs b/src/DotRecast.Recast/RcVoxelizations.cs index 9bc2e8e..608be4f 100644 --- a/src/DotRecast.Recast/RcVoxelizations.cs +++ b/src/DotRecast.Recast/RcVoxelizations.cs @@ -25,7 +25,7 @@ namespace DotRecast.Recast { public static class RcVoxelizations { - public static RcHeightfield BuildSolidHeightfield(IInputGeomProvider geomProvider, RcBuilderConfig builderCfg, RcTelemetry ctx) + public static RcHeightfield BuildSolidHeightfield(IInputGeomProvider geomProvider, RcBuilderConfig builderCfg, RcContext ctx) { RcConfig cfg = builderCfg.cfg; diff --git a/test/DotRecast.Recast.Test/RecastSoloMeshTest.cs b/test/DotRecast.Recast.Test/RecastSoloMeshTest.cs index 9cab2ae..731f101 100644 --- a/test/DotRecast.Recast.Test/RecastSoloMeshTest.cs +++ b/test/DotRecast.Recast.Test/RecastSoloMeshTest.cs @@ -101,7 +101,7 @@ public class RecastSoloMeshTest long time = RcFrequency.Ticks; RcVec3f bmin = geomProvider.GetMeshBoundsMin(); RcVec3f bmax = geomProvider.GetMeshBoundsMax(); - RcTelemetry m_ctx = new RcTelemetry(); + RcContext m_ctx = new RcContext(); // // Step 1. Initialize build config. // diff --git a/test/DotRecast.Recast.Test/RecastTest.cs b/test/DotRecast.Recast.Test/RecastTest.cs index 3aa4d63..7c02149 100644 --- a/test/DotRecast.Recast.Test/RecastTest.cs +++ b/test/DotRecast.Recast.Test/RecastTest.cs @@ -36,7 +36,7 @@ public class RecastTest int[] unwalkable_tri = { 0, 2, 1 }; int nt = 1; - RcTelemetry ctx = new RcTelemetry(); + RcContext ctx = new RcContext(); { int[] areas = { 42 }; RcCommons.ClearUnwalkableTriangles(ctx, walkableSlopeAngle, verts, nv, unwalkable_tri, nt, areas);