forked from bit/DotRecastNetSim
refactor: Math -> MathF
This commit is contained in:
parent
04fa38bb96
commit
d99666048b
|
@ -181,9 +181,9 @@ namespace DotRecast.Core.Numerics
|
||||||
public static RcMatrix4x4f CreateFromRotate(float a, float x, float y, float z)
|
public static RcMatrix4x4f CreateFromRotate(float a, float x, float y, float z)
|
||||||
{
|
{
|
||||||
var matrix = new RcMatrix4x4f();
|
var matrix = new RcMatrix4x4f();
|
||||||
a = (float)(a * Math.PI / 180.0); // convert to radians
|
a = (float)(a * MathF.PI / 180.0); // convert to radians
|
||||||
float s = (float)Math.Sin(a);
|
float s = MathF.Sin(a);
|
||||||
float c = (float)Math.Cos(a);
|
float c = MathF.Cos(a);
|
||||||
float t = 1.0f - c;
|
float t = 1.0f - c;
|
||||||
|
|
||||||
float tx = t * x;
|
float tx = t * x;
|
||||||
|
|
|
@ -93,7 +93,7 @@ namespace DotRecast.Core
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
if (Math.Abs(d.Get(i)) < EPS)
|
if (MathF.Abs(d.Get(i)) < EPS)
|
||||||
{
|
{
|
||||||
if (sp.Get(i) < amin.Get(i) || sp.Get(i) > amax.Get(i))
|
if (sp.Get(i) < amin.Get(i) || sp.Get(i) > amax.Get(i))
|
||||||
{
|
{
|
||||||
|
|
|
@ -905,7 +905,7 @@ namespace DotRecast.Detour.Crowd
|
||||||
|
|
||||||
// Check for overlap.
|
// Check for overlap.
|
||||||
RcVec3f diff = RcVec3f.Subtract(pos, ag.npos);
|
RcVec3f diff = RcVec3f.Subtract(pos, ag.npos);
|
||||||
if (Math.Abs(diff.Y) >= (height + ag.option.height) / 2.0f)
|
if (MathF.Abs(diff.Y) >= (height + ag.option.height) / 2.0f)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,7 +188,7 @@ namespace DotRecast.Detour.Crowd
|
||||||
RcVec3f v = RcVec3f.Subtract(bq, bp);
|
RcVec3f v = RcVec3f.Subtract(bq, bp);
|
||||||
RcVec3f w = RcVec3f.Subtract(ap, bp);
|
RcVec3f w = RcVec3f.Subtract(ap, bp);
|
||||||
float d = RcVec3f.Perp2D(u, v);
|
float d = RcVec3f.Perp2D(u, v);
|
||||||
if (Math.Abs(d) < 1e-6f)
|
if (MathF.Abs(d) < 1e-6f)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
d = 1.0f / d;
|
d = 1.0f / d;
|
||||||
|
@ -376,8 +376,8 @@ namespace DotRecast.Detour.Crowd
|
||||||
RcVec3f DtRotate2D(float[] v, float ang)
|
RcVec3f DtRotate2D(float[] v, float ang)
|
||||||
{
|
{
|
||||||
RcVec3f dest = new RcVec3f();
|
RcVec3f dest = new RcVec3f();
|
||||||
float c = (float)Math.Cos(ang);
|
float c = MathF.Cos(ang);
|
||||||
float s = (float)Math.Sin(ang);
|
float s = MathF.Sin(ang);
|
||||||
dest.X = v[0] * c - v[2] * s;
|
dest.X = v[0] * c - v[2] * s;
|
||||||
dest.Z = v[0] * s + v[2] * c;
|
dest.Z = v[0] * s + v[2] * c;
|
||||||
dest.Y = v[1];
|
dest.Y = v[1];
|
||||||
|
@ -412,8 +412,8 @@ namespace DotRecast.Detour.Crowd
|
||||||
int nd = Math.Clamp(ndivs, 1, DT_MAX_PATTERN_DIVS);
|
int nd = Math.Clamp(ndivs, 1, DT_MAX_PATTERN_DIVS);
|
||||||
int nr = Math.Clamp(nrings, 1, DT_MAX_PATTERN_RINGS);
|
int nr = Math.Clamp(nrings, 1, DT_MAX_PATTERN_RINGS);
|
||||||
float da = (1.0f / nd) * DT_PI * 2;
|
float da = (1.0f / nd) * DT_PI * 2;
|
||||||
float ca = (float)Math.Cos(da);
|
float ca = MathF.Cos(da);
|
||||||
float sa = (float)Math.Sin(da);
|
float sa = MathF.Sin(da);
|
||||||
|
|
||||||
// desired direction
|
// desired direction
|
||||||
float[] ddir = new float[6];
|
float[] ddir = new float[6];
|
||||||
|
|
|
@ -62,10 +62,10 @@ namespace DotRecast.Detour.Crowd
|
||||||
|
|
||||||
public void AddItem(DtCrowdAgent agent, float minx, float miny, float maxx, float maxy)
|
public void AddItem(DtCrowdAgent agent, float minx, float miny, float maxx, float maxy)
|
||||||
{
|
{
|
||||||
int iminx = (int)Math.Floor(minx * _invCellSize);
|
int iminx = (int)MathF.Floor(minx * _invCellSize);
|
||||||
int iminy = (int)Math.Floor(miny * _invCellSize);
|
int iminy = (int)MathF.Floor(miny * _invCellSize);
|
||||||
int imaxx = (int)Math.Floor(maxx * _invCellSize);
|
int imaxx = (int)MathF.Floor(maxx * _invCellSize);
|
||||||
int imaxy = (int)Math.Floor(maxy * _invCellSize);
|
int imaxy = (int)MathF.Floor(maxy * _invCellSize);
|
||||||
|
|
||||||
for (int y = iminy; y <= imaxy; ++y)
|
for (int y = iminy; y <= imaxy; ++y)
|
||||||
{
|
{
|
||||||
|
@ -86,10 +86,10 @@ namespace DotRecast.Detour.Crowd
|
||||||
// 해당 셀 사이즈의 크기로 x ~ y 영역을 찾아, 군집 에이전트를 가져오는 코드
|
// 해당 셀 사이즈의 크기로 x ~ y 영역을 찾아, 군집 에이전트를 가져오는 코드
|
||||||
public int QueryItems(float minx, float miny, float maxx, float maxy, ref HashSet<DtCrowdAgent> result)
|
public int QueryItems(float minx, float miny, float maxx, float maxy, ref HashSet<DtCrowdAgent> result)
|
||||||
{
|
{
|
||||||
int iminx = (int)Math.Floor(minx * _invCellSize);
|
int iminx = (int)MathF.Floor(minx * _invCellSize);
|
||||||
int iminy = (int)Math.Floor(miny * _invCellSize);
|
int iminy = (int)MathF.Floor(miny * _invCellSize);
|
||||||
int imaxx = (int)Math.Floor(maxx * _invCellSize);
|
int imaxx = (int)MathF.Floor(maxx * _invCellSize);
|
||||||
int imaxy = (int)Math.Floor(maxy * _invCellSize);
|
int imaxy = (int)MathF.Floor(maxy * _invCellSize);
|
||||||
|
|
||||||
for (int y = iminy; y <= imaxy; ++y)
|
for (int y = iminy; y <= imaxy; ++y)
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,7 +65,7 @@ namespace DotRecast.Detour.Dynamic.Colliders
|
||||||
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
||||||
{
|
{
|
||||||
RcFilledVolumeRasterization.RasterizeBox(
|
RcFilledVolumeRasterization.RasterizeBox(
|
||||||
hf, center, halfEdges, area, (int)Math.Floor(flagMergeThreshold / hf.ch), telemetry);
|
hf, center, halfEdges, area, (int)MathF.Floor(flagMergeThreshold / hf.ch), telemetry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RcVec3f[] GetHalfEdges(RcVec3f up, RcVec3f forward, RcVec3f extent)
|
public static RcVec3f[] GetHalfEdges(RcVec3f up, RcVec3f forward, RcVec3f extent)
|
||||||
|
|
|
@ -40,7 +40,7 @@ namespace DotRecast.Detour.Dynamic.Colliders
|
||||||
|
|
||||||
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
||||||
{
|
{
|
||||||
RcFilledVolumeRasterization.RasterizeCapsule(hf, start, end, radius, area, (int)Math.Floor(flagMergeThreshold / hf.ch), telemetry);
|
RcFilledVolumeRasterization.RasterizeCapsule(hf, start, end, radius, area, (int)MathF.Floor(flagMergeThreshold / hf.ch), telemetry);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static float[] Bounds(RcVec3f start, RcVec3f end, float radius)
|
private static float[] Bounds(RcVec3f start, RcVec3f end, float radius)
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace DotRecast.Detour.Dynamic.Colliders
|
||||||
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
||||||
{
|
{
|
||||||
RcFilledVolumeRasterization.RasterizeConvex(hf, vertices, triangles, area,
|
RcFilledVolumeRasterization.RasterizeConvex(hf, vertices, triangles, area,
|
||||||
(int)Math.Floor(flagMergeThreshold / hf.ch), telemetry);
|
(int)MathF.Floor(flagMergeThreshold / hf.ch), telemetry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -40,7 +40,7 @@ namespace DotRecast.Detour.Dynamic.Colliders
|
||||||
|
|
||||||
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
||||||
{
|
{
|
||||||
RcFilledVolumeRasterization.RasterizeCylinder(hf, start, end, radius, area, (int)Math.Floor(flagMergeThreshold / hf.ch),
|
RcFilledVolumeRasterization.RasterizeCylinder(hf, start, end, radius, area, (int)MathF.Floor(flagMergeThreshold / hf.ch),
|
||||||
telemetry);
|
telemetry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ namespace DotRecast.Detour.Dynamic.Colliders
|
||||||
|
|
||||||
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
public override void Rasterize(RcHeightfield hf, RcTelemetry telemetry)
|
||||||
{
|
{
|
||||||
RcFilledVolumeRasterization.RasterizeSphere(hf, center, radius, area, (int)Math.Floor(flagMergeThreshold / hf.ch),
|
RcFilledVolumeRasterization.RasterizeSphere(hf, center, radius, area, (int)MathF.Floor(flagMergeThreshold / hf.ch),
|
||||||
telemetry);
|
telemetry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ namespace DotRecast.Detour.Dynamic.Colliders
|
||||||
for (int i = 0; i < triangles.Length; i += 3)
|
for (int i = 0; i < triangles.Length; i += 3)
|
||||||
{
|
{
|
||||||
RcRasterizations.RasterizeTriangle(hf, vertices, triangles[i], triangles[i + 1], triangles[i + 2], area,
|
RcRasterizations.RasterizeTriangle(hf, vertices, triangles[i], triangles[i + 1], triangles[i + 2], area,
|
||||||
(int)Math.Floor(flagMergeThreshold / hf.ch), telemetry);
|
(int)MathF.Floor(flagMergeThreshold / hf.ch), telemetry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,10 +189,10 @@ namespace DotRecast.Detour.Dynamic
|
||||||
return _tiles.Values;
|
return _tiles.Values;
|
||||||
}
|
}
|
||||||
|
|
||||||
int minx = (int)Math.Floor((bounds[0] - navMeshParams.orig.X) / navMeshParams.tileWidth);
|
int minx = (int)MathF.Floor((bounds[0] - navMeshParams.orig.X) / navMeshParams.tileWidth);
|
||||||
int minz = (int)Math.Floor((bounds[2] - navMeshParams.orig.Z) / navMeshParams.tileHeight);
|
int minz = (int)MathF.Floor((bounds[2] - navMeshParams.orig.Z) / navMeshParams.tileHeight);
|
||||||
int maxx = (int)Math.Floor((bounds[3] - navMeshParams.orig.X) / navMeshParams.tileWidth);
|
int maxx = (int)MathF.Floor((bounds[3] - navMeshParams.orig.X) / navMeshParams.tileWidth);
|
||||||
int maxz = (int)Math.Floor((bounds[5] - navMeshParams.orig.Z) / navMeshParams.tileHeight);
|
int maxz = (int)MathF.Floor((bounds[5] - navMeshParams.orig.Z) / navMeshParams.tileHeight);
|
||||||
List<DtDynamicTile> tiles = new List<DtDynamicTile>();
|
List<DtDynamicTile> tiles = new List<DtDynamicTile>();
|
||||||
for (int z = minz; z <= maxz; ++z)
|
for (int z = minz; z <= maxz; ++z)
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,10 +57,10 @@ namespace DotRecast.Detour.Dynamic
|
||||||
{
|
{
|
||||||
float relStartX = start.X - origin.X;
|
float relStartX = start.X - origin.X;
|
||||||
float relStartZ = start.Z - origin.Z;
|
float relStartZ = start.Z - origin.Z;
|
||||||
int sx = (int)Math.Floor(relStartX / tileWidth);
|
int sx = (int)MathF.Floor(relStartX / tileWidth);
|
||||||
int sz = (int)Math.Floor(relStartZ / tileDepth);
|
int sz = (int)MathF.Floor(relStartZ / tileDepth);
|
||||||
int ex = (int)Math.Floor((end.X - origin.X) / tileWidth);
|
int ex = (int)MathF.Floor((end.X - origin.X) / tileWidth);
|
||||||
int ez = (int)Math.Floor((end.Z - origin.Z) / tileDepth);
|
int ez = (int)MathF.Floor((end.Z - origin.Z) / tileDepth);
|
||||||
int dx = ex - sx;
|
int dx = ex - sx;
|
||||||
int dz = ez - sz;
|
int dz = ez - sz;
|
||||||
int stepX = dx < 0 ? -1 : 1;
|
int stepX = dx < 0 ? -1 : 1;
|
||||||
|
@ -69,10 +69,10 @@ namespace DotRecast.Detour.Dynamic
|
||||||
float zRem = (tileDepth + (relStartZ % tileDepth)) % tileDepth;
|
float zRem = (tileDepth + (relStartZ % tileDepth)) % tileDepth;
|
||||||
float tx = end.X - start.X;
|
float tx = end.X - start.X;
|
||||||
float tz = end.Z - start.Z;
|
float tz = end.Z - start.Z;
|
||||||
float xOffest = Math.Abs(tx < 0 ? xRem : tileWidth - xRem);
|
float xOffest = MathF.Abs(tx < 0 ? xRem : tileWidth - xRem);
|
||||||
float zOffest = Math.Abs(tz < 0 ? zRem : tileDepth - zRem);
|
float zOffest = MathF.Abs(tz < 0 ? zRem : tileDepth - zRem);
|
||||||
tx = Math.Abs(tx);
|
tx = MathF.Abs(tx);
|
||||||
tz = Math.Abs(tz);
|
tz = MathF.Abs(tz);
|
||||||
float tMaxX = xOffest / tx;
|
float tMaxX = xOffest / tx;
|
||||||
float tMaxZ = zOffest / tz;
|
float tMaxZ = zOffest / tz;
|
||||||
float tDeltaX = tileWidth / tx;
|
float tDeltaX = tileWidth / tx;
|
||||||
|
@ -120,20 +120,20 @@ namespace DotRecast.Detour.Dynamic
|
||||||
float[] exit = { start.X + tMax * tx, start.Y + tMax * ty, start.Z + tMax * tz };
|
float[] exit = { start.X + tMax * tx, start.Y + tMax * ty, start.Z + tMax * tz };
|
||||||
float relStartX = entry[0] - hf.bmin.X;
|
float relStartX = entry[0] - hf.bmin.X;
|
||||||
float relStartZ = entry[2] - hf.bmin.Z;
|
float relStartZ = entry[2] - hf.bmin.Z;
|
||||||
int sx = (int)Math.Floor(relStartX / hf.cs);
|
int sx = (int)MathF.Floor(relStartX / hf.cs);
|
||||||
int sz = (int)Math.Floor(relStartZ / hf.cs);
|
int sz = (int)MathF.Floor(relStartZ / hf.cs);
|
||||||
int ex = (int)Math.Floor((exit[0] - hf.bmin.X) / hf.cs);
|
int ex = (int)MathF.Floor((exit[0] - hf.bmin.X) / hf.cs);
|
||||||
int ez = (int)Math.Floor((exit[2] - hf.bmin.Z) / hf.cs);
|
int ez = (int)MathF.Floor((exit[2] - hf.bmin.Z) / hf.cs);
|
||||||
int dx = ex - sx;
|
int dx = ex - sx;
|
||||||
int dz = ez - sz;
|
int dz = ez - sz;
|
||||||
int stepX = dx < 0 ? -1 : 1;
|
int stepX = dx < 0 ? -1 : 1;
|
||||||
int stepZ = dz < 0 ? -1 : 1;
|
int stepZ = dz < 0 ? -1 : 1;
|
||||||
float xRem = (hf.cs + (relStartX % hf.cs)) % hf.cs;
|
float xRem = (hf.cs + (relStartX % hf.cs)) % hf.cs;
|
||||||
float zRem = (hf.cs + (relStartZ % hf.cs)) % hf.cs;
|
float zRem = (hf.cs + (relStartZ % hf.cs)) % hf.cs;
|
||||||
float xOffest = Math.Abs(tx < 0 ? xRem : hf.cs - xRem);
|
float xOffest = MathF.Abs(tx < 0 ? xRem : hf.cs - xRem);
|
||||||
float zOffest = Math.Abs(tz < 0 ? zRem : hf.cs - zRem);
|
float zOffest = MathF.Abs(tz < 0 ? zRem : hf.cs - zRem);
|
||||||
tx = Math.Abs(tx);
|
tx = MathF.Abs(tx);
|
||||||
tz = Math.Abs(tz);
|
tz = MathF.Abs(tz);
|
||||||
float tMaxX = xOffest / tx;
|
float tMaxX = xOffest / tx;
|
||||||
float tMaxZ = zOffest / tz;
|
float tMaxZ = zOffest / tz;
|
||||||
float tDeltaX = hf.cs / tx;
|
float tDeltaX = hf.cs / tx;
|
||||||
|
|
|
@ -64,7 +64,7 @@ namespace DotRecast.Detour.Extras
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
if (Math.Abs(verts[3 * v + i] - verts2[3 * v2 + 1]) > float.Epsilon)
|
if (MathF.Abs(verts[3 * v + i] - verts2[3 * v2 + 1]) > float.Epsilon)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace DotRecast.Detour.Extras.Jumplink
|
||||||
{
|
{
|
||||||
float cs = acfg.cellSize;
|
float cs = acfg.cellSize;
|
||||||
float dist = MathF.Sqrt(RcVec3f.Dist2DSqr(es.start.p, es.start.q));
|
float dist = MathF.Sqrt(RcVec3f.Dist2DSqr(es.start.p, es.start.q));
|
||||||
int ngsamples = Math.Max(2, (int)Math.Ceiling(dist / cs));
|
int ngsamples = Math.Max(2, (int)MathF.Ceiling(dist / cs));
|
||||||
|
|
||||||
SampleGroundSegment(heightFunc, es.start, ngsamples);
|
SampleGroundSegment(heightFunc, es.start, ngsamples);
|
||||||
foreach (GroundSegment end in es.end)
|
foreach (GroundSegment end in es.end)
|
||||||
|
|
|
@ -36,7 +36,7 @@ namespace DotRecast.Detour.Extras.Jumplink
|
||||||
|
|
||||||
float dx = acfg.endDistance - 2 * acfg.agentRadius;
|
float dx = acfg.endDistance - 2 * acfg.agentRadius;
|
||||||
float cs = acfg.cellSize;
|
float cs = acfg.cellSize;
|
||||||
int nsamples = Math.Max(2, (int)Math.Ceiling(dx / cs));
|
int nsamples = Math.Max(2, (int)MathF.Ceiling(dx / cs));
|
||||||
|
|
||||||
for (int j = 0; j < nsamples; ++j)
|
for (int j = 0; j < nsamples; ++j)
|
||||||
{
|
{
|
||||||
|
|
|
@ -121,7 +121,7 @@ namespace DotRecast.Detour.Extras.Jumplink
|
||||||
private void AddNeighbour(EdgeSampler es, Queue<int[]> queue, float agentClimb, float h, int i, int j)
|
private void AddNeighbour(EdgeSampler es, Queue<int[]> queue, float agentClimb, float h, int i, int j)
|
||||||
{
|
{
|
||||||
GroundSample q = es.end[j].gsamples[i];
|
GroundSample q = es.end[j].gsamples[i];
|
||||||
if (q.validTrajectory && Math.Abs(q.p.Y - h) < agentClimb)
|
if (q.validTrajectory && MathF.Abs(q.p.Y - h) < agentClimb)
|
||||||
{
|
{
|
||||||
queue.Enqueue(new int[] { i, j });
|
queue.Enqueue(new int[] { i, j });
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,8 @@ namespace DotRecast.Detour.Extras.Jumplink
|
||||||
private bool SampleTrajectory(JumpLinkBuilderConfig acfg, RcHeightfield solid, RcVec3f pa, RcVec3f pb, Trajectory tra)
|
private bool SampleTrajectory(JumpLinkBuilderConfig acfg, RcHeightfield solid, RcVec3f pa, RcVec3f pb, Trajectory tra)
|
||||||
{
|
{
|
||||||
float cs = Math.Min(acfg.cellSize, acfg.cellHeight);
|
float cs = Math.Min(acfg.cellSize, acfg.cellHeight);
|
||||||
float d = RcVec3f.Dist2D(pa, pb) + Math.Abs(pa.Y - pb.Y);
|
float d = RcVec3f.Dist2D(pa, pb) + MathF.Abs(pa.Y - pb.Y);
|
||||||
int nsamples = Math.Max(2, (int)Math.Ceiling(d / cs));
|
int nsamples = Math.Max(2, (int)MathF.Ceiling(d / cs));
|
||||||
for (int i = 0; i < nsamples; ++i)
|
for (int i = 0; i < nsamples; ++i)
|
||||||
{
|
{
|
||||||
float u = (float)i / (float)(nsamples - 1);
|
float u = (float)i / (float)(nsamples - 1);
|
||||||
|
@ -57,8 +57,8 @@ namespace DotRecast.Detour.Extras.Jumplink
|
||||||
float cs = solid.cs;
|
float cs = solid.cs;
|
||||||
float ch = solid.ch;
|
float ch = solid.ch;
|
||||||
RcVec3f orig = solid.bmin;
|
RcVec3f orig = solid.bmin;
|
||||||
int ix = (int)Math.Floor((x - orig.X) / cs);
|
int ix = (int)MathF.Floor((x - orig.X) / cs);
|
||||||
int iz = (int)Math.Floor((z - orig.Z) / cs);
|
int iz = (int)MathF.Floor((z - orig.Z) / cs);
|
||||||
|
|
||||||
if (ix < 0 || iz < 0 || ix > w || iz > h)
|
if (ix < 0 || iz < 0 || ix > w || iz > h)
|
||||||
{
|
{
|
||||||
|
|
|
@ -377,8 +377,8 @@ namespace DotRecast.Detour.TileCache
|
||||||
ob.type = DtTileCacheObstacleType.ORIENTED_BOX;
|
ob.type = DtTileCacheObstacleType.ORIENTED_BOX;
|
||||||
ob.center = center;
|
ob.center = center;
|
||||||
ob.extents = extents;
|
ob.extents = extents;
|
||||||
float coshalf = (float)Math.Cos(0.5f * yRadians);
|
float coshalf = MathF.Cos(0.5f * yRadians);
|
||||||
float sinhalf = (float)Math.Sin(-0.5f * yRadians);
|
float sinhalf = MathF.Sin(-0.5f * yRadians);
|
||||||
ob.rotAux[0] = coshalf * sinhalf;
|
ob.rotAux[0] = coshalf * sinhalf;
|
||||||
ob.rotAux[1] = coshalf * coshalf - 0.5f;
|
ob.rotAux[1] = coshalf * coshalf - 0.5f;
|
||||||
return AddObstacleRequest(ob).refs;
|
return AddObstacleRequest(ob).refs;
|
||||||
|
@ -442,10 +442,10 @@ namespace DotRecast.Detour.TileCache
|
||||||
List<long> results = new List<long>();
|
List<long> results = new List<long>();
|
||||||
float tw = m_params.width * m_params.cs;
|
float tw = m_params.width * m_params.cs;
|
||||||
float th = m_params.height * m_params.cs;
|
float th = m_params.height * m_params.cs;
|
||||||
int tx0 = (int)Math.Floor((bmin.X - m_params.orig.X) / tw);
|
int tx0 = (int)MathF.Floor((bmin.X - m_params.orig.X) / tw);
|
||||||
int tx1 = (int)Math.Floor((bmax.X - m_params.orig.X) / tw);
|
int tx1 = (int)MathF.Floor((bmax.X - m_params.orig.X) / tw);
|
||||||
int ty0 = (int)Math.Floor((bmin.Z - m_params.orig.Z) / th);
|
int ty0 = (int)MathF.Floor((bmin.Z - m_params.orig.Z) / th);
|
||||||
int ty1 = (int)Math.Floor((bmax.Z - m_params.orig.Z) / th);
|
int ty1 = (int)MathF.Floor((bmax.Z - m_params.orig.Z) / th);
|
||||||
for (int ty = ty0; ty <= ty1; ++ty)
|
for (int ty = ty0; ty <= ty1; ++ty)
|
||||||
{
|
{
|
||||||
for (int tx = tx0; tx <= tx1; ++tx)
|
for (int tx = tx0; tx <= tx1; ++tx)
|
||||||
|
|
|
@ -259,7 +259,7 @@ namespace DotRecast.Detour.TileCache
|
||||||
{
|
{
|
||||||
if (layer.areas[ia] != layer.areas[ib])
|
if (layer.areas[ia] != layer.areas[ib])
|
||||||
return false;
|
return false;
|
||||||
if (Math.Abs(layer.heights[ia] - layer.heights[ib]) > walkableClimb)
|
if (MathF.Abs(layer.heights[ia] - layer.heights[ib]) > walkableClimb)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -606,7 +606,7 @@ namespace DotRecast.Detour.TileCache
|
||||||
{
|
{
|
||||||
int idx = px + pz * w;
|
int idx = px + pz * w;
|
||||||
int lh = layer.heights[idx];
|
int lh = layer.heights[idx];
|
||||||
if (Math.Abs(lh - y) <= walkableClimb && layer.areas[idx] != DT_TILECACHE_NULL_AREA)
|
if (MathF.Abs(lh - y) <= walkableClimb && layer.areas[idx] != DT_TILECACHE_NULL_AREA)
|
||||||
{
|
{
|
||||||
height = Math.Max(height, (char)lh);
|
height = Math.Max(height, (char)lh);
|
||||||
portal &= (layer.cons[idx] >> 4);
|
portal &= (layer.cons[idx] >> 4);
|
||||||
|
@ -727,7 +727,7 @@ namespace DotRecast.Detour.TileCache
|
||||||
while (i != DT_TILECACHE_NULL_IDX)
|
while (i != DT_TILECACHE_NULL_IDX)
|
||||||
{
|
{
|
||||||
int tv = i * 3;
|
int tv = i * 3;
|
||||||
if (verts[tv] == x && verts[tv + 2] == z && (Math.Abs(verts[tv + 1] - y) <= 2))
|
if (verts[tv] == x && verts[tv + 2] == z && (MathF.Abs(verts[tv + 1] - y) <= 2))
|
||||||
return i;
|
return i;
|
||||||
i = nextVert[i]; // next
|
i = nextVert[i]; // next
|
||||||
}
|
}
|
||||||
|
@ -1821,12 +1821,12 @@ namespace DotRecast.Detour.TileCache
|
||||||
float px = (pos.X - orig.X) * ics;
|
float px = (pos.X - orig.X) * ics;
|
||||||
float pz = (pos.Z - orig.Z) * ics;
|
float pz = (pos.Z - orig.Z) * ics;
|
||||||
|
|
||||||
int minx = (int)Math.Floor((bmin.X - orig.X) * ics);
|
int minx = (int)MathF.Floor((bmin.X - orig.X) * ics);
|
||||||
int miny = (int)Math.Floor((bmin.Y - orig.Y) * ich);
|
int miny = (int)MathF.Floor((bmin.Y - orig.Y) * ich);
|
||||||
int minz = (int)Math.Floor((bmin.Z - orig.Z) * ics);
|
int minz = (int)MathF.Floor((bmin.Z - orig.Z) * ics);
|
||||||
int maxx = (int)Math.Floor((bmax.X - orig.X) * ics);
|
int maxx = (int)MathF.Floor((bmax.X - orig.X) * ics);
|
||||||
int maxy = (int)Math.Floor((bmax.Y - orig.Y) * ich);
|
int maxy = (int)MathF.Floor((bmax.Y - orig.Y) * ich);
|
||||||
int maxz = (int)Math.Floor((bmax.Z - orig.Z) * ics);
|
int maxz = (int)MathF.Floor((bmax.Z - orig.Z) * ics);
|
||||||
|
|
||||||
if (maxx < 0)
|
if (maxx < 0)
|
||||||
return;
|
return;
|
||||||
|
@ -1869,12 +1869,12 @@ namespace DotRecast.Detour.TileCache
|
||||||
float ics = 1.0f / cs;
|
float ics = 1.0f / cs;
|
||||||
float ich = 1.0f / ch;
|
float ich = 1.0f / ch;
|
||||||
|
|
||||||
int minx = (int)Math.Floor((bmin.X - orig.X) * ics);
|
int minx = (int)MathF.Floor((bmin.X - orig.X) * ics);
|
||||||
int miny = (int)Math.Floor((bmin.Y - orig.Y) * ich);
|
int miny = (int)MathF.Floor((bmin.Y - orig.Y) * ich);
|
||||||
int minz = (int)Math.Floor((bmin.Z - orig.Z) * ics);
|
int minz = (int)MathF.Floor((bmin.Z - orig.Z) * ics);
|
||||||
int maxx = (int)Math.Floor((bmax.X - orig.X) * ics);
|
int maxx = (int)MathF.Floor((bmax.X - orig.X) * ics);
|
||||||
int maxy = (int)Math.Floor((bmax.Y - orig.Y) * ich);
|
int maxy = (int)MathF.Floor((bmax.Y - orig.Y) * ich);
|
||||||
int maxz = (int)Math.Floor((bmax.Z - orig.Z) * ics);
|
int maxz = (int)MathF.Floor((bmax.Z - orig.Z) * ics);
|
||||||
|
|
||||||
if (maxx < 0)
|
if (maxx < 0)
|
||||||
return;
|
return;
|
||||||
|
@ -2002,12 +2002,12 @@ namespace DotRecast.Detour.TileCache
|
||||||
float cz = (center.Z - orig.Z) * ics;
|
float cz = (center.Z - orig.Z) * ics;
|
||||||
|
|
||||||
float maxr = 1.41f * Math.Max(extents.X, extents.Z);
|
float maxr = 1.41f * Math.Max(extents.X, extents.Z);
|
||||||
int minx = (int)Math.Floor(cx - maxr * ics);
|
int minx = (int)MathF.Floor(cx - maxr * ics);
|
||||||
int maxx = (int)Math.Floor(cx + maxr * ics);
|
int maxx = (int)MathF.Floor(cx + maxr * ics);
|
||||||
int minz = (int)Math.Floor(cz - maxr * ics);
|
int minz = (int)MathF.Floor(cz - maxr * ics);
|
||||||
int maxz = (int)Math.Floor(cz + maxr * ics);
|
int maxz = (int)MathF.Floor(cz + maxr * ics);
|
||||||
int miny = (int)Math.Floor((center.Y - extents.Y - orig.Y) * ich);
|
int miny = (int)MathF.Floor((center.Y - extents.Y - orig.Y) * ich);
|
||||||
int maxy = (int)Math.Floor((center.Y + extents.Y - orig.Y) * ich);
|
int maxy = (int)MathF.Floor((center.Y + extents.Y - orig.Y) * ich);
|
||||||
|
|
||||||
if (maxx < 0)
|
if (maxx < 0)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -64,7 +64,7 @@ namespace DotRecast.Detour
|
||||||
float cross = B.X * A.Z - A.X * B.Z; // TriArea2D({0, 0}, A, B);
|
float cross = B.X * A.Z - A.X * B.Z; // TriArea2D({0, 0}, A, B);
|
||||||
float aHB = DtUtils.TriArea2D(b1, b, a);
|
float aHB = DtUtils.TriArea2D(b1, b, a);
|
||||||
float bHA = DtUtils.TriArea2D(a1, a, b);
|
float bHA = DtUtils.TriArea2D(a1, a, b);
|
||||||
if (Math.Abs(cross) < EPSILON)
|
if (MathF.Abs(cross) < EPSILON)
|
||||||
{
|
{
|
||||||
cross = 0f;
|
cross = 0f;
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ namespace DotRecast.Detour
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
/* Special case: A & B collinear. */
|
/* Special case: A & B collinear. */
|
||||||
else if (parallel && Math.Abs(aHB) < EPSILON && Math.Abs(bHA) < EPSILON)
|
else if (parallel && MathF.Abs(aHB) < EPSILON && MathF.Abs(bHA) < EPSILON)
|
||||||
{
|
{
|
||||||
/* Advance but do not output point. */
|
/* Advance but do not output point. */
|
||||||
if (f == DtConvexConvexInFlag.Pin)
|
if (f == DtConvexConvexInFlag.Pin)
|
||||||
|
@ -276,7 +276,7 @@ namespace DotRecast.Detour
|
||||||
|
|
||||||
private static bool Between(RcVec3f a, RcVec3f b, RcVec3f c)
|
private static bool Between(RcVec3f a, RcVec3f b, RcVec3f c)
|
||||||
{
|
{
|
||||||
if (Math.Abs(a.X - b.X) > Math.Abs(a.Z - b.Z))
|
if (MathF.Abs(a.X - b.X) > MathF.Abs(a.Z - b.Z))
|
||||||
{
|
{
|
||||||
return ((a.X <= c.X) && (c.X <= b.X)) || ((a.X >= c.X) && (c.X >= b.X));
|
return ((a.X <= c.X) && (c.X <= b.X)) || ((a.X >= c.X) && (c.X >= b.X));
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace DotRecast.Detour
|
||||||
RcVec3f diff = RcVec3f.Subtract(_center, closestPtPoly);
|
RcVec3f diff = RcVec3f.Subtract(_center, closestPtPoly);
|
||||||
if (posOverPoly)
|
if (posOverPoly)
|
||||||
{
|
{
|
||||||
d = Math.Abs(diff.Y) - tile.data.header.walkableClimb;
|
d = MathF.Abs(diff.Y) - tile.data.header.walkableClimb;
|
||||||
d = d > 0 ? d * d : 0;
|
d = d > 0 ? d * d : 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -242,8 +242,8 @@ namespace DotRecast.Detour
|
||||||
*/
|
*/
|
||||||
public void CalcTileLoc(RcVec3f pos, out int tx, out int ty)
|
public void CalcTileLoc(RcVec3f pos, out int tx, out int ty)
|
||||||
{
|
{
|
||||||
tx = (int)Math.Floor((pos.X - m_orig.X) / m_tileWidth);
|
tx = (int)MathF.Floor((pos.X - m_orig.X) / m_tileWidth);
|
||||||
ty = (int)Math.Floor((pos.Z - m_orig.Z) / m_tileHeight);
|
ty = (int)MathF.Floor((pos.Z - m_orig.Z) / m_tileHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets the tile and polygon for the specified polygon reference.
|
/// Gets the tile and polygon for the specified polygon reference.
|
||||||
|
@ -779,8 +779,8 @@ namespace DotRecast.Detour
|
||||||
tmax = temp;
|
tmax = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
link.bmin = (int)Math.Round(Math.Clamp(tmin, 0.0f, 1.0f) * 255.0f);
|
link.bmin = (int)MathF.Round(Math.Clamp(tmin, 0.0f, 1.0f) * 255.0f);
|
||||||
link.bmax = (int)Math.Round(Math.Clamp(tmax, 0.0f, 1.0f) * 255.0f);
|
link.bmax = (int)MathF.Round(Math.Clamp(tmax, 0.0f, 1.0f) * 255.0f);
|
||||||
}
|
}
|
||||||
else if (dir == 2 || dir == 6)
|
else if (dir == 2 || dir == 6)
|
||||||
{
|
{
|
||||||
|
@ -795,8 +795,8 @@ namespace DotRecast.Detour
|
||||||
tmax = temp;
|
tmax = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
link.bmin = (int)Math.Round(Math.Clamp(tmin, 0.0f, 1.0f) * 255.0f);
|
link.bmin = (int)MathF.Round(Math.Clamp(tmin, 0.0f, 1.0f) * 255.0f);
|
||||||
link.bmax = (int)Math.Round(Math.Clamp(tmax, 0.0f, 1.0f) * 255.0f);
|
link.bmax = (int)MathF.Round(Math.Clamp(tmax, 0.0f, 1.0f) * 255.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -926,7 +926,7 @@ namespace DotRecast.Detour
|
||||||
int vd = poly.verts[(j + 1) % nv] * 3;
|
int vd = poly.verts[(j + 1) % nv] * 3;
|
||||||
float bpos = GetSlabCoord(tile.data.verts, vc, side);
|
float bpos = GetSlabCoord(tile.data.verts, vc, side);
|
||||||
// Segments are not close enough.
|
// Segments are not close enough.
|
||||||
if (Math.Abs(apos - bpos) > 0.01f)
|
if (MathF.Abs(apos - bpos) > 0.01f)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1372,7 +1372,7 @@ namespace DotRecast.Detour
|
||||||
RcVec3f diff = RcVec3f.Subtract(center, closestPtPoly);
|
RcVec3f diff = RcVec3f.Subtract(center, closestPtPoly);
|
||||||
if (posOverPoly)
|
if (posOverPoly)
|
||||||
{
|
{
|
||||||
d = Math.Abs(diff.Y) - tile.data.header.walkableClimb;
|
d = MathF.Abs(diff.Y) - tile.data.header.walkableClimb;
|
||||||
d = d > 0 ? d * d : 0;
|
d = d > 0 ? d * d : 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -23,8 +23,6 @@ using DotRecast.Core.Numerics;
|
||||||
|
|
||||||
namespace DotRecast.Detour
|
namespace DotRecast.Detour
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
public static class DtNavMeshBuilder
|
public static class DtNavMeshBuilder
|
||||||
{
|
{
|
||||||
const int MESH_NULL_IDX = 0xffff;
|
const int MESH_NULL_IDX = 0xffff;
|
||||||
|
@ -208,8 +206,8 @@ namespace DotRecast.Detour
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remap y
|
// Remap y
|
||||||
it.bmin[1] = (int)Math.Floor(it.bmin[1] * option.ch * quantFactor);
|
it.bmin[1] = (int)MathF.Floor(it.bmin[1] * option.ch * quantFactor);
|
||||||
it.bmax[1] = (int)Math.Ceiling(it.bmax[1] * option.ch * quantFactor);
|
it.bmax[1] = (int)MathF.Ceiling(it.bmax[1] * option.ch * quantFactor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ namespace DotRecast.Detour
|
||||||
float dx = v2.X - v1.X;
|
float dx = v2.X - v1.X;
|
||||||
float dy = v2.Y - v1.Y;
|
float dy = v2.Y - v1.Y;
|
||||||
float dz = v2.Z - v1.Z;
|
float dz = v2.Z - v1.Z;
|
||||||
return (dx * dx + dz * dz) < r * r && Math.Abs(dy) < h;
|
return (dx * dx + dz * dz) < r * r && MathF.Abs(dy) < h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -22,10 +22,10 @@ namespace DotRecast.Detour
|
||||||
var temp = new float[CIRCLE_SEGMENTS * 3];
|
var temp = new float[CIRCLE_SEGMENTS * 3];
|
||||||
for (int i = 0; i < CIRCLE_SEGMENTS; i++)
|
for (int i = 0; i < CIRCLE_SEGMENTS; i++)
|
||||||
{
|
{
|
||||||
double a = i * Math.PI * 2 / CIRCLE_SEGMENTS;
|
float a = i * MathF.PI * 2 / CIRCLE_SEGMENTS;
|
||||||
temp[3 * i] = (float)Math.Cos(a);
|
temp[3 * i] = MathF.Cos(a);
|
||||||
temp[3 * i + 1] = 0;
|
temp[3 * i + 1] = 0;
|
||||||
temp[3 * i + 2] = (float)-Math.Sin(a);
|
temp[3 * i + 2] = -MathF.Sin(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
return temp;
|
return temp;
|
||||||
|
|
|
@ -221,7 +221,7 @@ namespace DotRecast.Detour
|
||||||
|
|
||||||
// Compute scaled barycentric coordinates
|
// Compute scaled barycentric coordinates
|
||||||
float denom = v0.X * v1.Z - v0.Z * v1.X;
|
float denom = v0.X * v1.Z - v0.Z * v1.X;
|
||||||
if (Math.Abs(denom) < EPS)
|
if (MathF.Abs(denom) < EPS)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -364,7 +364,7 @@ namespace DotRecast.Detour
|
||||||
var diff = RcVec3f.Subtract(p0v, vpj);
|
var diff = RcVec3f.Subtract(p0v, vpj);
|
||||||
float n = RcVec3f.Perp2D(edge, diff);
|
float n = RcVec3f.Perp2D(edge, diff);
|
||||||
float d = RcVec3f.Perp2D(dir, edge);
|
float d = RcVec3f.Perp2D(dir, edge);
|
||||||
if (Math.Abs(d) < EPS)
|
if (MathF.Abs(d) < EPS)
|
||||||
{
|
{
|
||||||
// S is nearly parallel to this edge
|
// S is nearly parallel to this edge
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
|
@ -426,7 +426,7 @@ namespace DotRecast.Detour
|
||||||
RcVec3f v = RcVec3f.Subtract(bq, bp);
|
RcVec3f v = RcVec3f.Subtract(bq, bp);
|
||||||
RcVec3f w = RcVec3f.Subtract(ap, bp);
|
RcVec3f w = RcVec3f.Subtract(ap, bp);
|
||||||
float d = RcVec3f.PerpXZ(u, v);
|
float d = RcVec3f.PerpXZ(u, v);
|
||||||
if (Math.Abs(d) < 1e-6f)
|
if (MathF.Abs(d) < 1e-6f)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,9 +132,9 @@ public class DebugDraw
|
||||||
cylinderInit = true;
|
cylinderInit = true;
|
||||||
for (int i = 0; i < CYLINDER_NUM_SEG; ++i)
|
for (int i = 0; i < CYLINDER_NUM_SEG; ++i)
|
||||||
{
|
{
|
||||||
float a = (float)(i * Math.PI * 2 / CYLINDER_NUM_SEG);
|
float a = (float)(i * MathF.PI * 2 / CYLINDER_NUM_SEG);
|
||||||
cylinderDir[i * 2] = (float)Math.Cos(a);
|
cylinderDir[i * 2] = MathF.Cos(a);
|
||||||
cylinderDir[i * 2 + 1] = (float)Math.Sin(a);
|
cylinderDir[i * 2 + 1] = MathF.Sin(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -313,9 +313,9 @@ public class DebugDraw
|
||||||
circleInit = true;
|
circleInit = true;
|
||||||
for (int i = 0; i < CIRCLE_NUM_SEG; ++i)
|
for (int i = 0; i < CIRCLE_NUM_SEG; ++i)
|
||||||
{
|
{
|
||||||
float a = (float)(i * Math.PI * 2 / CIRCLE_NUM_SEG);
|
float a = (float)(i * MathF.PI * 2 / CIRCLE_NUM_SEG);
|
||||||
circeDir[i * 2] = (float)Math.Cos(a);
|
circeDir[i * 2] = MathF.Cos(a);
|
||||||
circeDir[i * 2 + 1] = (float)Math.Sin(a);
|
circeDir[i * 2 + 1] = MathF.Sin(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ public static class GLU
|
||||||
public static void GlhPerspectivef2(ref RcMatrix4x4f matrix, float fovyInDegrees, float aspectRatio, float znear, float zfar)
|
public static void GlhPerspectivef2(ref RcMatrix4x4f matrix, float fovyInDegrees, float aspectRatio, float znear, float zfar)
|
||||||
{
|
{
|
||||||
float ymax, xmax;
|
float ymax, xmax;
|
||||||
ymax = (float)(znear * Math.Tan(fovyInDegrees * Math.PI / 360.0));
|
ymax = (float)(znear * Math.Tan(fovyInDegrees * MathF.PI / 360.0));
|
||||||
xmax = ymax * aspectRatio;
|
xmax = ymax * aspectRatio;
|
||||||
GlhFrustumf2(ref matrix, -xmax, xmax, -ymax, ymax, znear, zfar);
|
GlhFrustumf2(ref matrix, -xmax, xmax, -ymax, ymax, znear, zfar);
|
||||||
}
|
}
|
||||||
|
@ -158,21 +158,21 @@ public static class GLU
|
||||||
r3[7] = 1.0f;
|
r3[7] = 1.0f;
|
||||||
r3[4] = r3[5] = r3[6] = 0.0f;
|
r3[4] = r3[5] = r3[6] = 0.0f;
|
||||||
/* choose pivot - or die */
|
/* choose pivot - or die */
|
||||||
if (Math.Abs(r3[0]) > Math.Abs(r2[0]))
|
if (MathF.Abs(r3[0]) > MathF.Abs(r2[0]))
|
||||||
{
|
{
|
||||||
float[] r = r2;
|
float[] r = r2;
|
||||||
r2 = r3;
|
r2 = r3;
|
||||||
r3 = r;
|
r3 = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.Abs(r2[0]) > Math.Abs(r1[0]))
|
if (MathF.Abs(r2[0]) > MathF.Abs(r1[0]))
|
||||||
{
|
{
|
||||||
float[] r = r2;
|
float[] r = r2;
|
||||||
r2 = r1;
|
r2 = r1;
|
||||||
r1 = r;
|
r1 = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.Abs(r1[0]) > Math.Abs(r0[0]))
|
if (MathF.Abs(r1[0]) > MathF.Abs(r0[0]))
|
||||||
{
|
{
|
||||||
float[] r = r1;
|
float[] r = r1;
|
||||||
r1 = r0;
|
r1 = r0;
|
||||||
|
@ -230,14 +230,14 @@ public static class GLU
|
||||||
}
|
}
|
||||||
|
|
||||||
/* choose pivot - or die */
|
/* choose pivot - or die */
|
||||||
if (Math.Abs(r3[1]) > Math.Abs(r2[1]))
|
if (MathF.Abs(r3[1]) > MathF.Abs(r2[1]))
|
||||||
{
|
{
|
||||||
float[] r = r2;
|
float[] r = r2;
|
||||||
r2 = r3;
|
r2 = r3;
|
||||||
r3 = r;
|
r3 = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.Abs(r2[1]) > Math.Abs(r1[1]))
|
if (MathF.Abs(r2[1]) > MathF.Abs(r1[1]))
|
||||||
{
|
{
|
||||||
float[] r = r2;
|
float[] r = r2;
|
||||||
r2 = r1;
|
r2 = r1;
|
||||||
|
@ -282,7 +282,7 @@ public static class GLU
|
||||||
}
|
}
|
||||||
|
|
||||||
/* choose pivot - or die */
|
/* choose pivot - or die */
|
||||||
if (Math.Abs(r3[2]) > Math.Abs(r2[2]))
|
if (MathF.Abs(r3[2]) > MathF.Abs(r2[2]))
|
||||||
{
|
{
|
||||||
float[] r = r2;
|
float[] r = r2;
|
||||||
r2 = r3;
|
r2 = r3;
|
||||||
|
|
|
@ -40,7 +40,7 @@ public class RecastDebugDraw : DebugDraw
|
||||||
public void DebugDrawTriMeshSlope(float[] verts, int[] tris, float[] normals, float walkableSlopeAngle,
|
public void DebugDrawTriMeshSlope(float[] verts, int[] tris, float[] normals, float walkableSlopeAngle,
|
||||||
float texScale)
|
float texScale)
|
||||||
{
|
{
|
||||||
float walkableThr = (float)Math.Cos(walkableSlopeAngle / 180.0f * Math.PI);
|
float walkableThr = MathF.Cos(walkableSlopeAngle / 180.0f * MathF.PI);
|
||||||
|
|
||||||
RcVec2f uva = RcVec2f.Zero;
|
RcVec2f uva = RcVec2f.Zero;
|
||||||
RcVec2f uvb = RcVec2f.Zero;
|
RcVec2f uvb = RcVec2f.Zero;
|
||||||
|
@ -70,12 +70,12 @@ public class RecastDebugDraw : DebugDraw
|
||||||
RcVec3f vc = new RcVec3f(verts[tris[i + 2] * 3], verts[tris[i + 2] * 3 + 1], verts[tris[i + 2] * 3 + 2]);
|
RcVec3f vc = new RcVec3f(verts[tris[i + 2] * 3], verts[tris[i + 2] * 3 + 1], verts[tris[i + 2] * 3 + 2]);
|
||||||
|
|
||||||
int ax = 0, ay = 0;
|
int ax = 0, ay = 0;
|
||||||
if (Math.Abs(norm.Y) > Math.Abs(norm[ax]))
|
if (MathF.Abs(norm.Y) > MathF.Abs(norm[ax]))
|
||||||
{
|
{
|
||||||
ax = 1;
|
ax = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.Abs(norm.Z) > Math.Abs(norm[ax]))
|
if (MathF.Abs(norm.Z) > MathF.Abs(norm[ax]))
|
||||||
{
|
{
|
||||||
ax = 2;
|
ax = 2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
|
||||||
vertices[vi++] = 0;
|
vertices[vi++] = 0;
|
||||||
for (int r = 0; r <= rings; r++)
|
for (int r = 0; r <= rings; r++)
|
||||||
{
|
{
|
||||||
double theta = Math.PI * (r + 1) / (rings + 2);
|
double theta = MathF.PI * (r + 1) / (rings + 2);
|
||||||
vi = GenerateRingVertices(segments, vertices, vi, theta);
|
vi = GenerateRingVertices(segments, vertices, vi, theta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
|
||||||
int vi = 0;
|
int vi = 0;
|
||||||
for (int r = 0; r < 4; r++)
|
for (int r = 0; r < 4; r++)
|
||||||
{
|
{
|
||||||
vi = GenerateRingVertices(segments, vertices, vi, Math.PI * 0.5);
|
vi = GenerateRingVertices(segments, vertices, vi, MathF.PI * 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
return vertices;
|
return vertices;
|
||||||
|
@ -63,7 +63,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
|
||||||
double sinTheta = Math.Sin(theta);
|
double sinTheta = Math.Sin(theta);
|
||||||
for (int p = 0; p <= segments; p++)
|
for (int p = 0; p <= segments; p++)
|
||||||
{
|
{
|
||||||
double phi = 2 * Math.PI * p / segments;
|
double phi = 2 * MathF.PI * p / segments;
|
||||||
double cosPhi = Math.Cos(phi);
|
double cosPhi = Math.Cos(phi);
|
||||||
double sinPhi = Math.Sin(phi);
|
double sinPhi = Math.Sin(phi);
|
||||||
vertices[vi++] = (float)(sinTheta * cosPhi);
|
vertices[vi++] = (float)(sinTheta * cosPhi);
|
||||||
|
|
|
@ -48,7 +48,7 @@ namespace DotRecast.Recast.Toolset.Tools
|
||||||
int th = (gh + ts - 1) / ts;
|
int th = (gh + ts - 1) / ts;
|
||||||
|
|
||||||
// Generation params.
|
// Generation params.
|
||||||
var walkableRadius = (int)Math.Ceiling(setting.agentRadius / setting.cellSize); // Reserve enough padding.
|
var walkableRadius = (int)MathF.Ceiling(setting.agentRadius / setting.cellSize); // Reserve enough padding.
|
||||||
RcConfig cfg = new RcConfig(
|
RcConfig cfg = new RcConfig(
|
||||||
true, setting.tileSize, setting.tileSize,
|
true, setting.tileSize, setting.tileSize,
|
||||||
walkableRadius + 3,
|
walkableRadius + 3,
|
||||||
|
|
|
@ -263,7 +263,7 @@ namespace DotRecast.Recast.Geom
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
if (Math.Abs(d.Get(i)) < EPSILON)
|
if (MathF.Abs(d.Get(i)) < EPSILON)
|
||||||
{
|
{
|
||||||
// Ray is parallel to slab. No hit if origin not within slab
|
// Ray is parallel to slab. No hit if origin not within slab
|
||||||
if (p.Get(i) < bmin.Get(i) || p.Get(i) > bmax.Get(i))
|
if (p.Get(i) < bmin.Get(i) || p.Get(i) > bmax.Get(i))
|
||||||
|
|
|
@ -122,7 +122,7 @@ namespace DotRecast.Recast
|
||||||
public static int[] MarkWalkableTriangles(RcTelemetry ctx, float walkableSlopeAngle, float[] verts, int[] tris, int nt, RcAreaModification areaMod)
|
public static int[] MarkWalkableTriangles(RcTelemetry ctx, float walkableSlopeAngle, float[] verts, int[] tris, int nt, RcAreaModification areaMod)
|
||||||
{
|
{
|
||||||
int[] areas = new int[nt];
|
int[] areas = new int[nt];
|
||||||
float walkableThr = (float)Math.Cos(walkableSlopeAngle / 180.0f * Math.PI);
|
float walkableThr = MathF.Cos(walkableSlopeAngle / 180.0f * MathF.PI);
|
||||||
RcVec3f norm = new RcVec3f();
|
RcVec3f norm = new RcVec3f();
|
||||||
for (int i = 0; i < nt; ++i)
|
for (int i = 0; i < nt; ++i)
|
||||||
{
|
{
|
||||||
|
@ -155,7 +155,7 @@ namespace DotRecast.Recast
|
||||||
/// @see rcHeightfield, rcClearUnwalkableTriangles, rcRasterizeTriangles
|
/// @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(RcTelemetry ctx, float walkableSlopeAngle, float[] verts, int nv, int[] tris, int nt, int[] areas)
|
||||||
{
|
{
|
||||||
float walkableThr = (float)Math.Cos(walkableSlopeAngle / 180.0f * Math.PI);
|
float walkableThr = MathF.Cos(walkableSlopeAngle / 180.0f * MathF.PI);
|
||||||
|
|
||||||
RcVec3f norm = new RcVec3f();
|
RcVec3f norm = new RcVec3f();
|
||||||
|
|
||||||
|
|
|
@ -137,7 +137,7 @@ namespace DotRecast.Recast
|
||||||
|
|
||||||
// Check that the gap between the spans is walkable,
|
// Check that the gap between the spans is walkable,
|
||||||
// and that the climb height between the gaps is not too high.
|
// and that the climb height between the gaps is not too high.
|
||||||
if ((top - bot) >= walkableHeight && Math.Abs(ns.y - s.y) <= walkableClimb)
|
if ((top - bot) >= walkableHeight && MathF.Abs(ns.y - s.y) <= walkableClimb)
|
||||||
{
|
{
|
||||||
// Mark direction as walkable.
|
// Mark direction as walkable.
|
||||||
int lidx = k - nc.index;
|
int lidx = k - nc.index;
|
||||||
|
|
|
@ -160,15 +160,15 @@ namespace DotRecast.Recast
|
||||||
Cs = cellSize;
|
Cs = cellSize;
|
||||||
Ch = cellHeight;
|
Ch = cellHeight;
|
||||||
WalkableSlopeAngle = agentMaxSlope;
|
WalkableSlopeAngle = agentMaxSlope;
|
||||||
WalkableHeight = (int)Math.Ceiling(agentHeight / Ch);
|
WalkableHeight = (int)MathF.Ceiling(agentHeight / Ch);
|
||||||
WalkableHeightWorld = agentHeight;
|
WalkableHeightWorld = agentHeight;
|
||||||
WalkableClimb = (int)Math.Floor(agentMaxClimb / Ch);
|
WalkableClimb = (int)MathF.Floor(agentMaxClimb / Ch);
|
||||||
WalkableClimbWorld = agentMaxClimb;
|
WalkableClimbWorld = agentMaxClimb;
|
||||||
WalkableRadius = (int)Math.Ceiling(agentRadius / Cs);
|
WalkableRadius = (int)MathF.Ceiling(agentRadius / Cs);
|
||||||
WalkableRadiusWorld = agentRadius;
|
WalkableRadiusWorld = agentRadius;
|
||||||
MinRegionArea = (int)Math.Round(minRegionArea / (Cs * Cs));
|
MinRegionArea = (int)MathF.Round(minRegionArea / (Cs * Cs));
|
||||||
MinRegionAreaWorld = minRegionArea;
|
MinRegionAreaWorld = minRegionArea;
|
||||||
MergeRegionArea = (int)Math.Round(mergeRegionArea / (Cs * Cs));
|
MergeRegionArea = (int)MathF.Round(mergeRegionArea / (Cs * Cs));
|
||||||
MergeRegionAreaWorld = mergeRegionArea;
|
MergeRegionAreaWorld = mergeRegionArea;
|
||||||
MaxEdgeLen = (int)(edgeMaxLen / cellSize);
|
MaxEdgeLen = (int)(edgeMaxLen / cellSize);
|
||||||
MaxEdgeLenWorld = edgeMaxLen;
|
MaxEdgeLenWorld = edgeMaxLen;
|
||||||
|
@ -185,7 +185,7 @@ namespace DotRecast.Recast
|
||||||
|
|
||||||
public static int CalcBorder(float agentRadius, float cs)
|
public static int CalcBorder(float agentRadius, float cs)
|
||||||
{
|
{
|
||||||
return 3 + (int)Math.Ceiling(agentRadius / cs);
|
return 3 + (int)MathF.Ceiling(agentRadius / cs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -217,8 +217,8 @@ namespace DotRecast.Recast
|
||||||
float[] h = intersection.Invoke(rectangle);
|
float[] h = intersection.Invoke(rectangle);
|
||||||
if (h != null)
|
if (h != null)
|
||||||
{
|
{
|
||||||
int smin = (int)Math.Floor((h[0] - hf.bmin.Y) * ich);
|
int smin = (int)MathF.Floor((h[0] - hf.bmin.Y) * ich);
|
||||||
int smax = (int)Math.Ceiling((h[1] - hf.bmin.Y) * ich);
|
int smax = (int)MathF.Ceiling((h[1] - hf.bmin.Y) * ich);
|
||||||
if (smin != smax)
|
if (smin != smax)
|
||||||
{
|
{
|
||||||
int ismin = Math.Clamp(smin, 0, SPAN_MAX_HEIGHT);
|
int ismin = Math.Clamp(smin, 0, SPAN_MAX_HEIGHT);
|
||||||
|
@ -433,7 +433,7 @@ namespace DotRecast.Recast
|
||||||
float a = dd - nd * nd;
|
float a = dd - nd * nd;
|
||||||
float k = RcVec3f.Dot(m, m) - radiusSqr;
|
float k = RcVec3f.Dot(m, m) - radiusSqr;
|
||||||
float c = dd * k - md * md;
|
float c = dd * k - md * md;
|
||||||
if (Math.Abs(a) < EPSILON)
|
if (MathF.Abs(a) < EPSILON)
|
||||||
{
|
{
|
||||||
// Segment runs parallel to cylinder axis
|
// Segment runs parallel to cylinder axis
|
||||||
if (c > 0.0f)
|
if (c > 0.0f)
|
||||||
|
@ -523,7 +523,7 @@ namespace DotRecast.Recast
|
||||||
point.Z = ((i & 2) == 0) ? rectangle[1] : rectangle[3];
|
point.Z = ((i & 2) == 0) ? rectangle[1] : rectangle[3];
|
||||||
for (int j = 0; j < 6; j++)
|
for (int j = 0; j < 6; j++)
|
||||||
{
|
{
|
||||||
if (Math.Abs(planes[j][1]) > EPSILON)
|
if (MathF.Abs(planes[j][1]) > EPSILON)
|
||||||
{
|
{
|
||||||
float dotNormalPoint = RcVecUtils.Dot(planes[j], point);
|
float dotNormalPoint = RcVecUtils.Dot(planes[j], point);
|
||||||
float t = (planes[j][3] - dotNormalPoint) / planes[j][1];
|
float t = (planes[j][3] - dotNormalPoint) / planes[j][1];
|
||||||
|
@ -562,7 +562,7 @@ namespace DotRecast.Recast
|
||||||
float dx = vertices[vj] - x;
|
float dx = vertices[vj] - x;
|
||||||
float dy = vertices[vj + 1] - y;
|
float dy = vertices[vj + 1] - y;
|
||||||
float dz = vertices[vj + 2] - z;
|
float dz = vertices[vj + 2] - z;
|
||||||
if (Math.Abs(dx) > EPSILON)
|
if (MathF.Abs(dx) > EPSILON)
|
||||||
{
|
{
|
||||||
if (XSlabSegmentIntersection(rectangle, x, y, z, dx, dy, dz, rectangle[0], out var iy))
|
if (XSlabSegmentIntersection(rectangle, x, y, z, dx, dy, dz, rectangle[0], out var iy))
|
||||||
{
|
{
|
||||||
|
@ -577,7 +577,7 @@ namespace DotRecast.Recast
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.Abs(dz) > EPSILON)
|
if (MathF.Abs(dz) > EPSILON)
|
||||||
{
|
{
|
||||||
if (ZSlabSegmentIntersection(rectangle, x, y, z, dx, dy, dz, rectangle[1], out var iy))
|
if (ZSlabSegmentIntersection(rectangle, x, y, z, dx, dy, dz, rectangle[1], out var iy))
|
||||||
{
|
{
|
||||||
|
@ -614,7 +614,7 @@ namespace DotRecast.Recast
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.Abs(planes[tri][1]) < EPSILON)
|
if (MathF.Abs(planes[tri][1]) < EPSILON)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -637,7 +637,7 @@ namespace DotRecast.Recast
|
||||||
float dx = verts[vj] - x;
|
float dx = verts[vj] - x;
|
||||||
float dy = verts[vj + 1] - y;
|
float dy = verts[vj + 1] - y;
|
||||||
float dz = verts[vj + 2] - z;
|
float dz = verts[vj + 2] - z;
|
||||||
if (Math.Abs(dx) > EPSILON)
|
if (MathF.Abs(dx) > EPSILON)
|
||||||
{
|
{
|
||||||
if (XSlabSegmentIntersection(rectangle, x, y, z, dx, dy, dz, rectangle[0], out var iy))
|
if (XSlabSegmentIntersection(rectangle, x, y, z, dx, dy, dz, rectangle[0], out var iy))
|
||||||
{
|
{
|
||||||
|
@ -652,7 +652,7 @@ namespace DotRecast.Recast
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Math.Abs(dz) > EPSILON)
|
if (MathF.Abs(dz) > EPSILON)
|
||||||
{
|
{
|
||||||
if (ZSlabSegmentIntersection(rectangle, x, y, z, dx, dy, dz, rectangle[1], out var iy))
|
if (ZSlabSegmentIntersection(rectangle, x, y, z, dx, dy, dz, rectangle[1], out var iy))
|
||||||
{
|
{
|
||||||
|
|
|
@ -61,7 +61,7 @@ namespace DotRecast.Recast
|
||||||
// span just below it, mark the span above it walkable too.
|
// span just below it, mark the span above it walkable too.
|
||||||
if (!walkable && previousWalkable)
|
if (!walkable && previousWalkable)
|
||||||
{
|
{
|
||||||
if (Math.Abs(s.smax - ps.smax) <= walkableClimb)
|
if (MathF.Abs(s.smax - ps.smax) <= walkableClimb)
|
||||||
s.area = previousArea;
|
s.area = previousArea;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ namespace DotRecast.Recast
|
||||||
minh = Math.Min(minh, nbot - bot);
|
minh = Math.Min(minh, nbot - bot);
|
||||||
|
|
||||||
// Find min/max accessible neighbour height.
|
// Find min/max accessible neighbour height.
|
||||||
if (Math.Abs(nbot - bot) <= walkableClimb)
|
if (MathF.Abs(nbot - bot) <= walkableClimb)
|
||||||
{
|
{
|
||||||
if (nbot < asmin)
|
if (nbot < asmin)
|
||||||
asmin = nbot;
|
asmin = nbot;
|
||||||
|
|
|
@ -165,7 +165,7 @@ namespace DotRecast.Recast
|
||||||
var v3 = RcVecUtils.Subtract(verts, p3, p1);
|
var v3 = RcVecUtils.Subtract(verts, p3, p1);
|
||||||
|
|
||||||
float cp = Vcross2(v1, v2, v3);
|
float cp = Vcross2(v1, v2, v3);
|
||||||
if (Math.Abs(cp) > EPS)
|
if (MathF.Abs(cp) > EPS)
|
||||||
{
|
{
|
||||||
float v1Sq = Vdot2(v1, v1);
|
float v1Sq = Vdot2(v1, v1);
|
||||||
float v2Sq = Vdot2(v2, v2);
|
float v2Sq = Vdot2(v2, v2);
|
||||||
|
@ -205,7 +205,7 @@ namespace DotRecast.Recast
|
||||||
if (u >= -EPS && v >= -EPS && (u + v) <= 1 + EPS)
|
if (u >= -EPS && v >= -EPS && (u + v) <= 1 + EPS)
|
||||||
{
|
{
|
||||||
float y = verts[a + 1] + v0.Y * u + v1.Y * v;
|
float y = verts[a + 1] + v0.Y * u + v1.Y * v;
|
||||||
return Math.Abs(y - p.Y);
|
return MathF.Abs(y - p.Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
return float.MaxValue;
|
return float.MaxValue;
|
||||||
|
@ -345,8 +345,8 @@ namespace DotRecast.Recast
|
||||||
private static int GetHeight(float fx, float fy, float fz, float cs, float ics, float ch, int radius,
|
private static int GetHeight(float fx, float fy, float fz, float cs, float ics, float ch, int radius,
|
||||||
RcHeightPatch hp)
|
RcHeightPatch hp)
|
||||||
{
|
{
|
||||||
int ix = (int)Math.Floor(fx * ics + 0.01f);
|
int ix = (int)MathF.Floor(fx * ics + 0.01f);
|
||||||
int iz = (int)Math.Floor(fz * ics + 0.01f);
|
int iz = (int)MathF.Floor(fz * ics + 0.01f);
|
||||||
ix = Math.Clamp(ix - hp.xmin, 0, hp.width - 1);
|
ix = Math.Clamp(ix - hp.xmin, 0, hp.width - 1);
|
||||||
iz = Math.Clamp(iz - hp.ymin, 0, hp.height - 1);
|
iz = Math.Clamp(iz - hp.ymin, 0, hp.height - 1);
|
||||||
int h = hp.data[ix + iz * hp.width];
|
int h = hp.data[ix + iz * hp.width];
|
||||||
|
@ -373,7 +373,7 @@ namespace DotRecast.Recast
|
||||||
int nh = hp.data[nx + nz * hp.width];
|
int nh = hp.data[nx + nz * hp.width];
|
||||||
if (nh != RC_UNSET_HEIGHT)
|
if (nh != RC_UNSET_HEIGHT)
|
||||||
{
|
{
|
||||||
float d = Math.Abs(nh * ch - fy);
|
float d = MathF.Abs(nh * ch - fy);
|
||||||
if (d < dmin)
|
if (d < dmin)
|
||||||
{
|
{
|
||||||
h = nh;
|
h = nh;
|
||||||
|
@ -865,7 +865,7 @@ namespace DotRecast.Recast
|
||||||
bool swapped = false;
|
bool swapped = false;
|
||||||
// Make sure the segments are always handled in same order
|
// Make sure the segments are always handled in same order
|
||||||
// using lexological sort or else there will be seams.
|
// using lexological sort or else there will be seams.
|
||||||
if (Math.Abs(@in[vj + 0] - @in[vi + 0]) < 1e-6f)
|
if (MathF.Abs(@in[vj + 0] - @in[vi + 0]) < 1e-6f)
|
||||||
{
|
{
|
||||||
if (@in[vj + 2] > @in[vi + 2])
|
if (@in[vj + 2] > @in[vi + 2])
|
||||||
{
|
{
|
||||||
|
@ -891,7 +891,7 @@ namespace DotRecast.Recast
|
||||||
float dy = @in[vi + 1] - @in[vj + 1];
|
float dy = @in[vi + 1] - @in[vj + 1];
|
||||||
float dz = @in[vi + 2] - @in[vj + 2];
|
float dz = @in[vi + 2] - @in[vj + 2];
|
||||||
float d = MathF.Sqrt(dx * dx + dz * dz);
|
float d = MathF.Sqrt(dx * dx + dz * dz);
|
||||||
int nn = 1 + (int)Math.Floor(d / sampleDist);
|
int nn = 1 + (int)MathF.Floor(d / sampleDist);
|
||||||
if (nn >= MAX_VERTS_PER_EDGE)
|
if (nn >= MAX_VERTS_PER_EDGE)
|
||||||
{
|
{
|
||||||
nn = MAX_VERTS_PER_EDGE - 1;
|
nn = MAX_VERTS_PER_EDGE - 1;
|
||||||
|
@ -1008,10 +1008,10 @@ namespace DotRecast.Recast
|
||||||
bmax.Max(@in, i * 3);
|
bmax.Max(@in, i * 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
int x0 = (int)Math.Floor(bmin.X / sampleDist);
|
int x0 = (int)MathF.Floor(bmin.X / sampleDist);
|
||||||
int x1 = (int)Math.Ceiling(bmax.X / sampleDist);
|
int x1 = (int)MathF.Ceiling(bmax.X / sampleDist);
|
||||||
int z0 = (int)Math.Floor(bmin.Z / sampleDist);
|
int z0 = (int)MathF.Floor(bmin.Z / sampleDist);
|
||||||
int z1 = (int)Math.Ceiling(bmax.Z / sampleDist);
|
int z1 = (int)MathF.Ceiling(bmax.Z / sampleDist);
|
||||||
samples.Clear();
|
samples.Clear();
|
||||||
for (int z = z0; z < z1; ++z)
|
for (int z = z0; z < z1; ++z)
|
||||||
{
|
{
|
||||||
|
@ -1433,7 +1433,7 @@ namespace DotRecast.Recast
|
||||||
float ch = mesh.ch;
|
float ch = mesh.ch;
|
||||||
RcVec3f orig = mesh.bmin;
|
RcVec3f orig = mesh.bmin;
|
||||||
int borderSize = mesh.borderSize;
|
int borderSize = mesh.borderSize;
|
||||||
int heightSearchRadius = (int)Math.Max(1, Math.Ceiling(mesh.maxEdgeError));
|
int heightSearchRadius = (int)Math.Max(1, MathF.Ceiling(mesh.maxEdgeError));
|
||||||
|
|
||||||
List<int> tris = new List<int>(512);
|
List<int> tris = new List<int>(512);
|
||||||
float[] verts = new float[256 * 3];
|
float[] verts = new float[256 * 3];
|
||||||
|
|
|
@ -134,7 +134,7 @@ namespace DotRecast.Recast
|
||||||
while (i != -1)
|
while (i != -1)
|
||||||
{
|
{
|
||||||
int v = i * 3;
|
int v = i * 3;
|
||||||
if (verts[v + 0] == x && (Math.Abs(verts[v + 1] - y) <= 2) && verts[v + 2] == z)
|
if (verts[v + 0] == x && (MathF.Abs(verts[v + 1] - y) <= 2) && verts[v + 2] == z)
|
||||||
return i;
|
return i;
|
||||||
i = nextVert[i]; // next
|
i = nextVert[i]; // next
|
||||||
}
|
}
|
||||||
|
@ -1259,13 +1259,13 @@ namespace DotRecast.Recast
|
||||||
{
|
{
|
||||||
RcPolyMesh pmesh = meshes[i];
|
RcPolyMesh pmesh = meshes[i];
|
||||||
|
|
||||||
int ox = (int)Math.Floor((pmesh.bmin.X - mesh.bmin.X) / mesh.cs + 0.5f);
|
int ox = (int)MathF.Floor((pmesh.bmin.X - mesh.bmin.X) / mesh.cs + 0.5f);
|
||||||
int oz = (int)Math.Floor((pmesh.bmin.Z - mesh.bmin.Z) / mesh.cs + 0.5f);
|
int oz = (int)MathF.Floor((pmesh.bmin.Z - mesh.bmin.Z) / mesh.cs + 0.5f);
|
||||||
|
|
||||||
bool isMinX = (ox == 0);
|
bool isMinX = (ox == 0);
|
||||||
bool isMinZ = (oz == 0);
|
bool isMinZ = (oz == 0);
|
||||||
bool isMaxX = (Math.Floor((mesh.bmax.X - pmesh.bmax.X) / mesh.cs + 0.5f)) == 0;
|
bool isMaxX = (MathF.Floor((mesh.bmax.X - pmesh.bmax.X) / mesh.cs + 0.5f)) == 0;
|
||||||
bool isMaxZ = (Math.Floor((mesh.bmax.Z - pmesh.bmax.Z) / mesh.cs + 0.5f)) == 0;
|
bool isMaxZ = (MathF.Floor((mesh.bmax.Z - pmesh.bmax.Z) / mesh.cs + 0.5f)) == 0;
|
||||||
bool isOnBorder = (isMinX || isMinZ || isMaxX || isMaxZ);
|
bool isOnBorder = (isMinX || isMinZ || isMaxX || isMaxZ);
|
||||||
|
|
||||||
for (int j = 0; j < pmesh.nverts; ++j)
|
for (int j = 0; j < pmesh.nverts; ++j)
|
||||||
|
|
|
@ -112,7 +112,7 @@ namespace DotRecast.Recast
|
||||||
s.smax = cur.smax;
|
s.smax = cur.smax;
|
||||||
|
|
||||||
// Merge flags.
|
// Merge flags.
|
||||||
if (Math.Abs(s.smax - cur.smax) <= flagMergeThreshold)
|
if (MathF.Abs(s.smax - cur.smax) <= flagMergeThreshold)
|
||||||
s.area = Math.Max(s.area, cur.area);
|
s.area = Math.Max(s.area, cur.area);
|
||||||
|
|
||||||
// Remove current span.
|
// Remove current span.
|
||||||
|
@ -343,8 +343,8 @@ namespace DotRecast.Recast
|
||||||
spanMax = by;
|
spanMax = by;
|
||||||
|
|
||||||
// Snap the span to the heightfield height grid.
|
// Snap the span to the heightfield height grid.
|
||||||
int spanMinCellIndex = Math.Clamp((int)Math.Floor(spanMin * inverseCellHeight), 0, SPAN_MAX_HEIGHT);
|
int spanMinCellIndex = Math.Clamp((int)MathF.Floor(spanMin * inverseCellHeight), 0, SPAN_MAX_HEIGHT);
|
||||||
int spanMaxCellIndex = Math.Clamp((int)Math.Ceiling(spanMax * inverseCellHeight), spanMinCellIndex + 1, SPAN_MAX_HEIGHT);
|
int spanMaxCellIndex = Math.Clamp((int)MathF.Ceiling(spanMax * inverseCellHeight), spanMinCellIndex + 1, SPAN_MAX_HEIGHT);
|
||||||
|
|
||||||
AddSpan(heightfield, x, z, spanMinCellIndex, spanMaxCellIndex, area, flagMergeThreshold);
|
AddSpan(heightfield, x, z, spanMinCellIndex, spanMaxCellIndex, area, flagMergeThreshold);
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ public class PolygonByCircleConstraintTest
|
||||||
float[] constrained = _constraint.Apply(polygon, center, 3);
|
float[] constrained = _constraint.Apply(polygon, center, 3);
|
||||||
|
|
||||||
Assert.That(constrained.Length, Is.EqualTo(expectedSize));
|
Assert.That(constrained.Length, Is.EqualTo(expectedSize));
|
||||||
Assert.That(constrained, Is.SupersetOf(new[] { -2f, 0f, -4f, -4f, 0f, 0f, -3.4641016f, 0.0f, 1.6076951f, -2.0f, 0.0f, 2.0f }));
|
Assert.That(constrained, Is.SupersetOf(new[] { -2f, 0f, -4f, -4f, 0f, 0f, -3.4641016f, 0.0f, 1.60769534f, -2.0f, 0.0f, 2.0f }));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -88,6 +88,6 @@ public class PolygonByCircleConstraintTest
|
||||||
float[] constrained = _constraint.Apply(polygon, center, 4);
|
float[] constrained = _constraint.Apply(polygon, center, 4);
|
||||||
|
|
||||||
Assert.That(constrained.Length, Is.EqualTo(expectedSize));
|
Assert.That(constrained.Length, Is.EqualTo(expectedSize));
|
||||||
Assert.That(constrained, Is.SupersetOf(new[] { 1.5358982f, 0f, 3f, 2f, 0f, 3f, 3f, 0f, -3f }));
|
Assert.That(constrained, Is.SupersetOf(new[] { 1.53589869f, 0f, 3f, 2f, 0f, 3f, 3f, 0f, -3f }));
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue