/** * @ingroup matrix4 * @brief Compares every element of the matrix. Uses HYP_EPSILON for precision. * returns 1 if equal, 0 if different */ HYPAPI int matrix4_equals(const matrix4 *self, const matrix4 *mT) { unsigned char i; for(i = 0; i < 16; i++) { if(scalar_equalsf(self->m[i], mT->m[i]) == 0) { return 0; } } return 1; }
static char * test_quaternion_get_set_axis_anglev3() { quaternion q; float angle, angle1; vector3 axis, axis1; vector3_set(&axis, HYP_VECTOR3_UNIT_X); angle = HYP_TAU / 4.0f; quaternion_set_from_axis_anglev3(&q, &axis, angle); quaternion_get_axis_anglev3(&q, &axis1, &angle1); test_assert(vector3_equals(&axis, &axis1)); test_assert(scalar_equalsf(angle,angle1)); return 0; }
static char *test_vector3_cross_product(void) { struct vector3 a; struct vector3 b; struct vector3 r; vector3_setf3(&a, 3.0f, -3.0f, 1.0f); vector3_setf3(&b, 4.0f, 9.0f, 2.0f); vector3_cross_product(&r, &a, &b); test_assert(scalar_equalsf(r.x, -15.0f)); test_assert(scalar_equalsf(r.y, -2.0f)); test_assert(scalar_equalsf(r.z, 39.0f)); /* tests lack of commutative property */ vector3_cross_product(&r, &b, &a); test_assert(!scalar_equalsf(r.x, -15.0f)); test_assert(!scalar_equalsf(r.y, -2.0f)); test_assert(!scalar_equalsf(r.z, 39.0f)); return 0; }
/** * @ingroup quaternion * @brief if the scalar is 0.0 (w == 0.0), then the quaternion is said to be a *pure quaternion* */ HYPAPI short quaternion_is_pure(quaternion *self) { return scalar_equalsf(self->w, 0.0f); }
/** * @ingroup quaternion * @brief if the norm is 1.0, then the quaternion is said to be a *unit quaternion* */ HYPAPI short quaternion_is_unit(quaternion *self) { return (scalar_equalsf(1.0f, quaternion_norm(self))); }