forked from bit/DotRecastNetSim
refactor: RcVec3f.Cross now corresponds to System.Numerics.Vector3.Normalize in the switching build
This commit is contained in:
parent
3861b0a2c1
commit
cb4a7b37d7
|
@ -259,16 +259,6 @@ namespace DotRecast.Core.Numerics
|
|||
return right * left;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static RcVec3f Cross(RcVec3f v1, RcVec3f v2)
|
||||
{
|
||||
return new RcVec3f(
|
||||
(v1.Y * v2.Z) - (v1.Z * v2.Y),
|
||||
(v1.Z * v2.X) - (v1.X * v2.Z),
|
||||
(v1.X * v2.Y) - (v1.Y * v2.X)
|
||||
);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static RcVec3f Lerp(RcVec3f v1, RcVec3f v2, float t)
|
||||
{
|
||||
|
@ -505,21 +495,14 @@ namespace DotRecast.Core.Numerics
|
|||
e0.Z = i.Z - verts[j + 2];
|
||||
}
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static void Cross(float[] dest, float[] v1, float[] v2)
|
||||
public static RcVec3f Cross(RcVec3f v1, RcVec3f v2)
|
||||
{
|
||||
dest[0] = v1[1] * v2[2] - v1[2] * v2[1];
|
||||
dest[1] = v1[2] * v2[0] - v1[0] * v2[2];
|
||||
dest[2] = v1[0] * v2[1] - v1[1] * v2[0];
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static void Cross(ref RcVec3f dest, RcVec3f v1, RcVec3f v2)
|
||||
{
|
||||
dest.X = v1.Y * v2.Z - v1.Z * v2.Y;
|
||||
dest.Y = v1.Z * v2.X - v1.X * v2.Z;
|
||||
dest.Z = v1.X * v2.Y - v1.Y * v2.X;
|
||||
return new RcVec3f(
|
||||
(v1.Y * v2.Z) - (v1.Z * v2.Y),
|
||||
(v1.Z * v2.X) - (v1.X * v2.Z),
|
||||
(v1.X * v2.Y) - (v1.Y * v2.X)
|
||||
);
|
||||
}
|
||||
|
||||
/// Normalizes the vector.
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using DotRecast.Core.Numerics;
|
||||
|
||||
namespace DotRecast.Core.Numerics
|
||||
{
|
||||
public static class RcVecExtensions
|
||||
public static class RcVecUtils
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static float Get(this RcVec2f v, int i)
|
||||
|
@ -56,5 +55,13 @@ namespace DotRecast.Core.Numerics
|
|||
return @this.X * v[vi] +
|
||||
@this.Z * v[vi + 2];
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static void Cross(float[] dest, float[] v1, float[] v2)
|
||||
{
|
||||
dest[0] = v1[1] * v2[2] - v1[2] * v2[1];
|
||||
dest[1] = v1[2] * v2[0] - v1[0] * v2[2];
|
||||
dest[2] = v1[0] * v2[1] - v1[1] * v2[0];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -78,9 +78,9 @@ namespace DotRecast.Detour.Dynamic.Colliders
|
|||
};
|
||||
|
||||
halfEdges[1] = RcVec3f.Normalize(halfEdges[1]);
|
||||
RcVec3f.Cross(ref halfEdges[0], up, forward);
|
||||
halfEdges[0] = RcVec3f.Cross(up, forward);
|
||||
halfEdges[0] = RcVec3f.Normalize(halfEdges[0]);
|
||||
RcVec3f.Cross(ref halfEdges[2], halfEdges[0], up);
|
||||
halfEdges[2] = RcVec3f.Cross(halfEdges[0], up);
|
||||
halfEdges[2] = RcVec3f.Normalize(halfEdges[2]);
|
||||
halfEdges[0].X *= extent.X;
|
||||
halfEdges[0].Y *= extent.X;
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
using System;
|
||||
using DotRecast.Core.Numerics;
|
||||
|
||||
using static DotRecast.Recast.Toolset.Gizmos.RcGizmoHelper;
|
||||
|
||||
namespace DotRecast.Recast.Toolset.Gizmos
|
||||
|
@ -25,7 +24,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
|
|||
normals[1] = RcVec3f.Normalize(normals[1]);
|
||||
normals[0] = GetSideVector(axis);
|
||||
normals[2] = RcVec3f.Zero;
|
||||
RcVec3f.Cross(ref normals[2], normals[0], normals[1]);
|
||||
normals[2] = RcVec3f.Cross(normals[0], normals[1]);
|
||||
normals[2] = RcVec3f.Normalize(normals[2]);
|
||||
triangles = GenerateSphericalTriangles();
|
||||
var trX = new RcVec3f(normals[0].X, normals[1].X, normals[2].X);
|
||||
|
@ -55,15 +54,14 @@ namespace DotRecast.Recast.Toolset.Gizmos
|
|||
|
||||
private RcVec3f GetSideVector(RcVec3f axis)
|
||||
{
|
||||
RcVec3f side = new RcVec3f(1, 0, 0);
|
||||
var side = new RcVec3f(1, 0, 0);
|
||||
if (axis.X > 0.8)
|
||||
{
|
||||
side = new RcVec3f(0, 0, 1);
|
||||
}
|
||||
|
||||
RcVec3f forward = new RcVec3f();
|
||||
RcVec3f.Cross(ref forward, side, axis);
|
||||
RcVec3f.Cross(ref side, axis, forward);
|
||||
var forward = RcVec3f.Cross(side, axis);
|
||||
side = RcVec3f.Cross(axis, forward);
|
||||
side = RcVec3f.Normalize(side);
|
||||
return side;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
using System;
|
||||
using DotRecast.Core.Numerics;
|
||||
|
||||
using static DotRecast.Recast.Toolset.Gizmos.RcGizmoHelper;
|
||||
|
||||
|
||||
|
@ -25,7 +24,7 @@ namespace DotRecast.Recast.Toolset.Gizmos
|
|||
normals[1] = RcVec3f.Normalize(normals[1]);
|
||||
normals[0] = GetSideVector(axis);
|
||||
normals[2] = RcVec3f.Zero;
|
||||
RcVec3f.Cross(ref normals[2], normals[0], normals[1]);
|
||||
normals[2] = RcVec3f.Cross(normals[0], normals[1]);
|
||||
normals[2] = RcVec3f.Normalize(normals[2]);
|
||||
triangles = GenerateCylindricalTriangles();
|
||||
RcVec3f trX = new RcVec3f(normals[0].X, normals[1].X, normals[2].X);
|
||||
|
@ -67,9 +66,8 @@ namespace DotRecast.Recast.Toolset.Gizmos
|
|||
side = new RcVec3f(0, 0, 1);
|
||||
}
|
||||
|
||||
RcVec3f forward = new RcVec3f();
|
||||
RcVec3f.Cross(ref forward, side, axis);
|
||||
RcVec3f.Cross(ref side, axis, forward);
|
||||
var forward = RcVec3f.Cross(side, axis);
|
||||
side = RcVec3f.Cross(axis, forward);
|
||||
side = RcVec3f.Normalize(side);
|
||||
return side;
|
||||
}
|
||||
|
|
|
@ -142,7 +142,7 @@ namespace DotRecast.Recast
|
|||
RcVec3f e1 = new RcVec3f();
|
||||
RcVec3f.Sub(ref e0, verts, v1 * 3, v0 * 3);
|
||||
RcVec3f.Sub(ref e1, verts, v2 * 3, v0 * 3);
|
||||
RcVec3f.Cross(ref norm, e0, e1);
|
||||
norm = RcVec3f.Cross(e0, e1);
|
||||
norm = RcVec3f.Normalize(norm);
|
||||
}
|
||||
|
||||
|
|
|
@ -176,7 +176,7 @@ namespace DotRecast.Recast
|
|||
|
||||
private static void Plane(float[][] planes, int p, float[] v1, float[] v2, float[] vertices, int vert)
|
||||
{
|
||||
RcVec3f.Cross(planes[p], v1, v2);
|
||||
RcVecUtils.Cross(planes[p], v1, v2);
|
||||
planes[p][3] = planes[p][0] * vertices[vert] + planes[p][1] * vertices[vert + 1] + planes[p][2] * vertices[vert + 2];
|
||||
}
|
||||
|
||||
|
|
|
@ -75,4 +75,21 @@ public class Vector3Tests
|
|||
Assert.That(v2.Y, Is.EqualTo(v22.Y).Within(0.000001d));
|
||||
Assert.That(v2.Z, Is.EqualTo(v22.Z).Within(0.000001d));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Repeat(10000)]
|
||||
public void TestVectorCross()
|
||||
{
|
||||
var v1 = new Vector3(Random.Shared.NextSingle(), Random.Shared.NextSingle(), Random.Shared.NextSingle());
|
||||
var v2 = new Vector3(Random.Shared.NextSingle(), Random.Shared.NextSingle(), Random.Shared.NextSingle());
|
||||
var v3 = Vector3.Cross(v1, v2);
|
||||
|
||||
var v11 = new RcVec3f(v1.X, v1.Y, v1.Z);
|
||||
var v22 = new RcVec3f(v2.X, v2.Y, v2.Z);
|
||||
var v33 = RcVec3f.Cross(v11, v22);
|
||||
|
||||
Assert.That(v3.X, Is.EqualTo(v33.X));
|
||||
Assert.That(v3.Y, Is.EqualTo(v33.Y));
|
||||
Assert.That(v3.Z, Is.EqualTo(v33.Z));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue