static void check_matrix(generator_t &gen, distribution_t &dist) { // check identity { mtx44 m; mtx44Identity(&m); assert(m == glm::mat4()); } for(size_t x = 0; x < 10000; ++x) { // check multiply { mtx44 m1, m2; randomMatrix(m1, gen, dist); randomMatrix(m2, gen, dist); glm::mat4 g1 = loadMatrix(m1); glm::mat4 g2 = loadMatrix(m2); mtx44 result; mtx44Multiply(&result, &m1, &m2); assert(result == g1*g2); } // check translate { mtx44 m; randomMatrix(m, gen, dist); glm::mat4 g = loadMatrix(m); glm::vec3 v = randomVector(gen, dist); mtx44Translate(&m, v.x, v.y, v.z); assert(m == glm::translate(g, v)); } // check scale { mtx44 m; randomMatrix(m, gen, dist); glm::mat4 g = loadMatrix(m); glm::vec3 v = randomVector(gen, dist); mtx44Scale(&m, v.x, v.y, v.z); assert(m == glm::scale(g, v)); } // check rotate { mtx44 m; randomMatrix(m, gen, dist); float r = randomAngle(gen, dist); glm::mat4 g = loadMatrix(m); glm::vec3 v = randomVector(gen, dist); mtx44Rotate(&m, (vec3f){ v.x, v.y, v.z }, r); assert(m == glm::rotate(g, r, v)); } // check rotate X { mtx44 m; randomMatrix(m, gen, dist); float r = randomAngle(gen, dist); glm::mat4 g = loadMatrix(m); mtx44RotateX(&m, r); assert(m == glm::rotate(g, r, x_axis)); } // check rotate Y { mtx44 m; randomMatrix(m, gen, dist); float r = randomAngle(gen, dist); glm::mat4 g = loadMatrix(m); mtx44RotateY(&m, r); assert(m == glm::rotate(g, r, y_axis)); } // check rotate Z { mtx44 m; randomMatrix(m, gen, dist); float r = randomAngle(gen, dist); glm::mat4 g = loadMatrix(m); mtx44RotateZ(&m, r); assert(m == glm::rotate(g, r, z_axis)); } } }
mtx44 mtx44::operator* (const mtx44 &rhs) const { mtx44 result; mtx44Multiply(result, *this, rhs); return result; }