コード例 #1
0
 public static uint4 hashwide(double4x4 v)
 {
     return((fold_to_uint(v.c0) * uint4(0x64095221u, 0xADF428FFu, 0xA3977109u, 0x745ED837u) +
             fold_to_uint(v.c1) * uint4(0x9CDC88F5u, 0xFA62D721u, 0x7E4DB1CFu, 0x68EEE0F5u) +
             fold_to_uint(v.c2) * uint4(0xBC3B0A59u, 0x816EFB5Du, 0xA24E82B7u, 0x45A22087u) +
             fold_to_uint(v.c3) * uint4(0xFC104C3Bu, 0x5FFF6B19u, 0x5E6CBF3Bu, 0xB546F2A5u)) + 0xBBCF63E7u);
 }
コード例 #2
0
 public static uint hash(double4x4 v)
 {
     return(csum(fold_to_uint(v.c0) * uint4(0x4DDC6509u, 0x7CF083CBu, 0x5C4D6CEDu, 0xF9137117u) +
                 fold_to_uint(v.c1) * uint4(0xE857DCE1u, 0xF62213C5u, 0x9CDAA959u, 0xAA269ABFu) +
                 fold_to_uint(v.c2) * uint4(0xD54BA36Fu, 0xFD0847B9u, 0x8189A683u, 0xB139D651u) +
                 fold_to_uint(v.c3) * uint4(0xE7579997u, 0xEF7D56C7u, 0x66F38F0Bu, 0x624256A3u)) + 0x5292ADE1u);
 }
コード例 #3
0
 public uint4x4(double4x4 v)
 {
     this.c0 = (uint4)v.c0;
     this.c1 = (uint4)v.c1;
     this.c2 = (uint4)v.c2;
     this.c3 = (uint4)v.c3;
 }
コード例 #4
0
 public float4x4(double4x4 v)
 {
     this.c0 = (float4)v.c0;
     this.c1 = (float4)v.c1;
     this.c2 = (float4)v.c2;
     this.c3 = (float4)v.c3;
 }
コード例 #5
0
 public static uint hash(double4x4 v)
 {
     return(csum(fold_to_uint(v.c0) * uint4(0xE857DCE1u, 0xF62213C5u, 0x9CDAA959u, 0xAA269ABFu) +
                 fold_to_uint(v.c1) * uint4(0xD54BA36Fu, 0xFD0847B9u, 0x8189A683u, 0xB139D651u) +
                 fold_to_uint(v.c2) * uint4(0xE7579997u, 0xEF7D56C7u, 0x66F38F0Bu, 0x624256A3u) +
                 fold_to_uint(v.c3) * uint4(0x5292ADE1u, 0xD2E590E5u, 0xF25BE857u, 0x9BC17CE7u)) + 0xC8B86851u);
 }
コード例 #6
0
 public static uint hash(double4x4 v)
 {
     return(csum(fold_to_uint(v.c0) * uint4(0x7809205Fu, 0x9C9F0823u, 0x5A9CA13Bu, 0xAFCDD5EFu) +
                 fold_to_uint(v.c1) * uint4(0xA88D187Du, 0xCF6EBA1Du, 0x9D88E5A1u, 0xEADF0775u) +
                 fold_to_uint(v.c2) * uint4(0x747A9D7Bu, 0x4111F799u, 0xB5F05AF1u, 0xFD80290Bu) +
                 fold_to_uint(v.c3) * uint4(0x8B65ADB7u, 0xDFF4F563u, 0x7069770Du, 0xD1224537u)) + 0xE99ED6F3u);
 }
コード例 #7
0
 public static uint hash(double4x4 v)
 {
     return(csum(fold_to_uint(v.c0) * uint4(0xD4DFF6D3u, 0xCB634F4Du, 0x9B13B92Du, 0x4ABF0813u) +
                 fold_to_uint(v.c1) * uint4(0x86068063u, 0xD75513F9u, 0x5AB3E8CDu, 0x676E8407u) +
                 fold_to_uint(v.c2) * uint4(0xB36DE767u, 0x6FCA387Du, 0xAF0F3103u, 0xE4A056C7u) +
                 fold_to_uint(v.c3) * uint4(0x841D8225u, 0xC9393C7Du, 0xD42EAFA3u, 0xD9AFD06Du)) + 0x97A65421u);
 }
コード例 #8
0
 public static uint4 hashwide(double4x4 v)
 {
     return((fold_to_uint(v.c0) * uint4(0xD2E590E5u, 0xF25BE857u, 0x9BC17CE7u, 0xC8B86851u) +
             fold_to_uint(v.c1) * uint4(0x64095221u, 0xADF428FFu, 0xA3977109u, 0x745ED837u) +
             fold_to_uint(v.c2) * uint4(0x9CDC88F5u, 0xFA62D721u, 0x7E4DB1CFu, 0x68EEE0F5u) +
             fold_to_uint(v.c3) * uint4(0xBC3B0A59u, 0x816EFB5Du, 0xA24E82B7u, 0x45A22087u)) + 0xFC104C3Bu);
 }
コード例 #9
0
 public static uint hash(double4x4 v)
 {
     return(csum(fold_to_uint(v.c0) * uint4(0x9881FB9Fu, 0x56A1530Du, 0x804B722Du, 0x738E50E5u) +
                 fold_to_uint(v.c1) * uint4(0x4FC93C25u, 0xCD0445A5u, 0xD2B90D9Bu, 0xD35C9B2Du) +
                 fold_to_uint(v.c2) * uint4(0xA10D9E27u, 0x568DAAA9u, 0x7530254Fu, 0x9F090439u) +
                 fold_to_uint(v.c3) * uint4(0x5E9F85C9u, 0x8C4CA03Fu, 0xB8D969EDu, 0xAC5DB57Bu)) + 0xA91A02EDu);
 }
コード例 #10
0
 public static double4x4 transpose(double4x4 v)
 {
     return(double4x4(
                v.c0.x, v.c0.y, v.c0.z, v.c0.w,
                v.c1.x, v.c1.y, v.c1.z, v.c1.w,
                v.c2.x, v.c2.y, v.c2.z, v.c2.w,
                v.c3.x, v.c3.y, v.c3.z, v.c3.w));
 }
コード例 #11
0
        public static double4x4 rottrans(quaternion_d q, double3 t)
        {
            var m3x3 = quatToMatrix(q);
            var m    = new double4x4
            {
                m0 = new double4(m3x3.m0, 0.0f),
                m1 = new double4(m3x3.m1, 0.0f),
                m2 = new double4(m3x3.m2, 0.0f),
                m3 = new double4(t, 1.0f)
            };

            return(m);
        }
コード例 #12
0
        /// <summary>Returns the determinant of a double4x4 matrix.</summary>
        public static double determinant(double4x4 m)
        {
            double4 c0 = m.c0;
            double4 c1 = m.c1;
            double4 c2 = m.c2;
            double4 c3 = m.c3;

            double m00 = c1.y * (c2.z * c3.w - c2.w * c3.z) - c2.y * (c1.z * c3.w - c1.w * c3.z) + c3.y * (c1.z * c2.w - c1.w * c2.z);
            double m01 = c0.y * (c2.z * c3.w - c2.w * c3.z) - c2.y * (c0.z * c3.w - c0.w * c3.z) + c3.y * (c0.z * c2.w - c0.w * c2.z);
            double m02 = c0.y * (c1.z * c3.w - c1.w * c3.z) - c1.y * (c0.z * c3.w - c0.w * c3.z) + c3.y * (c0.z * c1.w - c0.w * c1.z);
            double m03 = c0.y * (c1.z * c2.w - c1.w * c2.z) - c1.y * (c0.z * c2.w - c0.w * c2.z) + c2.y * (c0.z * c1.w - c0.w * c1.z);

            return(c0.x * m00 - c1.x * m01 + c2.x * m02 - c3.x * m03);
        }
コード例 #13
0
        // Fast matrix inverse for rigid transforms (Orthonormal basis and translation)
        public static double4x4 fastinverse(double4x4 m)
        {
            double4 c0  = m.c0;
            double4 c1  = m.c1;
            double4 c2  = m.c2;
            double4 pos = m.c3;

            double4 zero = double4(0);

            double4 t0 = unpacklo(c0, c2);
            double4 t1 = unpacklo(c1, zero);
            double4 t2 = unpackhi(c0, c2);
            double4 t3 = unpackhi(c1, zero);

            double4 r0 = unpacklo(t0, t1);
            double4 r1 = unpackhi(t0, t1);
            double4 r2 = unpacklo(t2, t3);

            pos   = -(r0 * pos.x + r1 * pos.y + r2 * pos.z);
            pos.w = 1.0f;

            return(double4x4(r0, r1, r2, pos));
        }
コード例 #14
0
        /// <summary>Returns the double4x4 full inverse of a double4x4 matrix.</summary>
        public static double4x4 inverse(double4x4 m)
        {
            double4 c0 = m.c0;
            double4 c1 = m.c1;
            double4 c2 = m.c2;
            double4 c3 = m.c3;

            double4 r0y_r1y_r0x_r1x = movelh(c1, c0);
            double4 r0z_r1z_r0w_r1w = movelh(c2, c3);
            double4 r2y_r3y_r2x_r3x = movehl(c0, c1);
            double4 r2z_r3z_r2w_r3w = movehl(c3, c2);

            double4 r1y_r2y_r1x_r2x = shuffle(c1, c0, ShuffleComponent.LeftY, ShuffleComponent.LeftZ, ShuffleComponent.RightY, ShuffleComponent.RightZ);
            double4 r1z_r2z_r1w_r2w = shuffle(c2, c3, ShuffleComponent.LeftY, ShuffleComponent.LeftZ, ShuffleComponent.RightY, ShuffleComponent.RightZ);
            double4 r3y_r0y_r3x_r0x = shuffle(c1, c0, ShuffleComponent.LeftW, ShuffleComponent.LeftX, ShuffleComponent.RightW, ShuffleComponent.RightX);
            double4 r3z_r0z_r3w_r0w = shuffle(c2, c3, ShuffleComponent.LeftW, ShuffleComponent.LeftX, ShuffleComponent.RightW, ShuffleComponent.RightX);

            double4 r0_wzyx = shuffle(r0z_r1z_r0w_r1w, r0y_r1y_r0x_r1x, ShuffleComponent.LeftZ, ShuffleComponent.LeftX, ShuffleComponent.RightX, ShuffleComponent.RightZ);
            double4 r1_wzyx = shuffle(r0z_r1z_r0w_r1w, r0y_r1y_r0x_r1x, ShuffleComponent.LeftW, ShuffleComponent.LeftY, ShuffleComponent.RightY, ShuffleComponent.RightW);
            double4 r2_wzyx = shuffle(r2z_r3z_r2w_r3w, r2y_r3y_r2x_r3x, ShuffleComponent.LeftZ, ShuffleComponent.LeftX, ShuffleComponent.RightX, ShuffleComponent.RightZ);
            double4 r3_wzyx = shuffle(r2z_r3z_r2w_r3w, r2y_r3y_r2x_r3x, ShuffleComponent.LeftW, ShuffleComponent.LeftY, ShuffleComponent.RightY, ShuffleComponent.RightW);
            double4 r0_xyzw = shuffle(r0y_r1y_r0x_r1x, r0z_r1z_r0w_r1w, ShuffleComponent.LeftZ, ShuffleComponent.LeftX, ShuffleComponent.RightX, ShuffleComponent.RightZ);

            // Calculate remaining inner term pairs. inner terms have zw=-xy, so we only have to calculate xy and can pack two pairs per vector.
            double4 inner12_23 = r1y_r2y_r1x_r2x * r2z_r3z_r2w_r3w - r1z_r2z_r1w_r2w * r2y_r3y_r2x_r3x;
            double4 inner02_13 = r0y_r1y_r0x_r1x * r2z_r3z_r2w_r3w - r0z_r1z_r0w_r1w * r2y_r3y_r2x_r3x;
            double4 inner30_01 = r3z_r0z_r3w_r0w * r0y_r1y_r0x_r1x - r3y_r0y_r3x_r0x * r0z_r1z_r0w_r1w;

            // Expand inner terms back to 4 components. zw signs still need to be flipped
            double4 inner12 = shuffle(inner12_23, inner12_23, ShuffleComponent.LeftX, ShuffleComponent.LeftZ, ShuffleComponent.RightZ, ShuffleComponent.RightX);
            double4 inner23 = shuffle(inner12_23, inner12_23, ShuffleComponent.LeftY, ShuffleComponent.LeftW, ShuffleComponent.RightW, ShuffleComponent.RightY);

            double4 inner02 = shuffle(inner02_13, inner02_13, ShuffleComponent.LeftX, ShuffleComponent.LeftZ, ShuffleComponent.RightZ, ShuffleComponent.RightX);
            double4 inner13 = shuffle(inner02_13, inner02_13, ShuffleComponent.LeftY, ShuffleComponent.LeftW, ShuffleComponent.RightW, ShuffleComponent.RightY);

            // Calculate minors
            double4 minors0 = r3_wzyx * inner12 - r2_wzyx * inner13 + r1_wzyx * inner23;

            double4 denom = r0_xyzw * minors0;

            // Horizontal sum of denominator. Free sign flip of z and w compensates for missing flip in inner terms.
            denom = denom + shuffle(denom, denom, ShuffleComponent.LeftY, ShuffleComponent.LeftX, ShuffleComponent.RightW, ShuffleComponent.RightZ);   // x+y        x+y            z+w            z+w
            denom = denom - shuffle(denom, denom, ShuffleComponent.LeftZ, ShuffleComponent.LeftZ, ShuffleComponent.RightX, ShuffleComponent.RightX);   // x+y-z-w  x+y-z-w        z+w-x-y        z+w-x-y

            double4   rcp_denom_ppnn = double4(1.0) / denom;
            double4x4 res;

            res.c0 = minors0 * rcp_denom_ppnn;

            double4 inner30 = shuffle(inner30_01, inner30_01, ShuffleComponent.LeftX, ShuffleComponent.LeftZ, ShuffleComponent.RightZ, ShuffleComponent.RightX);
            double4 inner01 = shuffle(inner30_01, inner30_01, ShuffleComponent.LeftY, ShuffleComponent.LeftW, ShuffleComponent.RightW, ShuffleComponent.RightY);

            double4 minors1 = r2_wzyx * inner30 - r0_wzyx * inner23 - r3_wzyx * inner02;

            res.c1 = minors1 * rcp_denom_ppnn;

            double4 minors2 = r0_wzyx * inner13 - r1_wzyx * inner30 - r3_wzyx * inner01;

            res.c2 = minors2 * rcp_denom_ppnn;

            double4 minors3 = r1_wzyx * inner02 - r0_wzyx * inner12 + r2_wzyx * inner01;

            res.c3 = minors3 * rcp_denom_ppnn;
            return(res);
        }
コード例 #15
0
 public static float4x4 float4x4(double4x4 v)
 {
     return(new float4x4(v));
 }
コード例 #16
0
 public static int4x4 int4x4(double4x4 v)
 {
     return(new int4x4(v));
 }
コード例 #17
0
 public static double3 rotate(double4x4 a, double3 b)
 {
     return((a.c0 * b.x + a.c1 * b.y + a.c2 * b.z).xyz);
 }
コード例 #18
0
 public static uint4x4 uint4x4(double4x4 v)
 {
     return(new uint4x4(v));
 }
コード例 #19
0
 public static double3 transform(double4x4 a, double3 b)
 {
     return((a.c0 * b.x + a.c1 * b.y + a.c2 * b.z + a.c3).xyz);
 }