forked from bit/DotRecastNetSim
remove tuple<float, float> ok!!
This commit is contained in:
parent
98f62a4f8a
commit
bf07c8f3ff
|
@ -1,8 +0,0 @@
|
|||
namespace DotRecast.Core
|
||||
{
|
||||
public struct DistSeg
|
||||
{
|
||||
public float DistSqr;
|
||||
public float Seg;
|
||||
}
|
||||
}
|
|
@ -142,21 +142,21 @@ namespace DotRecast.Core
|
|||
return overlap;
|
||||
}
|
||||
|
||||
public static DistSeg DistancePtSegSqr2D(Vector3f pt, float[] verts, int p, int q)
|
||||
public static float DistancePtSegSqr2D(Vector3f pt, float[] verts, int p, int q, out float t)
|
||||
{
|
||||
var vp = Vector3f.Of(verts, p);
|
||||
var vq = Vector3f.Of(verts, q);
|
||||
return DistancePtSegSqr2D(pt, vp, vq);
|
||||
return DistancePtSegSqr2D(pt, vp, vq, out t);
|
||||
}
|
||||
|
||||
public static DistSeg DistancePtSegSqr2D(Vector3f pt, Vector3f p, Vector3f q)
|
||||
public static float DistancePtSegSqr2D(Vector3f pt, Vector3f p, Vector3f q, out float t)
|
||||
{
|
||||
float pqx = q.x - p.x;
|
||||
float pqz = q.z - p.z;
|
||||
float dx = pt.x - p.x;
|
||||
float dz = pt.z - p.z;
|
||||
float d = pqx * pqx + pqz * pqz;
|
||||
float t = pqx * dx + pqz * dz;
|
||||
t = pqx * dx + pqz * dz;
|
||||
if (d > 0)
|
||||
{
|
||||
t /= d;
|
||||
|
@ -173,11 +173,7 @@ namespace DotRecast.Core
|
|||
|
||||
dx = p.x + t * pqx - pt.x;
|
||||
dz = p.z + t * pqz - pt.z;
|
||||
return new DistSeg()
|
||||
{
|
||||
DistSqr = dx * dx + dz * dz,
|
||||
Seg = t,
|
||||
};
|
||||
return dx * dx + dz * dz;
|
||||
}
|
||||
|
||||
public static float? ClosestHeightPointTriangle(Vector3f p, Vector3f a, Vector3f b, Vector3f c)
|
||||
|
@ -244,15 +240,13 @@ namespace DotRecast.Core
|
|||
{
|
||||
int vi = i * 3;
|
||||
int vj = j * 3;
|
||||
if (((verts[vi + 2] > pt.z) != (verts[vj + 2] > pt.z)) && (pt.x < (verts[vj + 0] - verts[vi + 0])
|
||||
* (pt.z - verts[vi + 2]) / (verts[vj + 2] - verts[vi + 2]) + verts[vi + 0]))
|
||||
if (((verts[vi + 2] > pt.z) != (verts[vj + 2] > pt.z)) &&
|
||||
(pt.x < (verts[vj + 0] - verts[vi + 0]) * (pt.z - verts[vi + 2]) / (verts[vj + 2] - verts[vi + 2]) + verts[vi + 0]))
|
||||
{
|
||||
c = !c;
|
||||
}
|
||||
|
||||
var edet = DistancePtSegSqr2D(pt, verts, vj, vi);
|
||||
ed[j] = edet.DistSqr;
|
||||
et[j] = edet.Seg;
|
||||
ed[j] = DistancePtSegSqr2D(pt, verts, vj, vi, out et[j]);
|
||||
}
|
||||
|
||||
return c;
|
||||
|
@ -471,20 +465,24 @@ namespace DotRecast.Core
|
|||
}
|
||||
|
||||
|
||||
public static Tuple<float, float> IntersectSegSeg2D(Vector3f ap, Vector3f aq, Vector3f bp, Vector3f bq)
|
||||
public static bool IntersectSegSeg2D(Vector3f ap, Vector3f aq, Vector3f bp, Vector3f bq, out float s, out float t)
|
||||
{
|
||||
s = 0;
|
||||
t = 0;
|
||||
|
||||
Vector3f u = aq.Subtract(ap);
|
||||
Vector3f v = bq.Subtract(bp);
|
||||
Vector3f w = ap.Subtract(bp);
|
||||
float d = Vector3f.PerpXZ(u, v);
|
||||
if (Math.Abs(d) < 1e-6f)
|
||||
{
|
||||
return null;
|
||||
return false;
|
||||
}
|
||||
|
||||
float s = Vector3f.PerpXZ(v, w) / d;
|
||||
float t = Vector3f.PerpXZ(u, w) / d;
|
||||
return Tuple.Create(s, t);
|
||||
s = Vector3f.PerpXZ(v, w) / d;
|
||||
t = Vector3f.PerpXZ(u, w) / d;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -120,13 +120,13 @@ namespace DotRecast.Detour.Crowd
|
|||
var s3 = Vector3f.Of(s[3], s[4], s[5]);
|
||||
|
||||
// Skip too distant segments.
|
||||
var distseg = DistancePtSegSqr2D(pos, s0, s3);
|
||||
if (distseg.DistSqr > Sqr(collisionQueryRange))
|
||||
var distSqr = DistancePtSegSqr2D(pos, s0, s3, out var tseg);
|
||||
if (distSqr > Sqr(collisionQueryRange))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
AddSegment(distseg.DistSqr, s);
|
||||
AddSegment(distSqr, s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -150,8 +150,8 @@ namespace DotRecast.Detour.Crowd
|
|||
|
||||
// Precalc if the agent is really close to the segment.
|
||||
float r = 0.01f;
|
||||
var dt = DistancePtSegSqr2D(pos, seg.p, seg.q);
|
||||
seg.touch = dt.DistSqr < Sqr(r);
|
||||
var distSqr = DistancePtSegSqr2D(pos, seg.p, seg.q, out var t);
|
||||
seg.touch = distSqr < Sqr(r);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -235,11 +235,8 @@ namespace DotRecast.Detour
|
|||
|
||||
private static Intersection SegSegInt(Vector3f a, Vector3f b, Vector3f c, Vector3f d, ref Vector3f p, ref Vector3f q)
|
||||
{
|
||||
var isec = IntersectSegSeg2D(a, b, c, d);
|
||||
if (null != isec)
|
||||
if (IntersectSegSeg2D(a, b, c, d, out var s, out var t))
|
||||
{
|
||||
float s = isec.Item1;
|
||||
float t = isec.Item2;
|
||||
if (s >= 0.0f && s <= 1.0f && t >= 0.0f && t <= 1.0f)
|
||||
{
|
||||
p.x = a.x + (b.x - a.x) * s;
|
||||
|
|
|
@ -738,10 +738,7 @@ namespace DotRecast.Detour
|
|||
// Calc distance to the edge.
|
||||
int vj = bestPoly.verts[j] * 3;
|
||||
int vi = bestPoly.verts[i] * 3;
|
||||
var distseg = DistancePtSegSqr2D(centerPos, bestTile.data.verts, vj, vi);
|
||||
float distSqr = distseg.DistSqr;
|
||||
float tseg = distseg.Seg;
|
||||
|
||||
var distSqr = DistancePtSegSqr2D(centerPos, bestTile.data.verts, vj, vi, out var tseg);
|
||||
// Edge is too far, skip.
|
||||
if (distSqr > radiusSqr)
|
||||
{
|
||||
|
@ -784,8 +781,7 @@ namespace DotRecast.Detour
|
|||
// Calc distance to the edge.
|
||||
int va = bestPoly.verts[link.edge] * 3;
|
||||
int vb = bestPoly.verts[(link.edge + 1) % bestPoly.vertCount] * 3;
|
||||
var distseg = DistancePtSegSqr2D(centerPos, bestTile.data.verts, va, vb);
|
||||
float distSqr = distseg.DistSqr;
|
||||
var distSqr = DistancePtSegSqr2D(centerPos, bestTile.data.verts, va, vb, out var tseg);
|
||||
// If the circle is not touching the next polygon, skip it.
|
||||
if (distSqr > radiusSqr)
|
||||
{
|
||||
|
|
|
@ -1187,9 +1187,7 @@ namespace DotRecast.Detour
|
|||
continue;
|
||||
}
|
||||
|
||||
var dt = DistancePtSegSqr2D(pos, v[j], v[k]);
|
||||
float d = dt.DistSqr;
|
||||
float t = dt.Seg;
|
||||
var d = DistancePtSegSqr2D(pos, v[j], v[k], out var t);
|
||||
if (d < dmin)
|
||||
{
|
||||
dmin = d;
|
||||
|
@ -1213,9 +1211,7 @@ namespace DotRecast.Detour
|
|||
v[1].y = tile.data.verts[poly.verts[k] * 3 + 1];
|
||||
v[1].z = tile.data.verts[poly.verts[k] * 3 + 2];
|
||||
|
||||
var dt = DistancePtSegSqr2D(pos, v[0], v[1]);
|
||||
float d = dt.DistSqr;
|
||||
float t = dt.Seg;
|
||||
var d = DistancePtSegSqr2D(pos, v[0], v[1], out var t);
|
||||
if (d < dmin)
|
||||
{
|
||||
dmin = d;
|
||||
|
@ -1343,8 +1339,8 @@ namespace DotRecast.Detour
|
|||
var v0 = new Vector3f { x = tile.data.verts[i], y = tile.data.verts[i + 1], z = tile.data.verts[i + 2] };
|
||||
i = poly.verts[1] * 3;
|
||||
var v1 = new Vector3f { x = tile.data.verts[i], y = tile.data.verts[i + 1], z = tile.data.verts[i + 2] };
|
||||
var dt = DistancePtSegSqr2D(pos, v0, v1);
|
||||
return new ClosestPointOnPolyResult(false, Vector3f.Lerp(v0, v1, dt.Seg));
|
||||
var distSqr = DistancePtSegSqr2D(pos, v0, v1, out var t);
|
||||
return new ClosestPointOnPolyResult(false, Vector3f.Lerp(v0, v1, t));
|
||||
}
|
||||
|
||||
// Outside poly that is not an offmesh connection.
|
||||
|
|
|
@ -346,8 +346,7 @@ namespace DotRecast.Detour
|
|||
var vb = portalpoints.result.right;
|
||||
|
||||
// If the circle is not touching the next polygon, skip it.
|
||||
var distseg = DistancePtSegSqr2D(centerPos, va, vb);
|
||||
float distSqr = distseg.DistSqr;
|
||||
var distSqr = DistancePtSegSqr2D(centerPos, va, vb, out var tesg);
|
||||
if (distSqr > radiusSqr)
|
||||
{
|
||||
continue;
|
||||
|
@ -540,8 +539,8 @@ namespace DotRecast.Detour
|
|||
var v0 = new Vector3f { x = tile.data.verts[i], y = tile.data.verts[i + 1], z = tile.data.verts[i + 2] };
|
||||
i = poly.verts[1] * 3;
|
||||
var v1 = new Vector3f { x = tile.data.verts[i], y = tile.data.verts[i + 1], z = tile.data.verts[i + 2] };
|
||||
var dt = DistancePtSegSqr2D(pos, v0, v1);
|
||||
return Results.Success(v0.y + (v1.y - v0.y) * dt.Seg);
|
||||
var distSqr = DistancePtSegSqr2D(pos, v0, v1, out var tseg);
|
||||
return Results.Success(v0.y + (v1.y - v0.y) * tseg);
|
||||
}
|
||||
|
||||
float? height = m_nav.GetPolyHeight(tile, poly, pos);
|
||||
|
@ -1500,10 +1499,8 @@ namespace DotRecast.Detour
|
|||
}
|
||||
|
||||
// Append intersection
|
||||
Tuple<float, float> interect = IntersectSegSeg2D(startPos, endPos, left, right);
|
||||
if (null != interect)
|
||||
if (IntersectSegSeg2D(startPos, endPos, left, right, out var _, out var t))
|
||||
{
|
||||
float t = interect.Item2;
|
||||
var pt = Vector3f.Lerp(left, right, t);
|
||||
stat = AppendVertex(pt, 0, path[i + 1], straightPath, maxStraightPath);
|
||||
if (!stat.IsInProgress())
|
||||
|
@ -1626,8 +1623,8 @@ namespace DotRecast.Detour
|
|||
// If starting really close the portal, advance.
|
||||
if (i == 0)
|
||||
{
|
||||
var dt = DistancePtSegSqr2D(portalApex, left, right);
|
||||
if (dt.DistSqr < Sqr(0.001f))
|
||||
var distSqr = DistancePtSegSqr2D(portalApex, left, right, out var t);
|
||||
if (distSqr < Sqr(0.001f))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
@ -1906,9 +1903,7 @@ namespace DotRecast.Detour
|
|||
// Wall edge, calc distance.
|
||||
int vj = j * 3;
|
||||
int vi = i * 3;
|
||||
var distSeg = DistancePtSegSqr2D(endPos, verts, vj, vi);
|
||||
float distSqr = distSeg.DistSqr;
|
||||
float tseg = distSeg.Seg;
|
||||
var distSqr = DistancePtSegSqr2D(endPos, verts, vj, vi, out var tseg);
|
||||
if (distSqr < bestDist)
|
||||
{
|
||||
// Update nearest distance.
|
||||
|
@ -1932,8 +1927,7 @@ namespace DotRecast.Detour
|
|||
// TODO: Maybe should use GetPortalPoints(), but this one is way faster.
|
||||
int vj = j * 3;
|
||||
int vi = i * 3;
|
||||
var distseg = DistancePtSegSqr2D(searchPos, verts, vj, vi);
|
||||
float distSqr = distseg.DistSqr;
|
||||
var distSqr = DistancePtSegSqr2D(searchPos, verts, vj, vi, out var _);
|
||||
if (distSqr > searchRadSqr)
|
||||
{
|
||||
continue;
|
||||
|
@ -2127,17 +2121,16 @@ namespace DotRecast.Detour
|
|||
Vector3f left = ppoints.result.left;
|
||||
Vector3f right = ppoints.result.right;
|
||||
float t = 0.5f;
|
||||
Tuple<float, float> interect = IntersectSegSeg2D(fromPos, toPos, left, right);
|
||||
if (null != interect)
|
||||
if (IntersectSegSeg2D(fromPos, toPos, left, right, out var _, out var t2))
|
||||
{
|
||||
t = Clamp(interect.Item2, 0.1f, 0.9f);
|
||||
t = Clamp(t2, 0.1f, 0.9f);
|
||||
}
|
||||
|
||||
Vector3f pt = Vector3f.Lerp(left, right, t);
|
||||
return Results.Success(pt);
|
||||
}
|
||||
|
||||
private static float s = 1.0f / 255.0f;
|
||||
private const float s = 1.0f / 255.0f;
|
||||
|
||||
/// @par
|
||||
///
|
||||
|
@ -2553,8 +2546,7 @@ namespace DotRecast.Detour
|
|||
var vb = pp.result.right;
|
||||
|
||||
// If the circle is not touching the next polygon, skip it.
|
||||
var distseg = DistancePtSegSqr2D(centerPos, va, vb);
|
||||
float distSqr = distseg.DistSqr;
|
||||
var distSqr = DistancePtSegSqr2D(centerPos, va, vb, out var _);
|
||||
if (distSqr > radiusSqr)
|
||||
{
|
||||
continue;
|
||||
|
@ -2917,8 +2909,7 @@ namespace DotRecast.Detour
|
|||
var vb = pp.result.right;
|
||||
|
||||
// If the circle is not touching the next polygon, skip it.
|
||||
var distseg = DistancePtSegSqr2D(centerPos, va, vb);
|
||||
float distSqr = distseg.DistSqr;
|
||||
var distSqr = DistancePtSegSqr2D(centerPos, va, vb, out var _);
|
||||
if (distSqr > radiusSqr)
|
||||
{
|
||||
continue;
|
||||
|
@ -3261,9 +3252,7 @@ namespace DotRecast.Detour
|
|||
// Calc distance to the edge.
|
||||
int vj = bestPoly.verts[j] * 3;
|
||||
int vi = bestPoly.verts[i] * 3;
|
||||
var distseg = DistancePtSegSqr2D(centerPos, bestTile.data.verts, vj, vi);
|
||||
float distSqr = distseg.DistSqr;
|
||||
float tseg = distseg.Seg;
|
||||
var distSqr = DistancePtSegSqr2D(centerPos, bestTile.data.verts, vj, vi, out var tseg);
|
||||
|
||||
// Edge is too far, skip.
|
||||
if (distSqr > radiusSqr)
|
||||
|
@ -3307,8 +3296,7 @@ namespace DotRecast.Detour
|
|||
// Calc distance to the edge.
|
||||
int va = bestPoly.verts[link.edge] * 3;
|
||||
int vb = bestPoly.verts[(link.edge + 1) % bestPoly.vertCount] * 3;
|
||||
var distseg = DistancePtSegSqr2D(centerPos, bestTile.data.verts, va, vb);
|
||||
float distSqr = distseg.DistSqr;
|
||||
var distSqr = DistancePtSegSqr2D(centerPos, bestTile.data.verts, va, vb, out var tseg);
|
||||
// If the circle is not touching the next polygon, skip it.
|
||||
if (distSqr > radiusSqr)
|
||||
{
|
||||
|
|
|
@ -850,8 +850,8 @@ public class TestNavmeshTool : Tool
|
|||
var v0 = Vector3f.Of(s[0], s[1], s[2]);
|
||||
var s3 = Vector3f.Of(s[3], s[4], s[5]);
|
||||
// Skip too distant segments.
|
||||
var distSqr = DistancePtSegSqr2D(m_spos, v0, s3);
|
||||
if (distSqr.DistSqr > RcMath.Sqr(m_neighbourhoodRadius))
|
||||
var distSqr = DistancePtSegSqr2D(m_spos, v0, s3, out var tseg);
|
||||
if (distSqr > RcMath.Sqr(m_neighbourhoodRadius))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue