aadd08f0c90baaf5d0036c9f41430fddd2401828
[blender.git] / source / blender / blenlib / intern / math_matrix.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: some of this file.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28
29 #include "BLI_math.h"
30
31 /********************************* Init **************************************/
32
33 void zero_m3(float m[3][3])
34 {
35         memset(m, 0, 3*3*sizeof(float));
36 }
37
38 void zero_m4(float m[4][4])
39 {
40         memset(m, 0, 4*4*sizeof(float));
41 }
42
43 void unit_m3(float m[][3])
44 {
45         m[0][0]= m[1][1]= m[2][2]= 1.0;
46         m[0][1]= m[0][2]= 0.0;
47         m[1][0]= m[1][2]= 0.0;
48         m[2][0]= m[2][1]= 0.0;
49 }
50
51 void unit_m4(float m[][4])
52 {
53         m[0][0]= m[1][1]= m[2][2]= m[3][3]= 1.0;
54         m[0][1]= m[0][2]= m[0][3]= 0.0;
55         m[1][0]= m[1][2]= m[1][3]= 0.0;
56         m[2][0]= m[2][1]= m[2][3]= 0.0;
57         m[3][0]= m[3][1]= m[3][2]= 0.0;
58 }
59
60 void copy_m3_m3(float m1[][3], float m2[][3]) 
61 {       
62         /* destination comes first: */
63         memcpy(&m1[0], &m2[0], 9*sizeof(float));
64 }
65
66 void copy_m4_m4(float m1[][4], float m2[][4]) 
67 {
68         memcpy(m1, m2, 4*4*sizeof(float));
69 }
70
71 void copy_m3_m4(float m1[][3], float m2[][4])
72 {
73         m1[0][0]= m2[0][0];
74         m1[0][1]= m2[0][1];
75         m1[0][2]= m2[0][2];
76
77         m1[1][0]= m2[1][0];
78         m1[1][1]= m2[1][1];
79         m1[1][2]= m2[1][2];
80
81         m1[2][0]= m2[2][0];
82         m1[2][1]= m2[2][1];
83         m1[2][2]= m2[2][2];
84 }
85
86 void copy_m4_m3(float m1[][4], float m2[][3])   /* no clear */
87 {
88         m1[0][0]= m2[0][0];
89         m1[0][1]= m2[0][1];
90         m1[0][2]= m2[0][2];
91
92         m1[1][0]= m2[1][0];
93         m1[1][1]= m2[1][1];
94         m1[1][2]= m2[1][2];
95
96         m1[2][0]= m2[2][0];
97         m1[2][1]= m2[2][1];
98         m1[2][2]= m2[2][2];
99
100         /*      Reevan's Bugfix */
101         m1[0][3]=0.0F;
102         m1[1][3]=0.0F;
103         m1[2][3]=0.0F;
104
105         m1[3][0]=0.0F;  
106         m1[3][1]=0.0F;  
107         m1[3][2]=0.0F;  
108         m1[3][3]=1.0F;
109
110 }
111
112 void swap_m4m4(float m1[][4], float m2[][4])
113 {
114         float t;
115         int i, j;
116
117         for(i = 0; i < 4; i++) {
118                 for (j = 0; j < 4; j++) {
119                         t        = m1[i][j];
120                         m1[i][j] = m2[i][j];
121                         m2[i][j] = t;
122                 }
123         }
124 }
125
126 /******************************** Arithmetic *********************************/
127
128 void mul_m4_m4m4(float m1[][4], float m2_[][4], float m3_[][4])
129 {
130         float m2[4][4], m3[4][4];
131
132         /* copy so it works when m1 is the same pointer as m2 or m3 */
133         copy_m4_m4(m2, m2_);
134         copy_m4_m4(m3, m3_);
135
136         /* matrix product: m1[j][k] = m2[j][i].m3[i][k] */
137         m1[0][0] = m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0] + m2[0][3]*m3[3][0];
138         m1[0][1] = m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1] + m2[0][3]*m3[3][1];
139         m1[0][2] = m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2] + m2[0][3]*m3[3][2];
140         m1[0][3] = m2[0][0]*m3[0][3] + m2[0][1]*m3[1][3] + m2[0][2]*m3[2][3] + m2[0][3]*m3[3][3];
141
142         m1[1][0] = m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0] + m2[1][3]*m3[3][0];
143         m1[1][1] = m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1] + m2[1][3]*m3[3][1];
144         m1[1][2] = m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2] + m2[1][3]*m3[3][2];
145         m1[1][3] = m2[1][0]*m3[0][3] + m2[1][1]*m3[1][3] + m2[1][2]*m3[2][3] + m2[1][3]*m3[3][3];
146
147         m1[2][0] = m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0] + m2[2][3]*m3[3][0];
148         m1[2][1] = m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1] + m2[2][3]*m3[3][1];
149         m1[2][2] = m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2] + m2[2][3]*m3[3][2];
150         m1[2][3] = m2[2][0]*m3[0][3] + m2[2][1]*m3[1][3] + m2[2][2]*m3[2][3] + m2[2][3]*m3[3][3];
151
152         m1[3][0] = m2[3][0]*m3[0][0] + m2[3][1]*m3[1][0] + m2[3][2]*m3[2][0] + m2[3][3]*m3[3][0];
153         m1[3][1] = m2[3][0]*m3[0][1] + m2[3][1]*m3[1][1] + m2[3][2]*m3[2][1] + m2[3][3]*m3[3][1];
154         m1[3][2] = m2[3][0]*m3[0][2] + m2[3][1]*m3[1][2] + m2[3][2]*m3[2][2] + m2[3][3]*m3[3][2];
155         m1[3][3] = m2[3][0]*m3[0][3] + m2[3][1]*m3[1][3] + m2[3][2]*m3[2][3] + m2[3][3]*m3[3][3];
156
157 }
158
159 void mul_m3_m3m3(float m1[][3], float m3_[][3], float m2_[][3])
160 {
161         float m2[3][3], m3[3][3];
162
163         /* copy so it works when m1 is the same pointer as m2 or m3 */
164         copy_m3_m3(m2, m2_);
165         copy_m3_m3(m3, m3_);
166
167         /* m1[i][j] = m2[i][k]*m3[k][j], args are flipped!  */
168         m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0]; 
169         m1[0][1]= m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1]; 
170         m1[0][2]= m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2]; 
171
172         m1[1][0]= m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0]; 
173         m1[1][1]= m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1]; 
174         m1[1][2]= m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2]; 
175
176         m1[2][0]= m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0]; 
177         m1[2][1]= m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1]; 
178         m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2]; 
179 }
180
181 void mul_m4_m4m3(float (*m1)[4], float (*m3)[4], float (*m2)[3])
182 {
183         m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0];
184         m1[0][1]= m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1];
185         m1[0][2]= m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2];
186         m1[1][0]= m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0];
187         m1[1][1]= m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1];
188         m1[1][2]= m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2];
189         m1[2][0]= m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0];
190         m1[2][1]= m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1];
191         m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2];
192 }
193
194 /* m1 = m2 * m3, ignore the elements on the 4th row/column of m3*/
195 void mul_m3_m3m4(float m1[][3], float m2[][3], float m3[][4])
196 {
197         /* m1[i][j] = m2[i][k] * m3[k][j] */
198         m1[0][0] = m2[0][0] * m3[0][0] + m2[0][1] * m3[1][0] +m2[0][2] * m3[2][0];
199         m1[0][1] = m2[0][0] * m3[0][1] + m2[0][1] * m3[1][1] +m2[0][2] * m3[2][1];
200         m1[0][2] = m2[0][0] * m3[0][2] + m2[0][1] * m3[1][2] +m2[0][2] * m3[2][2];
201
202         m1[1][0] = m2[1][0] * m3[0][0] + m2[1][1] * m3[1][0] +m2[1][2] * m3[2][0];
203         m1[1][1] = m2[1][0] * m3[0][1] + m2[1][1] * m3[1][1] +m2[1][2] * m3[2][1];
204         m1[1][2] = m2[1][0] * m3[0][2] + m2[1][1] * m3[1][2] +m2[1][2] * m3[2][2];
205
206         m1[2][0] = m2[2][0] * m3[0][0] + m2[2][1] * m3[1][0] +m2[2][2] * m3[2][0];
207         m1[2][1] = m2[2][0] * m3[0][1] + m2[2][1] * m3[1][1] +m2[2][2] * m3[2][1];
208         m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] +m2[2][2] * m3[2][2];
209 }
210
211 void mul_m4_m3m4(float (*m1)[4], float (*m3)[3], float (*m2)[4])
212 {
213         m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0];
214         m1[0][1]= m2[0][0]*m3[0][1] + m2[0][1]*m3[1][1] + m2[0][2]*m3[2][1];
215         m1[0][2]= m2[0][0]*m3[0][2] + m2[0][1]*m3[1][2] + m2[0][2]*m3[2][2];
216         m1[1][0]= m2[1][0]*m3[0][0] + m2[1][1]*m3[1][0] + m2[1][2]*m3[2][0];
217         m1[1][1]= m2[1][0]*m3[0][1] + m2[1][1]*m3[1][1] + m2[1][2]*m3[2][1];
218         m1[1][2]= m2[1][0]*m3[0][2] + m2[1][1]*m3[1][2] + m2[1][2]*m3[2][2];
219         m1[2][0]= m2[2][0]*m3[0][0] + m2[2][1]*m3[1][0] + m2[2][2]*m3[2][0];
220         m1[2][1]= m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1];
221         m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2];
222 }
223
224 void mul_serie_m3(float answ[][3],
225                                    float m1[][3], float m2[][3], float m3[][3],
226                                    float m4[][3], float m5[][3], float m6[][3],
227                                    float m7[][3], float m8[][3])
228 {
229         float temp[3][3];
230         
231         if(m1==0 || m2==0) return;
232         
233         mul_m3_m3m3(answ, m2, m1);
234         if(m3) {
235                 mul_m3_m3m3(temp, m3, answ);
236                 if(m4) {
237                         mul_m3_m3m3(answ, m4, temp);
238                         if(m5) {
239                                 mul_m3_m3m3(temp, m5, answ);
240                                 if(m6) {
241                                         mul_m3_m3m3(answ, m6, temp);
242                                         if(m7) {
243                                                 mul_m3_m3m3(temp, m7, answ);
244                                                 if(m8) {
245                                                         mul_m3_m3m3(answ, m8, temp);
246                                                 }
247                                                 else copy_m3_m3(answ, temp);
248                                         }
249                                 }
250                                 else copy_m3_m3(answ, temp);
251                         }
252                 }
253                 else copy_m3_m3(answ, temp);
254         }
255 }
256
257 void mul_serie_m4(float answ[][4], float m1[][4],
258                                 float m2[][4], float m3[][4], float m4[][4],
259                                 float m5[][4], float m6[][4], float m7[][4],
260                                 float m8[][4])
261 {
262         float temp[4][4];
263         
264         if(m1==0 || m2==0) return;
265         
266         mul_m4_m4m4(answ, m2, m1);
267         if(m3) {
268                 mul_m4_m4m4(temp, m3, answ);
269                 if(m4) {
270                         mul_m4_m4m4(answ, m4, temp);
271                         if(m5) {
272                                 mul_m4_m4m4(temp, m5, answ);
273                                 if(m6) {
274                                         mul_m4_m4m4(answ, m6, temp);
275                                         if(m7) {
276                                                 mul_m4_m4m4(temp, m7, answ);
277                                                 if(m8) {
278                                                         mul_m4_m4m4(answ, m8, temp);
279                                                 }
280                                                 else copy_m4_m4(answ, temp);
281                                         }
282                                 }
283                                 else copy_m4_m4(answ, temp);
284                         }
285                 }
286                 else copy_m4_m4(answ, temp);
287         }
288 }
289
290 void mul_m4_v3(float mat[][4], float *vec)
291 {
292         float x,y;
293
294         x=vec[0]; 
295         y=vec[1];
296         vec[0]=x*mat[0][0] + y*mat[1][0] + mat[2][0]*vec[2] + mat[3][0];
297         vec[1]=x*mat[0][1] + y*mat[1][1] + mat[2][1]*vec[2] + mat[3][1];
298         vec[2]=x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2] + mat[3][2];
299 }
300
301 void mul_v3_m4v3(float *in, float mat[][4], float *vec)
302 {
303         float x,y;
304
305         x=vec[0]; 
306         y=vec[1];
307         in[0]= x*mat[0][0] + y*mat[1][0] + mat[2][0]*vec[2] + mat[3][0];
308         in[1]= x*mat[0][1] + y*mat[1][1] + mat[2][1]*vec[2] + mat[3][1];
309         in[2]= x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2] + mat[3][2];
310 }
311
312 /* same as mul_m4_v3() but doesnt apply translation component */
313 void mul_mat3_m4_v3(float mat[][4], float *vec)
314 {
315         float x,y;
316
317         x= vec[0]; 
318         y= vec[1];
319         vec[0]= x*mat[0][0] + y*mat[1][0] + mat[2][0]*vec[2];
320         vec[1]= x*mat[0][1] + y*mat[1][1] + mat[2][1]*vec[2];
321         vec[2]= x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2];
322 }
323
324 void mul_project_m4_v4(float mat[][4], float *vec)
325 {
326         float w;
327
328         w = vec[0]*mat[0][3] + vec[1]*mat[1][3] + vec[2]*mat[2][3] + mat[3][3];
329         mul_m4_v3(mat, vec);
330
331         vec[0] /= w;
332         vec[1] /= w;
333         vec[2] /= w;
334 }
335
336 void mul_v4_m4v4(float r[4], float mat[4][4], float v[4])
337 {
338         float x, y, z;
339
340         x= v[0]; 
341         y= v[1]; 
342         z= v[2];
343
344         r[0]= x*mat[0][0] + y*mat[1][0] + z*mat[2][0] + mat[3][0]*v[3];
345         r[1]= x*mat[0][1] + y*mat[1][1] + z*mat[2][1] + mat[3][1]*v[3];
346         r[2]= x*mat[0][2] + y*mat[1][2] + z*mat[2][2] + mat[3][2]*v[3];
347         r[3]= x*mat[0][3] + y*mat[1][3] + z*mat[2][3] + mat[3][3]*v[3];
348 }
349
350 void mul_m4_v4(float mat[4][4], float r[4])
351 {
352         mul_v4_m4v4(r, mat, r);
353 }
354
355 void mul_v3_m3v3(float r[3], float M[3][3], float a[3])
356 {
357         r[0]= M[0][0]*a[0] + M[1][0]*a[1] + M[2][0]*a[2];
358         r[1]= M[0][1]*a[0] + M[1][1]*a[1] + M[2][1]*a[2];
359         r[2]= M[0][2]*a[0] + M[1][2]*a[1] + M[2][2]*a[2];
360 }
361
362 void mul_m3_v3(float M[3][3], float r[3])
363 {
364         float tmp[3];
365
366         mul_v3_m3v3(tmp, M, r);
367         copy_v3_v3(r, tmp);
368 }
369
370 void mul_transposed_m3_v3(float mat[][3], float *vec)
371 {
372         float x,y;
373
374         x=vec[0]; 
375         y=vec[1];
376         vec[0]= x*mat[0][0] + y*mat[0][1] + mat[0][2]*vec[2];
377         vec[1]= x*mat[1][0] + y*mat[1][1] + mat[1][2]*vec[2];
378         vec[2]= x*mat[2][0] + y*mat[2][1] + mat[2][2]*vec[2];
379 }
380
381 void mul_m3_fl(float m[3][3], float f)
382 {
383         int i, j;
384
385         for(i=0;i<3;i++)
386                 for(j=0;j<3;j++)
387                         m[i][j] *= f;
388 }
389
390 void mul_m4_fl(float m[4][4], float f)
391 {
392         int i, j;
393
394         for(i=0;i<4;i++)
395                 for(j=0;j<4;j++)
396                         m[i][j] *= f;
397 }
398
399 void mul_mat3_m4_fl(float m[4][4], float f)
400 {
401         int i, j;
402
403         for(i=0; i<3; i++)
404                 for(j=0; j<3; j++)
405                         m[i][j] *= f;
406 }
407
408 void mul_m3_v3_double(float mat[][3], double *vec)
409 {
410         double x,y;
411
412         x=vec[0]; 
413         y=vec[1];
414         vec[0]= x*mat[0][0] + y*mat[1][0] + mat[2][0]*vec[2];
415         vec[1]= x*mat[0][1] + y*mat[1][1] + mat[2][1]*vec[2];
416         vec[2]= x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2];
417 }
418
419 void add_m3_m3m3(float m1[][3], float m2[][3], float m3[][3])
420 {
421         int i, j;
422
423         for(i=0;i<3;i++)
424                 for(j=0;j<3;j++)
425                         m1[i][j]= m2[i][j] + m3[i][j];
426 }
427
428 void add_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
429 {
430         int i, j;
431
432         for(i=0;i<4;i++)
433                 for(j=0;j<4;j++)
434                         m1[i][j]= m2[i][j] + m3[i][j];
435 }
436
437 int invert_m3(float m[3][3])
438 {
439         float tmp[3][3];
440         int success;
441
442         success= invert_m3_m3(tmp, m);
443         copy_m3_m3(m, tmp);
444
445         return success;
446 }
447
448 int invert_m3_m3(float m1[3][3], float m2[3][3])
449 {
450         float det;
451         int a, b, success;
452
453         /* calc adjoint */
454         adjoint_m3_m3(m1,m2);
455
456         /* then determinant old matrix! */
457         det= m2[0][0]* (m2[1][1]*m2[2][2] - m2[1][2]*m2[2][1])
458                 -m2[1][0]* (m2[0][1]*m2[2][2] - m2[0][2]*m2[2][1])
459                 +m2[2][0]* (m2[0][1]*m2[1][2] - m2[0][2]*m2[1][1]);
460
461         success= (det != 0);
462
463         if(det==0) det=1;
464         det= 1/det;
465         for(a=0;a<3;a++) {
466                 for(b=0;b<3;b++) {
467                         m1[a][b]*=det;
468                 }
469         }
470
471         return success;
472 }
473
474 int invert_m4(float m[4][4])
475 {
476         float tmp[4][4];
477         int success;
478
479         success= invert_m4_m4(tmp, m);
480         copy_m4_m4(m, tmp);
481
482         return success;
483 }
484
485 /*
486  * invertmat - 
487  *              computes the inverse of mat and puts it in inverse.  Returns 
488  *      TRUE on success (i.e. can always find a pivot) and FALSE on failure.
489  *      Uses Gaussian Elimination with partial (maximal column) pivoting.
490  *
491  *                                      Mark Segal - 1992
492  */
493
494 int invert_m4_m4(float inverse[4][4], float mat[4][4])
495 {
496         int i, j, k;
497         double temp;
498         float tempmat[4][4];
499         float max;
500         int maxj;
501
502         /* Set inverse to identity */
503         for (i=0; i<4; i++)
504                 for (j=0; j<4; j++)
505                         inverse[i][j] = 0;
506         for (i=0; i<4; i++)
507                 inverse[i][i] = 1;
508
509         /* Copy original matrix so we don't mess it up */
510         for(i = 0; i < 4; i++)
511                 for(j = 0; j <4; j++)
512                         tempmat[i][j] = mat[i][j];
513
514         for(i = 0; i < 4; i++) {
515                 /* Look for row with max pivot */
516                 max = fabs(tempmat[i][i]);
517                 maxj = i;
518                 for(j = i + 1; j < 4; j++) {
519                         if(fabs(tempmat[j][i]) > max) {
520                                 max = fabs(tempmat[j][i]);
521                                 maxj = j;
522                         }
523                 }
524                 /* Swap rows if necessary */
525                 if (maxj != i) {
526                         for(k = 0; k < 4; k++) {
527                                 SWAP(float, tempmat[i][k], tempmat[maxj][k]);
528                                 SWAP(float, inverse[i][k], inverse[maxj][k]);
529                         }
530                 }
531
532                 temp = tempmat[i][i];
533                 if (temp == 0)
534                         return 0;  /* No non-zero pivot */
535                 for(k = 0; k < 4; k++) {
536                         tempmat[i][k] = (float)(tempmat[i][k]/temp);
537                         inverse[i][k] = (float)(inverse[i][k]/temp);
538                 }
539                 for(j = 0; j < 4; j++) {
540                         if(j != i) {
541                                 temp = tempmat[j][i];
542                                 for(k = 0; k < 4; k++) {
543                                         tempmat[j][k] -= (float)(tempmat[i][k]*temp);
544                                         inverse[j][k] -= (float)(inverse[i][k]*temp);
545                                 }
546                         }
547                 }
548         }
549         return 1;
550 }
551
552 /****************************** Linear Algebra *******************************/
553
554 void transpose_m3(float mat[][3])
555 {
556         float t;
557
558         t = mat[0][1] ; 
559         mat[0][1] = mat[1][0] ; 
560         mat[1][0] = t;
561         t = mat[0][2] ; 
562         mat[0][2] = mat[2][0] ; 
563         mat[2][0] = t;
564         t = mat[1][2] ; 
565         mat[1][2] = mat[2][1] ; 
566         mat[2][1] = t;
567 }
568
569 void transpose_m4(float mat[][4])
570 {
571         float t;
572
573         t = mat[0][1] ; 
574         mat[0][1] = mat[1][0] ; 
575         mat[1][0] = t;
576         t = mat[0][2] ; 
577         mat[0][2] = mat[2][0] ; 
578         mat[2][0] = t;
579         t = mat[0][3] ; 
580         mat[0][3] = mat[3][0] ; 
581         mat[3][0] = t;
582
583         t = mat[1][2] ; 
584         mat[1][2] = mat[2][1] ; 
585         mat[2][1] = t;
586         t = mat[1][3] ; 
587         mat[1][3] = mat[3][1] ; 
588         mat[3][1] = t;
589
590         t = mat[2][3] ; 
591         mat[2][3] = mat[3][2] ; 
592         mat[3][2] = t;
593 }
594
595 void orthogonalize_m3(float mat[][3], int axis)
596 {
597         float size[3];
598         mat3_to_size(size, mat);
599         normalize_v3(mat[axis]);
600         switch(axis)
601         {
602                 case 0:
603                         if (dot_v3v3(mat[0], mat[1]) < 1) {
604                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
605                                 normalize_v3(mat[2]);
606                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
607                         } else if (dot_v3v3(mat[0], mat[2]) < 1) {
608                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
609                                 normalize_v3(mat[1]);
610                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
611                         } else {
612                                 float vec[3] = {mat[0][1], mat[0][2], mat[0][0]};
613
614                                 cross_v3_v3v3(mat[2], mat[0], vec);
615                                 normalize_v3(mat[2]);
616                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
617                         }
618                 case 1:
619                         if (dot_v3v3(mat[1], mat[0]) < 1) {
620                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
621                                 normalize_v3(mat[2]);
622                                 cross_v3_v3v3(mat[0], mat[1], mat[2]);
623                         } else if (dot_v3v3(mat[0], mat[2]) < 1) {
624                                 cross_v3_v3v3(mat[0], mat[1], mat[2]);
625                                 normalize_v3(mat[0]);
626                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
627                         } else {
628                                 float vec[3] = {mat[1][1], mat[1][2], mat[1][0]};
629
630                                 cross_v3_v3v3(mat[0], mat[1], vec);
631                                 normalize_v3(mat[0]);
632                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
633                         }
634                 case 2:
635                         if (dot_v3v3(mat[2], mat[0]) < 1) {
636                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
637                                 normalize_v3(mat[1]);
638                                 cross_v3_v3v3(mat[0], mat[1], mat[2]);
639                         } else if (dot_v3v3(mat[2], mat[1]) < 1) {
640                                 cross_v3_v3v3(mat[0], mat[1], mat[2]);
641                                 normalize_v3(mat[0]);
642                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
643                         } else {
644                                 float vec[3] = {mat[2][1], mat[2][2], mat[2][0]};
645
646                                 cross_v3_v3v3(mat[0], vec, mat[2]);
647                                 normalize_v3(mat[0]);
648                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
649                         }
650         }
651         mul_v3_fl(mat[0], size[0]);
652         mul_v3_fl(mat[1], size[1]);
653         mul_v3_fl(mat[2], size[2]);
654 }
655
656 void orthogonalize_m4(float mat[][4], int axis)
657 {
658         float size[3];
659         mat4_to_size(size, mat);
660         normalize_v3(mat[axis]);
661         switch(axis)
662         {
663                 case 0:
664                         if (dot_v3v3(mat[0], mat[1]) < 1) {
665                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
666                                 normalize_v3(mat[2]);
667                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
668                         } else if (dot_v3v3(mat[0], mat[2]) < 1) {
669                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
670                                 normalize_v3(mat[1]);
671                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
672                         } else {
673                                 float vec[3] = {mat[0][1], mat[0][2], mat[0][0]};
674
675                                 cross_v3_v3v3(mat[2], mat[0], vec);
676                                 normalize_v3(mat[2]);
677                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
678                         }
679                 case 1:
680                         normalize_v3(mat[0]);
681                         if (dot_v3v3(mat[1], mat[0]) < 1) {
682                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
683                                 normalize_v3(mat[2]);
684                                 cross_v3_v3v3(mat[0], mat[1], mat[2]);
685                         } else if (dot_v3v3(mat[0], mat[2]) < 1) {
686                                 cross_v3_v3v3(mat[0], mat[1], mat[2]);
687                                 normalize_v3(mat[0]);
688                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
689                         } else {
690                                 float vec[3] = {mat[1][1], mat[1][2], mat[1][0]};
691
692                                 cross_v3_v3v3(mat[0], mat[1], vec);
693                                 normalize_v3(mat[0]);
694                                 cross_v3_v3v3(mat[2], mat[0], mat[1]);
695                         }
696                 case 2:
697                         if (dot_v3v3(mat[2], mat[0]) < 1) {
698                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
699                                 normalize_v3(mat[1]);
700                                 cross_v3_v3v3(mat[0], mat[1], mat[2]);
701                         } else if (dot_v3v3(mat[2], mat[1]) < 1) {
702                                 cross_v3_v3v3(mat[0], mat[1], mat[2]);
703                                 normalize_v3(mat[0]);
704                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
705                         } else {
706                                 float vec[3] = {mat[2][1], mat[2][2], mat[2][0]};
707
708                                 cross_v3_v3v3(mat[0], vec, mat[2]);
709                                 normalize_v3(mat[0]);
710                                 cross_v3_v3v3(mat[1], mat[2], mat[0]);
711                         }
712         }
713         mul_v3_fl(mat[0], size[0]);
714         mul_v3_fl(mat[1], size[1]);
715         mul_v3_fl(mat[2], size[2]);
716 }
717
718 int is_orthogonal_m3(float mat[][3])
719 {
720         if (fabs(dot_v3v3(mat[0], mat[1])) > 1.5 * FLT_EPSILON)
721                 return 0;
722
723         if (fabs(dot_v3v3(mat[1], mat[2])) > 1.5 * FLT_EPSILON)
724                 return 0;
725
726         if (fabs(dot_v3v3(mat[0], mat[2])) > 1.5 * FLT_EPSILON)
727                 return 0;
728         
729         return 1;
730 }
731
732 int is_orthogonal_m4(float mat[][4])
733 {
734         if (fabs(dot_v3v3(mat[0], mat[1])) > 1.5 * FLT_EPSILON)
735                 return 0;
736
737         if (fabs(dot_v3v3(mat[1], mat[2])) > 1.5 * FLT_EPSILON)
738                 return 0;
739
740         if (fabs(dot_v3v3(mat[0], mat[2])) > 1.5 * FLT_EPSILON)
741                 return 0;
742         
743         return 1;
744 }
745
746 void normalize_m3(float mat[][3])
747 {       
748         normalize_v3(mat[0]);
749         normalize_v3(mat[1]);
750         normalize_v3(mat[2]);
751 }
752
753 void normalize_m3_m3(float rmat[][3], float mat[][3])
754 {       
755         normalize_v3_v3(rmat[0], mat[0]);
756         normalize_v3_v3(rmat[1], mat[1]);
757         normalize_v3_v3(rmat[2], mat[2]);
758 }
759
760
761 void normalize_m4(float mat[][4])
762 {
763         float len;
764         
765         len= normalize_v3(mat[0]);
766         if(len!=0.0) mat[0][3]/= len;
767         len= normalize_v3(mat[1]);
768         if(len!=0.0) mat[1][3]/= len;
769         len= normalize_v3(mat[2]);
770         if(len!=0.0) mat[2][3]/= len;
771 }
772
773 void normalize_m4_m4(float rmat[][4], float mat[][4])
774 {
775         float len;
776         
777         len= normalize_v3_v3(rmat[0], mat[0]);
778         if(len!=0.0) rmat[0][3]= mat[0][3] / len;
779         len= normalize_v3_v3(rmat[1], mat[1]);
780         if(len!=0.0) rmat[1][3]= mat[1][3] / len;
781         len= normalize_v3_v3(rmat[2], mat[2]);
782         if(len!=0.0) rmat[2][3]= mat[2][3] / len;;
783 }
784
785 void adjoint_m3_m3(float m1[][3], float m[][3])
786 {
787         m1[0][0]=m[1][1]*m[2][2]-m[1][2]*m[2][1];
788         m1[0][1]= -m[0][1]*m[2][2]+m[0][2]*m[2][1];
789         m1[0][2]=m[0][1]*m[1][2]-m[0][2]*m[1][1];
790
791         m1[1][0]= -m[1][0]*m[2][2]+m[1][2]*m[2][0];
792         m1[1][1]=m[0][0]*m[2][2]-m[0][2]*m[2][0];
793         m1[1][2]= -m[0][0]*m[1][2]+m[0][2]*m[1][0];
794
795         m1[2][0]=m[1][0]*m[2][1]-m[1][1]*m[2][0];
796         m1[2][1]= -m[0][0]*m[2][1]+m[0][1]*m[2][0];
797         m1[2][2]=m[0][0]*m[1][1]-m[0][1]*m[1][0];
798 }
799
800 void adjoint_m4_m4(float out[][4], float in[][4])       /* out = ADJ(in) */
801 {
802         float a1, a2, a3, a4, b1, b2, b3, b4;
803         float c1, c2, c3, c4, d1, d2, d3, d4;
804
805         a1= in[0][0]; 
806         b1= in[0][1];
807         c1= in[0][2]; 
808         d1= in[0][3];
809
810         a2= in[1][0]; 
811         b2= in[1][1];
812         c2= in[1][2]; 
813         d2= in[1][3];
814
815         a3= in[2][0]; 
816         b3= in[2][1];
817         c3= in[2][2]; 
818         d3= in[2][3];
819
820         a4= in[3][0]; 
821         b4= in[3][1];
822         c4= in[3][2]; 
823         d4= in[3][3];
824
825
826         out[0][0]  =   determinant_m3(b2, b3, b4, c2, c3, c4, d2, d3, d4);
827         out[1][0]  = - determinant_m3(a2, a3, a4, c2, c3, c4, d2, d3, d4);
828         out[2][0]  =   determinant_m3(a2, a3, a4, b2, b3, b4, d2, d3, d4);
829         out[3][0]  = - determinant_m3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
830
831         out[0][1]  = - determinant_m3(b1, b3, b4, c1, c3, c4, d1, d3, d4);
832         out[1][1]  =   determinant_m3(a1, a3, a4, c1, c3, c4, d1, d3, d4);
833         out[2][1]  = - determinant_m3(a1, a3, a4, b1, b3, b4, d1, d3, d4);
834         out[3][1]  =   determinant_m3(a1, a3, a4, b1, b3, b4, c1, c3, c4);
835
836         out[0][2]  =   determinant_m3(b1, b2, b4, c1, c2, c4, d1, d2, d4);
837         out[1][2]  = - determinant_m3(a1, a2, a4, c1, c2, c4, d1, d2, d4);
838         out[2][2]  =   determinant_m3(a1, a2, a4, b1, b2, b4, d1, d2, d4);
839         out[3][2]  = - determinant_m3(a1, a2, a4, b1, b2, b4, c1, c2, c4);
840
841         out[0][3]  = - determinant_m3(b1, b2, b3, c1, c2, c3, d1, d2, d3);
842         out[1][3]  =   determinant_m3(a1, a2, a3, c1, c2, c3, d1, d2, d3);
843         out[2][3]  = - determinant_m3(a1, a2, a3, b1, b2, b3, d1, d2, d3);
844         out[3][3]  =   determinant_m3(a1, a2, a3, b1, b2, b3, c1, c2, c3);
845 }
846
847 float determinant_m2(float a,float b,float c,float d)
848 {
849
850         return a*d - b*c;
851 }
852
853 float determinant_m3(float a1, float a2, float a3,
854                          float b1, float b2, float b3,
855                          float c1, float c2, float c3)
856 {
857         float ans;
858
859         ans = a1 * determinant_m2(b2, b3, c2, c3)
860                 - b1 * determinant_m2(a2, a3, c2, c3)
861                 + c1 * determinant_m2(a2, a3, b2, b3);
862
863         return ans;
864 }
865
866 float determinant_m4(float m[][4])
867 {
868         float ans;
869         float a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4,d1,d2,d3,d4;
870
871         a1= m[0][0]; 
872         b1= m[0][1];
873         c1= m[0][2]; 
874         d1= m[0][3];
875
876         a2= m[1][0]; 
877         b2= m[1][1];
878         c2= m[1][2]; 
879         d2= m[1][3];
880
881         a3= m[2][0]; 
882         b3= m[2][1];
883         c3= m[2][2]; 
884         d3= m[2][3];
885
886         a4= m[3][0]; 
887         b4= m[3][1];
888         c4= m[3][2]; 
889         d4= m[3][3];
890
891         ans = a1 * determinant_m3(b2, b3, b4, c2, c3, c4, d2, d3, d4)
892                 - b1 * determinant_m3(a2, a3, a4, c2, c3, c4, d2, d3, d4)
893                 + c1 * determinant_m3(a2, a3, a4, b2, b3, b4, d2, d3, d4)
894                 - d1 * determinant_m3(a2, a3, a4, b2, b3, b4, c2, c3, c4);
895
896         return ans;
897 }
898
899 /****************************** Transformations ******************************/
900
901 void size_to_mat3(float mat[][3], const float size[3])
902 {
903         mat[0][0]= size[0];
904         mat[0][1]= 0.0f;
905         mat[0][2]= 0.0f;
906         mat[1][1]= size[1];
907         mat[1][0]= 0.0f;
908         mat[1][2]= 0.0f;
909         mat[2][2]= size[2];
910         mat[2][1]= 0.0f;
911         mat[2][0]= 0.0f;
912 }
913
914 void size_to_mat4(float mat[][4], const float size[3])
915 {
916         float tmat[3][3];
917         
918         size_to_mat3(tmat,size);
919         unit_m4(mat);
920         copy_m4_m3(mat, tmat);
921 }
922
923 void mat3_to_size(float *size, float mat[][3])
924 {
925         size[0]= len_v3(mat[0]);
926         size[1]= len_v3(mat[1]);
927         size[2]= len_v3(mat[2]);
928 }
929
930 void mat4_to_size(float *size, float mat[][4])
931 {
932         size[0]= len_v3(mat[0]);
933         size[1]= len_v3(mat[1]);
934         size[2]= len_v3(mat[2]);
935 }
936
937 /* this gets the average scale of a matrix, only use when your scaling
938  * data that has no idea of scale axis, examples are bone-envelope-radius
939  * and curve radius */
940 float mat3_to_scale(float mat[][3])
941 {
942         /* unit length vector */
943         float unit_vec[3] = {0.577350269189626f, 0.577350269189626f, 0.577350269189626f};
944         mul_m3_v3(mat, unit_vec);
945         return len_v3(unit_vec);
946 }
947
948 float mat4_to_scale(float mat[][4])
949 {
950         float tmat[3][3];
951         copy_m3_m4(tmat, mat);
952         return mat3_to_scale(tmat);
953 }
954
955 void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], float wmat[][4])
956 {
957         float mat3[3][3];    /* wmat -> 3x3 */
958         float mat3_n[3][3];  /* wmat -> normalized, 3x3 */
959         float imat3_n[3][3]; /* wmat -> normalized & inverted, 3x3 */
960         /* location */
961         copy_v3_v3(loc, wmat[3]);
962
963         /* rotation & scale are linked, we need to create the mat's
964          * for these together since they are related. */
965         copy_m3_m4(mat3, wmat);
966         /* so scale doesnt interfear with rotation [#24291] */
967         /* note: this is a workaround for negative matrix not working for rotation conversion, FIXME */
968         normalize_m3_m3(mat3_n, mat3);
969         if(is_negative_m3(mat3)) {
970                 negate_v3(mat3_n[0]);
971                 negate_v3(mat3_n[1]);
972                 negate_v3(mat3_n[2]);
973         }
974
975         /* rotation */
976         /* keep rot as a 3x3 matrix, the caller can convert into a quat or euler */
977         copy_m3_m3(rot, mat3_n);
978
979         /* scale */
980         /* note: mat4_to_size(ob->size, mat) fails for negative scale */
981         invert_m3_m3(imat3_n, mat3_n);
982         mul_m3_m3m3(mat3, imat3_n, mat3);
983
984         size[0]= mat3[0][0];
985         size[1]= mat3[1][1];
986         size[2]= mat3[2][2];
987 }
988
989 void scale_m3_fl(float m[][3], float scale)
990 {
991         m[0][0]= m[1][1]= m[2][2]= scale;
992         m[0][1]= m[0][2]= 0.0;
993         m[1][0]= m[1][2]= 0.0;
994         m[2][0]= m[2][1]= 0.0;
995 }
996
997 void scale_m4_fl(float m[][4], float scale)
998 {
999         m[0][0]= m[1][1]= m[2][2]= scale;
1000         m[3][3]= 1.0;
1001         m[0][1]= m[0][2]= m[0][3]= 0.0;
1002         m[1][0]= m[1][2]= m[1][3]= 0.0;
1003         m[2][0]= m[2][1]= m[2][3]= 0.0;
1004         m[3][0]= m[3][1]= m[3][2]= 0.0;
1005 }
1006
1007 void translate_m4(float mat[][4],float Tx, float Ty, float Tz)
1008 {
1009         mat[3][0] += (Tx*mat[0][0] + Ty*mat[1][0] + Tz*mat[2][0]);
1010         mat[3][1] += (Tx*mat[0][1] + Ty*mat[1][1] + Tz*mat[2][1]);
1011         mat[3][2] += (Tx*mat[0][2] + Ty*mat[1][2] + Tz*mat[2][2]);
1012 }
1013
1014 void rotate_m4(float mat[][4], const char axis, const float angle)
1015 {
1016         int col;
1017         float temp[4]= {0.0f, 0.0f, 0.0f, 0.0f};
1018         float cosine, sine;
1019
1020         cosine = (float)cos(angle);
1021         sine = (float)sin(angle);
1022         switch(axis){
1023         case 'X':    
1024                 for(col=0 ; col<4 ; col++)
1025                         temp[col] = cosine*mat[1][col] + sine*mat[2][col];
1026                 for(col=0 ; col<4 ; col++) {
1027                 mat[2][col] = - sine*mat[1][col] + cosine*mat[2][col];
1028                         mat[1][col] = temp[col];
1029         }
1030                 break;
1031
1032         case 'Y':
1033                 for(col=0 ; col<4 ; col++)
1034                         temp[col] = cosine*mat[0][col] - sine*mat[2][col];
1035                 for(col=0 ; col<4 ; col++) {
1036                         mat[2][col] = sine*mat[0][col] + cosine*mat[2][col];
1037                         mat[0][col] = temp[col];
1038                 }
1039         break;
1040
1041         case 'Z':
1042                 for(col=0 ; col<4 ; col++)
1043                         temp[col] = cosine*mat[0][col] + sine*mat[1][col];
1044                 for(col=0 ; col<4 ; col++) {
1045                         mat[1][col] = - sine*mat[0][col] + cosine*mat[1][col];
1046                         mat[0][col] = temp[col];
1047                 }
1048         break;
1049         }
1050 }
1051
1052 void blend_m3_m3m3(float out[][3], float dst[][3], float src[][3], float srcweight)
1053 {
1054         float squat[4], dquat[4], fquat[4];
1055         float ssize[3], dsize[3], fsize[3];
1056         float rmat[3][3], smat[3][3];
1057         
1058         mat3_to_quat(dquat,dst);
1059         mat3_to_size(dsize,dst);
1060
1061         mat3_to_quat(squat,src);
1062         mat3_to_size(ssize,src);
1063         
1064         /* do blending */
1065         interp_qt_qtqt(fquat, dquat, squat, srcweight);
1066         interp_v3_v3v3(fsize, dsize, ssize, srcweight);
1067
1068         /* compose new matrix */
1069         quat_to_mat3(rmat,fquat);
1070         size_to_mat3(smat,fsize);
1071         mul_m3_m3m3(out, rmat, smat);
1072 }
1073
1074 void blend_m4_m4m4(float out[][4], float dst[][4], float src[][4], float srcweight)
1075 {
1076         float squat[4], dquat[4], fquat[4];
1077         float ssize[3], dsize[3], fsize[3];
1078         float sloc[3], dloc[3], floc[3];
1079         
1080         mat4_to_quat(dquat,dst);
1081         mat4_to_size(dsize,dst);
1082         copy_v3_v3(dloc, dst[3]);
1083
1084         mat4_to_quat(squat,src);
1085         mat4_to_size(ssize,src);
1086         copy_v3_v3(sloc, src[3]);
1087         
1088         /* do blending */
1089         interp_v3_v3v3(floc, dloc, sloc, srcweight);
1090         interp_qt_qtqt(fquat, dquat, squat, srcweight);
1091         interp_v3_v3v3(fsize, dsize, ssize, srcweight);
1092
1093         /* compose new matrix */
1094         loc_quat_size_to_mat4(out, floc, fquat, fsize);
1095 }
1096
1097
1098 int is_negative_m3(float mat[][3])
1099 {
1100         float vec[3];
1101         cross_v3_v3v3(vec, mat[0], mat[1]);
1102         return (dot_v3v3(vec, mat[2]) < 0.0f);
1103 }
1104
1105 int is_negative_m4(float mat[][4])
1106 {
1107         float vec[3];
1108         cross_v3_v3v3(vec, mat[0], mat[1]);
1109         return (dot_v3v3(vec, mat[2]) < 0.0f);
1110 }
1111
1112 /* make a 4x4 matrix out of 3 transform components */
1113 /* matrices are made in the order: scale * rot * loc */
1114 // TODO: need to have a version that allows for rotation order...
1115 void loc_eul_size_to_mat4(float mat[4][4], const float loc[3], const float eul[3], const float size[3])
1116 {
1117         float rmat[3][3], smat[3][3], tmat[3][3];
1118         
1119         /* initialise new matrix */
1120         unit_m4(mat);
1121         
1122         /* make rotation + scaling part */
1123         eul_to_mat3(rmat,eul);
1124         size_to_mat3(smat,size);
1125         mul_m3_m3m3(tmat, rmat, smat);
1126         
1127         /* copy rot/scale part to output matrix*/
1128         copy_m4_m3(mat, tmat);
1129         
1130         /* copy location to matrix */
1131         mat[3][0] = loc[0];
1132         mat[3][1] = loc[1];
1133         mat[3][2] = loc[2];
1134 }
1135
1136 /* make a 4x4 matrix out of 3 transform components */
1137 /* matrices are made in the order: scale * rot * loc */
1138 void loc_eulO_size_to_mat4(float mat[4][4], const float loc[3], const float eul[3], const float size[3], const short rotOrder)
1139 {
1140         float rmat[3][3], smat[3][3], tmat[3][3];
1141         
1142         /* initialise new matrix */
1143         unit_m4(mat);
1144         
1145         /* make rotation + scaling part */
1146         eulO_to_mat3(rmat,eul, rotOrder);
1147         size_to_mat3(smat,size);
1148         mul_m3_m3m3(tmat, rmat, smat);
1149         
1150         /* copy rot/scale part to output matrix*/
1151         copy_m4_m3(mat, tmat);
1152         
1153         /* copy location to matrix */
1154         mat[3][0] = loc[0];
1155         mat[3][1] = loc[1];
1156         mat[3][2] = loc[2];
1157 }
1158
1159
1160 /* make a 4x4 matrix out of 3 transform components */
1161 /* matrices are made in the order: scale * rot * loc */
1162 void loc_quat_size_to_mat4(float mat[4][4], const float loc[3], const float quat[4], const float size[3])
1163 {
1164         float rmat[3][3], smat[3][3], tmat[3][3];
1165         
1166         /* initialise new matrix */
1167         unit_m4(mat);
1168         
1169         /* make rotation + scaling part */
1170         quat_to_mat3(rmat,quat);
1171         size_to_mat3(smat,size);
1172         mul_m3_m3m3(tmat, rmat, smat);
1173         
1174         /* copy rot/scale part to output matrix*/
1175         copy_m4_m3(mat, tmat);
1176         
1177         /* copy location to matrix */
1178         mat[3][0] = loc[0];
1179         mat[3][1] = loc[1];
1180         mat[3][2] = loc[2];
1181 }
1182
1183 void loc_axisangle_size_to_mat4(float mat[4][4], const float loc[3], const float axis[3], const float angle, const float size[3])
1184 {
1185         float q[4];
1186         axis_angle_to_quat(q, axis, angle);
1187         loc_quat_size_to_mat4(mat, loc, q, size);
1188 }
1189
1190 /*********************************** Other ***********************************/
1191
1192 void print_m3(char *str, float m[][3])
1193 {
1194         printf("%s\n", str);
1195         printf("%f %f %f\n",m[0][0],m[1][0],m[2][0]);
1196         printf("%f %f %f\n",m[0][1],m[1][1],m[2][1]);
1197         printf("%f %f %f\n",m[0][2],m[1][2],m[2][2]);
1198         printf("\n");
1199 }
1200
1201 void print_m4(char *str, float m[][4])
1202 {
1203         printf("%s\n", str);
1204         printf("%f %f %f %f\n",m[0][0],m[1][0],m[2][0],m[3][0]);
1205         printf("%f %f %f %f\n",m[0][1],m[1][1],m[2][1],m[3][1]);
1206         printf("%f %f %f %f\n",m[0][2],m[1][2],m[2][2],m[3][2]);
1207         printf("%f %f %f %f\n",m[0][3],m[1][3],m[2][3],m[3][3]);
1208         printf("\n");
1209 }
1210
1211 /*********************************** SVD ************************************
1212  * from TNT matrix library
1213
1214  * Compute the Single Value Decomposition of an arbitrary matrix A
1215  * That is compute the 3 matrices U,W,V with U column orthogonal (m,n) 
1216  * ,W a diagonal matrix and V an orthogonal square matrix s.t. 
1217  * A = U.W.Vt. From this decomposition it is trivial to compute the 
1218  * (pseudo-inverse) of A as Ainv = V.Winv.tranpose(U).
1219  */
1220
1221 void svd_m4(float U[4][4], float s[4], float V[4][4], float A_[4][4])
1222 {
1223         float A[4][4];
1224         float work1[4], work2[4];
1225         int m = 4;
1226         int n = 4;
1227         int maxiter = 200;
1228         int nu = minf(m,n);
1229
1230         float *work = work1;
1231         float *e = work2;
1232         float eps;
1233
1234         int i=0, j=0, k=0, p, pp, iter;
1235
1236         // Reduce A to bidiagonal form, storing the diagonal elements
1237         // in s and the super-diagonal elements in e.
1238
1239         int nct = minf(m-1,n);
1240         int nrt = maxf(0,minf(n-2,m));
1241
1242         copy_m4_m4(A, A_);
1243         zero_m4(U);
1244         zero_v4(s);
1245
1246         for (k = 0; k < maxf(nct,nrt); k++) {
1247                 if (k < nct) {
1248
1249                         // Compute the transformation for the k-th column and
1250                         // place the k-th diagonal in s[k].
1251                         // Compute 2-norm of k-th column without under/overflow.
1252                         s[k] = 0;
1253                         for (i = k; i < m; i++) {
1254                                 s[k] = hypotf(s[k],A[i][k]);
1255                         }
1256                         if (s[k] != 0.0f) {
1257                                 float invsk;
1258                                 if (A[k][k] < 0.0f) {
1259                                         s[k] = -s[k];
1260                                 }
1261                                 invsk = 1.0f/s[k];
1262                                 for (i = k; i < m; i++) {
1263                                         A[i][k] *= invsk;
1264                                 }
1265                                 A[k][k] += 1.0f;
1266                         }
1267                         s[k] = -s[k];
1268                 }
1269                 for (j = k+1; j < n; j++) {
1270                         if ((k < nct) && (s[k] != 0.0f))  {
1271
1272                         // Apply the transformation.
1273
1274                                 float t = 0;
1275                                 for (i = k; i < m; i++) {
1276                                         t += A[i][k]*A[i][j];
1277                                 }
1278                                 t = -t/A[k][k];
1279                                 for (i = k; i < m; i++) {
1280                                         A[i][j] += t*A[i][k];
1281                                 }
1282                         }
1283
1284                         // Place the k-th row of A into e for the
1285                         // subsequent calculation of the row transformation.
1286
1287                         e[j] = A[k][j];
1288                 }
1289                 if (k < nct) {
1290
1291                         // Place the transformation in U for subsequent back
1292                         // multiplication.
1293
1294                         for (i = k; i < m; i++)
1295                                 U[i][k] = A[i][k];
1296                 }
1297                 if (k < nrt) {
1298
1299                         // Compute the k-th row transformation and place the
1300                         // k-th super-diagonal in e[k].
1301                         // Compute 2-norm without under/overflow.
1302                         e[k] = 0;
1303                         for (i = k+1; i < n; i++) {
1304                                 e[k] = hypotf(e[k],e[i]);
1305                         }
1306                         if (e[k] != 0.0f) {
1307                                 float invek;
1308                                 if (e[k+1] < 0.0f) {
1309                                         e[k] = -e[k];
1310                                 }
1311                                 invek = 1.0f/e[k];
1312                                 for (i = k+1; i < n; i++) {
1313                                         e[i] *= invek;
1314                                 }
1315                                 e[k+1] += 1.0f;
1316                         }
1317                         e[k] = -e[k];
1318                         if ((k+1 < m) & (e[k] != 0.0f)) {
1319                                 float invek1;
1320
1321                         // Apply the transformation.
1322
1323                                 for (i = k+1; i < m; i++) {
1324                                         work[i] = 0.0f;
1325                                 }
1326                                 for (j = k+1; j < n; j++) {
1327                                         for (i = k+1; i < m; i++) {
1328                                                 work[i] += e[j]*A[i][j];
1329                                         }
1330                                 }
1331                                 invek1 = 1.0f/e[k+1];
1332                                 for (j = k+1; j < n; j++) {
1333                                         float t = -e[j]*invek1;
1334                                         for (i = k+1; i < m; i++) {
1335                                                 A[i][j] += t*work[i];
1336                                         }
1337                                 }
1338                         }
1339
1340                         // Place the transformation in V for subsequent
1341                         // back multiplication.
1342
1343                         for (i = k+1; i < n; i++)
1344                                 V[i][k] = e[i];
1345                 }
1346         }
1347
1348         // Set up the final bidiagonal matrix or order p.
1349
1350         p = minf(n,m+1);
1351         if (nct < n) {
1352                 s[nct] = A[nct][nct];
1353         }
1354         if (m < p) {
1355                 s[p-1] = 0.0f;
1356         }
1357         if (nrt+1 < p) {
1358                 e[nrt] = A[nrt][p-1];
1359         }
1360         e[p-1] = 0.0f;
1361
1362         // If required, generate U.
1363
1364         for (j = nct; j < nu; j++) {
1365                 for (i = 0; i < m; i++) {
1366                         U[i][j] = 0.0f;
1367                 }
1368                 U[j][j] = 1.0f;
1369         }
1370         for (k = nct-1; k >= 0; k--) {
1371                 if (s[k] != 0.0f) {
1372                         for (j = k+1; j < nu; j++) {
1373                                 float t = 0;
1374                                 for (i = k; i < m; i++) {
1375                                         t += U[i][k]*U[i][j];
1376                                 }
1377                                 t = -t/U[k][k];
1378                                 for (i = k; i < m; i++) {
1379                                         U[i][j] += t*U[i][k];
1380                                 }
1381                         }
1382                         for (i = k; i < m; i++ ) {
1383                                 U[i][k] = -U[i][k];
1384                         }
1385                         U[k][k] = 1.0f + U[k][k];
1386                         for (i = 0; i < k-1; i++) {
1387                                 U[i][k] = 0.0f;
1388                         }
1389                 } else {
1390                         for (i = 0; i < m; i++) {
1391                                 U[i][k] = 0.0f;
1392                         }
1393                         U[k][k] = 1.0f;
1394                 }
1395         }
1396
1397         // If required, generate V.
1398
1399         for (k = n-1; k >= 0; k--) {
1400                 if ((k < nrt) & (e[k] != 0.0f)) {
1401                         for (j = k+1; j < nu; j++) {
1402                                 float t = 0;
1403                                 for (i = k+1; i < n; i++) {
1404                                         t += V[i][k]*V[i][j];
1405                                 }
1406                                 t = -t/V[k+1][k];
1407                                 for (i = k+1; i < n; i++) {
1408                                         V[i][j] += t*V[i][k];
1409                                 }
1410                         }
1411                 }
1412                 for (i = 0; i < n; i++) {
1413                         V[i][k] = 0.0f;
1414                 }
1415                 V[k][k] = 1.0f;
1416         }
1417
1418         // Main iteration loop for the singular values.
1419
1420         pp = p-1;
1421         iter = 0;
1422         eps = powf(2.0f,-52.0f);
1423         while (p > 0) {
1424                 int kase=0;
1425                 k=0;
1426
1427                 // Test for maximum iterations to avoid infinite loop
1428                 if(maxiter == 0)
1429                         break;
1430                 maxiter--;
1431
1432                 // This section of the program inspects for
1433                 // negligible elements in the s and e arrays.  On
1434                 // completion the variables kase and k are set as follows.
1435
1436                 // kase = 1       if s(p) and e[k-1] are negligible and k<p
1437                 // kase = 2       if s(k) is negligible and k<p
1438                 // kase = 3       if e[k-1] is negligible, k<p, and
1439                 //                                s(k), ..., s(p) are not negligible (qr step).
1440                 // kase = 4       if e(p-1) is negligible (convergence).
1441
1442                 for (k = p-2; k >= -1; k--) {
1443                         if (k == -1) {
1444                                 break;
1445                         }
1446                         if (fabsf(e[k]) <= eps*(fabsf(s[k]) + fabsf(s[k+1]))) {
1447                                 e[k] = 0.0f;
1448                                 break;
1449                         }
1450                 }
1451                 if (k == p-2) {
1452                         kase = 4;
1453                 } else {
1454                         int ks;
1455                         for (ks = p-1; ks >= k; ks--) {
1456                                 float t;
1457                                 if (ks == k) {
1458                                         break;
1459                                 }
1460                                 t = (ks != p ? fabsf(e[ks]) : 0.f) + 
1461                                                           (ks != k+1 ? fabsf(e[ks-1]) : 0.0f);
1462                                 if (fabsf(s[ks]) <= eps*t)  {
1463                                         s[ks] = 0.0f;
1464                                         break;
1465                                 }
1466                         }
1467                         if (ks == k) {
1468                                 kase = 3;
1469                         } else if (ks == p-1) {
1470                                 kase = 1;
1471                         } else {
1472                                 kase = 2;
1473                                 k = ks;
1474                         }
1475                 }
1476                 k++;
1477
1478                 // Perform the task indicated by kase.
1479
1480                 switch (kase) {
1481
1482                         // Deflate negligible s(p).
1483
1484                         case 1: {
1485                                 float f = e[p-2];
1486                                 e[p-2] = 0.0f;
1487                                 for (j = p-2; j >= k; j--) {
1488                                         float t = hypotf(s[j],f);
1489                                         float invt = 1.0f/t;
1490                                         float cs = s[j]*invt;
1491                                         float sn = f*invt;
1492                                         s[j] = t;
1493                                         if (j != k) {
1494                                                 f = -sn*e[j-1];
1495                                                 e[j-1] = cs*e[j-1];
1496                                         }
1497
1498                                         for (i = 0; i < n; i++) {
1499                                                 t = cs*V[i][j] + sn*V[i][p-1];
1500                                                 V[i][p-1] = -sn*V[i][j] + cs*V[i][p-1];
1501                                                 V[i][j] = t;
1502                                         }
1503                                 }
1504                         }
1505                         break;
1506
1507                         // Split at negligible s(k).
1508
1509                         case 2: {
1510                                 float f = e[k-1];
1511                                 e[k-1] = 0.0f;
1512                                 for (j = k; j < p; j++) {
1513                                         float t = hypotf(s[j],f);
1514                                         float invt = 1.0f/t;
1515                                         float cs = s[j]*invt;
1516                                         float sn = f*invt;
1517                                         s[j] = t;
1518                                         f = -sn*e[j];
1519                                         e[j] = cs*e[j];
1520
1521                                         for (i = 0; i < m; i++) {
1522                                                 t = cs*U[i][j] + sn*U[i][k-1];
1523                                                 U[i][k-1] = -sn*U[i][j] + cs*U[i][k-1];
1524                                                 U[i][j] = t;
1525                                         }
1526                                 }
1527                         }
1528                         break;
1529
1530                         // Perform one qr step.
1531
1532                         case 3: {
1533
1534                                 // Calculate the shift.
1535
1536                                 float scale = maxf(maxf(maxf(maxf(
1537                                                   fabsf(s[p-1]),fabsf(s[p-2])),fabsf(e[p-2])), 
1538                                                   fabsf(s[k])),fabsf(e[k]));
1539                                 float invscale = 1.0f/scale;
1540                                 float sp = s[p-1]*invscale;
1541                                 float spm1 = s[p-2]*invscale;
1542                                 float epm1 = e[p-2]*invscale;
1543                                 float sk = s[k]*invscale;
1544                                 float ek = e[k]*invscale;
1545                                 float b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)*0.5f;
1546                                 float c = (sp*epm1)*(sp*epm1);
1547                                 float shift = 0.0f;
1548                                 float f, g;
1549                                 if ((b != 0.0f) || (c != 0.0f)) {
1550                                         shift = sqrtf(b*b + c);
1551                                         if (b < 0.0f) {
1552                                                 shift = -shift;
1553                                         }
1554                                         shift = c/(b + shift);
1555                                 }
1556                                 f = (sk + sp)*(sk - sp) + shift;
1557                                 g = sk*ek;
1558
1559                                 // Chase zeros.
1560
1561                                 for (j = k; j < p-1; j++) {
1562                                         float t = hypotf(f,g);
1563                                         /* division by zero checks added to avoid NaN (brecht) */
1564                                         float cs = (t == 0.0f)? 0.0f: f/t;
1565                                         float sn = (t == 0.0f)? 0.0f: g/t;
1566                                         if (j != k) {
1567                                                 e[j-1] = t;
1568                                         }
1569                                         f = cs*s[j] + sn*e[j];
1570                                         e[j] = cs*e[j] - sn*s[j];
1571                                         g = sn*s[j+1];
1572                                         s[j+1] = cs*s[j+1];
1573
1574                                         for (i = 0; i < n; i++) {
1575                                                 t = cs*V[i][j] + sn*V[i][j+1];
1576                                                 V[i][j+1] = -sn*V[i][j] + cs*V[i][j+1];
1577                                                 V[i][j] = t;
1578                                         }
1579
1580                                         t = hypotf(f,g);
1581                                         /* division by zero checks added to avoid NaN (brecht) */
1582                                         cs = (t == 0.0f)? 0.0f: f/t;
1583                                         sn = (t == 0.0f)? 0.0f: g/t;
1584                                         s[j] = t;
1585                                         f = cs*e[j] + sn*s[j+1];
1586                                         s[j+1] = -sn*e[j] + cs*s[j+1];
1587                                         g = sn*e[j+1];
1588                                         e[j+1] = cs*e[j+1];
1589                                         if (j < m-1) {
1590                                                 for (i = 0; i < m; i++) {
1591                                                         t = cs*U[i][j] + sn*U[i][j+1];
1592                                                         U[i][j+1] = -sn*U[i][j] + cs*U[i][j+1];
1593                                                         U[i][j] = t;
1594                                                 }
1595                                         }
1596                                 }
1597                                 e[p-2] = f;
1598                                 iter = iter + 1;
1599                         }
1600                         break;
1601
1602                         // Convergence.
1603
1604                         case 4: {
1605
1606                                 // Make the singular values positive.
1607
1608                                 if (s[k] <= 0.0f) {
1609                                         s[k] = (s[k] < 0.0f ? -s[k] : 0.0f);
1610
1611                                         for (i = 0; i <= pp; i++)
1612                                                 V[i][k] = -V[i][k];
1613                                 }
1614
1615                                 // Order the singular values.
1616
1617                                 while (k < pp) {
1618                                         float t;
1619                                         if (s[k] >= s[k+1]) {
1620                                                 break;
1621                                         }
1622                                         t = s[k];
1623                                         s[k] = s[k+1];
1624                                         s[k+1] = t;
1625                                         if (k < n-1) {
1626                                                 for (i = 0; i < n; i++) {
1627                                                         t = V[i][k+1]; V[i][k+1] = V[i][k]; V[i][k] = t;
1628                                                 }
1629                                         }
1630                                         if (k < m-1) {
1631                                                 for (i = 0; i < m; i++) {
1632                                                         t = U[i][k+1]; U[i][k+1] = U[i][k]; U[i][k] = t;
1633                                                 }
1634                                         }
1635                                         k++;
1636                                 }
1637                                 iter = 0;
1638                                 p--;
1639                         }
1640                         break;
1641                 }
1642         }
1643 }
1644
1645 void pseudoinverse_m4_m4(float Ainv[4][4], float A[4][4], float epsilon)
1646 {
1647         /* compute moon-penrose pseudo inverse of matrix, singular values
1648            below epsilon are ignored for stability (truncated SVD) */
1649         float V[4][4], W[4], Wm[4][4], U[4][4];
1650         int i;
1651
1652         transpose_m4(A);
1653         svd_m4(V, W, U, A);
1654         transpose_m4(U);
1655         transpose_m4(V);
1656
1657         zero_m4(Wm);
1658         for(i=0; i<4; i++)
1659                 Wm[i][i]= (W[i] < epsilon)? 0.0f: 1.0f/W[i];
1660
1661         transpose_m4(V);
1662
1663         mul_serie_m4(Ainv, U, Wm, V, 0, 0, 0, 0, 0);
1664 }