float[2] -> Vector2f

This commit is contained in:
ikpil 2023-05-25 23:27:32 +09:00
parent 3f72b8e916
commit 995c062a18
9 changed files with 71 additions and 107 deletions

View File

@ -83,9 +83,6 @@ namespace DotRecast.Core
}
/// @}
/// @name Computational geometry helper functions.
/// @{
@ -104,15 +101,6 @@ namespace DotRecast.Core
return acx * abz - abx * acz;
}
public static float TriArea2D(float[] a, float[] b, float[] c)
{
float abx = b[0] - a[0];
float abz = b[2] - a[2];
float acx = c[0] - a[0];
float acz = c[2] - a[2];
return acx * abz - abx * acz;
}
public static float TriArea2D(Vector3f a, Vector3f b, Vector3f c)
{
float abx = b.x - a.x;
@ -122,16 +110,6 @@ namespace DotRecast.Core
return acx * abz - abx * acz;
}
public static float TriArea2D(Vector3f a, float[] b, Vector3f c)
{
float abx = b[0] - a.x;
float abz = b[2] - a.z;
float acx = c.x - a.x;
float acz = c.z - a.z;
return acx * abz - abx * acz;
}
/// Determines if two axis-aligned bounding boxes overlap.
/// @param[in] amin Minimum bounds of box A. [(x, y, z)]
/// @param[in] amax Maximum bounds of box A. [(x, y, z)]
@ -155,15 +133,6 @@ namespace DotRecast.Core
/// @param[in] bmax Maximum bounds of box B. [(x, y, z)]
/// @return True if the two AABB's overlap.
/// @see dtOverlapQuantBounds
public static bool OverlapBounds(float[] amin, float[] amax, float[] bmin, float[] bmax)
{
bool overlap = true;
overlap = (amin[0] > bmax[0] || amax[0] < bmin[0]) ? false : overlap;
overlap = (amin[1] > bmax[1] || amax[1] < bmin[1]) ? false : overlap;
overlap = (amin[2] > bmax[2] || amax[2] < bmin[2]) ? false : overlap;
return overlap;
}
public static bool OverlapBounds(Vector3f amin, Vector3f amax, Vector3f bmin, Vector3f bmax)
{
bool overlap = true;
@ -278,7 +247,7 @@ namespace DotRecast.Core
return c;
}
public static float[] ProjectPoly(Vector3f axis, float[] poly, int npoly)
public static Vector2f ProjectPoly(Vector3f axis, float[] poly, int npoly)
{
float rmin, rmax;
rmin = rmax = axis.Dot2D(poly, 0);
@ -289,7 +258,11 @@ namespace DotRecast.Core
rmax = Math.Max(rmax, d);
}
return new float[] { rmin, rmax };
return new Vector2f
{
x = rmin,
y = rmax,
};
}
public static bool OverlapRange(float amin, float amax, float bmin, float bmax, float eps)
@ -311,9 +284,9 @@ namespace DotRecast.Core
Vector3f n = Vector3f.Of(polya[vb + 2] - polya[va + 2], 0, -(polya[vb + 0] - polya[va + 0]));
float[] aminmax = ProjectPoly(n, polya, npolya);
float[] bminmax = ProjectPoly(n, polyb, npolyb);
if (!OverlapRange(aminmax[0], aminmax[1], bminmax[0], bminmax[1], eps))
Vector2f aminmax = ProjectPoly(n, polya, npolya);
Vector2f bminmax = ProjectPoly(n, polyb, npolyb);
if (!OverlapRange(aminmax.x, aminmax.y, bminmax.x, bminmax.y, eps))
{
// Found separating axis
return false;
@ -327,9 +300,9 @@ namespace DotRecast.Core
Vector3f n = Vector3f.Of(polyb[vb + 2] - polyb[va + 2], 0, -(polyb[vb + 0] - polyb[va + 0]));
float[] aminmax = ProjectPoly(n, polya, npolya);
float[] bminmax = ProjectPoly(n, polyb, npolyb);
if (!OverlapRange(aminmax[0], aminmax[1], bminmax[0], bminmax[1], eps))
Vector2f aminmax = ProjectPoly(n, polya, npolya);
Vector2f bminmax = ProjectPoly(n, polyb, npolyb);
if (!OverlapRange(aminmax.x, aminmax.y, bminmax.x, bminmax.y, eps))
{
// Found separating axis
return false;
@ -557,31 +530,5 @@ namespace DotRecast.Core
float t = Vector3f.PerpXZ(u, w) / d;
return Tuple.Create(s, t);
}
/// Checks that the specified vector's components are all finite.
/// @param[in] v A point. [(x, y, z)]
/// @return True if all of the point's components are finite, i.e. not NaN
/// or any of the infinities.
public static bool VIsFinite(float[] v)
{
return float.IsFinite(v[0]) && float.IsFinite(v[1]) && float.IsFinite(v[2]);
}
public static bool VIsFinite(Vector3f v)
{
return float.IsFinite(v.x) && float.IsFinite(v.y) && float.IsFinite(v.z);
}
/// Checks that the specified vector's 2D components are finite.
/// @param[in] v A point. [(x, y, z)]
public static bool VIsFinite2D(float[] v)
{
return float.IsFinite(v[0]) && float.IsFinite(v[2]);
}
public static bool VIsFinite2D(Vector3f v)
{
return float.IsFinite(v.x) && float.IsFinite(v.z);
}
}
}

View File

@ -471,6 +471,23 @@ namespace DotRecast.Core
return v.x * v.x + v.y * v.y + v.z * v.z;
}
/// Checks that the specified vector's components are all finite.
/// @param[in] v A point. [(x, y, z)]
/// @return True if all of the point's components are finite, i.e. not NaN
/// or any of the infinities.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsFinite(Vector3f v)
{
return float.IsFinite(v.x) && float.IsFinite(v.y) && float.IsFinite(v.z);
}
/// Checks that the specified vector's 2D components are finite.
/// @param[in] v A point. [(x, y, z)]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsFinite2D(Vector3f v)
{
return float.IsFinite(v.x) && float.IsFinite(v.z);
}
}
}

View File

@ -43,7 +43,7 @@ namespace DotRecast.Detour
public override Result<List<long>> FindPath(long startRef, long endRef, Vector3f startPos, Vector3f endPos, IQueryFilter filter)
{
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !m_nav.IsValidPolyRef(endRef) || !VIsFinite(startPos) || !VIsFinite(endPos) || null == filter)
if (!m_nav.IsValidPolyRef(startRef) || !m_nav.IsValidPolyRef(endRef) || !Vector3f.IsFinite(startPos) || !Vector3f.IsFinite(endPos) || null == filter)
{
return Results.InvalidParam<List<long>>();
}
@ -648,7 +648,7 @@ namespace DotRecast.Detour
public override Result<FindDistanceToWallResult> FindDistanceToWall(long startRef, Vector3f centerPos, float maxRadius, IQueryFilter filter)
{
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !VIsFinite(centerPos) || maxRadius < 0
if (!m_nav.IsValidPolyRef(startRef) || !Vector3f.IsFinite(centerPos) || maxRadius < 0
|| !float.IsFinite(maxRadius) || null == filter)
{
return Results.InvalidParam<FindDistanceToWallResult>();
@ -776,7 +776,7 @@ namespace DotRecast.Detour
Poly neighbourPoly = neighbourTileAndPoly.Item2;
// Skip off-mesh connections.
if (neighbourPoly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (neighbourPoly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}

View File

@ -400,7 +400,7 @@ namespace DotRecast.Detour
{
Poly p = tile.data.polys[i];
// Do not return off-mesh connection polygons.
if (p.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (p.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}
@ -654,7 +654,7 @@ namespace DotRecast.Detour
Poly poly = tile.data.polys[i];
tile.polyLinks[poly.index] = DT_NULL_LINK;
if (poly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (poly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}
@ -1233,7 +1233,7 @@ namespace DotRecast.Detour
{
// Off-mesh connections do not have detail polys and getting height
// over them does not make sense.
if (poly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (poly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
return null;
}
@ -1337,7 +1337,7 @@ namespace DotRecast.Detour
}
// Off-mesh connections don't have detail polygons.
if (poly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (poly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
int i = poly.verts[0] * 3;
var v0 = new Vector3f { x = tile.data.verts[i], y = tile.data.verts[i + 1], z = tile.data.verts[i + 2] };
@ -1550,7 +1550,7 @@ namespace DotRecast.Detour
Poly poly = tile.data.polys[ip];
// Make sure that the current poly is indeed off-mesh link.
if (poly.GetType() != Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (poly.GetPolyType() != Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
return Results.InvalidParam<Tuple<Vector3f, Vector3f>>("Invalid poly type");
}

View File

@ -125,7 +125,7 @@ namespace DotRecast.Detour
{
Poly p = tile.data.polys[i];
// Do not return off-mesh connection polygons.
if (p.GetType() != Poly.DT_POLYTYPE_GROUND)
if (p.GetPolyType() != Poly.DT_POLYTYPE_GROUND)
{
continue;
}
@ -226,7 +226,7 @@ namespace DotRecast.Detour
IQueryFilter filter, FRand frand, IPolygonByCircleConstraint constraint)
{
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !VIsFinite(centerPos) || maxRadius < 0
if (!m_nav.IsValidPolyRef(startRef) || !Vector3f.IsFinite(centerPos) || maxRadius < 0
|| !float.IsFinite(maxRadius) || null == filter || null == frand)
{
return Results.InvalidParam<FindRandomPointResult>();
@ -272,7 +272,7 @@ namespace DotRecast.Detour
Poly bestPoly = bestTilePoly.Item2;
// Place random locations on on ground.
if (bestPoly.GetType() == Poly.DT_POLYTYPE_GROUND)
if (bestPoly.GetPolyType() == Poly.DT_POLYTYPE_GROUND)
{
// Calc area of the polygon.
float polyArea = 0.0f;
@ -423,7 +423,7 @@ namespace DotRecast.Detour
/// @returns The status flags for the query.
public Result<ClosestPointOnPolyResult> ClosestPointOnPoly(long refs, Vector3f pos)
{
if (!m_nav.IsValidPolyRef(refs) || !VIsFinite(pos))
if (!m_nav.IsValidPolyRef(refs) || !Vector3f.IsFinite(pos))
{
return Results.InvalidParam<ClosestPointOnPolyResult>();
}
@ -463,7 +463,7 @@ namespace DotRecast.Detour
return Results.InvalidParam<Vector3f>("Invalid tile");
}
if (!VIsFinite(pos))
if (!Vector3f.IsFinite(pos))
{
return Results.InvalidParam<Vector3f>();
}
@ -526,7 +526,7 @@ namespace DotRecast.Detour
MeshTile tile = tileAndPoly.result.Item1;
Poly poly = tileAndPoly.result.Item2;
if (!VIsFinite2D(pos))
if (!Vector3f.IsFinite2D(pos))
{
return Results.InvalidParam<float>();
}
@ -534,7 +534,7 @@ namespace DotRecast.Detour
// We used to return success for offmesh connections, but the
// getPolyHeight in DetourNavMesh does not do this, so special
// case it here.
if (poly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (poly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
int i = poly.verts[0] * 3;
var v0 = new Vector3f { x = tile.data.verts[i], y = tile.data.verts[i + 1], z = tile.data.verts[i + 2] };
@ -638,7 +638,7 @@ namespace DotRecast.Detour
{
Poly p = tile.data.polys[i];
// Do not return off-mesh connection polygons.
if (p.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (p.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}
@ -683,7 +683,7 @@ namespace DotRecast.Detour
*/
public Status QueryPolygons(Vector3f center, Vector3f halfExtents, IQueryFilter filter, IPolyQuery query)
{
if (!VIsFinite(center) || !VIsFinite(halfExtents) || null == filter)
if (!Vector3f.IsFinite(center) || !Vector3f.IsFinite(halfExtents) || null == filter)
{
return Status.FAILURE_INVALID_PARAM;
}
@ -704,7 +704,7 @@ namespace DotRecast.Detour
*/
public IList<MeshTile> QueryTiles(Vector3f center, Vector3f halfExtents)
{
if (!VIsFinite(center) || !VIsFinite(halfExtents))
if (!Vector3f.IsFinite(center) || !Vector3f.IsFinite(halfExtents))
{
return ImmutableArray<MeshTile>.Empty;
}
@ -764,7 +764,7 @@ namespace DotRecast.Detour
IQueryHeuristic heuristic, int options, float raycastLimit)
{
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !m_nav.IsValidPolyRef(endRef) || !VIsFinite(startPos) || !VIsFinite(endPos) || null == filter)
if (!m_nav.IsValidPolyRef(startRef) || !m_nav.IsValidPolyRef(endRef) || !Vector3f.IsFinite(startPos) || !Vector3f.IsFinite(endPos) || null == filter)
{
return Results.InvalidParam<List<long>>();
}
@ -1049,7 +1049,7 @@ namespace DotRecast.Detour
m_query.raycastLimitSqr = Sqr(raycastLimit);
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !m_nav.IsValidPolyRef(endRef) || !VIsFinite(startPos) || !VIsFinite(endPos) || null == filter)
if (!m_nav.IsValidPolyRef(startRef) || !m_nav.IsValidPolyRef(endRef) || !Vector3f.IsFinite(startPos) || !Vector3f.IsFinite(endPos) || null == filter)
{
return Status.FAILURE_INVALID_PARAM;
}
@ -1545,7 +1545,7 @@ namespace DotRecast.Detour
int maxStraightPath, int options)
{
List<StraightPathItem> straightPath = new List<StraightPathItem>();
if (!VIsFinite(startPos) || !VIsFinite(endPos)
if (!Vector3f.IsFinite(startPos) || !Vector3f.IsFinite(endPos)
|| null == path || 0 == path.Count || path[0] == 0 || maxStraightPath <= 0)
{
return Results.InvalidParam<List<StraightPathItem>>();
@ -1802,8 +1802,8 @@ namespace DotRecast.Detour
public Result<MoveAlongSurfaceResult> MoveAlongSurface(long startRef, Vector3f startPos, Vector3f endPos, IQueryFilter filter)
{
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !VIsFinite(startPos)
|| !VIsFinite(endPos) || null == filter)
if (!m_nav.IsValidPolyRef(startRef) || !Vector3f.IsFinite(startPos)
|| !Vector3f.IsFinite(endPos) || null == filter)
{
return Results.InvalidParam<MoveAlongSurfaceResult>();
}
@ -1985,7 +1985,7 @@ namespace DotRecast.Detour
Tuple<MeshTile, Poly> tileAndPoly = tileAndPolyResult.result;
MeshTile fromTile = tileAndPoly.Item1;
Poly fromPoly = tileAndPoly.Item2;
int fromType = fromPoly.GetType();
int fromType = fromPoly.GetPolyType();
tileAndPolyResult = m_nav.GetTileAndPolyByRef(to);
if (tileAndPolyResult.Failed())
@ -1996,7 +1996,7 @@ namespace DotRecast.Detour
tileAndPoly = tileAndPolyResult.result;
MeshTile toTile = tileAndPoly.Item1;
Poly toPoly = tileAndPoly.Item2;
int toType = toPoly.GetType();
int toType = toPoly.GetPolyType();
return GetPortalPoints(from, fromPoly, fromTile, to, toPoly, toTile, fromType, toType);
}
@ -2024,7 +2024,7 @@ namespace DotRecast.Detour
}
// Handle off-mesh connections.
if (fromPoly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (fromPoly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
// Find link that points to first vertex.
for (int i = fromTile.polyLinks[fromPoly.index]; i != NavMesh.DT_NULL_LINK; i = fromTile.links[i].next)
@ -2046,7 +2046,7 @@ namespace DotRecast.Detour
return Results.InvalidParam<PortalResult>("Invalid offmesh from connection");
}
if (toPoly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (toPoly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
for (int i = toTile.polyLinks[toPoly.index]; i != NavMesh.DT_NULL_LINK; i = toTile.links[i].next)
{
@ -2195,7 +2195,7 @@ namespace DotRecast.Detour
long prevRef)
{
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !VIsFinite(startPos) || !VIsFinite(endPos) || null == filter
if (!m_nav.IsValidPolyRef(startRef) || !Vector3f.IsFinite(startPos) || !Vector3f.IsFinite(endPos) || null == filter
|| (prevRef != 0 && !m_nav.IsValidPolyRef(prevRef)))
{
return Results.InvalidParam<RaycastHit>();
@ -2291,7 +2291,7 @@ namespace DotRecast.Detour
nextTile = tileAndPolyUns.Item1;
nextPoly = tileAndPolyUns.Item2;
// Skip off-mesh connections.
if (nextPoly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (nextPoly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}
@ -2463,7 +2463,7 @@ namespace DotRecast.Detour
{
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !VIsFinite(centerPos) || radius < 0
if (!m_nav.IsValidPolyRef(startRef) || !Vector3f.IsFinite(centerPos) || radius < 0
|| !float.IsFinite(radius) || null == filter)
{
return Results.InvalidParam<FindPolysAroundResult>();
@ -2832,7 +2832,7 @@ namespace DotRecast.Detour
IQueryFilter filter)
{
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !VIsFinite(centerPos) || radius < 0
if (!m_nav.IsValidPolyRef(startRef) || !Vector3f.IsFinite(centerPos) || radius < 0
|| !float.IsFinite(radius) || null == filter)
{
return Results.InvalidParam<FindLocalNeighbourhoodResult>();
@ -2894,7 +2894,7 @@ namespace DotRecast.Detour
Poly neighbourPoly = tileAndPoly.Item2;
// Skip off-mesh connections.
if (neighbourPoly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (neighbourPoly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}
@ -3172,7 +3172,7 @@ namespace DotRecast.Detour
IQueryFilter filter)
{
// Validate input
if (!m_nav.IsValidPolyRef(startRef) || !VIsFinite(centerPos) || maxRadius < 0
if (!m_nav.IsValidPolyRef(startRef) || !Vector3f.IsFinite(centerPos) || maxRadius < 0
|| !float.IsFinite(maxRadius) || null == filter)
{
return Results.InvalidParam<FindDistanceToWallResult>();
@ -3299,7 +3299,7 @@ namespace DotRecast.Detour
Poly neighbourPoly = neighbourTileAndPoly.Item2;
// Skip off-mesh connections.
if (neighbourPoly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (neighbourPoly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}

View File

@ -49,7 +49,7 @@ namespace DotRecast.Detour
for (int i = 0; i < tile.data.header.polyCount; ++i)
{
Poly p = tile.data.polys[i];
if (p.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (p.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}

View File

@ -76,7 +76,7 @@ namespace DotRecast.Detour
}
/** Gets the polygon type. (See: #dtPolyTypes) */
public int GetType()
public int GetPolyType()
{
return areaAndtype >> 6;
}

View File

@ -126,7 +126,7 @@ public class RecastDebugDraw : DebugDraw
for (int i = 0; i < tile.data.header.polyCount; ++i)
{
Poly p = tile.data.polys[i];
if (p.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (p.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}
@ -173,7 +173,7 @@ public class RecastDebugDraw : DebugDraw
{
Poly p = tile.data.polys[i];
if (p.GetType() != Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (p.GetPolyType() != Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}
@ -307,7 +307,7 @@ public class RecastDebugDraw : DebugDraw
{
Poly p = tile.data.polys[i];
if (p.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (p.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
continue;
}
@ -1296,7 +1296,7 @@ public class RecastDebugDraw : DebugDraw
int c = DuTransCol(col, 64);
int ip = poly.index;
if (poly.GetType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
if (poly.GetPolyType() == Poly.DT_POLYTYPE_OFFMESH_CONNECTION)
{
OffMeshConnection con = tile.data.offMeshCons[ip - tile.data.header.offMeshBase];

View File

@ -64,6 +64,6 @@ public class NavMeshBuilderTest
Assert.That(nmd.polys[118].verts[1], Is.EqualTo(224));
Assert.That(nmd.polys[118].flags, Is.EqualTo(12));
Assert.That(nmd.polys[118].GetArea(), Is.EqualTo(2));
Assert.That(nmd.polys[118].GetType(), Is.EqualTo(Poly.DT_POLYTYPE_OFFMESH_CONNECTION));
Assert.That(nmd.polys[118].GetPolyType(), Is.EqualTo(Poly.DT_POLYTYPE_OFFMESH_CONNECTION));
}
}