Removed RcMeshDetails.VdistSq2(float[], float[])

This commit is contained in:
ikpil 2024-06-07 22:36:46 +09:00
parent ebab0a11f3
commit 8ad34dc0d8
4 changed files with 37 additions and 93 deletions

View File

@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Removed RcVecUtils.Dot() - Removed RcVecUtils.Dot()
- Removed RcVecUtils.Scale() - Removed RcVecUtils.Scale()
- Removed RcVecUtils.Subtract(RcVec3f i, float[] verts, int j) - Removed RcVecUtils.Subtract(RcVec3f i, float[] verts, int j)
- Removed RcMeshDetails.VdistSq2(float[], float[])
### Special Thanks ### Special Thanks
- [@Doprez](https://github.com/Doprez) - [@Doprez](https://github.com/Doprez)

View File

@ -87,11 +87,11 @@ namespace DotRecast.Recast.Toolset.Geom
{ {
for (int i = 0; i < faces.Length; i += 3) for (int i = 0; i < faces.Length; i += 3)
{ {
int v0 = faces[i] * 3; RcVec3f v0 = RcVecUtils.Create(vertices, faces[i] * 3);
int v1 = faces[i + 1] * 3; RcVec3f v1 = RcVecUtils.Create(vertices, faces[i + 1] * 3);
int v2 = faces[i + 2] * 3; RcVec3f v2 = RcVecUtils.Create(vertices, faces[i + 2] * 3);
var e0 = RcVecUtils.Subtract(vertices, v1, v0); RcVec3f e0 = v1 - v0;
var e1 = RcVecUtils.Subtract(vertices, v2, v0); RcVec3f e1 = v2 - v0;
normals[i] = e0.Y * e1.Z - e0.Z * e1.Y; normals[i] = e0.Y * e1.Z - e0.Z * e1.Y;
normals[i + 1] = e0.Z * e1.X - e0.X * e1.Z; normals[i + 1] = e0.Z * e1.X - e0.X * e1.Z;

View File

@ -40,11 +40,6 @@ namespace DotRecast.Recast
public const int EV_HULL = -2; public const int EV_HULL = -2;
private static float Vdot2(float[] a, float[] b)
{
return a[0] * b[0] + a[2] * b[2];
}
private static float Vdot2(RcVec3f a, RcVec3f b) private static float Vdot2(RcVec3f a, RcVec3f b)
{ {
return a.X * b.X + a.Z * b.Z; return a.X * b.X + a.Z * b.Z;
@ -63,21 +58,6 @@ namespace DotRecast.Recast
return MathF.Sqrt(VdistSq2(verts, p, q)); return MathF.Sqrt(VdistSq2(verts, p, q));
} }
private static float VdistSq2(float[] p, float[] q)
{
float dx = q[0] - p[0];
float dy = q[2] - p[2];
return dx * dx + dy * dy;
}
private static float VdistSq2(float[] p, RcVec3f q)
{
float dx = q.X - p[0];
float dy = q.Z - p[2];
return dx * dx + dy * dy;
}
private static float VdistSq2(RcVec3f p, RcVec3f q) private static float VdistSq2(RcVec3f p, RcVec3f q)
{ {
float dx = q.X - p.X; float dx = q.X - p.X;
@ -85,49 +65,11 @@ namespace DotRecast.Recast
return dx * dx + dy * dy; return dx * dx + dy * dy;
} }
private static float Vdist2(float[] p, float[] q)
{
return MathF.Sqrt(VdistSq2(p, q));
}
private static float Vdist2(RcVec3f p, RcVec3f q) private static float Vdist2(RcVec3f p, RcVec3f q)
{ {
return MathF.Sqrt(VdistSq2(p, q)); return MathF.Sqrt(VdistSq2(p, q));
} }
private static float Vdist2(float[] p, RcVec3f q)
{
return MathF.Sqrt(VdistSq2(p, q));
}
private static float VdistSq2(float[] p, float[] verts, int q)
{
float dx = verts[q + 0] - p[0];
float dy = verts[q + 2] - p[2];
return dx * dx + dy * dy;
}
private static float VdistSq2(RcVec3f p, float[] verts, int q)
{
float dx = verts[q + 0] - p.X;
float dy = verts[q + 2] - p.Z;
return dx * dx + dy * dy;
}
private static float Vdist2(float[] p, float[] verts, int q)
{
return MathF.Sqrt(VdistSq2(p, verts, q));
}
private static float Vdist2(RcVec3f p, float[] verts, int q)
{
return MathF.Sqrt(VdistSq2(p, verts, q));
}
private static float Vcross2(float[] verts, int p1, int p2, int p3) private static float Vcross2(float[] verts, int p1, int p2, int p3)
{ {
float u1 = verts[p2 + 0] - verts[p1 + 0]; float u1 = verts[p2 + 0] - verts[p1 + 0];
@ -137,15 +79,6 @@ namespace DotRecast.Recast
return u1 * v2 - v1 * u2; return u1 * v2 - v1 * u2;
} }
private static float Vcross2(float[] p1, float[] p2, float[] p3)
{
float u1 = p2[0] - p1[0];
float v1 = p2[2] - p1[2];
float u2 = p3[0] - p1[0];
float v2 = p3[2] - p1[2];
return u1 * v2 - v1 * u2;
}
private static float Vcross2(RcVec3f p1, RcVec3f p2, RcVec3f p3) private static float Vcross2(RcVec3f p1, RcVec3f p2, RcVec3f p3)
{ {
float u1 = p2.X - p1.X; float u1 = p2.X - p1.X;
@ -156,13 +89,13 @@ namespace DotRecast.Recast
} }
private static bool CircumCircle(float[] verts, int p1, int p2, int p3, ref RcVec3f c, RcAtomicFloat r) private static bool CircumCircle(RcVec3f p1, RcVec3f p2, RcVec3f p3, ref RcVec3f c, out float r)
{ {
const float EPS = 1e-6f; const float EPS = 1e-6f;
// Calculate the circle relative to p1, to avoid some precision issues. // Calculate the circle relative to p1, to avoid some precision issues.
var v1 = new RcVec3f(); var v1 = new RcVec3f();
var v2 = RcVecUtils.Subtract(verts, p2, p1); var v2 = p2 - p1;
var v3 = RcVecUtils.Subtract(verts, p3, p1); var v3 = p3 - p1;
float cp = Vcross2(v1, v2, v3); float cp = Vcross2(v1, v2, v3);
if (MathF.Abs(cp) > EPS) if (MathF.Abs(cp) > EPS)
@ -173,13 +106,13 @@ namespace DotRecast.Recast
c.X = (v1Sq * (v2.Z - v3.Z) + v2Sq * (v3.Z - v1.Z) + v3Sq * (v1.Z - v2.Z)) / (2 * cp); c.X = (v1Sq * (v2.Z - v3.Z) + v2Sq * (v3.Z - v1.Z) + v3Sq * (v1.Z - v2.Z)) / (2 * cp);
c.Y = 0; c.Y = 0;
c.Z = (v1Sq * (v3.X - v2.X) + v2Sq * (v1.X - v3.X) + v3Sq * (v2.X - v1.X)) / (2 * cp); c.Z = (v1Sq * (v3.X - v2.X) + v2Sq * (v1.X - v3.X) + v3Sq * (v2.X - v1.X)) / (2 * cp);
r.Exchange(Vdist2(c, v1)); r = Vdist2(c, v1);
c = RcVecUtils.Add(c, verts, p1); c = c + p1;
return true; return true;
} }
c = RcVecUtils.Create(verts, p1); c = p1;
r.Exchange(0f); r = 0f;
return false; return false;
} }
@ -534,7 +467,7 @@ namespace DotRecast.Recast
// Find best point on left of edge. // Find best point on left of edge.
int pt = npts; int pt = npts;
RcVec3f c = new RcVec3f(); RcVec3f c = new RcVec3f();
RcAtomicFloat r = new RcAtomicFloat(-1f); float r = -1f;
for (int u = 0; u < npts; ++u) for (int u = 0; u < npts; ++u)
{ {
if (u == s || u == t) if (u == s || u == t)
@ -542,28 +475,32 @@ namespace DotRecast.Recast
continue; continue;
} }
if (Vcross2(pts, s * 3, t * 3, u * 3) > EPS) RcVec3f vs = RcVecUtils.Create(pts, s * 3);
RcVec3f vt = RcVecUtils.Create(pts, t * 3);
RcVec3f vu = RcVecUtils.Create(pts, u * 3);
if (Vcross2(vs, vt, vu) > EPS)
{ {
if (r.Get() < 0) if (r < 0)
{ {
// The circle is not updated yet, do it now. // The circle is not updated yet, do it now.
pt = u; pt = u;
CircumCircle(pts, s * 3, t * 3, u * 3, ref c, r); CircumCircle(vs, vt, vu, ref c, out r);
continue; continue;
} }
float d = Vdist2(c, pts, u * 3); float d = Vdist2(c, vu);
float tol = 0.001f; float tol = 0.001f;
if (d > r.Get() * (1 + tol)) if (d > r * (1 + tol))
{ {
// Outside current circumcircle, skip. // Outside current circumcircle, skip.
continue; continue;
} }
else if (d < r.Get() * (1 - tol)) else if (d < r * (1 - tol))
{ {
// Inside safe circumcircle, update circle. // Inside safe circumcircle, update circle.
pt = u; pt = u;
CircumCircle(pts, s * 3, t * 3, u * 3, ref c, r); CircumCircle(vs, vt, vu, ref c, out r);
} }
else else
{ {
@ -581,7 +518,7 @@ namespace DotRecast.Recast
// Edge is valid. // Edge is valid.
pt = u; pt = u;
CircumCircle(pts, s * 3, t * 3, u * 3, ref c, r); CircumCircle(vs, vt, vu, ref c, out r);
} }
} }
} }

View File

@ -193,7 +193,10 @@ namespace DotRecast.Recast
for (int i = 0; i < nt; ++i) for (int i = 0; i < nt; ++i)
{ {
int tri = i * 3; int tri = i * 3;
CalcTriNormal(verts, tris[tri], tris[tri + 1], tris[tri + 2], ref norm); RcVec3f v0 = RcVecUtils.Create(verts, tris[tri + 0] * 3);
RcVec3f v1 = RcVecUtils.Create(verts, tris[tri + 1] * 3);
RcVec3f v2 = RcVecUtils.Create(verts, tris[tri + 2] * 3);
CalcTriNormal(v0, v1, v2, ref norm);
// Check if the face is walkable. // Check if the face is walkable.
if (norm.Y > walkableThr) if (norm.Y > walkableThr)
areas[i] = areaMod.Apply(areas[i]); areas[i] = areaMod.Apply(areas[i]);
@ -202,10 +205,10 @@ namespace DotRecast.Recast
return areas; return areas;
} }
public static void CalcTriNormal(float[] verts, int v0, int v1, int v2, ref RcVec3f norm) public static void CalcTriNormal(RcVec3f v0, RcVec3f v1, RcVec3f v2, ref RcVec3f norm)
{ {
var e0 = RcVecUtils.Subtract(verts, v1 * 3, v0 * 3); var e0 = v1 - v0;
var e1 = RcVecUtils.Subtract(verts, v2 * 3, v0 * 3); var e1 = v2 - v0;
norm = RcVec3f.Cross(e0, e1); norm = RcVec3f.Cross(e0, e1);
norm = RcVec3f.Normalize(norm); norm = RcVec3f.Normalize(norm);
} }
@ -228,7 +231,10 @@ namespace DotRecast.Recast
for (int i = 0; i < nt; ++i) for (int i = 0; i < nt; ++i)
{ {
int tri = i * 3; int tri = i * 3;
CalcTriNormal(verts, tris[tri], tris[tri + 1], tris[tri + 2], ref norm); RcVec3f v0 = RcVecUtils.Create(verts, tris[tri + 0] * 3);
RcVec3f v1 = RcVecUtils.Create(verts, tris[tri + 1] * 3);
RcVec3f v2 = RcVecUtils.Create(verts, tris[tri + 2] * 3);
CalcTriNormal(v0, v1, v2, ref norm);
// Check if the face is walkable. // Check if the face is walkable.
if (norm.Y <= walkableThr) if (norm.Y <= walkableThr)
areas[i] = RC_NULL_AREA; areas[i] = RC_NULL_AREA;