public static unsafe bool Decompose(MatrixSingle matrix, out Vector128 <float> scale, out Vector128 <float> rotation, out Vector128 <float> translation) { // TODO use Unsafe.SkipInit<T>(out T) scale = default; translation = matrix._v3; CanonicalBasis canonicalBasis; Vector128 <float> **pCanonicalBasis = (Vector128 <float> **) & canonicalBasis; var r0 = IdentityRow0; var r1 = IdentityRow1; var r2 = IdentityRow2; canonicalBasis.E0 = &r0; canonicalBasis.E1 = &r1; canonicalBasis.E2 = &r2; MatrixSingle tmp; VectorBasis vectorBasis; Vector128 <float> **pVectorBasis = (Vector128 <float> **) & vectorBasis; vectorBasis.E0 = &tmp._v0; vectorBasis.E1 = &tmp._v1; vectorBasis.E2 = &tmp._v2; tmp._v0 = matrix._v0; tmp._v1 = matrix._v1; tmp._v2 = matrix._v2; tmp._v3 = IdentityRow3; ref var pFloat0 = ref Unsafe.As <Vector128 <float>, float>(ref scale);
public static bool CompareEqual(MatrixSingle left, MatrixSingle right) { Vector128 <float> row0 = Vector.CompareEqual(left._v0, right._v0); Vector128 <float> row1 = Vector.CompareEqual(left._v1, right._v1); Vector128 <float> row2 = Vector.CompareEqual(left._v2, right._v2); Vector128 <float> row3 = Vector.CompareEqual(left._v3, right._v3); row0 = And(row0, row1); row2 = And(row2, row3); row0 = And(row0, row2); return(row0.AllTrue()); }
public static Vector128 <float> Transform2D(Vector128 <float> position, MatrixSingle matrix) { var x = FillWithX(position); var y = FillWithY(position); x = Multiply(x, matrix._v0); y = Multiply(y, matrix._v1); x = Vector.Add(x, y); x = Vector.Add(x, matrix._v3); return(x); }
public static bool IsIdentity(MatrixSingle matrix) { var row0 = Vector.Equality(matrix._v0, IdentityRow0); var row1 = Vector.Equality(matrix._v1, IdentityRow1); var row2 = Vector.Equality(matrix._v2, IdentityRow2); var row3 = Vector.Equality(matrix._v3, IdentityRow3); row0 = Vector.And(row0, row1); row2 = Vector.And(row2, row3); row0 = Vector.And(row0, row2); return(Vector.ExtractMask(row0) == 0b_0000_1111); }
public static Vector128 <float> Transform4D(Vector128 <float> position, MatrixSingle matrix) { var x = FillWithX(position); var y = FillWithY(position); var z = FillWithZ(position); var w = FillWithW(position); x = Multiply(x, matrix._v0); y = Multiply(y, matrix._v1); z = Multiply(z, matrix._v2); w = Multiply(w, matrix._v3); x = Vector.Add(x, y); x = Vector.Add(x, z); x = Vector.Add(x, w); return(x); }
public static MatrixSingle SetTranslation(MatrixSingle matrix, Vector128 <float> translation) { // (X, Y, Z, W) - we must keep W Vector128 <float> old = matrix._v3; // Make W of translation zero Vector128 <float> newTranslation = And(translation, SingleConstants.MaskW); // Mask out everything but W old = And(old, SingleConstants.MaskXYZ); // Or them together to get X Y Z from translation and W from old newTranslation = Or(newTranslation, old); matrix._v3 = newTranslation; return(matrix); }
public static bool IsIdentity(MatrixSingle matrix) { return(CompareEqual(matrix, Identity)); }
public static Vector128 <float> GetTranslation(MatrixSingle matrix) { Vector128 <float> vec = matrix._v3; return(And(vec, SingleConstants.MaskW)); }
public static MatrixSingle SetTranslation(MatrixSingle matrix, in Vector4FParam1_3 translation)