Ejemplo n.º 1
0
        public static unsafe Mat4x4 TransposeReadOnlySpan(Mat4x4 source)
        {
            Mat4x4 result = new Mat4x4();

            Mat4x4 *srcP = &source;
            Mat4x4 *resP = &result;

            float *src = (float *)srcP;
            float *res = (float *)resP;

            var avx1 = Avx.LoadVector256(src);
            var avx2 = Avx.LoadVector256(&src[8]);

            Vector256 <int> permuter;

            fixed(int *p = &pmuter.GetPinnableReference())
            {
                permuter = Avx.LoadVector256(p);
            }

            var tmp1 = Avx2.PermuteVar8x32(avx1, permuter);
            var tmp2 = Avx2.PermuteVar8x32(avx2, permuter);

            var res1 = Avx.Shuffle(tmp1, tmp2, 0b10_00_10_00);
            var res2 = Avx.Shuffle(tmp1, tmp2, 0b11_01_11_01);

            Avx.Store(&res[0], res1);
            Avx.Store(&res[8], res2);

            return(result);
        }
Ejemplo n.º 2
0
        public static unsafe Mat4x4 TransposeLoadArray(Mat4x4 source)
        {
            Mat4x4 result = new Mat4x4();

            Mat4x4 *srcP = &source;
            Mat4x4 *resP = &result;

            float *src = (float *)srcP;
            float *res = (float *)resP;

            var avx1 = Avx.LoadVector256(src);
            var avx2 = Avx.LoadVector256(&src[8]);

            Vector256 <int> permuter = Avx.LoadVector256(tranpose_permuter);

            var tmp1 = Avx2.PermuteVar8x32(avx1, permuter);
            var tmp2 = Avx2.PermuteVar8x32(avx2, permuter);

            var res1 = Avx.Shuffle(tmp1, tmp2, 0b10_00_10_00);
            var res2 = Avx.Shuffle(tmp1, tmp2, 0b11_01_11_01);

            Avx.Store(&res[0], res1);
            Avx.Store(&res[8], res2);

            return(result);
        }
Ejemplo n.º 3
0
        public static Mat4x4 Multiply(Mat4x4 left, Mat4x4 right)
        {
            Mat4x4 result = new Mat4x4
            {
                r1c1 = left.r1c1 * right.r1c1 + left.r2c1 * right.r1c2 + left.r3c1 * right.r1c3 + left.r4c1 * right.r1c4,
                r1c2 = left.r1c2 * right.r1c1 + left.r2c2 * right.r1c2 + left.r3c2 * right.r1c3 + left.r4c2 * right.r1c4,
                r1c3 = left.r1c3 * right.r1c1 + left.r2c3 * right.r1c2 + left.r3c3 * right.r1c3 + left.r4c3 * right.r1c4,
                r1c4 = left.r1c4 * right.r1c1 + left.r2c4 * right.r1c2 + left.r3c4 * right.r1c3 + left.r4c4 * right.r1c4,

                r2c1 = left.r1c1 * right.r2c1 + left.r2c1 * right.r2c2 + left.r3c1 * right.r2c3 + left.r4c1 * right.r2c4,
                r2c2 = left.r1c2 * right.r2c1 + left.r2c2 * right.r2c2 + left.r3c2 * right.r2c3 + left.r4c2 * right.r2c4,
                r2c3 = left.r1c3 * right.r2c1 + left.r2c3 * right.r2c2 + left.r3c3 * right.r2c3 + left.r4c3 * right.r2c4,
                r2c4 = left.r1c4 * right.r2c1 + left.r2c4 * right.r2c2 + left.r3c4 * right.r2c3 + left.r4c4 * right.r2c4,

                r3c1 = left.r1c1 * right.r3c1 + left.r2c1 * right.r3c2 + left.r3c1 * right.r3c3 + left.r4c1 * right.r3c4,
                r3c2 = left.r1c2 * right.r3c1 + left.r2c2 * right.r3c2 + left.r3c2 * right.r3c3 + left.r4c2 * right.r3c4,
                r3c3 = left.r1c3 * right.r3c1 + left.r2c3 * right.r3c2 + left.r3c3 * right.r3c3 + left.r4c3 * right.r3c4,
                r3c4 = left.r1c4 * right.r3c1 + left.r2c4 * right.r3c2 + left.r3c4 * right.r3c3 + left.r4c4 * right.r3c4,

                r4c1 = left.r1c1 * right.r4c1 + left.r2c1 * right.r4c2 + left.r3c1 * right.r4c3 + left.r4c1 * right.r4c4,
                r4c2 = left.r1c2 * right.r4c1 + left.r2c2 * right.r4c2 + left.r3c2 * right.r4c3 + left.r4c2 * right.r4c4,
                r4c3 = left.r1c3 * right.r4c1 + left.r2c3 * right.r4c2 + left.r3c3 * right.r4c3 + left.r4c3 * right.r4c4,
                r4c4 = left.r1c4 * right.r4c1 + left.r2c4 * right.r4c2 + left.r3c4 * right.r4c3 + left.r4c4 * right.r4c4
            };

            return(result);
        }
        public void Setup()
        {
            numericsMat1 = Matrix4x4.CreateFromYawPitchRoll(10, 3, 3);

            mat1 = new VectorMath.Mat4x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);
        }