diff options
Diffstat (limited to 'test/src/testmath.c')
| -rw-r--r-- | test/src/testmath.c | 825 |
1 files changed, 825 insertions, 0 deletions
diff --git a/test/src/testmath.c b/test/src/testmath.c new file mode 100644 index 0000000..c927861 --- /dev/null +++ b/test/src/testmath.c @@ -0,0 +1,825 @@ +#include <bh/math.h> +#include <bh/unit.h> + + +#define ACCEPTABLE_DELTA 0.0001f + + +static int check_point4f(void) +{ + bh_point4f_t a, b, c, r; + float value; + + a.x = 1.0f; a.y = 2.0f; a.z = 3.0f; a.w = 4.0f; + b.x = 5.0f; b.y = 6.0f; b.z = 7.0f; b.w = 8.0f; + c.x = 1.5f; c.y = 2.5f; c.z = 3.5f; c.w = 4.5f; + + bh_point4f_add(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 6.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 8.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 10.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 12.0000f, ACCEPTABLE_DELTA); + + bh_point4f_sub(&a, &b, &r); + BH_VERIFY_DELTA(r.x, -4.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, -4.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, -4.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, -4.0000f, ACCEPTABLE_DELTA); + + bh_point4f_mul(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 5.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 12.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 21.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 32.0000f, ACCEPTABLE_DELTA); + + bh_point4f_scale(&a, 10.0f, &r); + BH_VERIFY_DELTA(r.x, 10.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 20.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 30.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 40.0000f, ACCEPTABLE_DELTA); + + bh_point4f_madd(&a, &b, &c, &r); + BH_VERIFY_DELTA(r.x, 6.5000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 14.5000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 24.5000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 36.5000f, ACCEPTABLE_DELTA); + + bh_point4f_negate(&a, &r); + BH_VERIFY_DELTA(r.x, -1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, -2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, -3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, -4.0000f, ACCEPTABLE_DELTA); + + value = bh_point4f_dot(&a, &b); + BH_VERIFY_DELTA(value, 70.0000f, ACCEPTABLE_DELTA); + + value = bh_point4f_dot3(&a, &b); + BH_VERIFY_DELTA(value, 38.0000f, ACCEPTABLE_DELTA); + + bh_point4f_cross(&a, &b, &r); + BH_VERIFY_DELTA(r.x, -4.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 8.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, -4.0000f, ACCEPTABLE_DELTA); + + value = bh_point4f_length(&a); + BH_VERIFY_DELTA(value, sqrt(30.0f), ACCEPTABLE_DELTA); + + bh_point4f_normal(&a, &r); + BH_VERIFY_DELTA(r.x, 1.0f / sqrt(30.0f), ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0f / sqrt(30.0f), ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 3.0f / sqrt(30.0f), ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 4.0f / sqrt(30.0f), ACCEPTABLE_DELTA); + + bh_point4f_min(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 4.0000f, ACCEPTABLE_DELTA); + + bh_point4f_max(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 5.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 6.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 7.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 8.0000f, ACCEPTABLE_DELTA); + + bh_point4f_lerp(&a, &b, 0.0f, &r); + BH_VERIFY_DELTA(r.x, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 4.0000f, ACCEPTABLE_DELTA); + + bh_point4f_lerp(&a, &b, 0.5f, &r); + BH_VERIFY_DELTA(r.x, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 4.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 5.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 6.0000f, ACCEPTABLE_DELTA); + + bh_point4f_lerp(&a, &b, 1.0f, &r); + BH_VERIFY_DELTA(r.x, 5.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 6.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 7.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 8.0000f, ACCEPTABLE_DELTA); + + bh_point4f_slerp(&a, &b, 0.0f, &r); + BH_VERIFY_DELTA(r.x, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 4.0000f, ACCEPTABLE_DELTA); + + bh_point4f_slerp(&a, &b, 0.5f, &r); + BH_VERIFY_DELTA(r.x, 0.50350f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 0.67135f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 0.83918f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 1.00702f, ACCEPTABLE_DELTA); + + bh_point4f_slerp(&a, &b, 1.0f, &r); + BH_VERIFY_DELTA(r.x, 5.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 6.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 7.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w, 8.0000f, ACCEPTABLE_DELTA); + + return 0; +} + + +static int check_point3f(void) +{ + bh_point3f_t a, b, c, r; + float value; + + a.x = 1.0f; a.y = 2.0f; a.z = 3.0f; + b.x = 5.0f; b.y = 6.0f; b.z = 7.0f; + c.x = 1.5f; c.y = 2.5f; c.z = 3.5f; + + bh_point3f_add(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 6.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 8.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 10.0f, ACCEPTABLE_DELTA); + + bh_point3f_sub(&a, &b, &r); + BH_VERIFY_DELTA(r.x, -4.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, -4.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, -4.0f, ACCEPTABLE_DELTA); + + bh_point3f_mul(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 5.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 12.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 21.0f, ACCEPTABLE_DELTA); + + bh_point3f_scale(&a, 10.0f, &r); + BH_VERIFY_DELTA(r.x, 10.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 20.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 30.0f, ACCEPTABLE_DELTA); + + bh_point3f_madd(&a, &b, &c, &r); + BH_VERIFY_DELTA(r.x, 6.5f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 14.5f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 24.5f, ACCEPTABLE_DELTA); + + bh_point3f_negate(&a, &r); + BH_VERIFY_DELTA(r.x, -1.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, -2.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, -3.0f, ACCEPTABLE_DELTA); + + value = bh_point3f_dot(&a, &b); + BH_VERIFY_DELTA(value, 38.0f, ACCEPTABLE_DELTA); + + bh_point3f_cross(&a, &b, &r); + BH_VERIFY_DELTA(r.x, -4.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 8.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, -4.0f, ACCEPTABLE_DELTA); + + value = bh_point3f_length(&a); + BH_VERIFY_DELTA(value, sqrt(14.0f), ACCEPTABLE_DELTA); + + bh_point3f_normal(&a, &r); + BH_VERIFY_DELTA(r.x, 1.0f / sqrt(14.0f), ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0f / sqrt(14.0f), ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 3.0f / sqrt(14.0f), ACCEPTABLE_DELTA); + + bh_point3f_min(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 1.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 3.0f, ACCEPTABLE_DELTA); + + bh_point3f_max(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 5.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 6.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 7.0f, ACCEPTABLE_DELTA); + + bh_point3f_lerp(&a, &b, 0.0f, &r); + BH_VERIFY_DELTA(r.x, 1.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 3.0f, ACCEPTABLE_DELTA); + + bh_point3f_lerp(&a, &b, 0.5f, &r); + BH_VERIFY_DELTA(r.x, 3.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 4.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 5.0f, ACCEPTABLE_DELTA); + + bh_point3f_lerp(&a, &b, 1.0f, &r); + BH_VERIFY_DELTA(r.x, 5.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 6.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 7.0f, ACCEPTABLE_DELTA); + + bh_point3f_slerp(&a, &b, 0.0f, &r); + BH_VERIFY_DELTA(r.x, 1.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 3.0f, ACCEPTABLE_DELTA); + + bh_point3f_slerp(&a, &b, 0.5f, &r); + BH_VERIFY_DELTA(r.x, 0.67937f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 0.90582f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 1.13228f, ACCEPTABLE_DELTA); + + bh_point3f_slerp(&a, &b, 1.0f, &r); + BH_VERIFY_DELTA(r.x, 5.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 6.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z, 7.0f, ACCEPTABLE_DELTA); + + return 0; +} + + +static int check_point2f(void) +{ + bh_point2f_t a, b, c, r; + float value; + + a.x = 1.0f; a.y = 2.0f; + b.x = 5.0f; b.y = 6.0f; + c.x = 1.5f; c.y = 2.5f; + + bh_point2f_add(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 6.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 8.0f, ACCEPTABLE_DELTA); + + bh_point2f_sub(&a, &b, &r); + BH_VERIFY_DELTA(r.x, -4.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, -4.0f, ACCEPTABLE_DELTA); + + bh_point2f_mul(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 5.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 12.0f, ACCEPTABLE_DELTA); + + bh_point2f_scale(&a, 10.0f, &r); + BH_VERIFY_DELTA(r.x, 10.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 20.0f, ACCEPTABLE_DELTA); + + bh_point2f_madd(&a, &b, &c, &r); + BH_VERIFY_DELTA(r.x, 6.5f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 14.5f, ACCEPTABLE_DELTA); + + bh_point2f_negate(&a, &r); + BH_VERIFY_DELTA(r.x, -1.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, -2.0f, ACCEPTABLE_DELTA); + + value = bh_point2f_dot(&a, &b); + BH_VERIFY_DELTA(value, 17.0f, ACCEPTABLE_DELTA); + + value = bh_point2f_cross(&a, &b); + BH_VERIFY_DELTA(value, -4.0f, ACCEPTABLE_DELTA); + + value = bh_point2f_length(&a); + BH_VERIFY_DELTA(value, sqrt(5.0f), ACCEPTABLE_DELTA); + + bh_point2f_normal(&a, &r); + BH_VERIFY_DELTA(r.x, 1.0f / sqrt(5.0f), ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0f / sqrt(5.0f), ACCEPTABLE_DELTA); + + bh_point2f_min(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 1.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0f, ACCEPTABLE_DELTA); + + bh_point2f_max(&a, &b, &r); + BH_VERIFY_DELTA(r.x, 5.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 6.0f, ACCEPTABLE_DELTA); + + bh_point2f_lerp(&a, &b, 0.0f, &r); + BH_VERIFY_DELTA(r.x, 1.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0f, ACCEPTABLE_DELTA); + + bh_point2f_lerp(&a, &b, 0.5f, &r); + BH_VERIFY_DELTA(r.x, 3.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 4.0f, ACCEPTABLE_DELTA); + + bh_point2f_lerp(&a, &b, 1.0f, &r); + BH_VERIFY_DELTA(r.x, 5.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 6.0f, ACCEPTABLE_DELTA); + + bh_point2f_slerp(&a, &b, 0.0f, &r); + BH_VERIFY_DELTA(r.x, 1.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 2.0f, ACCEPTABLE_DELTA); + + bh_point2f_slerp(&a, &b, 0.5f, &r); + BH_VERIFY_DELTA(r.x, 1.00000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 1.33333f, ACCEPTABLE_DELTA); + + bh_point2f_slerp(&a, &b, 1.0f, &r); + BH_VERIFY_DELTA(r.x, 5.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y, 6.0f, ACCEPTABLE_DELTA); + + return 0; +} + + +static int check_point4i(void) +{ + bh_point4i_t a, b, c, r; + + a.x = 1; a.y = 2; a.z = 3; a.w = 4; + b.x = 5; b.y = 6; b.z = 7; b.w = 8; + c.x = 4; c.y = 3; c.z = 2; c.w = 1; + + bh_point4i_add(&a, &b, &r); + BH_VERIFY(r.x == 6); + BH_VERIFY(r.y == 8); + BH_VERIFY(r.z == 10); + BH_VERIFY(r.w == 12); + + bh_point4i_sub(&a, &b, &r); + BH_VERIFY(r.x == -4); + BH_VERIFY(r.y == -4); + BH_VERIFY(r.z == -4); + BH_VERIFY(r.w == -4); + + bh_point4i_mul(&a, &b, &r); + BH_VERIFY(r.x == 5); + BH_VERIFY(r.y == 12); + BH_VERIFY(r.z == 21); + BH_VERIFY(r.w == 32); + + bh_point4i_scale(&a, 10, &r); + BH_VERIFY(r.x == 10); + BH_VERIFY(r.y == 20); + BH_VERIFY(r.z == 30); + BH_VERIFY(r.w == 40); + + bh_point4i_madd(&a, &b, &c, &r); + BH_VERIFY(r.x == 9); + BH_VERIFY(r.y == 15); + BH_VERIFY(r.z == 23); + BH_VERIFY(r.w == 33); + + bh_point4i_negate(&a, &r); + BH_VERIFY(r.x == -1); + BH_VERIFY(r.y == -2); + BH_VERIFY(r.z == -3); + BH_VERIFY(r.w == -4); + + bh_point4i_min(&a, &b, &r); + BH_VERIFY(r.x == 1); + BH_VERIFY(r.y == 2); + BH_VERIFY(r.z == 3); + BH_VERIFY(r.w == 4); + + bh_point4i_max(&a, &b, &r); + BH_VERIFY(r.x == 5); + BH_VERIFY(r.y == 6); + BH_VERIFY(r.z == 7); + BH_VERIFY(r.w == 8); + + bh_point4i_lerp(&a, &b, 0.0f, &r); + BH_VERIFY(r.x == 1); + BH_VERIFY(r.y == 2); + BH_VERIFY(r.z == 3); + BH_VERIFY(r.w == 4); + + bh_point4i_lerp(&a, &b, 0.5f, &r); + BH_VERIFY(r.x == 3); + BH_VERIFY(r.y == 4); + BH_VERIFY(r.z == 5); + BH_VERIFY(r.w == 6); + + bh_point4i_lerp(&a, &b, 1.0f, &r); + BH_VERIFY(r.x == 5); + BH_VERIFY(r.y == 6); + BH_VERIFY(r.z == 7); + BH_VERIFY(r.w == 8); + + return 0; +} + + +static int check_point3i(void) +{ + bh_point3i_t a, b, c, r; + + a.x = 1; a.y = 2; a.z = 3; + b.x = 5; b.y = 6; b.z = 7; + c.x = 4; c.y = 3; c.z = 2; + + bh_point3i_add(&a, &b, &r); + BH_VERIFY(r.x == 6); + BH_VERIFY(r.y == 8); + BH_VERIFY(r.z == 10); + + bh_point3i_sub(&a, &b, &r); + BH_VERIFY(r.x == -4); + BH_VERIFY(r.y == -4); + BH_VERIFY(r.z == -4); + + bh_point3i_mul(&a, &b, &r); + BH_VERIFY(r.x == 5); + BH_VERIFY(r.y == 12); + BH_VERIFY(r.z == 21); + + bh_point3i_scale(&a, 10, &r); + BH_VERIFY(r.x == 10); + BH_VERIFY(r.y == 20); + BH_VERIFY(r.z == 30); + + bh_point3i_madd(&a, &b, &c, &r); + BH_VERIFY(r.x == 9); + BH_VERIFY(r.y == 15); + BH_VERIFY(r.z == 23); + + bh_point3i_negate(&a, &r); + BH_VERIFY(r.x == -1); + BH_VERIFY(r.y == -2); + BH_VERIFY(r.z == -3); + + bh_point3i_min(&a, &b, &r); + BH_VERIFY(r.x == 1); + BH_VERIFY(r.y == 2); + BH_VERIFY(r.z == 3); + + bh_point3i_max(&a, &b, &r); + BH_VERIFY(r.x == 5); + BH_VERIFY(r.y == 6); + BH_VERIFY(r.z == 7); + + bh_point3i_lerp(&a, &b, 0.0f, &r); + BH_VERIFY(r.x == 1); + BH_VERIFY(r.y == 2); + BH_VERIFY(r.z == 3); + + bh_point3i_lerp(&a, &b, 0.5f, &r); + BH_VERIFY(r.x == 3); + BH_VERIFY(r.y == 4); + BH_VERIFY(r.z == 5); + + bh_point3i_lerp(&a, &b, 1.0f, &r); + BH_VERIFY(r.x == 5); + BH_VERIFY(r.y == 6); + BH_VERIFY(r.z == 7); + + return 0; +} + + +static int check_point2i(void) +{ + bh_point2i_t a, b, c, r; + + a.x = 1; a.y = 2; + b.x = 5; b.y = 6; + c.x = 4; c.y = 3; + + bh_point2i_add(&a, &b, &r); + BH_VERIFY(r.x == 6); + BH_VERIFY(r.y == 8); + + bh_point2i_sub(&a, &b, &r); + BH_VERIFY(r.x == -4); + BH_VERIFY(r.y == -4); + + bh_point2i_mul(&a, &b, &r); + BH_VERIFY(r.x == 5); + BH_VERIFY(r.y == 12); + + bh_point2i_scale(&a, 10, &r); + BH_VERIFY(r.x == 10); + BH_VERIFY(r.y == 20); + + bh_point2i_madd(&a, &b, &c, &r); + BH_VERIFY(r.x == 9); + BH_VERIFY(r.y == 15); + + bh_point2i_negate(&a, &r); + BH_VERIFY(r.x == -1); + BH_VERIFY(r.y == -2); + + bh_point2i_min(&a, &b, &r); + BH_VERIFY(r.x == 1); + BH_VERIFY(r.y == 2); + + bh_point2i_max(&a, &b, &r); + BH_VERIFY(r.x == 5); + BH_VERIFY(r.y == 6); + + bh_point2i_lerp(&a, &b, 0.0f, &r); + BH_VERIFY(r.x == 1); + BH_VERIFY(r.y == 2); + + bh_point2i_lerp(&a, &b, 0.5f, &r); + BH_VERIFY(r.x == 3); + BH_VERIFY(r.y == 4); + + bh_point2i_lerp(&a, &b, 1.0f, &r); + BH_VERIFY(r.x == 5); + BH_VERIFY(r.y == 6); + + return 0; +} + + +static int check_quat(void) +{ + return 0; +} + + +static int check_matrix4f(void) +{ + bh_matrix4f_t a, b, r; + float value; + + a.x.x = 5.0f; a.y.x = 1.0f; a.z.x = 2.0f; a.w.x = 7.0f; + a.x.y = 3.0f; a.y.y = 0.0f; a.z.y = 0.0f; a.w.y = 2.0f; + a.x.z = 1.0f; a.y.z = 3.0f; a.z.z = 4.0f; a.w.z = 5.0f; + a.x.w = 2.0f; a.y.w = 0.0f; a.z.w = 0.0f; a.w.w = 3.0f; + + b.x.x = 5.0f; b.y.x = 1.0f; b.z.x = 2.0f; b.w.x = 7.0f; + b.x.y = 3.0f; b.y.y = 1.0f; b.z.y = 0.0f; b.w.y = 2.0f; + b.x.z = 4.0f; b.y.z = 2.0f; b.z.z = 4.0f; b.w.z = 5.0f; + b.x.w = 6.0f; b.y.w = 2.0f; b.z.w = 0.0f; b.w.w = 4.0f; + + bh_matrix4f_identity(&r); + BH_VERIFY(r.x.x == 1.0f); + BH_VERIFY(r.x.y == 0.0f); + BH_VERIFY(r.x.z == 0.0f); + BH_VERIFY(r.x.w == 0.0f); + + BH_VERIFY(r.y.x == 0.0f); + BH_VERIFY(r.y.y == 1.0f); + BH_VERIFY(r.y.z == 0.0f); + BH_VERIFY(r.y.w == 0.0f); + + BH_VERIFY(r.z.x == 0.0f); + BH_VERIFY(r.z.y == 0.0f); + BH_VERIFY(r.z.z == 1.0f); + BH_VERIFY(r.z.w == 0.0f); + + BH_VERIFY(r.w.x == 0.0f); + BH_VERIFY(r.w.y == 0.0f); + BH_VERIFY(r.w.z == 0.0f); + BH_VERIFY(r.w.w == 1.0f); + + bh_matrix4f_add(&a, &b, &r); + BH_VERIFY_DELTA(r.x.x, 10.0f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 6.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 5.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.w, 8.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 5.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.w, 2.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 4.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 8.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.w, 0.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.w.x, 14.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.y, 4.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.z, 10.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.w, 7.0000f, ACCEPTABLE_DELTA); + + bh_matrix4f_sub(&a, &b, &r); + BH_VERIFY_DELTA(r.x.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, -3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.w, -4.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, -1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.w, -2.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.w, 0.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.w.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.z, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.w, -1.0000f, ACCEPTABLE_DELTA); + + bh_matrix4f_mul(&a, &b, &r); + BH_VERIFY_DELTA(r.x.x, 78.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 27.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 60.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.w, 28.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 24.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 7.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 22.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.w, 8.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 18.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 6.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 18.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.w, 4.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.w.x, 75.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.y, 29.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.z, 53.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.w, 26.0000f, ACCEPTABLE_DELTA); + + bh_matrix4f_scale(&a, 10, &r); + BH_VERIFY_DELTA(r.x.x, 50.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 30.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 10.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.w, 20.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 10.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 30.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.w, 0.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 20.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 40.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.w, 0.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.w.x, 70.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.y, 20.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.z, 50.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.w, 30.0000f, ACCEPTABLE_DELTA); + + bh_matrix4f_transpose(&a, &r); + BH_VERIFY_DELTA(r.x.x, 5.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.w, 7.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.w, 2.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 4.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.w, 5.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.w.x, 2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.z, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.w, 3.0000f, ACCEPTABLE_DELTA); + + value = bh_matrix4f_trace(&a); + BH_VERIFY_DELTA(value, 12.0000f, ACCEPTABLE_DELTA); + + value = bh_matrix4f_determinant(&a); + BH_VERIFY_DELTA(value, 10.0000f, ACCEPTABLE_DELTA); + + value = bh_matrix4f_determinant(&b); + BH_VERIFY_DELTA(value, 0.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY(bh_matrix4f_inverse(&a, &r) == BH_OK); + BH_VERIFY_DELTA(r.x.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, -2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 1.5000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.w, 0.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 0.6000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 1.8000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, -1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.w, -0.4000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, -0.5000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.w, 0.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.w.x, -0.4000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.y, 1.8000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.z, -2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.w.w, 0.6000f, ACCEPTABLE_DELTA); + + BH_VERIFY(bh_matrix4f_inverse(&b, &r) != BH_OK); + + return 0; +} + + +static int check_matrix3f(void) +{ + bh_matrix3f_t a, b, r; + float value; + + a.x.x = 5.0f; a.y.x = 1.0f; a.z.x = 2.0f; + a.x.y = 3.0f; a.y.y = 0.0f; a.z.y = 0.0f; + a.x.z = 1.0f; a.y.z = 3.0f; a.z.z = 4.0f; + + b.x.x = 2.0f; b.y.x = 1.0f; b.z.x = 2.0f; + b.x.y = 3.0f; b.y.y = 1.0f; b.z.y = 0.0f; + b.x.z = 4.0f; b.y.z = 2.0f; b.z.z = 4.0f; + + bh_matrix3f_identity(&r); + BH_VERIFY(r.x.x == 1.0f); + BH_VERIFY(r.x.y == 0.0f); + BH_VERIFY(r.x.z == 0.0f); + + BH_VERIFY(r.y.x == 0.0f); + BH_VERIFY(r.y.y == 1.0f); + BH_VERIFY(r.y.z == 0.0f); + + BH_VERIFY(r.z.x == 0.0f); + BH_VERIFY(r.z.y == 0.0f); + BH_VERIFY(r.z.z == 1.0f); + + bh_matrix3f_add(&a, &b, &r); + BH_VERIFY_DELTA(r.x.x, 7.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 6.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 5.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 5.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 4.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 8.0000f, ACCEPTABLE_DELTA); + + bh_matrix3f_sub(&a, &b, &r); + BH_VERIFY_DELTA(r.x.x, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, -3.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, -1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 1.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 0.0000f, ACCEPTABLE_DELTA); + + bh_matrix3f_mul(&a, &b, &r); + BH_VERIFY_DELTA(r.x.x, 21.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 6.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 27.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 10.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 12.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 18.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 6.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 18.0000f, ACCEPTABLE_DELTA); + + bh_matrix3f_scale(&a, 10, &r); + BH_VERIFY_DELTA(r.x.x, 50.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 30.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 10.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 10.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 30.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 20.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 40.0000f, ACCEPTABLE_DELTA); + + bh_matrix3f_transpose(&a, &r); + BH_VERIFY_DELTA(r.x.x, 5.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 2.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, 0.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, 4.0000f, ACCEPTABLE_DELTA); + + value = bh_matrix3f_trace(&a); + BH_VERIFY_DELTA(value, 9.0000f, ACCEPTABLE_DELTA); + + value = bh_matrix3f_determinant(&a); + BH_VERIFY_DELTA(value, 6.0000f, ACCEPTABLE_DELTA); + + value = bh_matrix3f_determinant(&b); + BH_VERIFY_DELTA(value, 0.0000f, ACCEPTABLE_DELTA); + + BH_VERIFY(bh_matrix3f_inverse(&a, &r) == BH_OK); + BH_VERIFY_DELTA(r.x.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.y, -2.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.x.z, 1.5000f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.y.x, 0.3333f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.y, 3.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.y.z, -2.3333f, ACCEPTABLE_DELTA); + + BH_VERIFY_DELTA(r.z.x, 0.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.y, 1.0000f, ACCEPTABLE_DELTA); + BH_VERIFY_DELTA(r.z.z, -0.5000f, ACCEPTABLE_DELTA); + + BH_VERIFY(bh_matrix3f_inverse(&b, &r) != BH_OK); + + return 0; +} + + +int main(int argc, char **argv) +{ + (void)argc; + (void)argv; + + bh_unit_add("point4f", check_point4f); + bh_unit_add("point3f", check_point3f); + bh_unit_add("point2f", check_point2f); + bh_unit_add("point4i", check_point4i); + bh_unit_add("point3i", check_point3i); + bh_unit_add("point2i", check_point2i); + bh_unit_add("quat", check_quat); + bh_unit_add("matrix4f", check_matrix4f); + bh_unit_add("matrix3f", check_matrix3f); + + return bh_unit_run(); +} |
