public unsafe static void Invert(Matrix3x3 *m, Matrix3x3 *inverse) { var mScalar = (M *)m; var inverseScalar = (M *)inverse; var m11 = mScalar->M22 * mScalar->M33 - mScalar->M32 * mScalar->M23; var m21 = mScalar->M23 * mScalar->M31 - mScalar->M33 * mScalar->M21; var m31 = mScalar->M21 * mScalar->M32 - mScalar->M31 * mScalar->M22; var determinantInverse = 1f / (m11 * mScalar->M11 + m21 * mScalar->M12 + m31 * mScalar->M13); var m12 = mScalar->M32 * mScalar->M13 - mScalar->M12 * mScalar->M33; var m22 = mScalar->M33 * mScalar->M11 - mScalar->M13 * mScalar->M31; var m32 = mScalar->M31 * mScalar->M12 - mScalar->M11 * mScalar->M32; var m13 = mScalar->M12 * mScalar->M23 - mScalar->M22 * mScalar->M13; var m23 = mScalar->M13 * mScalar->M21 - mScalar->M23 * mScalar->M11; var m33 = mScalar->M11 * mScalar->M22 - mScalar->M21 * mScalar->M12; inverseScalar->M11 = m11 * determinantInverse; inverseScalar->M21 = m21 * determinantInverse; inverseScalar->M31 = m31 * determinantInverse; inverseScalar->M12 = m12 * determinantInverse; inverseScalar->M22 = m22 * determinantInverse; inverseScalar->M32 = m32 * determinantInverse; inverseScalar->M13 = m13 * determinantInverse; inverseScalar->M23 = m23 * determinantInverse; inverseScalar->M33 = m33 * determinantInverse; }
public unsafe void Matrix3x3FieldOffsetTest() { Matrix3x3 mat = new Matrix3x3(); float * basePtr = &mat.M11; // Take address of first element Matrix3x3 *matPtr = &mat; // Take address of whole matrix Assert.AreEqual(new IntPtr(basePtr), new IntPtr(matPtr)); Assert.AreEqual(new IntPtr(basePtr + 0), new IntPtr(&mat.M11)); Assert.AreEqual(new IntPtr(basePtr + 1), new IntPtr(&mat.M12)); Assert.AreEqual(new IntPtr(basePtr + 2), new IntPtr(&mat.M13)); Assert.AreEqual(new IntPtr(basePtr + 3), new IntPtr(&mat.M21)); Assert.AreEqual(new IntPtr(basePtr + 4), new IntPtr(&mat.M22)); Assert.AreEqual(new IntPtr(basePtr + 5), new IntPtr(&mat.M23)); Assert.AreEqual(new IntPtr(basePtr + 6), new IntPtr(&mat.M31)); Assert.AreEqual(new IntPtr(basePtr + 7), new IntPtr(&mat.M32)); Assert.AreEqual(new IntPtr(basePtr + 8), new IntPtr(&mat.M33)); }
public unsafe static void Transpose(Matrix3x3 *m, Matrix3x3 *transposed) { Transpose((M *)m, (M *)transposed); }