856 {
858 {
859 return SseImpl(matrix, out result);
860 }
861 return SoftwareFallback(matrix, out result);
863 {
864 float m = matrix.M11;
865 float m2 = matrix.M12;
866 float m3 = matrix.M13;
867 float m4 = matrix.M14;
868 float m5 = matrix.M21;
869 float m6 = matrix.M22;
870 float m7 = matrix.M23;
871 float m8 = matrix.M24;
872 float m9 = matrix.M31;
873 float m10 = matrix.M32;
874 float m11 = matrix.M33;
875 float m12 = matrix.M34;
876 float m13 = matrix.M41;
877 float m14 = matrix.M42;
878 float m15 = matrix.M43;
879 float m16 = matrix.M44;
880 float num = m11 * m16 - m12 * m15;
881 float num2 = m10 * m16 - m12 * m14;
882 float num3 = m10 * m15 - m11 * m14;
883 float num4 = m9 * m16 - m12 * m13;
884 float num5 = m9 * m15 - m11 * m13;
885 float num6 = m9 * m14 - m10 * m13;
886 float num7 = m6 * num - m7 * num2 + m8 * num3;
887 float num8 = 0f - (m5 * num - m7 * num4 + m8 * num5);
888 float num9 = m5 * num2 - m6 * num4 + m8 * num6;
889 float num10 = 0f - (m5 * num3 - m6 * num5 + m7 * num6);
890 float num11 = m * num7 + m2 * num8 + m3 * num9 + m4 * num10;
891 if (MathF.Abs(num11) < float.Epsilon)
892 {
893 result =
new Matrix4x4(
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN);
894 return false;
895 }
896 float num12 = 1f / num11;
897 result.M11 = num7 * num12;
898 result.M21 = num8 * num12;
899 result.M31 = num9 * num12;
900 result.M41 = num10 * num12;
901 result.M12 = (0f - (m2 * num - m3 * num2 + m4 * num3)) * num12;
902 result.M22 = (m * num - m3 * num4 + m4 * num5) * num12;
903 result.M32 = (0f - (m * num2 - m2 * num4 + m4 * num6)) * num12;
904 result.M42 = (m * num3 - m2 * num5 + m3 * num6) * num12;
905 float num13 = m7 * m16 - m8 * m15;
906 float num14 = m6 * m16 - m8 * m14;
907 float num15 = m6 * m15 - m7 * m14;
908 float num16 = m5 * m16 - m8 * m13;
909 float num17 = m5 * m15 - m7 * m13;
910 float num18 = m5 * m14 - m6 * m13;
911 result.M13 = (m2 * num13 - m3 * num14 + m4 * num15) * num12;
912 result.M23 = (0f - (m * num13 - m3 * num16 + m4 * num17)) * num12;
913 result.M33 = (m * num14 - m2 * num16 + m4 * num18) * num12;
914 result.M43 = (0f - (m * num15 - m2 * num17 + m3 * num18)) * num12;
915 float num19 = m7 * m12 - m8 * m11;
916 float num20 = m6 * m12 - m8 * m10;
917 float num21 = m6 * m11 - m7 * m10;
918 float num22 = m5 * m12 - m8 * m9;
919 float num23 = m5 * m11 - m7 * m9;
920 float num24 = m5 * m10 - m6 * m9;
921 result.M14 = (0f - (m2 * num19 - m3 * num20 + m4 * num21)) * num12;
922 result.M24 = (m * num19 - m3 * num22 + m4 * num23) * num12;
923 result.M34 = (0f - (m * num20 - m2 * num22 + m4 * num24)) * num12;
924 result.M44 = (m * num21 - m2 * num23 + m3 * num24) * num12;
925 return true;
926 }
928 {
930 {
931 throw new PlatformNotSupportedException();
932 }
1002 left11 =
Permute(left11, 147);
1008 left13 =
Sse.
Add(left13, left5);
1012 left15 =
Sse.
Add(left15, left7);
1019 left13 =
Permute(left13, 216);
1020 left14 =
Permute(left14, 216);
1021 left15 =
Permute(left15, 216);
1022 left16 =
Permute(left16, 216);
1023 right3 = left;
1025 if (MathF.Abs(num25) < float.Epsilon)
1026 {
1027 result =
new Matrix4x4(
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN,
float.NaN);
1028 return false;
1029 }
1039 reference = left;
1040 Unsafe.Add(ref reference, 1) = right;
1041 Unsafe.Add(ref reference, 2) = left2;
1042 Unsafe.Add(ref reference, 3) = right2;
1043 return true;
1044 }
1045 }
static Vector128< byte > Create(byte value)
static Vector4 AsVector4(this Vector128< float > value)
static new bool IsSupported
static unsafe Vector128< float > LoadVector128(float *address)
static Vector128< float > Shuffle(Vector128< float > left, Vector128< float > right, byte control)
static Vector128< float > Multiply(Vector128< float > left, Vector128< float > right)
static Vector128< float > Add(Vector128< float > left, Vector128< float > right)
static Vector128< float > Subtract(Vector128< float > left, Vector128< float > right)
static Vector128< float > Divide(Vector128< float > left, Vector128< float > right)
Matrix4x4(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44)
static Vector128< float > Permute(Vector128< float > value, byte control)