forked from mirror/DotRecast
Changed to consolidate vector-related functions into one place.
This commit is contained in:
parent
5911510544
commit
0092761742
|
@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Changed `heights`, `areas`, `cons`, and `regs` arrays to byte arrays for uniformity and efficiency in `DtTileCacheLayer`
|
- Changed `heights`, `areas`, `cons`, and `regs` arrays to byte arrays for uniformity and efficiency in `DtTileCacheLayer`
|
||||||
- Changed `reg`, `area` arrays to byte arrays for uniformity and efficiency in `DtTileCacheContour`
|
- Changed `reg`, `area` arrays to byte arrays for uniformity and efficiency in `DtTileCacheContour`
|
||||||
- Changed `RcChunkyTriMesh` to separate the function and variable.
|
- Changed `RcChunkyTriMesh` to separate the function and variable.
|
||||||
|
- Changed to consolidate vector-related functions into one place.
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
- Removed RcMeshDetails.VdistSq2(float[], float[])
|
- Removed RcMeshDetails.VdistSq2(float[], float[])
|
||||||
|
|
|
@ -36,6 +36,54 @@ namespace DotRecast.Core.Numerics
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static float Dot2(RcVec3f a, RcVec3f b)
|
||||||
|
{
|
||||||
|
return a.X * b.X + a.Z * b.Z;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static float DistSq2(float[] verts, int p, int q)
|
||||||
|
{
|
||||||
|
float dx = verts[q + 0] - verts[p + 0];
|
||||||
|
float dy = verts[q + 2] - verts[p + 2];
|
||||||
|
return dx * dx + dy * dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float Dist2(float[] verts, int p, int q)
|
||||||
|
{
|
||||||
|
return MathF.Sqrt(DistSq2(verts, p, q));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float DistSq2(RcVec3f p, RcVec3f q)
|
||||||
|
{
|
||||||
|
float dx = q.X - p.X;
|
||||||
|
float dy = q.Z - p.Z;
|
||||||
|
return dx * dx + dy * dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float Dist2(RcVec3f p, RcVec3f q)
|
||||||
|
{
|
||||||
|
return MathF.Sqrt(DistSq2(p, q));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float Cross2(float[] verts, int p1, int p2, int p3)
|
||||||
|
{
|
||||||
|
float u1 = verts[p2 + 0] - verts[p1 + 0];
|
||||||
|
float v1 = verts[p2 + 2] - verts[p1 + 2];
|
||||||
|
float u2 = verts[p3 + 0] - verts[p1 + 0];
|
||||||
|
float v2 = verts[p3 + 2] - verts[p1 + 2];
|
||||||
|
return u1 * v2 - v1 * u2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float Cross2(RcVec3f p1, RcVec3f p2, RcVec3f p3)
|
||||||
|
{
|
||||||
|
float u1 = p2.X - p1.X;
|
||||||
|
float v1 = p2.Z - p1.Z;
|
||||||
|
float u2 = p3.X - p1.X;
|
||||||
|
float v2 = p3.Z - p1.Z;
|
||||||
|
return u1 * v2 - v1 * u2;
|
||||||
|
}
|
||||||
|
|
||||||
/// Derives the dot product of two vectors on the xz-plane. (@p u . @p v)
|
/// Derives the dot product of two vectors on the xz-plane. (@p u . @p v)
|
||||||
/// @param[in] u A vector [(x, y, z)]
|
/// @param[in] u A vector [(x, y, z)]
|
||||||
/// @param[in] v A vector [(x, y, z)]
|
/// @param[in] v A vector [(x, y, z)]
|
||||||
|
|
|
@ -27,60 +27,13 @@ using DotRecast.Core.Numerics;
|
||||||
namespace DotRecast.Recast
|
namespace DotRecast.Recast
|
||||||
{
|
{
|
||||||
using static RcRecast;
|
using static RcRecast;
|
||||||
|
using static RcVecUtils;
|
||||||
using static EdgeValues;
|
using static EdgeValues;
|
||||||
|
|
||||||
public static class RcMeshDetails
|
public static class RcMeshDetails
|
||||||
{
|
{
|
||||||
public const int RC_UNSET_HEIGHT = RC_SPAN_MAX_HEIGHT;
|
public const int RC_UNSET_HEIGHT = RC_SPAN_MAX_HEIGHT;
|
||||||
|
|
||||||
public static float Vdot2(RcVec3f a, RcVec3f b)
|
|
||||||
{
|
|
||||||
return a.X * b.X + a.Z * b.Z;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static float VdistSq2(float[] verts, int p, int q)
|
|
||||||
{
|
|
||||||
float dx = verts[q + 0] - verts[p + 0];
|
|
||||||
float dy = verts[q + 2] - verts[p + 2];
|
|
||||||
return dx * dx + dy * dy;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float Vdist2(float[] verts, int p, int q)
|
|
||||||
{
|
|
||||||
return MathF.Sqrt(VdistSq2(verts, p, q));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float VdistSq2(RcVec3f p, RcVec3f q)
|
|
||||||
{
|
|
||||||
float dx = q.X - p.X;
|
|
||||||
float dy = q.Z - p.Z;
|
|
||||||
return dx * dx + dy * dy;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float Vdist2(RcVec3f p, RcVec3f q)
|
|
||||||
{
|
|
||||||
return MathF.Sqrt(VdistSq2(p, q));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float Vcross2(float[] verts, int p1, int p2, int p3)
|
|
||||||
{
|
|
||||||
float u1 = verts[p2 + 0] - verts[p1 + 0];
|
|
||||||
float v1 = verts[p2 + 2] - verts[p1 + 2];
|
|
||||||
float u2 = verts[p3 + 0] - verts[p1 + 0];
|
|
||||||
float v2 = verts[p3 + 2] - verts[p1 + 2];
|
|
||||||
return u1 * v2 - v1 * u2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float Vcross2(RcVec3f p1, RcVec3f p2, RcVec3f p3)
|
|
||||||
{
|
|
||||||
float u1 = p2.X - p1.X;
|
|
||||||
float v1 = p2.Z - p1.Z;
|
|
||||||
float u2 = p3.X - p1.X;
|
|
||||||
float v2 = p3.Z - p1.Z;
|
|
||||||
return u1 * v2 - v1 * u2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static bool CircumCircle(RcVec3f p1, RcVec3f p2, RcVec3f p3, ref RcVec3f c, out float r)
|
public static bool CircumCircle(RcVec3f p1, RcVec3f p2, RcVec3f p3, ref RcVec3f c, out float r)
|
||||||
{
|
{
|
||||||
|
@ -90,16 +43,16 @@ namespace DotRecast.Recast
|
||||||
var v2 = p2 - p1;
|
var v2 = p2 - p1;
|
||||||
var v3 = p3 - p1;
|
var v3 = p3 - p1;
|
||||||
|
|
||||||
float cp = Vcross2(v1, v2, v3);
|
float cp = Cross2(v1, v2, v3);
|
||||||
if (MathF.Abs(cp) > EPS)
|
if (MathF.Abs(cp) > EPS)
|
||||||
{
|
{
|
||||||
float v1Sq = Vdot2(v1, v1);
|
float v1Sq = Dot2(v1, v1);
|
||||||
float v2Sq = Vdot2(v2, v2);
|
float v2Sq = Dot2(v2, v2);
|
||||||
float v3Sq = Vdot2(v3, v3);
|
float v3Sq = Dot2(v3, v3);
|
||||||
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 = Vdist2(c, v1);
|
r = Dist2(c, v1);
|
||||||
c = c + p1;
|
c = c + p1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -115,11 +68,11 @@ namespace DotRecast.Recast
|
||||||
var v1 = b - a;
|
var v1 = b - a;
|
||||||
var v2 = p - a;
|
var v2 = p - a;
|
||||||
|
|
||||||
float dot00 = Vdot2(v0, v0);
|
float dot00 = Dot2(v0, v0);
|
||||||
float dot01 = Vdot2(v0, v1);
|
float dot01 = Dot2(v0, v1);
|
||||||
float dot02 = Vdot2(v0, v2);
|
float dot02 = Dot2(v0, v2);
|
||||||
float dot11 = Vdot2(v1, v1);
|
float dot11 = Dot2(v1, v1);
|
||||||
float dot12 = Vdot2(v1, v2);
|
float dot12 = Dot2(v1, v2);
|
||||||
|
|
||||||
// Compute barycentric coordinates
|
// Compute barycentric coordinates
|
||||||
float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01);
|
float invDenom = 1.0f / (dot00 * dot11 - dot01 * dot01);
|
||||||
|
@ -397,11 +350,11 @@ namespace DotRecast.Recast
|
||||||
|
|
||||||
public static bool OverlapSegSeg2d(float[] verts, int a, int b, int c, int d)
|
public static bool OverlapSegSeg2d(float[] verts, int a, int b, int c, int d)
|
||||||
{
|
{
|
||||||
float a1 = Vcross2(verts, a, b, d);
|
float a1 = Cross2(verts, a, b, d);
|
||||||
float a2 = Vcross2(verts, a, b, c);
|
float a2 = Cross2(verts, a, b, c);
|
||||||
if (a1 * a2 < 0.0f)
|
if (a1 * a2 < 0.0f)
|
||||||
{
|
{
|
||||||
float a3 = Vcross2(verts, c, d, a);
|
float a3 = Cross2(verts, c, d, a);
|
||||||
float a4 = a3 + a2 - a1;
|
float a4 = a3 + a2 - a1;
|
||||||
if (a3 * a4 < 0.0f)
|
if (a3 * a4 < 0.0f)
|
||||||
{
|
{
|
||||||
|
@ -472,7 +425,7 @@ namespace DotRecast.Recast
|
||||||
RcVec3f vt = RcVecUtils.Create(pts, t * 3);
|
RcVec3f vt = RcVecUtils.Create(pts, t * 3);
|
||||||
RcVec3f vu = RcVecUtils.Create(pts, u * 3);
|
RcVec3f vu = RcVecUtils.Create(pts, u * 3);
|
||||||
|
|
||||||
if (Vcross2(vs, vt, vu) > EPS)
|
if (Cross2(vs, vt, vu) > EPS)
|
||||||
{
|
{
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
{
|
{
|
||||||
|
@ -482,7 +435,7 @@ namespace DotRecast.Recast
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
float d = Vdist2(c, vu);
|
float d = Dist2(c, vu);
|
||||||
float tol = 0.001f;
|
float tol = 0.001f;
|
||||||
if (d > r * (1 + tol))
|
if (d > r * (1 + tol))
|
||||||
{
|
{
|
||||||
|
@ -696,7 +649,7 @@ namespace DotRecast.Recast
|
||||||
int pv = hull[pi] * 3;
|
int pv = hull[pi] * 3;
|
||||||
int cv = hull[i] * 3;
|
int cv = hull[i] * 3;
|
||||||
int nv = hull[ni] * 3;
|
int nv = hull[ni] * 3;
|
||||||
float d = Vdist2(verts, pv, cv) + Vdist2(verts, cv, nv) + Vdist2(verts, nv, pv);
|
float d = Dist2(verts, pv, cv) + Dist2(verts, cv, nv) + Dist2(verts, nv, pv);
|
||||||
if (d < dmin)
|
if (d < dmin)
|
||||||
{
|
{
|
||||||
start = i;
|
start = i;
|
||||||
|
@ -726,8 +679,8 @@ namespace DotRecast.Recast
|
||||||
int nvleft = hull[nleft] * 3;
|
int nvleft = hull[nleft] * 3;
|
||||||
int cvright = hull[right] * 3;
|
int cvright = hull[right] * 3;
|
||||||
int nvright = hull[nright] * 3;
|
int nvright = hull[nright] * 3;
|
||||||
float dleft = Vdist2(verts, cvleft, nvleft) + Vdist2(verts, nvleft, cvright);
|
float dleft = Dist2(verts, cvleft, nvleft) + Dist2(verts, nvleft, cvright);
|
||||||
float dright = Vdist2(verts, cvright, nvright) + Vdist2(verts, cvleft, nvright);
|
float dright = Dist2(verts, cvright, nvright) + Dist2(verts, cvleft, nvright);
|
||||||
|
|
||||||
if (dleft < dright)
|
if (dleft < dright)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue