Skip to content

Commit 8ab80b9

Browse files
Additional cleanup and acceleration of the System.Numerics vector and related types (#103527)
* Added SIMD paths for: Vector3.Cross(Vector3 vector1, Vector3 vector2) Vector3.Transform(Vector3 value, Quaternion rotation) * Fixed typo * fixed missing conversion back to Vector3 added simd paths for quaternion multiplication, division and concatenate added simd path for matrix4x4 multiplication * Implemented feedback * fixed non static field * removed whitespace * Use Vector4.Transform * Perform some additional cleanup of the System.Numerics.Vector and Matrix types --------- Co-authored-by: martenf <marten-fahse@hotmail.de>
1 parent ab013a3 commit 8ab80b9

File tree

11 files changed

+455
-837
lines changed

11 files changed

+455
-837
lines changed

src/libraries/System.Numerics.Vectors/tests/QuaternionTests.cs

+6-5
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ public void QuaternionCreateFromAxisAngleTest()
326326
Vector3 axis = Vector3.Normalize(new Vector3(1.0f, 2.0f, 3.0f));
327327
float angle = MathHelper.ToRadians(30.0f);
328328

329-
Quaternion expected = new Quaternion(0.0691723f, 0.1383446f, 0.207516879f, 0.9659258f);
329+
Quaternion expected = new Quaternion(0.06917231f, 0.13834462f, 0.2075169f, 0.9659258f);
330330
Quaternion actual;
331331

332332
actual = Quaternion.CreateFromAxisAngle(axis, angle);
@@ -545,10 +545,11 @@ public void QuaternionInverseTest()
545545
public void QuaternionInverseTest1()
546546
{
547547
Quaternion a = new Quaternion();
548+
549+
Quaternion expected = Quaternion.Zero;
548550
Quaternion actual = Quaternion.Inverse(a);
549551

550-
Assert.True(float.IsNaN(actual.X) && float.IsNaN(actual.Y) && float.IsNaN(actual.Z) && float.IsNaN(actual.W)
551-
, $"Quaternion.Inverse - did not return the expected value: expected {new Quaternion(float.NaN, float.NaN, float.NaN, float.NaN)} actual {actual}");
552+
Assert.Equal(expected, actual);
552553
}
553554

554555
// A test for ToString ()
@@ -919,10 +920,10 @@ public void QuaternionZeroTest()
919920
{
920921
// A default value should be equal to a zero value.
921922
Assert.Equal(default(Quaternion), Quaternion.Zero);
922-
923+
923924
// A newly constructed value should be equal to a zero value.
924925
Assert.Equal(new Quaternion(), Quaternion.Zero);
925-
926+
926927
// A newly constructed value with (0, 0, 0, 0) should be equal to a zero value.
927928
Assert.Equal(new Quaternion(0, 0, 0, 0), Quaternion.Zero);
928929
}

src/libraries/System.Numerics.Vectors/tests/Vector2Tests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ public void Vector2TransformByQuaternionTest1()
632632
{
633633
Vector2 v = new Vector2(1.0f, 2.0f);
634634
Quaternion q = new Quaternion();
635-
Vector2 expected = v;
635+
Vector2 expected = Vector2.Zero;
636636

637637
Vector2 actual = Vector2.Transform(v, q);
638638
Assert.True(MathHelper.Equal(expected, actual), "Vector2f.Transform did not return the expected value.");

src/libraries/System.Numerics.Vectors/tests/Vector3Tests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ public void Vector3TransformByQuaternionTest1()
689689
{
690690
Vector3 v = new Vector3(1.0f, 2.0f, 3.0f);
691691
Quaternion q = new Quaternion();
692-
Vector3 expected = v;
692+
Vector3 expected = Vector3.Zero;
693693

694694
Vector3 actual = Vector3.Transform(v, q);
695695
Assert.True(MathHelper.Equal(expected, actual), "Vector3f.Transform did not return the expected value.");

src/libraries/System.Numerics.Vectors/tests/Vector4Tests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ public void Vector4TransformVector4QuaternionTest1()
800800
{
801801
Vector4 v = new Vector4(1.0f, 2.0f, 3.0f, 0.0f);
802802
Quaternion q = new Quaternion();
803-
Vector4 expected = v;
803+
Vector4 expected = Vector4.Zero;
804804

805805
Vector4 actual = Vector4.Transform(v, q);
806806
Assert.True(MathHelper.Equal(expected, actual), "Vector4f.Transform did not return the expected value.");
@@ -844,7 +844,7 @@ public void Vector4TransformVector3QuaternionTest1()
844844
{
845845
Vector3 v = new Vector3(1.0f, 2.0f, 3.0f);
846846
Quaternion q = new Quaternion();
847-
Vector4 expected = new Vector4(v, 1.0f);
847+
Vector4 expected = Vector4.Zero;
848848

849849
Vector4 actual = Vector4.Transform(v, q);
850850
Assert.True(MathHelper.Equal(expected, actual), "Vector4f.Transform did not return the expected value.");
@@ -888,7 +888,7 @@ public void Vector4TransformVector2QuaternionTest1()
888888
{
889889
Vector2 v = new Vector2(1.0f, 2.0f);
890890
Quaternion q = new Quaternion();
891-
Vector4 expected = new Vector4(1.0f, 2.0f, 0, 1.0f);
891+
Vector4 expected = Vector4.Zero;
892892

893893
Vector4 actual = Vector4.Transform(v, q);
894894
Assert.True(MathHelper.Equal(expected, actual), "Vector4f.Transform did not return the expected value.");

src/libraries/System.Private.CoreLib/src/System/Numerics/Matrix3x2.Impl.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ readonly get
7272
{
7373
ThrowHelper.ThrowArgumentOutOfRangeException();
7474
}
75-
76-
return Unsafe.Add(ref Unsafe.AsRef(in this.X), row)[column];
75+
return Unsafe.Add(ref Unsafe.AsRef(in X), row)[column];
7776
}
7877

7978
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -83,7 +82,7 @@ readonly get
8382
{
8483
ThrowHelper.ThrowArgumentOutOfRangeException();
8584
}
86-
Unsafe.Add(ref this.X, row)[column] = value;
85+
Unsafe.Add(ref X, row)[column] = value;
8786
}
8887
}
8988

@@ -514,7 +513,7 @@ public readonly float GetDeterminant()
514513
[MethodImpl(MethodImplOptions.AggressiveInlining)]
515514
public override readonly int GetHashCode() => HashCode.Combine(X, Y, Z);
516515

517-
bool IEquatable<Impl>.Equals(Impl other) => Equals(in other);
516+
readonly bool IEquatable<Impl>.Equals(Impl other) => Equals(in other);
518517
}
519518
}
520519
}

0 commit comments

Comments
 (0)