dungeon_crawler
view prototype/vmath/matrix.inl @ 80:a373b36ffc17
better
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 27 Oct 2012 01:59:39 +0300 |
parents | |
children |
line source
1 /*
2 libvmath - a vector math library
3 Copyright (C) 2004-2011 John Tsiombikas <nuclear@member.fsf.org>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published
7 by the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
19 #include <string.h>
21 #ifdef __cplusplus
22 extern "C" {
23 #endif /* __cplusplus */
25 /* C matrix 3x3 functions */
26 static inline void m3_identity(mat3_t m)
27 {
28 static const mat3_t id = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
29 memcpy(m, id, sizeof id);
30 }
32 static inline void m3_cons(mat3_t m,
33 scalar_t m11, scalar_t m12, scalar_t m13,
34 scalar_t m21, scalar_t m22, scalar_t m23,
35 scalar_t m31, scalar_t m32, scalar_t m33)
36 {
37 m[0][0] = m11; m[0][1] = m12; m[0][2] = m13;
38 m[1][0] = m21; m[1][1] = m22; m[1][2] = m23;
39 m[2][0] = m31; m[2][1] = m32; m[2][2] = m33;
40 }
42 static inline void m3_copy(mat3_t dest, mat3_t src)
43 {
44 memcpy(dest, src, sizeof(mat3_t));
45 }
48 /* C matrix 4x4 functions */
49 static inline void m4_identity(mat4_t m)
50 {
51 static const mat4_t id = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}};
52 memcpy(m, id, sizeof id);
53 }
55 static inline void m4_cons(mat4_t m,
56 scalar_t m11, scalar_t m12, scalar_t m13, scalar_t m14,
57 scalar_t m21, scalar_t m22, scalar_t m23, scalar_t m24,
58 scalar_t m31, scalar_t m32, scalar_t m33, scalar_t m34,
59 scalar_t m41, scalar_t m42, scalar_t m43, scalar_t m44)
60 {
61 m[0][0] = m11; m[0][1] = m12; m[0][2] = m13; m[0][3] = m14;
62 m[1][0] = m21; m[1][1] = m22; m[1][2] = m23; m[1][3] = m24;
63 m[2][0] = m31; m[2][1] = m32; m[2][2] = m33; m[2][3] = m34;
64 m[3][0] = m41; m[3][1] = m42; m[3][2] = m43; m[3][3] = m44;
65 }
67 static inline void m4_copy(mat4_t dest, mat4_t src)
68 {
69 memcpy(dest, src, sizeof(mat4_t));
70 }
72 static inline void m4_mult(mat4_t res, mat4_t m1, mat4_t m2)
73 {
74 res[0][0] = m1[0][0] * m2[0][0] + m1[0][1] * m2[1][0] + m1[0][2] * m2[2][0] + m1[0][3] * m2[3][0];
75 res[0][1] = m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1] + m1[0][2] * m2[2][1] + m1[0][3] * m2[3][1];
76 res[0][2] = m1[0][0] * m2[0][2] + m1[0][1] * m2[1][2] + m1[0][2] * m2[2][2] + m1[0][3] * m2[3][2];
77 res[0][3] = m1[0][0] * m2[0][3] + m1[0][1] * m2[1][3] + m1[0][2] * m2[2][3] + m1[0][3] * m2[3][3];
79 res[1][0] = m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0] + m1[1][2] * m2[2][0] + m1[1][3] * m2[3][0];
80 res[1][1] = m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1] + m1[1][2] * m2[2][1] + m1[1][3] * m2[3][1];
81 res[1][2] = m1[1][0] * m2[0][2] + m1[1][1] * m2[1][2] + m1[1][2] * m2[2][2] + m1[1][3] * m2[3][2];
82 res[1][3] = m1[1][0] * m2[0][3] + m1[1][1] * m2[1][3] + m1[1][2] * m2[2][3] + m1[1][3] * m2[3][3];
84 res[2][0] = m1[2][0] * m2[0][0] + m1[2][1] * m2[1][0] + m1[2][2] * m2[2][0] + m1[2][3] * m2[3][0];
85 res[2][1] = m1[2][0] * m2[0][1] + m1[2][1] * m2[1][1] + m1[2][2] * m2[2][1] + m1[2][3] * m2[3][1];
86 res[2][2] = m1[2][0] * m2[0][2] + m1[2][1] * m2[1][2] + m1[2][2] * m2[2][2] + m1[2][3] * m2[3][2];
87 res[2][3] = m1[2][0] * m2[0][3] + m1[2][1] * m2[1][3] + m1[2][2] * m2[2][3] + m1[2][3] * m2[3][3];
89 res[3][0] = m1[3][0] * m2[0][0] + m1[3][1] * m2[1][0] + m1[3][2] * m2[2][0] + m1[3][3] * m2[3][0];
90 res[3][1] = m1[3][0] * m2[0][1] + m1[3][1] * m2[1][1] + m1[3][2] * m2[2][1] + m1[3][3] * m2[3][1];
91 res[3][2] = m1[3][0] * m2[0][2] + m1[3][1] * m2[1][2] + m1[3][2] * m2[2][2] + m1[3][3] * m2[3][2];
92 res[3][3] = m1[3][0] * m2[0][3] + m1[3][1] * m2[1][3] + m1[3][2] * m2[2][3] + m1[3][3] * m2[3][3];
93 }
95 static inline void m4_set_column(mat4_t m, vec4_t v, int idx)
96 {
97 m[0][idx] = v.x;
98 m[1][idx] = v.y;
99 m[2][idx] = v.z;
100 m[3][idx] = v.w;
101 }
103 static inline void m4_set_row(mat4_t m, vec4_t v, int idx)
104 {
105 m[idx][0] = v.x;
106 m[idx][1] = v.y;
107 m[idx][2] = v.z;
108 m[idx][3] = v.w;
109 }
111 #ifdef __cplusplus
112 } /* extern "C" */
115 /* unrolled to hell and inline */
116 inline Matrix4x4 operator *(const Matrix4x4 &m1, const Matrix4x4 &m2) {
117 Matrix4x4 res;
119 res.m[0][0] = m1.m[0][0] * m2.m[0][0] + m1.m[0][1] * m2.m[1][0] + m1.m[0][2] * m2.m[2][0] + m1.m[0][3] * m2.m[3][0];
120 res.m[0][1] = m1.m[0][0] * m2.m[0][1] + m1.m[0][1] * m2.m[1][1] + m1.m[0][2] * m2.m[2][1] + m1.m[0][3] * m2.m[3][1];
121 res.m[0][2] = m1.m[0][0] * m2.m[0][2] + m1.m[0][1] * m2.m[1][2] + m1.m[0][2] * m2.m[2][2] + m1.m[0][3] * m2.m[3][2];
122 res.m[0][3] = m1.m[0][0] * m2.m[0][3] + m1.m[0][1] * m2.m[1][3] + m1.m[0][2] * m2.m[2][3] + m1.m[0][3] * m2.m[3][3];
124 res.m[1][0] = m1.m[1][0] * m2.m[0][0] + m1.m[1][1] * m2.m[1][0] + m1.m[1][2] * m2.m[2][0] + m1.m[1][3] * m2.m[3][0];
125 res.m[1][1] = m1.m[1][0] * m2.m[0][1] + m1.m[1][1] * m2.m[1][1] + m1.m[1][2] * m2.m[2][1] + m1.m[1][3] * m2.m[3][1];
126 res.m[1][2] = m1.m[1][0] * m2.m[0][2] + m1.m[1][1] * m2.m[1][2] + m1.m[1][2] * m2.m[2][2] + m1.m[1][3] * m2.m[3][2];
127 res.m[1][3] = m1.m[1][0] * m2.m[0][3] + m1.m[1][1] * m2.m[1][3] + m1.m[1][2] * m2.m[2][3] + m1.m[1][3] * m2.m[3][3];
129 res.m[2][0] = m1.m[2][0] * m2.m[0][0] + m1.m[2][1] * m2.m[1][0] + m1.m[2][2] * m2.m[2][0] + m1.m[2][3] * m2.m[3][0];
130 res.m[2][1] = m1.m[2][0] * m2.m[0][1] + m1.m[2][1] * m2.m[1][1] + m1.m[2][2] * m2.m[2][1] + m1.m[2][3] * m2.m[3][1];
131 res.m[2][2] = m1.m[2][0] * m2.m[0][2] + m1.m[2][1] * m2.m[1][2] + m1.m[2][2] * m2.m[2][2] + m1.m[2][3] * m2.m[3][2];
132 res.m[2][3] = m1.m[2][0] * m2.m[0][3] + m1.m[2][1] * m2.m[1][3] + m1.m[2][2] * m2.m[2][3] + m1.m[2][3] * m2.m[3][3];
134 res.m[3][0] = m1.m[3][0] * m2.m[0][0] + m1.m[3][1] * m2.m[1][0] + m1.m[3][2] * m2.m[2][0] + m1.m[3][3] * m2.m[3][0];
135 res.m[3][1] = m1.m[3][0] * m2.m[0][1] + m1.m[3][1] * m2.m[1][1] + m1.m[3][2] * m2.m[2][1] + m1.m[3][3] * m2.m[3][1];
136 res.m[3][2] = m1.m[3][0] * m2.m[0][2] + m1.m[3][1] * m2.m[1][2] + m1.m[3][2] * m2.m[2][2] + m1.m[3][3] * m2.m[3][2];
137 res.m[3][3] = m1.m[3][0] * m2.m[0][3] + m1.m[3][1] * m2.m[1][3] + m1.m[3][2] * m2.m[2][3] + m1.m[3][3] * m2.m[3][3];
139 return res;
140 }
142 inline scalar_t *Matrix3x3::operator [](int index) {
143 return m[index];
144 }
146 inline const scalar_t *Matrix3x3::operator [](int index) const {
147 return m[index];
148 }
150 inline void Matrix3x3::reset_identity() {
151 memcpy(this->m, identity.m, 9 * sizeof(scalar_t));
152 }
154 inline scalar_t *Matrix4x4::operator [](int index) {
155 return m[index];
156 }
158 inline const scalar_t *Matrix4x4::operator [](int index) const {
159 return m[index];
160 }
162 inline void Matrix4x4::reset_identity() {
163 memcpy(this->m, identity.m, 16 * sizeof(scalar_t));
164 }
165 #endif /* __cplusplus */