Undo revision 23130 which was a merge with 2.5, a messy one because I did something...
[blender.git] / source / blender / blenlib / MTC_matrixops.h
1 /*
2  * matrixops.h
3  *
4  * $Id$
5  *
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL LICENSE BLOCK *****
30  */
31
32 #ifndef MATRIXOPS_H
33 #define MATRIXOPS_H 
34
35 #ifdef __cplusplus
36 extern "C" { 
37 #endif
38
39 /* ------------------------------------------------------------------------- */
40 /* need rewriting: */
41 /**
42  * copy the left upp3 3 by 3 of m2 to m1
43  */
44 void MTC_Mat3CpyMat4(float m1[][3], float m2[][4]);
45
46 /* ------------------------------------------------------------------------- */
47 /* operations based on 4 by 4 matrices */
48
49 /**
50  * Copy m1 to m2
51  */
52 void MTC_Mat4CpyMat4(float m1[][4], float m2[][4]);
53
54 /**
55  * Multiply all matrices after the first, leave the result in the
56  * first argument
57  */
58 void MTC_Mat4MulSerie(float answ[][4],
59                                           float m1[][4], float m2[][4], float m3[][4],
60                                           float m4[][4], float m5[][4], float m6[][4],
61                                           float m7[][4], float m8[][4]);
62
63 /**
64  * m1 = m2 matprod m3
65  */
66 void MTC_Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4]);
67
68 /**
69  * Do vec^t prod mat, result in vec. Ignore vec[3] (vec is a
70  * float[3])
71  */
72 void MTC_Mat4MulVecfl(float mat[][4], float *vec);
73
74 /**
75  * Invert mat, result in inverse. Always returns 1
76  */
77 int MTC_Mat4Invert(float inverse[][4], float mat[][4]);
78
79 /**
80  * Make the set of mat orthonormal (mat should already be orthogonal)?
81  * (doesn't appear to normalize properly?)
82  */
83 void MTC_Mat4Ortho(float mat[][4]);
84
85 /**
86  * vec = mat prod vec, result in vec, ignore fourth component entirely
87  * (4th component is _not_ accessed!!! vec is 3d)
88  */
89 void MTC_Mat4Mul3Vecfl(float mat[][4], float *vec);
90
91 /**
92  * vec = mat prod vec, result in vec
93  */
94 void MTC_Mat4MulVec4fl(float mat[][4], float *vec);
95
96 /**
97  * Set <m> to the 4-D unity matrix
98  */
99 void MTC_Mat4One(float m[][4]);
100
101 /**
102  * Swap matrices m1 and m2
103  */
104 void MTC_Mat4SwapMat4(float m1[][4], float m2[][4]);
105
106 /**
107  * Copy m2 to the top-left 3x3 of m1, don't touch the remaining elements.
108  */
109 void MTC_Mat4CpyMat3nc(float m1[][4], float m2[][3]);
110
111 /**
112  * m1 = m2 * m3, but only the top-left 3x3
113  */
114 void MTC_Mat4MulMat33(float m1[][3], float m2[][4], float m3[][3]); 
115
116 /* ------------------------------------------------------------------------- */
117 /* Operations based on 3 by 3 matrices */
118 /**
119  * Do vec^t prod mat, result in vec.(vex is 3d)
120  */
121 void MTC_Mat3MulVecfl(float mat[][3], float *vec);
122
123 /**
124  * Copy m1 to m2
125  */
126 void MTC_Mat3CpyMat3(float m1[][3], float m2[][3]);
127
128 /**
129  * m1 = m2 prod m3
130  */
131 void MTC_Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3]);
132
133 /**
134  * vec = vec prod mat
135  */
136 void MTC_Mat3MulVecd(float mat[][3], double *vec);
137
138 /**
139  * Guess: invert matrix
140  * result goes to m1
141  */
142 void MTC_Mat3Inv(float m1[][3], float m2[][3]);
143
144 /**
145  * Sort of a determinant matrix? Doesn't seem very adjoint to me...
146  * result goes to m1
147  */
148 void MTC_Mat3Adj(float m1[][3], float m[][3]);
149
150 /**
151  * Set <m> to the 3D unity matrix
152  */
153 void MTC_Mat3One(float m[][3]);
154
155 /* ------------------------------------------------------------------------- */
156
157 #ifdef __cplusplus
158 }
159 #endif
160
161 #endif /* MATRIXOPS_H */
162