2
* Copyright (C) 2002 Terence M. Welsh
3
* Ported to Linux by Tugrul Galatali <tugrul@galatali.com>
5
* rsMath is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License version 2 as
7
* published by the Free Software Foundation.
9
* rsMath is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25
rsMatrix::~rsMatrix ()
50
void rsMatrix::set (float *mat)
54
for (i = 0; i < 16; i++)
58
void rsMatrix::get (float *mat)
62
for (i = 0; i < 16; i++)
66
void rsMatrix::copy (const rsMatrix & mat)
70
for (i = 0; i < 16; i++)
74
void rsMatrix::preMult (const rsMatrix & postMat)
95
m[0] = preMat[0] * postMat[0] + preMat[4] * postMat[1] + preMat[8] * postMat[2] + preMat[12] * postMat[3];
96
m[1] = preMat[1] * postMat[0] + preMat[5] * postMat[1] + preMat[9] * postMat[2] + preMat[13] * postMat[3];
97
m[2] = preMat[2] * postMat[0] + preMat[6] * postMat[1] + preMat[10] * postMat[2] + preMat[14] * postMat[3];
98
m[3] = preMat[3] * postMat[0] + preMat[7] * postMat[1] + preMat[11] * postMat[2] + preMat[15] * postMat[3];
99
m[4] = preMat[0] * postMat[4] + preMat[4] * postMat[5] + preMat[8] * postMat[6] + preMat[12] * postMat[7];
100
m[5] = preMat[1] * postMat[4] + preMat[5] * postMat[5] + preMat[9] * postMat[6] + preMat[13] * postMat[7];
101
m[6] = preMat[2] * postMat[4] + preMat[6] * postMat[5] + preMat[10] * postMat[6] + preMat[14] * postMat[7];
102
m[7] = preMat[3] * postMat[4] + preMat[7] * postMat[5] + preMat[11] * postMat[6] + preMat[15] * postMat[7];
103
m[8] = preMat[0] * postMat[8] + preMat[4] * postMat[9] + preMat[8] * postMat[10] + preMat[12] * postMat[11];
104
m[9] = preMat[1] * postMat[8] + preMat[5] * postMat[9] + preMat[9] * postMat[10] + preMat[13] * postMat[11];
105
m[10] = preMat[2] * postMat[8] + preMat[6] * postMat[9] + preMat[10] * postMat[10] + preMat[14] * postMat[11];
106
m[11] = preMat[3] * postMat[8] + preMat[7] * postMat[9] + preMat[11] * postMat[10] + preMat[15] * postMat[11];
107
m[12] = preMat[0] * postMat[12] + preMat[4] * postMat[13] + preMat[8] * postMat[14] + preMat[12] * postMat[15];
108
m[13] = preMat[1] * postMat[12] + preMat[5] * postMat[13] + preMat[9] * postMat[14] + preMat[13] * postMat[15];
109
m[14] = preMat[2] * postMat[12] + preMat[6] * postMat[13] + preMat[10] * postMat[14] + preMat[14] * postMat[15];
110
m[15] = preMat[3] * postMat[12] + preMat[7] * postMat[13] + preMat[11] * postMat[14] + preMat[15] * postMat[15];
113
void rsMatrix::postMult (const rsMatrix & preMat)
134
m[0] = preMat[0] * postMat[0] + preMat[4] * postMat[1] + preMat[8] * postMat[2] + preMat[12] * postMat[3];
135
m[1] = preMat[1] * postMat[0] + preMat[5] * postMat[1] + preMat[9] * postMat[2] + preMat[13] * postMat[3];
136
m[2] = preMat[2] * postMat[0] + preMat[6] * postMat[1] + preMat[10] * postMat[2] + preMat[14] * postMat[3];
137
m[3] = preMat[3] * postMat[0] + preMat[7] * postMat[1] + preMat[11] * postMat[2] + preMat[15] * postMat[3];
138
m[4] = preMat[0] * postMat[4] + preMat[4] * postMat[5] + preMat[8] * postMat[6] + preMat[12] * postMat[7];
139
m[5] = preMat[1] * postMat[4] + preMat[5] * postMat[5] + preMat[9] * postMat[6] + preMat[13] * postMat[7];
140
m[6] = preMat[2] * postMat[4] + preMat[6] * postMat[5] + preMat[10] * postMat[6] + preMat[14] * postMat[7];
141
m[7] = preMat[3] * postMat[4] + preMat[7] * postMat[5] + preMat[11] * postMat[6] + preMat[15] * postMat[7];
142
m[8] = preMat[0] * postMat[8] + preMat[4] * postMat[9] + preMat[8] * postMat[10] + preMat[12] * postMat[11];
143
m[9] = preMat[1] * postMat[8] + preMat[5] * postMat[9] + preMat[9] * postMat[10] + preMat[13] * postMat[11];
144
m[10] = preMat[2] * postMat[8] + preMat[6] * postMat[9] + preMat[10] * postMat[10] + preMat[14] * postMat[11];
145
m[11] = preMat[3] * postMat[8] + preMat[7] * postMat[9] + preMat[11] * postMat[10] + preMat[15] * postMat[11];
146
m[12] = preMat[0] * postMat[12] + preMat[4] * postMat[13] + preMat[8] * postMat[14] + preMat[12] * postMat[15];
147
m[13] = preMat[1] * postMat[12] + preMat[5] * postMat[13] + preMat[9] * postMat[14] + preMat[13] * postMat[15];
148
m[14] = preMat[2] * postMat[12] + preMat[6] * postMat[13] + preMat[10] * postMat[14] + preMat[14] * postMat[15];
149
m[15] = preMat[3] * postMat[12] + preMat[7] * postMat[13] + preMat[11] * postMat[14] + preMat[15] * postMat[15];
152
float rsMatrix::determinant ()
154
return (m[0] * m[5] * m[10] * m[15] + m[4] * m[9] * m[14] * m[3] + m[8] * m[13] * m[2] * m[7] + m[12] * m[1] * m[6] * m[11] - m[3] * m[6] * m[9] * m[12] -
155
m[7] * m[10] * m[13] * m[0] - m[11] * m[14] * m[1] * m[4] - m[15] * m[2] * m[5] * m[8]);
158
void rsMatrix::makeTrans (float x, float y, float z)
178
void rsMatrix::makeTrans (float *p)
198
void rsMatrix::makeTrans (const rsVec & vec)
218
void rsMatrix::makeScale (float s)
238
void rsMatrix::makeScale (float x, float y, float z)
258
void rsMatrix::makeScale (float *s)
278
void rsMatrix::makeScale (const rsVec & vec)
298
void rsMatrix::makeRot (float a, float x, float y, float z)
306
void rsMatrix::makeRot (float a, const rsVec & v)
314
void rsMatrix::makeRot (rsQuat & q)
319
int rsMatrix::invert (const rsMatrix & mat)
325
// initialize reduction matrix
336
rmat[2][2] = mat[10];
337
rmat[3][2] = mat[11];
338
rmat[0][3] = mat[12];
339
rmat[1][3] = mat[13];
340
rmat[2][3] = mat[14];
341
rmat[3][3] = mat[15];
359
// perform reductions
360
for (i = 0; i < 4; i++) {
362
if (a == 0.0f) // matrix is singular, can't be reduced
366
for (j = 0; j < 8; j++)
367
rmat[i][j] = rmat[i][j] * a;
368
for (k = 0; k < 4; k++) {
371
for (j = 0; j < 8; j++)
372
rmat[k][j] = rmat[k][j] - b * rmat[i][j];
378
// extract the inverted matrix
399
void rsMatrix::rotationInvert (const rsMatrix & mat)
401
float det = mat[0] * mat[5] * mat[10]
402
+ mat[4] * mat[9] * mat[2]
403
+ mat[8] * mat[1] * mat[6]
404
- mat[2] * mat[5] * mat[8]
405
- mat[6] * mat[9] * mat[0]
406
- mat[10] * mat[1] * mat[4];
408
m[0] = (mat[5] * mat[10] - mat[6] * mat[9]) / det;
409
m[1] = (mat[6] * mat[8] - mat[4] * mat[10]) / det;
410
m[2] = (mat[4] * mat[9] - mat[5] * mat[8]) / det;
411
m[4] = (mat[9] * mat[2] - mat[10] * mat[1]) / det;
412
m[5] = (mat[10] * mat[0] - mat[8] * mat[2]) / det;
413
m[6] = (mat[8] * mat[1] - mat[9] * mat[0]) / det;
414
m[8] = (mat[1] * mat[6] - mat[2] * mat[5]) / det;
415
m[9] = (mat[2] * mat[4] - mat[0] * mat[6]) / det;
416
m[10] = (mat[0] * mat[5] - mat[1] * mat[4]) / det;
417
m[3] = m[7] = m[11] = m[12] = m[13] = m[14] = 0.0f;
421
void rsMatrix::fromQuat (const rsQuat & q)
423
float s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;
426
if (q[0] == 0.0f && q[1] == 0.0f && q[2] == 0.0f) {
431
s = 2.0f / (q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
445
m[0] = 1.0f - yy - zz;
450
m[5] = 1.0f - xx - zz;
455
m[10] = 1.0f - xx - yy;
463
rsMatrix & rsMatrix::operator = (const rsMatrix & mat)