diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/math/mat4.h | 80 |
1 files changed, 34 insertions, 46 deletions
diff --git a/include/math/mat4.h b/include/math/mat4.h index e808d73..f3601b6 100644 --- a/include/math/mat4.h +++ b/include/math/mat4.h | |||
@@ -23,74 +23,62 @@ typedef struct mat4 { | |||
23 | static inline mat4 mat4_make( | 23 | static inline mat4 mat4_make( |
24 | R m00, R m01, R m02, R m03, R m10, R m11, R m12, R m13, R m20, R m21, R m22, | 24 | R m00, R m01, R m02, R m03, R m10, R m11, R m12, R m13, R m20, R m21, R m22, |
25 | R m23, R m30, R m31, R m32, R m33) { | 25 | R m23, R m30, R m31, R m32, R m33) { |
26 | // clang-format off | ||
27 | // We store the matrix in columns, this is why the following looks flipped. | ||
26 | mat4 m; | 28 | mat4 m; |
27 | m.val[0][0] = m00; | 29 | m.val[0][0] = m00; m.val[0][1] = m10; m.val[0][2] = m20; m.val[0][3] = m30; |
28 | m.val[0][1] = m10; | 30 | m.val[1][0] = m01; m.val[1][1] = m11; m.val[1][2] = m21; m.val[1][3] = m31; |
29 | m.val[0][2] = m20; | 31 | m.val[2][0] = m02; m.val[2][1] = m12; m.val[2][2] = m22; m.val[2][3] = m32; |
30 | m.val[0][3] = m30; | 32 | m.val[3][0] = m03; m.val[3][1] = m13; m.val[3][2] = m23; m.val[3][3] = m33; |
31 | |||
32 | m.val[1][0] = m01; | ||
33 | m.val[1][1] = m11; | ||
34 | m.val[1][2] = m21; | ||
35 | m.val[1][3] = m31; | ||
36 | |||
37 | m.val[2][0] = m02; | ||
38 | m.val[2][1] = m12; | ||
39 | m.val[2][2] = m22; | ||
40 | m.val[2][3] = m32; | ||
41 | |||
42 | m.val[3][0] = m03; | ||
43 | m.val[3][1] = m13; | ||
44 | m.val[3][2] = m23; | ||
45 | m.val[3][3] = m33; | ||
46 | return m; | 33 | return m; |
34 | // clang-format on | ||
47 | } | 35 | } |
48 | 36 | ||
49 | /// Construct a matrix from a column-major matrix array. | 37 | /// Construct a matrix from a column-major matrix array. |
50 | static inline mat4 mat4_from_array(const R M[16]) { | 38 | static inline mat4 mat4_from_array(const R M[16]) { |
39 | // clang-format off | ||
51 | mat4 m; | 40 | mat4 m; |
52 | m.val[0][0] = M[0]; | 41 | m.val[0][0] = M[0]; m.val[0][1] = M[1]; m.val[0][2] = M[2]; m.val[0][3] = M[3]; |
53 | m.val[0][1] = M[1]; | 42 | m.val[1][0] = M[4]; m.val[1][1] = M[5]; m.val[1][2] = M[6]; m.val[1][3] = M[7]; |
54 | m.val[0][2] = M[2]; | 43 | m.val[2][0] = M[8]; m.val[2][1] = M[9]; m.val[2][2] = M[10]; m.val[2][3] = M[11]; |
55 | m.val[0][3] = M[3]; | 44 | m.val[3][0] = M[12]; m.val[3][1] = M[13]; m.val[3][2] = M[14]; m.val[3][3] = M[15]; |
56 | |||
57 | m.val[1][0] = M[4]; | ||
58 | m.val[1][1] = M[5]; | ||
59 | m.val[1][2] = M[6]; | ||
60 | m.val[1][3] = M[7]; | ||
61 | |||
62 | m.val[2][0] = M[8]; | ||
63 | m.val[2][1] = M[9]; | ||
64 | m.val[2][2] = M[10]; | ||
65 | m.val[2][3] = M[11]; | ||
66 | |||
67 | m.val[3][0] = M[12]; | ||
68 | m.val[3][1] = M[13]; | ||
69 | m.val[3][2] = M[14]; | ||
70 | m.val[3][3] = M[15]; | ||
71 | return m; | 45 | return m; |
46 | // clang-format on | ||
72 | } | 47 | } |
73 | 48 | ||
74 | /// Construct the identity matrix. | 49 | /// Construct the identity matrix. |
75 | static inline mat4 mat4_id() { | 50 | static inline mat4 mat4_id() { |
51 | // clang-format off | ||
76 | return mat4_make( | 52 | return mat4_make( |
77 | 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, | 53 | 1.0, 0.0, 0.0, 0.0, |
78 | 1.0); | 54 | 0.0, 1.0, 0.0, 0.0, |
55 | 0.0, 0.0, 1.0, 0.0, | ||
56 | 0.0, 0.0, 0.0, 1.0); | ||
57 | // clang-format on | ||
79 | } | 58 | } |
80 | 59 | ||
81 | /// Construct a matrix from 4 column vectors. | 60 | /// Construct a matrix from 4 column vectors. |
82 | static inline mat4 mat4_from_vec4(vec4 v0, vec4 v1, vec4 v2, vec4 v3) { | 61 | static inline mat4 mat4_from_vec4(vec4 v0, vec4 v1, vec4 v2, vec4 v3) { |
62 | // clang-format off | ||
83 | return mat4_make( | 63 | return mat4_make( |
84 | v0.x, v0.y, v0.z, v0.w, v1.x, v1.y, v1.z, v1.w, v2.x, v2.y, v2.z, v2.w, | 64 | v0.x, v1.x, v2.x, v3.x, |
85 | v3.x, v3.y, v3.z, v3.w); | 65 | v0.y, v1.y, v2.y, v3.y, |
66 | v0.z, v1.z, v2.z, v3.z, | ||
67 | 0,0,0,1); | ||
68 | // clang-format on | ||
86 | } | 69 | } |
87 | 70 | ||
88 | /// Construct a transformation matrix from 4 vectors. | 71 | /// Construct a transformation matrix from a position and vectors forming a |
72 | /// coordinate system. | ||
89 | static inline mat4 mat4_from_vec3( | 73 | static inline mat4 mat4_from_vec3( |
90 | vec3 right, vec3 up, vec3 forward, vec3 position) { | 74 | vec3 right, vec3 up, vec3 forward, vec3 position) { |
75 | // clang-format off | ||
91 | return mat4_make( | 76 | return mat4_make( |
92 | right.x, right.y, right.z, 0.0, up.x, up.y, up.z, 0.0, forward.x, | 77 | right.x, up.x, forward.x, position.x, |
93 | forward.y, forward.z, 0.0, position.x, position.y, position.z, 1.0); | 78 | right.y, up.y, forward.y, position.y, |
79 | right.z, up.z, forward.z, position.z, | ||
80 | 0, 0, 0, 1); | ||
81 | // clant-format on | ||
94 | } | 82 | } |
95 | 83 | ||
96 | /// Return the value at the specified position. | 84 | /// Return the value at the specified position. |
@@ -309,7 +297,7 @@ static inline mat4 mat4_lookat(vec3 position, vec3 target, vec3 up) { | |||
309 | const vec3 fwd = vec3_normalize(vec3_sub(target, position)); | 297 | const vec3 fwd = vec3_normalize(vec3_sub(target, position)); |
310 | const vec3 right = vec3_normalize(vec3_cross(fwd, up)); | 298 | const vec3 right = vec3_normalize(vec3_cross(fwd, up)); |
311 | up = vec3_normalize(vec3_cross(right, fwd)); | 299 | up = vec3_normalize(vec3_cross(right, fwd)); |
312 | return mat4_from_vec3(right, up, fwd, position); | 300 | return mat4_from_vec3(right, up, vec3_neg(fwd), position); |
313 | } | 301 | } |
314 | 302 | ||
315 | /// Create an orthographic projection matrix. | 303 | /// Create an orthographic projection matrix. |