remove tuple<float, float>

This commit is contained in:
ikpil 2023-05-29 12:33:41 +09:00
parent 11f023969f
commit 98f62a4f8a
6 changed files with 42 additions and 87 deletions

View File

@ -142,7 +142,14 @@ namespace DotRecast.Core
return overlap; return overlap;
} }
public static Tuple<float, float> DistancePtSegSqr2D(Vector3f pt, Vector3f p, Vector3f q) public static DistSeg DistancePtSegSqr2D(Vector3f pt, float[] verts, int p, int q)
{
var vp = Vector3f.Of(verts, p);
var vq = Vector3f.Of(verts, q);
return DistancePtSegSqr2D(pt, vp, vq);
}
public static DistSeg DistancePtSegSqr2D(Vector3f pt, Vector3f p, Vector3f q)
{ {
float pqx = q.x - p.x; float pqx = q.x - p.x;
float pqz = q.z - p.z; float pqz = q.z - p.z;
@ -166,7 +173,11 @@ namespace DotRecast.Core
dx = p.x + t * pqx - pt.x; dx = p.x + t * pqx - pt.x;
dz = p.z + t * pqz - pt.z; dz = p.z + t * pqz - pt.z;
return Tuple.Create(dx * dx + dz * dz, t); return new DistSeg()
{
DistSqr = dx * dx + dz * dz,
Seg = t,
};
} }
public static float? ClosestHeightPointTriangle(Vector3f p, Vector3f a, Vector3f b, Vector3f c) public static float? ClosestHeightPointTriangle(Vector3f p, Vector3f a, Vector3f b, Vector3f c)
@ -454,66 +465,6 @@ namespace DotRecast.Core
return result; return result;
} }
public static Tuple<float, float> DistancePtSegSqr2D(Vector3f pt, SegmentVert verts, int p, int q)
{
float pqx = verts[q + 0] - verts[p + 0];
float pqz = verts[q + 2] - verts[p + 2];
float dx = pt.x - verts[p + 0];
float dz = pt.z - verts[p + 2];
float d = pqx * pqx + pqz * pqz;
float t = pqx * dx + pqz * dz;
if (d > 0)
{
t /= d;
}
if (t < 0)
{
t = 0;
}
else if (t > 1)
{
t = 1;
}
dx = verts[p + 0] + t * pqx - pt.x;
dz = verts[p + 2] + t * pqz - pt.z;
return Tuple.Create(dx * dx + dz * dz, t);
}
public static DistSeg DistancePtSegSqr2D(Vector3f pt, float[] verts, int p, int q)
{
float pqx = verts[q + 0] - verts[p + 0];
float pqz = verts[q + 2] - verts[p + 2];
float dx = pt.x - verts[p + 0];
float dz = pt.z - verts[p + 2];
float d = pqx * pqx + pqz * pqz;
float t = pqx * dx + pqz * dz;
if (d > 0)
{
t /= d;
}
if (t < 0)
{
t = 0;
}
else if (t > 1)
{
t = 1;
}
dx = verts[p + 0] + t * pqx - pt.x;
dz = verts[p + 2] + t * pqz - pt.z;
return new DistSeg()
{
DistSqr = dx * dx + dz * dz,
Seg = t,
};
}
public static int OppositeTile(int side) public static int OppositeTile(int side)
{ {
return (side + 4) & 0x7; return (side + 4) & 0x7;

View File

@ -116,14 +116,17 @@ namespace DotRecast.Detour.Crowd
for (int k = 0; k < gpws.CountSegmentRefs(); ++k) for (int k = 0; k < gpws.CountSegmentRefs(); ++k)
{ {
SegmentVert s = gpws.GetSegmentVert(k); SegmentVert s = gpws.GetSegmentVert(k);
var s0 = Vector3f.Of(s[0], s[1], s[2]);
var s3 = Vector3f.Of(s[3], s[4], s[5]);
// Skip too distant segments. // Skip too distant segments.
Tuple<float, float> distseg = DistancePtSegSqr2D(pos, s, 0, 3); var distseg = DistancePtSegSqr2D(pos, s0, s3);
if (distseg.Item1 > Sqr(collisionQueryRange)) if (distseg.DistSqr > Sqr(collisionQueryRange))
{ {
continue; continue;
} }
AddSegment(distseg.Item1, s); AddSegment(distseg.DistSqr, s);
} }
} }
} }

View File

@ -150,8 +150,8 @@ namespace DotRecast.Detour.Crowd
// Precalc if the agent is really close to the segment. // Precalc if the agent is really close to the segment.
float r = 0.01f; float r = 0.01f;
Tuple<float, float> dt = DistancePtSegSqr2D(pos, seg.p, seg.q); var dt = DistancePtSegSqr2D(pos, seg.p, seg.q);
seg.touch = dt.Item1 < Sqr(r); seg.touch = dt.DistSqr < Sqr(r);
} }
} }

View File

@ -1187,9 +1187,9 @@ namespace DotRecast.Detour
continue; continue;
} }
Tuple<float, float> dt = DistancePtSegSqr2D(pos, v[j], v[k]); var dt = DistancePtSegSqr2D(pos, v[j], v[k]);
float d = dt.Item1; float d = dt.DistSqr;
float t = dt.Item2; float t = dt.Seg;
if (d < dmin) if (d < dmin)
{ {
dmin = d; dmin = d;
@ -1213,9 +1213,9 @@ namespace DotRecast.Detour
v[1].y = tile.data.verts[poly.verts[k] * 3 + 1]; v[1].y = tile.data.verts[poly.verts[k] * 3 + 1];
v[1].z = tile.data.verts[poly.verts[k] * 3 + 2]; v[1].z = tile.data.verts[poly.verts[k] * 3 + 2];
Tuple<float, float> dt = DistancePtSegSqr2D(pos, v[0], v[1]); var dt = DistancePtSegSqr2D(pos, v[0], v[1]);
float d = dt.Item1; float d = dt.DistSqr;
float t = dt.Item2; float t = dt.Seg;
if (d < dmin) if (d < dmin)
{ {
dmin = d; dmin = d;
@ -1343,8 +1343,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] }; 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; 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 v1 = new Vector3f { x = tile.data.verts[i], y = tile.data.verts[i + 1], z = tile.data.verts[i + 2] };
Tuple<float, float> dt = DistancePtSegSqr2D(pos, v0, v1); var dt = DistancePtSegSqr2D(pos, v0, v1);
return new ClosestPointOnPolyResult(false, Vector3f.Lerp(v0, v1, dt.Item2)); return new ClosestPointOnPolyResult(false, Vector3f.Lerp(v0, v1, dt.Seg));
} }
// Outside poly that is not an offmesh connection. // Outside poly that is not an offmesh connection.

View File

@ -347,7 +347,7 @@ namespace DotRecast.Detour
// If the circle is not touching the next polygon, skip it. // If the circle is not touching the next polygon, skip it.
var distseg = DistancePtSegSqr2D(centerPos, va, vb); var distseg = DistancePtSegSqr2D(centerPos, va, vb);
float distSqr = distseg.Item1; float distSqr = distseg.DistSqr;
if (distSqr > radiusSqr) if (distSqr > radiusSqr)
{ {
continue; continue;
@ -541,7 +541,7 @@ namespace DotRecast.Detour
i = poly.verts[1] * 3; 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 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); var dt = DistancePtSegSqr2D(pos, v0, v1);
return Results.Success(v0.y + (v1.y - v0.y) * dt.Item2); return Results.Success(v0.y + (v1.y - v0.y) * dt.Seg);
} }
float? height = m_nav.GetPolyHeight(tile, poly, pos); float? height = m_nav.GetPolyHeight(tile, poly, pos);
@ -1626,8 +1626,8 @@ namespace DotRecast.Detour
// If starting really close the portal, advance. // If starting really close the portal, advance.
if (i == 0) if (i == 0)
{ {
Tuple<float, float> dt = DistancePtSegSqr2D(portalApex, left, right); var dt = DistancePtSegSqr2D(portalApex, left, right);
if (dt.Item1 < Sqr(0.001f)) if (dt.DistSqr < Sqr(0.001f))
{ {
continue; continue;
} }
@ -2553,8 +2553,8 @@ namespace DotRecast.Detour
var vb = pp.result.right; var vb = pp.result.right;
// If the circle is not touching the next polygon, skip it. // If the circle is not touching the next polygon, skip it.
Tuple<float, float> distseg = DistancePtSegSqr2D(centerPos, va, vb); var distseg = DistancePtSegSqr2D(centerPos, va, vb);
float distSqr = distseg.Item1; float distSqr = distseg.DistSqr;
if (distSqr > radiusSqr) if (distSqr > radiusSqr)
{ {
continue; continue;
@ -2917,8 +2917,8 @@ namespace DotRecast.Detour
var vb = pp.result.right; var vb = pp.result.right;
// If the circle is not touching the next polygon, skip it. // If the circle is not touching the next polygon, skip it.
Tuple<float, float> distseg = DistancePtSegSqr2D(centerPos, va, vb); var distseg = DistancePtSegSqr2D(centerPos, va, vb);
float distSqr = distseg.Item1; float distSqr = distseg.DistSqr;
if (distSqr > radiusSqr) if (distSqr > radiusSqr)
{ {
continue; continue;

View File

@ -847,10 +847,11 @@ public class TestNavmeshTool : Tool
for (int j = 0; j < wallSegments.CountSegmentVerts(); ++j) for (int j = 0; j < wallSegments.CountSegmentVerts(); ++j)
{ {
SegmentVert s = wallSegments.GetSegmentVert(j); SegmentVert s = wallSegments.GetSegmentVert(j);
Vector3f s3 = Vector3f.Of(s[3], s[4], s[5]); var v0 = Vector3f.Of(s[0], s[1], s[2]);
var s3 = Vector3f.Of(s[3], s[4], s[5]);
// Skip too distant segments. // Skip too distant segments.
Tuple<float, float> distSqr = DistancePtSegSqr2D(m_spos, s, 0, 3); var distSqr = DistancePtSegSqr2D(m_spos, v0, s3);
if (distSqr.Item1 > RcMath.Sqr(m_neighbourhoodRadius)) if (distSqr.DistSqr > RcMath.Sqr(m_neighbourhoodRadius))
{ {
continue; continue;
} }
@ -1016,4 +1017,4 @@ public class TestNavmeshTool : Tool
} }
} }
} }
} }