Пример #1
0
        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);
Пример #2
0
        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());
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
 public static bool IsIdentity(MatrixSingle matrix)
 {
     return(CompareEqual(matrix, Identity));
 }
Пример #8
0
        public static Vector128 <float> GetTranslation(MatrixSingle matrix)
        {
            Vector128 <float> vec = matrix._v3;

            return(And(vec, SingleConstants.MaskW));
        }
Пример #9
0
 public static MatrixSingle SetTranslation(MatrixSingle matrix, in Vector4FParam1_3 translation)