From 2e82e2ddd0852b8063a3d6645366f53ee844e273 Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 4 Dec 2019 00:07:32 +0800 Subject: +init --- src/test/test.h | 15 ++++ src/test/test_mat4.c | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/test/test_quat.c | 82 ++++++++++++++++++++ 3 files changed, 305 insertions(+) create mode 100644 src/test/test.h create mode 100644 src/test/test_mat4.c create mode 100644 src/test/test_quat.c (limited to 'src/test') diff --git a/src/test/test.h b/src/test/test.h new file mode 100644 index 0000000..4e7d77e --- /dev/null +++ b/src/test/test.h @@ -0,0 +1,15 @@ +#ifndef _SOFTSHADEROOM_TEST_H_ +#define _SOFTSHADEROOM_TEST_H_ + +#include +#include +#include + +#define print(str) printf("%s", str) +#define TEST(f) void f(){print(#f);print("\n"); +#define END } + +void test_mat4(); +void test_quat(); + +#endif \ No newline at end of file diff --git a/src/test/test_mat4.c b/src/test/test_mat4.c new file mode 100644 index 0000000..e7a65fc --- /dev/null +++ b/src/test/test_mat4.c @@ -0,0 +1,208 @@ +#include "test.h" +#include "../math/math.h" +#include "../util/time.h" + +Mat4 m1 = { + 1, 5, 9,13, + 2, 6,10,14, + 3, 7,11,15, + 4, 8,12,16 +}; + +Mat4 m2 = { + 16,12, 8, 4, + 15,11, 7, 3, + 14,10, 6, 2, + 13, 9, 5, 1 +}; + +static void test_multiply() { + print("test_multiply\n"); + Mat4 res; + mat4_multiply(&m1, &m2, &res); + mat4_print(&res); +} + +static void test_invert() { + print("test_invert\n"); + Mat4 m = { + 0, 3, 0, 0, + 2, 7, 0, 1, + 8, 1, 1, 0, + 6, 0, 2, 1, + }; + Mat4 res, res2; + mat4_invertfull(&m, &res); + mat4_print(&res); + mat4_multiply(&m1, &m, &res2); + mat4_multiply(&res2, &res, &res2); + mat4_print(&res2); + /* + -0.250 0.333 1.667 -1.833 + 0.083 0.000 -0.667 0.833 + 0.167 -0.000 -0.333 -0.333 + -0.083 0.000 0.667 0.167 + */ +} + +static void test_transpose() { + print("test_transpose\n"); + Mat4 res; + mat4_transpose(&m1, &res); + mat4_print(&res); +} + +static void test_scale() { + print("test_scale\n"); + Mat4 scale; + mat4_setscale(1, 2, 3, &scale); + Mat4 res; + mat4_multiply(&scale, &m1, &res); + mat4_print(&scale); +} + +static void test_position() { + print("test_position\n"); + Mat4 pos; + mat4_setposition(1, 2, 3, &pos); + mat4_print(&pos); +} + +static void test_rotation() { + print("test_rotation\n"); + Mat4 i; + mat4_setidentity(&i); + Vec3 axis = { 0, 0, 1 }; + mat4_rotate(&i, 90, &axis, &i); + mat4_print(&i); +} + +static void test_invertgeneral3d() { + print("test_invertgeneral3d\n"); + Mat4 trans; + mat4_setidentity(&trans); + print("original matrix"); mat4_print(&m1); + Vec3 v; + v.x = 1; v.y = 3.3; v.z = 0; mat4_translate(&trans, &v, &trans); + v.x = 1; v.y = 0; v.z = 0; mat4_rotate(&trans, 23, &v, &trans); + v.x = 1; v.y = 1.2; v.z = 1; mat4_scale(&trans, &v, &trans); + v.x = 1; v.y = 3; v.z = 0; mat4_rotate(&trans, 23, &v, &trans); + v.x = 2; v.y = 3.3; v.z = 0; mat4_translate(&trans, &v, &trans); + print("transform matrix"); mat4_print(&trans); + Mat4 res; + mat4_multiply(&trans, &m1, &res); + mat4_invertgeneral3d(&trans, &trans); + print("inverse transform matrix"); mat4_print(&trans); + mat4_multiply(&trans, &res, &res); + print("inverted result"); mat4_print(&res); +} + +void test_invertrot() { + print("test_invertrot\n"); + print("original matrix"); mat4_print(&m1); + Mat4 rot; mat4_setidentity(&rot); + Vec3 axis = { 1,2,3 }; mat4_rotate(&rot, 90, &axis, &rot); + print("rotation matrix"); mat4_print(&rot); + Mat4 res; + mat4_multiply(&rot, &m1, &res); + print("result matrix"); mat4_print(&res); + mat4_invertgeneral3d(&rot, &rot); + print("inverse rotation matrix"); mat4_print(&rot); + mat4_multiply(&rot, &res, &res); + print("result matrix"); mat4_print(&res); +} + +TEST(test_orthogonalize) + ROWMAT(A0, + 1, 2, 4, 0, + 0, 0, 5, 0, + 0, 3, 6, 0, + 0, 0, 0, 0 + ); + Mat4 A; + + TIME_STAMP("mat4_orthogonalize time used") + for (int i = 0; i < 1000000; ++i) { + mat4_orthogonalize(&A0, &A); + } + TIME_STAMP_END + + TIME_STAMP("mat4_isorthogonal time used") + for (int i = 0; i < 1000000; ++i) { + mat4_isorthogonal(&A0); + } + TIME_STAMP_END + + mat4_print(&A); + float res = vec3_dot(&A.basis.y, &A.basis.x); + printf("%f\n", res); + printf("%d\n", mat4_isorthogonal(&A)); + Mat4 rev; + mat4_transpose(&A, &rev); + mat4_multiply(&A, &rev, &rev); + mat4_print(&rev); +END + +TEST(test_toeuler) + Euler euler = { 90, 0, 33 }; + Quat rot; + quat_fromeuler(&euler, &rot); + Mat4 m; + quat_tomat4(&rot, &m); + Euler res; + quat_toeuler(&rot, &res); + euler_print(&res); +END + +TEST(test_rotatematrix) + Euler euler = { 10, 20, 30 }; + Quat rot; + quat_fromeuler(&euler, &rot); + Mat4 m; + quat_tomat4(&rot, &m); + mat4_print(&m); + Mat4 mz, mx, my; + mat4_setrotatez(30, &mz); + mat4_setrotatex(10, &mx); + mat4_setrotatey(20, &my); + mat4_multiply(&mx, &mz, &mx); + mat4_multiply(&my, &mx, &m); + mat4_print(&m); + mat4_setrotate(10, 20, 30, &m); + mat4_print(&m); +END + +TEST(test_isidentity) + ROWMAT(mat, + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + ) + bool res; + TIME_STAMP_1000000("test is isidentity") + res = mat4_isidentity(&mat); + TIME_STAMP_END + printf("%d\n", res); +END + +void test_mat4() { + print("================================================\n"); + print("test_mat4\n"); + print("================================================\n"); + + //test_transpose(); + //test_multiply(); + //test_invert(); + //test_scale(); + //test_position(); + //test_rotation(); + //test_invertgeneral3d(); + + //test_invertrot(); + //test_orthogonalize(); + //test_toeuler(); + test_rotatematrix(); + + //test_isidentity(); +} diff --git a/src/test/test_quat.c b/src/test/test_quat.c new file mode 100644 index 0000000..c932082 --- /dev/null +++ b/src/test/test_quat.c @@ -0,0 +1,82 @@ +#include "test.h" +#include "../math/math.h" + +TEST(test_euler) + +Euler e = {90, 90, 0}; +Vec3 p = {2,3,4}, res; +Quat qut; +quat_fromeuler(&e, &qut); +quat_applytovec3(&qut, &p, &res); +vec3_print(&res); + +/*ÓÃÖá½Ç¶¨Òå*/ +Vec3 axis = { 1, 0,0 }; +Quat qut2; +quat_fromaxisangle(&axis, 90, &qut2); +quat_applytovec3(&qut, &p, &res); +vec3_print(&res); + +Mat4 mat; +quat_tomat4(&qut, &mat); +mat4_print(&mat); + +Vec4 p2 = { 2,3,4,1 }; +Vec4 res2; +mat4_applytovec4(&mat, &p2, &res2); +vec4_print(&res2); + +END + +TEST(test_quat2euler) +Euler e = { 10, 20, 30}; + +Quat q; +euler_toquat(&e, &q); +euler_deg2rad(&e, &e); +quat_print(&q); +euler_print(&e); + +Euler res; +quat_toeuler(&q, &res); + +euler_print(&res); + +quat_fromeuler(&res, &q); +quat_print(&q); + +END + +TEST(test_conjugate) +Quat rot; +Vec3 axis = {2,3,4}; +vec3_normalize(&axis, &axis); +quat_fromaxisangle(&axis, 46, &rot); +Vec3 p = {12, 3, 55}; +vec3_print(&p); +Vec3 res; +quat_applytovec3(&rot, &p, &res); +vec3_print(&res); +Quat rev; +quat_invert(&rot, &rev); +quat_applytovec3(&rev, &res, &res); +vec3_print(&res); +END + +TEST(test_lookrotation) +Vec3 view = {1, 0, 0}; +Vec3 up = {0, 1, 0}; +Quat rot; +quat_setlookrotation(&view, &up, &rot); +quat_print(&rot); +Euler euler; +quat_toeuler(&rot, &euler); +euler_print(&euler); +END + +void test_quat() { + //test_euler(); + //test_quat2euler(); + //test_conjugate(); + //test_lookrotation(); +} \ No newline at end of file -- cgit v1.1-26-g67d0