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); }
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); }
public uint4x4(double4x4 v) { this.c0 = (uint4)v.c0; this.c1 = (uint4)v.c1; this.c2 = (uint4)v.c2; this.c3 = (uint4)v.c3; }
public float4x4(double4x4 v) { this.c0 = (float4)v.c0; this.c1 = (float4)v.c1; this.c2 = (float4)v.c2; this.c3 = (float4)v.c3; }
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); }
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); }
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); }
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); }
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); }
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)); }
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); }
/// <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); }
// 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)); }
/// <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); }
public static float4x4 float4x4(double4x4 v) { return(new float4x4(v)); }
public static int4x4 int4x4(double4x4 v) { return(new int4x4(v)); }
public static double3 rotate(double4x4 a, double3 b) { return((a.c0 * b.x + a.c1 * b.y + a.c2 * b.z).xyz); }
public static uint4x4 uint4x4(double4x4 v) { return(new uint4x4(v)); }
public static double3 transform(double4x4 a, double3 b) { return((a.c0 * b.x + a.c1 * b.y + a.c2 * b.z + a.c3).xyz); }