svn merge -r 12653:12664 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / blender / blenlib / BLI_arithb.h
1 #undef TEST_ACTIVE
2 //#define ACTIVE 1
3 /**
4  * blenlib/BLI_arithb.h    mar 2001 Nzc
5  *
6  * $Id$ 
7  *
8  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version. The Blender
14  * Foundation also sells licenses for use in proprietary software under
15  * the Blender License.  See http://www.blender.org/BL/ for information
16  * about this.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
26  *
27  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
28  * All rights reserved.
29  *
30  * The Original Code is: all of this file.
31  *
32  * Contributor(s): none yet.
33  *
34  * ***** END GPL/BL DUAL LICENSE BLOCK *****
35  * */
36
37 #ifndef BLI_ARITHB_H
38 #define BLI_ARITHB_H
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 #ifndef M_PI
45 #define M_PI            3.14159265358979323846
46 #endif
47 #ifndef M_PI_2
48 #define M_PI_2          1.57079632679489661923
49 #endif
50 #ifndef M_SQRT2
51 #define M_SQRT2         1.41421356237309504880
52 #endif
53 #ifndef M_SQRT1_2
54 #define M_SQRT1_2       0.70710678118654752440
55 #endif
56
57 #define MAT4_UNITY {{ 1.0, 0.0, 0.0, 0.0},\
58                                         { 0.0, 1.0, 0.0, 0.0},\
59                                         { 0.0, 0.0, 1.0, 0.0},\
60                                         { 0.0, 0.0, 0.0, 1.0}}
61
62 #define MAT3_UNITY {{ 1.0, 0.0, 0.0},\
63                                         { 0.0, 1.0, 0.0},\
64                                         { 0.0, 0.0, 1.0}}
65
66
67 void CalcCent3f(float *cent,  float *v1, float *v2, float *v3);
68 void CalcCent4f(float *cent, float *v1, float *v2, float *v3, float *v4);
69
70 void Crossf(float *c, float *a, float *b);
71 void Projf(float *c, float *v1, float *v2);
72
73 float Inpf(float *v1, float *v2);
74 float Inp2f(float *v1, float *v2);
75
76 float Normalize(float *n);
77 float Normalize2(float *n);
78
79 float Sqrt3f(float f);
80 double Sqrt3d(double d);
81
82 float saacos(float fac);
83 float saasin(float fac);
84 float sasqrt(float fac);
85
86 int FloatCompare(float *v1, float *v2, float limit);
87 float FloatLerpf(float target, float origin, float fac);
88
89 float CalcNormFloat(float *v1, float *v2, float *v3, float *n);
90 float CalcNormFloat4(float *v1, float *v2, float *v3, float *v4, float *n);
91
92 void CalcNormLong(int *v1, int *v2, int *v3, float *n);
93 /* CalcNormShort: is ook uitprodukt - (translates as 'is also out/cross product') */
94 void CalcNormShort(short *v1, short *v2, short *v3, float *n);
95
96
97 /**
98  * @section Euler conversion routines
99  */
100
101 void EulToMat3(float *eul, float mat[][3]);
102 void EulToMat4(float *eul, float mat[][4]);
103
104 void Mat3ToEul(float tmat[][3], float *eul);
105 void Mat4ToEul(float tmat[][4],float *eul);
106
107 void EulToQuat(float *eul, float *quat);
108
109 void compatible_eul(float *eul, float *oldrot);
110
111 void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot);
112
113
114 /**
115  * @section Quaternion arithmetic routines
116  */
117
118 void QuatToEul(float *quat, float *eul);
119 void QuatOne(float *);
120 void QuatMul(float *, float *, float *);
121 void QuatMulVecf(float *q, float *v);
122 void QuatMulf(float *q, float f);
123 void QuatMulFac(float *q, float fac);
124
125 void NormalQuat(float *);
126 void VecRotToQuat(float *vec, float phi, float *quat);
127
128 void QuatSub(float *q, float *q1, float *q2);
129 void QuatConj(float *q);
130 void QuatInv(float *q);
131 float QuatDot(float *q1, float *q2);
132 void QuatCopy(float *q1, float *q2);
133
134 void printquat(char *str, float q[4]);
135
136 void QuatInterpol(float *result, float *quat1, float *quat2, float t);
137 void QuatAdd(float *result, float *quat1, float *quat2, float t);
138
139
140 /**
141  * @section matrix multiplication and copying routines
142  */
143
144 void Mat3MulFloat(float *m, float f);
145 void Mat4MulFloat(float *m, float f);
146 void Mat4MulFloat3(float *m, float f);
147
148 void Mat3Transp(float mat[][3]);
149 void Mat4Transp(float mat[][4]);
150
151 int Mat4Invert(float inverse[][4], float mat[][4]);
152 void Mat4InvertSimp(float inverse[][4], float mat[][4]);
153 void Mat4Inv(float *m1, float *m2);
154 void Mat4InvGG(float out[][4], float in[][4]);
155 void Mat3Inv(float m1[][3], float m2[][3]);
156
157 void Mat3CpyMat4(float m1[][3],float m2[][4]);
158 void Mat4CpyMat3(float m1[][4], float m2[][3]); 
159
160 void Mat4BlendMat4(float out[][4], float dst[][4], float src[][4], float srcweight);
161
162 float Det2x2(float a,float b,float c, float d);
163
164 float Det3x3(
165         float a1, float a2, float a3,
166         float b1, float b2, float b3,
167         float c1, float c2, float c3 
168 );
169
170 float Det4x4(float m[][4]);
171
172 void Mat3Adj(float m1[][3], float m[][3]);
173 void Mat4Adj(float out[][4], float in[][4]);
174
175 void Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4]);
176 void subMat4MulMat4(float *m1, float *m2, float *m3);
177 #ifndef TEST_ACTIVE
178 void Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3]);
179 #else
180 void Mat3MulMat3(float *m1, float *m3, float *m2);
181 #endif
182 void Mat4MulMat34(float (*m1)[4], float (*m3)[3], float (*m2)[4]);
183 void Mat4CpyMat4(float m1[][4], float m2[][4]);
184 void Mat4SwapMat4(float *m1, float *m2);
185 void Mat3CpyMat3(float m1[][3], float m2[][3]);
186
187 void Mat3MulSerie(float answ[][3],
188         float m1[][3], float m2[][3], float m3[][3],
189         float m4[][3], float m5[][3], float m6[][3],
190         float m7[][3], float m8[][3]
191 );
192
193 void Mat4MulSerie(float answ[][4], float m1[][4],
194         float m2[][4], float m3[][4], float m4[][4],
195         float m5[][4], float m6[][4], float m7[][4],
196         float m8[][4]
197 );
198         
199 void Mat4Clr(float *m);
200 void Mat3Clr(float *m);
201         
202 void Mat3One(float m[][3]);
203 void Mat4One(float m[][4]);
204
205 void Mat3Ortho(float mat[][3]);
206 void Mat4Ortho(float mat[][4]);
207
208 void VecMat4MulVecfl(float *in, float mat[][4], float *vec);
209 void Mat4MulMat43(float (*m1)[4], float (*m3)[4], float (*m2)[3]);
210 void Mat3IsMat3MulMat4(float m1[][3], float m2[][3], float m3[][4]);
211
212 void Mat4MulVec(float mat[][4],int *vec);
213 void Mat4MulVecfl(float mat[][4], float *vec);
214 void Mat4Mul3Vecfl(float mat[][4], float *vec);
215 void Mat4MulVec3Project(float mat[][4],float *vec);
216 void Mat4MulVec4fl(float mat[][4], float *vec);
217 void Mat3MulVec(float mat[][3],int *vec);
218 void Mat3MulVecfl(float mat[][3], float *vec);
219 void Mat3MulVecd(float mat[][3], double *vec);
220 void Mat3TransMulVecfl(float mat[][3], float *vec);
221
222 void Mat3AddMat3(float m1[][3], float m2[][3], float m3[][3]);
223 void Mat4AddMat4(float m1[][4], float m2[][4], float m3[][4]);
224
225 void VecUpMat3old(float *vec, float mat[][3], short axis);
226 void VecUpMat3(float *vec, float mat[][3], short axis);
227 void VecRotToMat3(float *vec, float phi, float mat[][3]);
228 void VecRotToMat4(float *vec, float phi, float mat[][4]);
229
230 void VecCopyf(float *v1, float *v2);
231 int VecLen(int *v1, int *v2);
232 float VecLenf(float *v1, float *v2);
233 float VecLength(float *v);
234 void VecMulf(float *v1, float f);
235
236 int VecLenCompare(float *v1, float *v2, float limit);
237 int VecCompare(float *v1, float *v2, float limit);
238 int VecEqual(float *v1, float *v2);
239
240 void printvecf(char *str,float v[3]);
241 void printvec4f(char *str, float v[4]);
242
243 void VecAddf(float *v, float *v1, float *v2);
244 void VecSubf(float *v, float *v1, float *v2);
245 void VecLerpf(float *target, float *a, float *b, float t);
246 void VecMidf(float *v, float *v1, float *v2);
247
248 void VecOrthoBasisf(float *v, float *v1, float *v2);
249
250 float Vec2Lenf(float *v1, float *v2);
251 void Vec2Mulf(float *v1, float f);
252 void Vec2Addf(float *v, float *v1, float *v2);
253 void Vec2Subf(float *v, float *v1, float *v2);
254 void Vec2Copyf(float *v1, float *v2);
255
256 float *vectoquat(float *vec, short axis, short upflag);
257
258 float VecAngle2(float *v1, float *v2);
259 float VecAngle3(float *v1, float *v2, float *v3);
260 float NormalizedVecAngle2(float *v1, float *v2);
261
262 void euler_rot(float *beul, float ang, char axis);
263         
264
265 float DistVL2Dfl(float *v1, float *v2, float *v3);
266 float PdistVL2Dfl(float *v1, float *v2, float *v3);
267 float PdistVL3Dfl(float *v1, float *v2, float *v3);
268 void PclosestVL3Dfl(float *closest, float *v1, float *v2, float *v3);
269 float AreaF2Dfl(float *v1, float *v2, float *v3);
270 float AreaQ3Dfl(float *v1, float *v2, float *v3, float *v4);
271 float AreaT3Dfl(float *v1, float *v2, float *v3);
272 float AreaPoly3Dfl(int nr, float *verts, float *normal);
273
274 /* intersect Line-Line
275         return:
276         -1: colliniar
277          0: no intersection of segments
278          1: exact intersection of segments
279          2: cross-intersection of segments
280 */
281 extern short IsectLL2Df(float *v1, float *v2, float *v3, float *v4);
282 extern short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4);
283
284 /* interpolation weights of point in a triangle or quad, v4 may be NULL */
285 void InterpWeightsQ3Dfl(float *v1, float *v2, float *v3, float *v4, float *co, float *w);
286 /* interpolation weights of point in a polygon with >= 3 vertices */
287 void MeanValueWeights(float v[][3], int n, float *co, float *w);
288
289 void i_lookat(
290         float vx, float vy, 
291         float vz, float px, 
292         float py, float pz, 
293         float twist, float mat[][4]
294 );
295
296 void i_window(
297         float left, float right,
298         float bottom, float top,
299         float nearClip, float farClip,
300         float mat[][4]
301 );
302
303 void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
304 void hex_to_rgb(char *hexcol, float *r, float *g, float *b);
305 void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv);
306 void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb);
307 void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb);
308 void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr);
309 void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
310 unsigned int hsv_to_cpack(float h, float s, float v);
311 unsigned int rgb_to_cpack(float r, float g, float b);
312 void cpack_to_rgb(unsigned int col, float *r, float *g, float *b);
313 void MinMaxRGB(short c[]);
314
315
316
317 void VecStar(float mat[][3],float *vec);
318
319 short EenheidsMat(float mat[][3]);
320
321 void QuatToMat3(float *q, float m[][3]);
322 void QuatToMat4(float *q, float m[][4]);
323
324 void Mat3ToQuat_is_ok(float wmat[][3], float *q);
325
326 void i_ortho(float left, float right, float bottom, float top, float nearClip, float farClip, float matrix[][4]);
327 void i_polarview(float dist, float azimuth, float incidence, float twist, float Vm[][4]);
328 void i_translate(float Tx, float Ty, float Tz, float mat[][4]);
329 void i_multmatrix(float icand[][4], float Vm[][4]);
330 void i_rotate(float angle, char axis, float mat[][4]);
331
332
333
334
335
336 void MinMax3(float *min, float *max, float *vec);
337 void SizeToMat3(float *size, float mat[][3]);
338 void SizeToMat4(float *size, float mat[][4]);
339
340 float Mat3ToScalef(float mat[][3]);
341 float Mat4ToScalef(float mat[][4]);
342
343 void printmatrix3(char *str, float m[][3]);
344 void printmatrix4(char *str, float m[][4]);
345
346 /* uit Sig.Proc.85 pag 253 */
347 void Mat3ToQuat(float wmat[][3], float *q);
348 void Mat4ToQuat(float m[][4], float *q);
349
350 void Mat3ToSize(float mat[][3], float *size);
351 void Mat4ToSize(float mat[][4], float *size);
352
353 void triatoquat(float *v1, float *v2, float *v3, float *quat);
354
355 void LocEulSizeToMat4(float mat[][4], float loc[3], float eul[3], float size[3]);
356 void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3]);
357
358 void tubemap(float x, float y, float z, float *u, float *v);
359 void spheremap(float x, float y, float z, float *u, float *v);
360
361 int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda);
362 int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
363
364 float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3]);
365
366 typedef struct DualQuat {
367         float quat[4];
368         float trans[4];
369
370         float scale[4][4];
371         float scale_weight;
372 } DualQuat;
373
374 void Mat4ToDQuat(float basemat[][4], float mat[][4], DualQuat *dq);
375 void DQuatToMat4(DualQuat *dq, float mat[][4]);
376 void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight);
377 void DQuatNormalize(DualQuat *dq, float totweight);
378 void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3]);
379 void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2);
380                           
381 #ifdef __cplusplus
382 }
383 #endif
384         
385 #endif
386