#include "unittest/TestSuite.h" #include "gamemath/Matrix3x3f.h" #include #define assertMatrixExact(matrix, expected0, expected3, expected6, \ expected1, expected4, expected7, \ expected2, expected5, expected8) { \ float expectedValues[9] = {expected0, expected1, expected2, expected3, expected4, expected5, expected6, expected7, expected8}; \ for (unsigned int index = 0; index < 9; index++) { \ TestCase_assert(matrix.m[index] == expectedValues[index], "Expected matrix: {%f, %f, %f,\n %f, %f, %f,\n %f, %f, %f}\nActual matrix: {%f, %f, %f,\n %f, %f, %f,\n %f, %f, %f} (nonmatching index %u)", (float) expected0, (float) expected3, (float) expected6, (float) expected1, (float) expected4, (float) expected7, (float) expected2, (float) expected5, (float) expected8, matrix.m[0], matrix.m[3], matrix.m[6], matrix.m[1], matrix.m[4], matrix.m[7], matrix.m[2], matrix.m[5], matrix.m[8], index); \ } \ } #define assertMatrixApproximate(matrix, expected0, expected3, expected6, \ expected1, expected4, expected7, \ expected2, expected5, expected8, tolerance) { \ float expectedValues[9] = {expected0, expected1, expected2, expected3, expected4, expected5, expected6, expected7, expected8}; \ for (unsigned int index = 0; index < 9; index++) { \ TestCase_assert(fabsf(matrix.m[index] - expectedValues[index]) < tolerance, "Expected matrix: {%f, %f, %f,\n %f, %f, %f,\n %f, %f, %f}\nActual matrix: {%f, %f, %f,\n %f, %f, %f,\n %f, %f, %f} (nonmatching index %u, tolerance %f)", (float) expected0, (float) expected3, (float) expected6, (float) expected1, (float) expected4, (float) expected7, (float) expected2, (float) expected5, (float) expected8, matrix.m[0], matrix.m[3], matrix.m[6], matrix.m[1], matrix.m[4], matrix.m[7], matrix.m[2], matrix.m[5], matrix.m[8], index, tolerance); \ } \ } #define assertVector2fApproximate(vector, expectedX, expectedY, tolerance) { \ TestCase_assert(fabsf(vector.x - expectedX) < tolerance, "Expected %f x but got %f (tolerance %f)", expectedX, vector.x, tolerance); \ TestCase_assert(fabsf(vector.y - expectedY) < tolerance, "Expected %f y but got %f (tolerance %f)", expectedY, vector.y, tolerance); \ } #define assertVector3fApproximate(vector, expectedX, expectedY, expectedZ, tolerance) { \ TestCase_assert(fabsf(vector.x - expectedX) < tolerance, "Expected %f x but got %f (tolerance %f)", expectedX, vector.x, tolerance); \ TestCase_assert(fabsf(vector.y - expectedY) < tolerance, "Expected %f y but got %f (tolerance %f)", expectedY, vector.y, tolerance); \ TestCase_assert(fabsf(vector.z - expectedZ) < tolerance, "Expected %f z but got %f (tolerance %f)", expectedZ, vector.z, tolerance); \ } #define TOLERANCE 0.0001f static void testInit(void) { Matrix3x3f matrix; matrix = MATRIX3x3f(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f); assertMatrixExact(matrix, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f); matrix = MATRIX3x3f(0.0f, 3.0f, 6.0f, 1.0f, 4.0f, 7.0f, 2.0f, 5.0f, 8.0f); assertMatrixExact(matrix, 0.0f, 3.0f, 6.0f, 1.0f, 4.0f, 7.0f, 2.0f, 5.0f, 8.0f); matrix = Matrix3x3f_fromDirectionVectors(VECTOR3f(1.0f, 0.0f, 0.0f), VECTOR3f(0.0f, 1.0f, 0.0f), VECTOR3f(0.0f, 0.0f, 1.0f)); assertMatrixExact(matrix, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f); matrix = Matrix3x3f_fromDirectionVectors(VECTOR3f(0.0f, 1.0f, 0.0f), VECTOR3f(0.0f, 0.0f, 1.0f), VECTOR3f(1.0f, 0.0f, 0.0f)); assertMatrixExact(matrix, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); } static void testFromQuaternion(void) { Matrix3x3f matrix; matrix = Matrix3x3f_fromQuaternionf(QUATERNIONf(0.0f, 0.0f, 0.0f, 1.0f)); assertMatrixApproximate(matrix, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, TOLERANCE); matrix = Matrix3x3f_fromQuaternionf(QUATERNIONf(0.0f, 0.707107f, 0.0f, 0.707107f)); assertMatrixApproximate(matrix, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f, TOLERANCE); matrix = Matrix3x3f_fromQuaternionf(QUATERNIONf(0.5f, 0.5f, 0.5f, 0.5f)); assertMatrixApproximate(matrix, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, TOLERANCE); matrix = Matrix3x3f_fromQuaternionf(QUATERNIONf(1.0f, 1.0f, 1.0f, 1.0f)); assertMatrixApproximate(matrix, -3.0f, 0.0f, 4.0f, 4.0f, -3.0f, 0.0f, 0.0f, 4.0f, -3.0f, TOLERANCE); } static void testFromMatrix4x4f(void) { Matrix3x3f matrix; matrix = Matrix3x3f_fromMatrix4x4f(MATRIX4x4f(0, 4, 8, 12, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15)); assertMatrixExact(matrix, 0, 4, 8, 1, 5, 9, 2, 6, 10); matrix = Matrix3x3f_fromMatrix4x4f(MATRIX4x4f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)); assertMatrixExact(matrix, 1, 2, 3, 5, 6, 7, 9, 10, 11); } static void testIdentity(void) { Matrix3x3f matrix; matrix = MATRIX3x3f_IDENTITY; assertMatrixExact(matrix, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f); memset(matrix.m, 0xFF, sizeof(float) * 9); Matrix3x3f_loadIdentity(&matrix); assertMatrixExact(matrix, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f); TestCase_assertBoolTrue(Matrix3x3f_isIdentity(matrix)); matrix.m[0] = 0.5f; TestCase_assertBoolFalse(Matrix3x3f_isIdentity(matrix)); } static void testIsEqual(void) { Matrix3x3f matrix1 = MATRIX3x3f_IDENTITY; Matrix3x3f matrix2 = MATRIX3x3f_IDENTITY; TestCase_assertBoolTrue(Matrix3x3f_isEqual(matrix1, matrix2)); matrix2.m[1] = 2.0f; TestCase_assertBoolFalse(Matrix3x3f_isEqual(matrix1, matrix2)); matrix1.m[1] = 2.0f; TestCase_assertBoolTrue(Matrix3x3f_isEqual(matrix1, matrix2)); } static void testMultiply(void) { Matrix3x3f matrix; matrix = Matrix3x3f_multiplied(MATRIX3x3f(2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f), MATRIX3x3f(2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f)); assertMatrixApproximate(matrix, 4.0f, 0.0f, 0.0f, 0.0f, 4.0f, 0.0f, 0.0f, 0.0f, 4.0f, TOLERANCE); matrix = Matrix3x3f_multiplied(MATRIX3x3f(0.0f, 3.0f, 6.0f, 1.0f, 4.0f, 7.0f, 2.0f, 5.0f, 8.0f), MATRIX3x3f(1.0f, 5.0f, 13.0f, 2.0f, 7.0f, 17.0f, 3.0f, 11.0f, 19.0f)); assertMatrixApproximate(matrix, 24.0f, 87.0f, 165.0f, 30.0f, 110.0f, 214.0f, 36.0f, 133.0f, 263.0f, TOLERANCE); matrix = MATRIX3x3f(2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f), Matrix3x3f_multiply(&matrix, MATRIX3x3f(2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f)); assertMatrixApproximate(matrix, 4.0f, 0.0f, 0.0f, 0.0f, 4.0f, 0.0f, 0.0f, 0.0f, 4.0f, TOLERANCE); matrix = MATRIX3x3f(0.0f, 3.0f, 6.0f, 1.0f, 4.0f, 7.0f, 2.0f, 5.0f, 8.0f), Matrix3x3f_multiply(&matrix, MATRIX3x3f(1.0f, 5.0f, 13.0f, 2.0f, 7.0f, 17.0f, 3.0f, 11.0f, 19.0f)); assertMatrixApproximate(matrix, 24.0f, 87.0f, 165.0f, 30.0f, 110.0f, 214.0f, 36.0f, 133.0f, 263.0f, TOLERANCE); matrix = MATRIX3x3f(1.0f, 5.0f, 13.0f, 2.0f, 7.0f, 17.0f, 3.0f, 11.0f, 19.0f), Matrix3x3f_leftMultiply(&matrix, MATRIX3x3f(0.0f, 3.0f, 6.0f, 1.0f, 4.0f, 7.0f, 2.0f, 5.0f, 8.0f)); assertMatrixApproximate(matrix, 24.0f, 87.0f, 165.0f, 30.0f, 110.0f, 214.0f, 36.0f, 133.0f, 263.0f, TOLERANCE); } static void testScale(void) { Matrix3x3f matrix; matrix = Matrix3x3f_scaled(MATRIX3x3f_IDENTITY, V3f(2.0f, -1.0f, 0.5f)); assertMatrixApproximate(matrix, 2.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.5f, TOLERANCE); matrix = Matrix3x3f_scaled(MATRIX3x3f(0.0f, 0.0f, -1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 1.5f, 0.0f), V3f(3.0f, 1.5f, -0.5f)); assertMatrixApproximate(matrix, 0.0f, 0.0f, 0.5f, 6.0f, 0.0f, 0.0f, 0.0f, 2.25f, 0.0f, TOLERANCE); matrix = MATRIX3x3f_IDENTITY; Matrix3x3f_scale(&matrix, V3f(2.0f, -1.0f, 0.5f)); assertMatrixApproximate(matrix, 2.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.5f, TOLERANCE); matrix = MATRIX3x3f(0.0f, 0.0f, -1.0f, 2.0f, 0.0f, 0.0f, 0.0f, 1.5f, 0.0f); Matrix3x3f_scale(&matrix, V3f(3.0f, 1.5f, -0.5f)); assertMatrixApproximate(matrix, 0.0f, 0.0f, 0.5f, 6.0f, 0.0f, 0.0f, 0.0f, 2.25f, 0.0f, TOLERANCE); } static void testRotate(void) { Matrix3x3f matrix; matrix = Matrix3x3f_rotated(MATRIX3x3f_IDENTITY, V3f(0.0f, 1.0f, 0.0f), M_PI); assertMatrixApproximate(matrix, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, TOLERANCE); matrix = Matrix3x3f_rotated(Matrix3x3f_scaled(MATRIX3x3f_IDENTITY, V3f(2.0f, 2.0f, 2.0f)), V3f(-1.0f, 0.0f, 0.0f), M_PI * 0.5f); assertMatrixApproximate(matrix, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f, -2.0f, 0.0f, TOLERANCE); matrix = MATRIX3x3f_IDENTITY; Matrix3x3f_rotate(&matrix, V3f(0.0f, 1.0f, 0.0f), M_PI); assertMatrixApproximate(matrix, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, TOLERANCE); matrix = Matrix3x3f_scaled(MATRIX3x3f_IDENTITY, V3f(2.0f, 2.0f, 2.0f)); Matrix3x3f_rotate(&matrix, V3f(-1.0f, 0.0f, 0.0f), M_PI * 0.5f); assertMatrixApproximate(matrix, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f, -2.0f, 0.0f, TOLERANCE); } static void testShear(void) { Matrix3x3f matrix; matrix = Matrix3x3f_shearedX(MATRIX3x3f_IDENTITY, 1.0f, 1.0f); assertMatrixApproximate(matrix, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, TOLERANCE); matrix = Matrix3x3f_shearedX(Matrix3x3f_fromDirectionVectors(V3f(0.0f, 1.0f, 0.0f), V3f(0.0f, 0.0f, 1.0f), V3f(1.0f, 0.0f, 0.0f)), 0.5f, -0.5f); assertMatrixApproximate(matrix, -0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.5f, 1.0f, 0.0f, TOLERANCE); matrix = Matrix3x3f_shearedY(MATRIX3x3f_IDENTITY, 1.0f, 1.0f); assertMatrixApproximate(matrix, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, TOLERANCE); matrix = Matrix3x3f_shearedY(Matrix3x3f_fromDirectionVectors(V3f(0.0f, 1.0f, 0.0f), V3f(0.0f, 0.0f, 1.0f), V3f(1.0f, 0.0f, 0.0f)), 0.5f, -0.5f); assertMatrixApproximate(matrix, 0.0f, -0.5f, 1.0f, 1.0f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, TOLERANCE); matrix = Matrix3x3f_shearedZ(MATRIX3x3f_IDENTITY, 1.0f, 1.0f); assertMatrixApproximate(matrix, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, TOLERANCE); matrix = Matrix3x3f_shearedZ(Matrix3x3f_fromDirectionVectors(V3f(0.0f, 1.0f, 0.0f), V3f(0.0f, 0.0f, 1.0f), V3f(1.0f, 0.0f, 0.0f)), 0.5f, -0.5f); assertMatrixApproximate(matrix, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.5f, 0.0f, 1.0f, -0.5f, TOLERANCE); matrix = MATRIX3x3f_IDENTITY; Matrix3x3f_shearX(&matrix, 1.0f, 1.0f); assertMatrixApproximate(matrix, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, TOLERANCE); matrix = Matrix3x3f_fromDirectionVectors(V3f(0.0f, 1.0f, 0.0f), V3f(0.0f, 0.0f, 1.0f), V3f(1.0f, 0.0f, 0.0f)); Matrix3x3f_shearX(&matrix, 0.5f, -0.5f); assertMatrixApproximate(matrix, -0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.5f, 1.0f, 0.0f, TOLERANCE); matrix = MATRIX3x3f_IDENTITY; Matrix3x3f_shearY(&matrix, 1.0f, 1.0f); assertMatrixApproximate(matrix, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, TOLERANCE); matrix = Matrix3x3f_fromDirectionVectors(V3f(0.0f, 1.0f, 0.0f), V3f(0.0f, 0.0f, 1.0f), V3f(1.0f, 0.0f, 0.0f)); Matrix3x3f_shearY(&matrix, 0.5f, -0.5f); assertMatrixApproximate(matrix, 0.0f, -0.5f, 1.0f, 1.0f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, TOLERANCE); matrix = MATRIX3x3f_IDENTITY; Matrix3x3f_shearZ(&matrix, 1.0f, 1.0f); assertMatrixApproximate(matrix, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, TOLERANCE); matrix = Matrix3x3f_fromDirectionVectors(V3f(0.0f, 1.0f, 0.0f), V3f(0.0f, 0.0f, 1.0f), V3f(1.0f, 0.0f, 0.0f)); Matrix3x3f_shearZ(&matrix, 0.5f, -0.5f); assertMatrixApproximate(matrix, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.5f, 0.0f, 1.0f, -0.5f, TOLERANCE); } static void testTranspose(void) { Matrix3x3f matrix; matrix = Matrix3x3f_transposed(MATRIX3x3f(1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f)); assertMatrixExact(matrix, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f); matrix = Matrix3x3f_transposed(MATRIX3x3f(0.0f, 0.3f, 0.6f, 0.1f, 0.4f, 0.7f, 0.2f, 0.5f, 0.8f)); assertMatrixExact(matrix, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); matrix = MATRIX3x3f(1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f); Matrix3x3f_transpose(&matrix); assertMatrixExact(matrix, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f); matrix = MATRIX3x3f(0.0f, 0.3f, 0.6f, 0.1f, 0.4f, 0.7f, 0.2f, 0.5f, 0.8f); Matrix3x3f_transpose(&matrix); assertMatrixExact(matrix, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); } static void testDeterminant(void) { float determinant; determinant = Matrix3x3f_determinant(MATRIX3x3f_IDENTITY); TestCase_assertFloatApproximate(determinant, 1.0f, TOLERANCE); determinant = Matrix3x3f_determinant(MATRIX3x3f(0.0f, 0.0f, 2.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f)); TestCase_assertFloatApproximate(determinant, 8.0f, TOLERANCE); } static void testInvert(void) { Matrix3x3f matrix; matrix = Matrix3x3f_inverted(MATRIX3x3f_IDENTITY); assertMatrixApproximate(matrix, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, TOLERANCE); matrix = Matrix3x3f_inverted(MATRIX3x3f(0.0f, 0.0f, 2.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f)); assertMatrixApproximate(matrix, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f, 0.0f, TOLERANCE); matrix = MATRIX3x3f_IDENTITY; Matrix3x3f_invert(&matrix); assertMatrixApproximate(matrix, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, TOLERANCE); matrix = MATRIX3x3f(0.0f, 0.0f, 2.0f, 2.0f, 0.0f, 0.0f, 0.0f, 2.0f, 0.0f); Matrix3x3f_invert(&matrix); assertMatrixApproximate(matrix, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f, 0.0f, TOLERANCE); } static void testInterpolate(void) { Matrix3x3f matrixLeft, matrixRight, matrixInterpolated; matrixLeft = MATRIX3x3f_IDENTITY; matrixRight = MATRIX3x3f(0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f); matrixInterpolated = Matrix3x3f_interpolated(matrixLeft, matrixRight, 0.0f); assertMatrixApproximate(matrixInterpolated, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, TOLERANCE); matrixInterpolated = Matrix3x3f_interpolated(matrixLeft, matrixRight, 0.25f); assertMatrixApproximate(matrixInterpolated, 0.75f, 0.25f, 0.25f, 0.25f, 0.75f, 0.25f, 0.25f, 0.25f, 0.75f, TOLERANCE); matrixInterpolated = matrixLeft; Matrix3x3f_interpolate(&matrixInterpolated, matrixRight, 0.0f); assertMatrixApproximate(matrixInterpolated, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, TOLERANCE); matrixInterpolated = matrixLeft; Matrix3x3f_interpolate(&matrixInterpolated, matrixRight, 0.25f); assertMatrixApproximate(matrixInterpolated, 0.75f, 0.25f, 0.25f, 0.25f, 0.75f, 0.25f, 0.25f, 0.25f, 0.75f, TOLERANCE); matrixLeft = MATRIX3x3f(0.0f, 3.0f, 6.0f, 1.0f, 4.0f, 7.0f, 2.0f, 5.0f, 8.0f); matrixRight = MATRIX3x3f_IDENTITY; matrixInterpolated = Matrix3x3f_interpolated(matrixLeft, matrixRight, -1.0f); assertMatrixApproximate(matrixInterpolated, -1.0f, 6.0f, 12.0f, 2.0f, 7.0f, 14.0f, 4.0f, 10.0f, 15.0f, TOLERANCE); matrixInterpolated = Matrix3x3f_interpolated(matrixLeft, matrixRight, 2.0f); assertMatrixApproximate(matrixInterpolated, 2.0f, -3.0f, -6.0f, -1.0f, -2.0f, -7.0f, -2.0f, -5.0f, -6.0f, TOLERANCE); matrixInterpolated = matrixLeft; Matrix3x3f_interpolate(&matrixInterpolated, matrixRight, -1.0f); assertMatrixApproximate(matrixInterpolated, -1.0f, 6.0f, 12.0f, 2.0f, 7.0f, 14.0f, 4.0f, 10.0f, 15.0f, TOLERANCE); matrixInterpolated = matrixLeft; Matrix3x3f_interpolate(&matrixInterpolated, matrixRight, 2.0f); assertMatrixApproximate(matrixInterpolated, 2.0f, -3.0f, -6.0f, -1.0f, -2.0f, -7.0f, -2.0f, -5.0f, -6.0f, TOLERANCE); } static void testNormalize(void) { Matrix3x3f matrix = MATRIX3x3f(0.5f, 0.0f, 0.0f, 0.0f, 0.25f, 0.0f, 0.0f, 0.0f, 0.125f); Matrix3x3f normalizedMatrix = Matrix3x3f_normalized(matrix); assertMatrixApproximate(normalizedMatrix, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, TOLERANCE); Matrix3x3f_normalize(&matrix); assertMatrixApproximate(matrix, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, TOLERANCE); matrix = MATRIX3x3f(0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f); normalizedMatrix = Matrix3x3f_normalized(matrix); assertMatrixApproximate(normalizedMatrix, 0.0f, 0.707106f, -0.707106f, -0.707106f, 0.0f, 0.707106f, -0.707106f, -0.707106f, 0.0f, TOLERANCE); Matrix3x3f_normalize(&matrix); assertMatrixApproximate(matrix, 0.0f, 0.707106f, -0.707106f, -0.707106f, 0.0f, 0.707106f, -0.707106f, -0.707106f, 0.0f, TOLERANCE); } static void testMultiplyVector(void) { Matrix3x3f matrix; Vector2f vector2; Vector3f vector3; matrix = MATRIX3x3f_IDENTITY; vector2 = Matrix3x3f_multiplyVector2f(matrix, VECTOR2f(1.0f, 0.0f)); assertVector2fApproximate(vector2, 1.0f, 0.0f, TOLERANCE); vector3 = Matrix3x3f_multiplyVector3f(matrix, VECTOR3f(0.0f, 1.0f, 0.0f)); assertVector3fApproximate(vector3, 0.0f, 1.0f, 0.0f, TOLERANCE); matrix = MATRIX3x3f(0.0f, 2.0f, 0.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, -2.0f); vector2 = Matrix3x3f_multiplyVector2f(matrix, VECTOR2f(-1.0f, 1.0f)); assertVector2fApproximate(vector2, 2.0f, -2.0f, TOLERANCE); vector3 = Matrix3x3f_multiplyVector3f(matrix, VECTOR3f(0.0f, -1.0f, 0.0f)); assertVector3fApproximate(vector3, -2.0f, 0.0f, 0.0f, TOLERANCE); } TEST_SUITE(Matrix3x3fTest, testInit, testFromQuaternion, testFromMatrix4x4f, testIsEqual, testIdentity, testMultiply, testScale, testRotate, testShear, testTranspose, testDeterminant, testInvert, testInterpolate, testNormalize, testMultiplyVector)