summaryrefslogtreecommitdiff
path: root/src/test/test_mat4.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/test_mat4.c')
-rw-r--r--src/test/test_mat4.c208
1 files changed, 208 insertions, 0 deletions
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();
+}