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