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); }
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); }
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); }