~ubuntu-branches/ubuntu/gutsy/rss-glx/gutsy

« back to all changes in this revision

Viewing changes to reallyslick/cpp_src/rsMatrix.cpp

  • Committer: Bazaar Package Importer
  • Author(s): LaMont Jones
  • Date: 2005-11-30 18:21:27 UTC
  • mto: This revision was merged to the branch mainline in revision 4.
  • Revision ID: james.westby@ubuntu.com-20051130182127-5iww7elbiyzej1lk
Tags: upstream-0.8.0
ImportĀ upstreamĀ versionĀ 0.8.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (C) 2002  Terence M. Welsh
3
 
 * Ported to Linux by Tugrul Galatali <tugrul@galatali.com>
4
 
 *
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.
8
 
 *
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.
13
 
 *
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
17
 
 */
18
 
 
19
 
#include "rsMatrix.h"
20
 
 
21
 
rsMatrix::rsMatrix ()
22
 
{
23
 
}
24
 
 
25
 
rsMatrix::~rsMatrix ()
26
 
{
27
 
}
28
 
 
29
 
void
30
 
  rsMatrix::identity ()
31
 
{
32
 
        m[0] = 1.0f;
33
 
        m[1] = 0.0f;
34
 
        m[2] = 0.0f;
35
 
        m[3] = 0.0f;
36
 
        m[4] = 0.0f;
37
 
        m[5] = 1.0f;
38
 
        m[6] = 0.0f;
39
 
        m[7] = 0.0f;
40
 
        m[8] = 0.0f;
41
 
        m[9] = 0.0f;
42
 
        m[10] = 1.0f;
43
 
        m[11] = 0.0f;
44
 
        m[12] = 0.0f;
45
 
        m[13] = 0.0f;
46
 
        m[14] = 0.0f;
47
 
        m[15] = 1.0f;
48
 
}
49
 
 
50
 
void rsMatrix::set (float *mat)
51
 
{
52
 
        int i;
53
 
 
54
 
        for (i = 0; i < 16; i++)
55
 
                m[i] = mat[i];
56
 
}
57
 
 
58
 
void rsMatrix::get (float *mat)
59
 
{
60
 
        int i;
61
 
 
62
 
        for (i = 0; i < 16; i++)
63
 
                mat[i] = m[i];
64
 
}
65
 
 
66
 
void rsMatrix::copy (const rsMatrix & mat)
67
 
{
68
 
        int i;
69
 
 
70
 
        for (i = 0; i < 16; i++)
71
 
                m[i] = mat[i];
72
 
}
73
 
 
74
 
void rsMatrix::preMult (const rsMatrix & postMat)
75
 
{
76
 
        float preMat[16];
77
 
 
78
 
        preMat[0] = m[0];
79
 
        preMat[1] = m[1];
80
 
        preMat[2] = m[2];
81
 
        preMat[3] = m[3];
82
 
        preMat[4] = m[4];
83
 
        preMat[5] = m[5];
84
 
        preMat[6] = m[6];
85
 
        preMat[7] = m[7];
86
 
        preMat[8] = m[8];
87
 
        preMat[9] = m[9];
88
 
        preMat[10] = m[10];
89
 
        preMat[11] = m[11];
90
 
        preMat[12] = m[12];
91
 
        preMat[13] = m[13];
92
 
        preMat[14] = m[14];
93
 
        preMat[15] = m[15];
94
 
 
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];
111
 
}
112
 
 
113
 
void rsMatrix::postMult (const rsMatrix & preMat)
114
 
{
115
 
        float postMat[16];
116
 
 
117
 
        postMat[0] = m[0];
118
 
        postMat[1] = m[1];
119
 
        postMat[2] = m[2];
120
 
        postMat[3] = m[3];
121
 
        postMat[4] = m[4];
122
 
        postMat[5] = m[5];
123
 
        postMat[6] = m[6];
124
 
        postMat[7] = m[7];
125
 
        postMat[8] = m[8];
126
 
        postMat[9] = m[9];
127
 
        postMat[10] = m[10];
128
 
        postMat[11] = m[11];
129
 
        postMat[12] = m[12];
130
 
        postMat[13] = m[13];
131
 
        postMat[14] = m[14];
132
 
        postMat[15] = m[15];
133
 
 
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];
150
 
}
151
 
 
152
 
float rsMatrix::determinant ()
153
 
{
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]);
156
 
}
157
 
 
158
 
void rsMatrix::makeTrans (float x, float y, float z)
159
 
{
160
 
        m[0] = 1.0f;
161
 
        m[1] = 0.0f;
162
 
        m[2] = 0.0f;
163
 
        m[3] = 0.0f;
164
 
        m[4] = 0.0f;
165
 
        m[5] = 1.0f;
166
 
        m[6] = 0.0f;
167
 
        m[7] = 0.0f;
168
 
        m[8] = 0.0f;
169
 
        m[9] = 0.0f;
170
 
        m[10] = 1.0f;
171
 
        m[11] = 0.0f;
172
 
        m[12] = x;
173
 
        m[13] = y;
174
 
        m[14] = z;
175
 
        m[15] = 1.0f;
176
 
}
177
 
 
178
 
void rsMatrix::makeTrans (float *p)
179
 
{
180
 
        m[0] = 1.0f;
181
 
        m[1] = 0.0f;
182
 
        m[2] = 0.0f;
183
 
        m[3] = 0.0f;
184
 
        m[4] = 0.0f;
185
 
        m[5] = 1.0f;
186
 
        m[6] = 0.0f;
187
 
        m[7] = 0.0f;
188
 
        m[8] = 0.0f;
189
 
        m[9] = 0.0f;
190
 
        m[10] = 1.0f;
191
 
        m[11] = 0.0f;
192
 
        m[12] = p[0];
193
 
        m[13] = p[1];
194
 
        m[14] = p[2];
195
 
        m[15] = 1.0f;
196
 
}
197
 
 
198
 
void rsMatrix::makeTrans (const rsVec & vec)
199
 
{
200
 
        m[0] = 1.0f;
201
 
        m[1] = 0.0f;
202
 
        m[2] = 0.0f;
203
 
        m[3] = 0.0f;
204
 
        m[4] = 0.0f;
205
 
        m[5] = 1.0f;
206
 
        m[6] = 0.0f;
207
 
        m[7] = 0.0f;
208
 
        m[8] = 0.0f;
209
 
        m[9] = 0.0f;
210
 
        m[10] = 1.0f;
211
 
        m[11] = 0.0f;
212
 
        m[12] = vec[0];
213
 
        m[13] = vec[1];
214
 
        m[14] = vec[2];
215
 
        m[15] = 1.0f;
216
 
}
217
 
 
218
 
void rsMatrix::makeScale (float s)
219
 
{
220
 
        m[0] = s;
221
 
        m[1] = 0.0f;
222
 
        m[2] = 0.0f;
223
 
        m[3] = 0.0f;
224
 
        m[4] = 0.0f;
225
 
        m[5] = s;
226
 
        m[6] = 0.0f;
227
 
        m[7] = 0.0f;
228
 
        m[8] = 0.0f;
229
 
        m[9] = 0.0f;
230
 
        m[10] = s;
231
 
        m[11] = 0.0f;
232
 
        m[12] = 0.0f;
233
 
        m[13] = 0.0f;
234
 
        m[14] = 0.0f;
235
 
        m[15] = 1.0f;
236
 
}
237
 
 
238
 
void rsMatrix::makeScale (float x, float y, float z)
239
 
{
240
 
        m[0] = x;
241
 
        m[1] = 0.0f;
242
 
        m[2] = 0.0f;
243
 
        m[3] = 0.0f;
244
 
        m[4] = 0.0f;
245
 
        m[5] = y;
246
 
        m[6] = 0.0f;
247
 
        m[7] = 0.0f;
248
 
        m[8] = 0.0f;
249
 
        m[9] = 0.0f;
250
 
        m[10] = z;
251
 
        m[11] = 0.0f;
252
 
        m[12] = 0.0f;
253
 
        m[13] = 0.0f;
254
 
        m[14] = 0.0f;
255
 
        m[15] = 1.0f;
256
 
}
257
 
 
258
 
void rsMatrix::makeScale (float *s)
259
 
{
260
 
        m[0] = s[0];
261
 
        m[1] = 0.0f;
262
 
        m[2] = 0.0f;
263
 
        m[3] = 0.0f;
264
 
        m[4] = 0.0f;
265
 
        m[5] = s[1];
266
 
        m[6] = 0.0f;
267
 
        m[7] = 0.0f;
268
 
        m[8] = 0.0f;
269
 
        m[9] = 0.0f;
270
 
        m[10] = s[2];
271
 
        m[11] = 0.0f;
272
 
        m[12] = 0.0f;
273
 
        m[13] = 0.0f;
274
 
        m[14] = 0.0f;
275
 
        m[15] = 1.0f;
276
 
}
277
 
 
278
 
void rsMatrix::makeScale (const rsVec & vec)
279
 
{
280
 
        m[0] = vec[0];
281
 
        m[1] = 0.0f;
282
 
        m[2] = 0.0f;
283
 
        m[3] = 0.0f;
284
 
        m[4] = 0.0f;
285
 
        m[5] = vec[1];
286
 
        m[6] = 0.0f;
287
 
        m[7] = 0.0f;
288
 
        m[8] = 0.0f;
289
 
        m[9] = 0.0f;
290
 
        m[10] = vec[2];
291
 
        m[11] = 0.0f;
292
 
        m[12] = 0.0f;
293
 
        m[13] = 0.0f;
294
 
        m[14] = 0.0f;
295
 
        m[15] = 1.0f;
296
 
}
297
 
 
298
 
void rsMatrix::makeRot (float a, float x, float y, float z)
299
 
{
300
 
        rsQuat q;
301
 
 
302
 
        q.make (a, x, y, z);
303
 
        q.toMat (m);
304
 
}
305
 
 
306
 
void rsMatrix::makeRot (float a, const rsVec & v)
307
 
{
308
 
        rsQuat q;
309
 
 
310
 
        q.make (a, v);
311
 
        q.toMat (m);
312
 
}
313
 
 
314
 
void rsMatrix::makeRot (rsQuat & q)
315
 
{
316
 
        q.toMat (m);
317
 
}
318
 
 
319
 
int rsMatrix::invert (const rsMatrix & mat)
320
 
{
321
 
        float rmat[4][8];
322
 
        float a, b;
323
 
        int i, j, k;
324
 
 
325
 
        // initialize reduction matrix
326
 
        rmat[0][0] = mat[0];
327
 
        rmat[1][0] = mat[1];
328
 
        rmat[2][0] = mat[2];
329
 
        rmat[3][0] = mat[3];
330
 
        rmat[0][1] = mat[4];
331
 
        rmat[1][1] = mat[5];
332
 
        rmat[2][1] = mat[6];
333
 
        rmat[3][1] = mat[7];
334
 
        rmat[0][2] = mat[8];
335
 
        rmat[1][2] = mat[9];
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];
342
 
        rmat[0][4] = 1.0f;
343
 
        rmat[1][4] = 0.0f;
344
 
        rmat[2][4] = 0.0f;
345
 
        rmat[3][4] = 0.0f;
346
 
        rmat[0][5] = 0.0f;
347
 
        rmat[1][5] = 1.0f;
348
 
        rmat[2][5] = 0.0f;
349
 
        rmat[3][5] = 0.0f;
350
 
        rmat[0][6] = 0.0f;
351
 
        rmat[1][6] = 0.0f;
352
 
        rmat[2][6] = 1.0f;
353
 
        rmat[3][6] = 0.0f;
354
 
        rmat[0][7] = 0.0f;
355
 
        rmat[1][7] = 0.0f;
356
 
        rmat[2][7] = 0.0f;
357
 
        rmat[3][7] = 1.0f;
358
 
 
359
 
        // perform reductions
360
 
        for (i = 0; i < 4; i++) {
361
 
                a = rmat[i][i];
362
 
                if (a == 0.0f)  // matrix is singular, can't be reduced
363
 
                        return 0;
364
 
                else {
365
 
                        a = 1.0f / a;
366
 
                        for (j = 0; j < 8; j++)
367
 
                                rmat[i][j] = rmat[i][j] * a;
368
 
                        for (k = 0; k < 4; k++) {
369
 
                                if ((k - i) != 0) {
370
 
                                        b = rmat[k][i];
371
 
                                        for (j = 0; j < 8; j++)
372
 
                                                rmat[k][j] = rmat[k][j] - b * rmat[i][j];
373
 
                                }
374
 
                        }
375
 
                }
376
 
        }
377
 
 
378
 
        // extract the inverted matrix
379
 
        m[0] = rmat[0][4];
380
 
        m[1] = rmat[1][4];
381
 
        m[2] = rmat[2][4];
382
 
        m[3] = rmat[3][4];
383
 
        m[4] = rmat[0][5];
384
 
        m[5] = rmat[1][5];
385
 
        m[6] = rmat[2][5];
386
 
        m[7] = rmat[3][5];
387
 
        m[8] = rmat[0][6];
388
 
        m[9] = rmat[1][6];
389
 
        m[10] = rmat[2][6];
390
 
        m[11] = rmat[3][6];
391
 
        m[12] = rmat[0][7];
392
 
        m[13] = rmat[1][7];
393
 
        m[14] = rmat[2][7];
394
 
        m[15] = rmat[3][7];
395
 
 
396
 
        return 1;
397
 
}
398
 
 
399
 
void rsMatrix::rotationInvert (const rsMatrix & mat)
400
 
{
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];
407
 
 
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;
418
 
        m[15] = 1.0f;
419
 
}
420
 
 
421
 
void rsMatrix::fromQuat (const rsQuat & q)
422
 
{
423
 
        float s, xs, ys, zs, wx, wy, wz, xx, xy, xz, yy, yz, zz;
424
 
 
425
 
        // must have an axis
426
 
        if (q[0] == 0.0f && q[1] == 0.0f && q[2] == 0.0f) {
427
 
                identity ();
428
 
                return;
429
 
        }
430
 
 
431
 
        s = 2.0f / (q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
432
 
        xs = q[0] * s;
433
 
        ys = q[1] * s;
434
 
        zs = q[2] * s;
435
 
        wx = q[3] * xs;
436
 
        wy = q[3] * ys;
437
 
        wz = q[3] * zs;
438
 
        xx = q[0] * xs;
439
 
        xy = q[0] * ys;
440
 
        xz = q[0] * zs;
441
 
        yy = q[1] * ys;
442
 
        yz = q[1] * zs;
443
 
        zz = q[2] * zs;
444
 
 
445
 
        m[0] = 1.0f - yy - zz;
446
 
        m[1] = xy + wz;
447
 
        m[2] = xz - wy;
448
 
        m[3] = 0.0f;
449
 
        m[4] = xy - wz;
450
 
        m[5] = 1.0f - xx - zz;
451
 
        m[6] = yz + wx;
452
 
        m[7] = 0.0f;
453
 
        m[8] = xz + wy;
454
 
        m[9] = yz - wx;
455
 
        m[10] = 1.0f - xx - yy;
456
 
        m[11] = 0.0f;
457
 
        m[12] = 0.0f;
458
 
        m[13] = 0.0f;
459
 
        m[14] = 0.0f;
460
 
        m[15] = 1.0f;
461
 
}
462
 
 
463
 
rsMatrix & rsMatrix::operator = (const rsMatrix & mat)
464
 
{
465
 
        m[0] = mat[0];
466
 
        m[1] = mat[1];
467
 
        m[2] = mat[2];
468
 
        m[3] = mat[3];
469
 
        m[4] = mat[4];
470
 
        m[5] = mat[5];
471
 
        m[6] = mat[6];
472
 
        m[7] = mat[7];
473
 
        m[8] = mat[8];
474
 
        m[9] = mat[9];
475
 
        m[10] = mat[10];
476
 
        m[11] = mat[11];
477
 
        m[12] = mat[12];
478
 
        m[13] = mat[13];
479
 
        m[14] = mat[14];
480
 
        m[15] = mat[15];
481
 
        return *this;
482
 
}