f4d91891dd1fb28bd23a09db2b3d8db30ccf6e53
[blender-staging.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 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.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  *
24  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
25  * All rights reserved.
26  *
27  * The Original Code is: all of this file.
28  *
29  * Contributor(s): none yet.
30  *
31  * ***** END GPL LICENSE BLOCK *****
32  * */
33
34 #ifndef BLI_ARITHB_H
35 #define BLI_ARITHB_H
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 #ifdef WIN32
42 #define _USE_MATH_DEFINES
43 #endif
44
45 #include <math.h>
46
47 #ifndef M_PI
48 #define M_PI            3.14159265358979323846
49 #endif
50 #ifndef M_PI_2
51 #define M_PI_2          1.57079632679489661923
52 #endif
53 #ifndef M_SQRT2
54 #define M_SQRT2         1.41421356237309504880
55 #endif
56 #ifndef M_SQRT1_2
57 #define M_SQRT1_2       0.70710678118654752440
58 #endif
59 #ifndef M_1_PI
60 #define M_1_PI          0.318309886183790671538
61 #endif
62
63 #ifndef M_E
64 #define M_E             2.7182818284590452354
65 #endif
66 #ifndef M_LOG2E
67 #define M_LOG2E         1.4426950408889634074
68 #endif
69 #ifndef M_LOG10E
70 #define M_LOG10E        0.43429448190325182765
71 #endif
72 #ifndef M_LN2
73 #define M_LN2           0.69314718055994530942
74 #endif
75 #ifndef M_LN10
76 #define M_LN10          2.30258509299404568402
77 #endif
78
79 #ifndef sqrtf
80 #define sqrtf(a) ((float)sqrt(a))
81 #endif
82 #ifndef powf
83 #define powf(a, b) ((float)pow(a, b))
84 #endif
85 #ifndef cosf
86 #define cosf(a) ((float)cos(a))
87 #endif
88 #ifndef sinf
89 #define sinf(a) ((float)sin(a))
90 #endif
91 #ifndef acosf
92 #define acosf(a) ((float)acos(a))
93 #endif
94 #ifndef asinf
95 #define asinf(a) ((float)asin(a))
96 #endif
97 #ifndef atan2f
98 #define atan2f(a, b) ((float)atan2(a, b))
99 #endif
100 #ifndef tanf
101 #define tanf(a) ((float)tan(a))
102 #endif
103 #ifndef atanf
104 #define atanf(a) ((float)atan(a))
105 #endif
106 #ifndef floorf
107 #define floorf(a) ((float)floor(a))
108 #endif
109 #ifndef ceilf
110 #define ceilf(a) ((float)ceil(a))
111 #endif
112 #ifndef fabsf
113 #define fabsf(a) ((float)fabs(a))
114 #endif
115 #ifndef logf
116 #define logf(a) ((float)log(a))
117 #endif
118 #ifndef expf
119 #define expf(a) ((float)exp(a))
120 #endif
121 #ifndef fmodf
122 #define fmodf(a, b) ((float)fmod(a, b))
123 #endif
124
125 #ifdef WIN32
126         #ifndef FREE_WINDOWS
127                 #define isnan(n) _isnan(n)
128                 #define finite _finite
129         #endif
130 #endif
131
132 #define MAT4_UNITY {{ 1.0, 0.0, 0.0, 0.0},\
133                                         { 0.0, 1.0, 0.0, 0.0},\
134                                         { 0.0, 0.0, 1.0, 0.0},\
135                                         { 0.0, 0.0, 0.0, 1.0}}
136
137 #define MAT3_UNITY {{ 1.0, 0.0, 0.0},\
138                                         { 0.0, 1.0, 0.0},\
139                                         { 0.0, 0.0, 1.0}}
140
141
142 void CalcCent3f(float *cent,  float *v1, float *v2, float *v3);
143 void CalcCent4f(float *cent, float *v1, float *v2, float *v3, float *v4);
144
145 void Crossf(float *c, float *a, float *b);
146 void Projf(float *c, float *v1, float *v2);
147
148 float Inpf(float *v1, float *v2);
149 float Inp2f(float *v1, float *v2);
150
151 float Normalize(float *n);
152 float Normalize2(float *n);
153
154 float Sqrt3f(float f);
155 double Sqrt3d(double d);
156
157 float saacos(float fac);
158 float saasin(float fac);
159 float sasqrt(float fac);
160 float saacosf(float fac);
161 float saasinf(float fac);
162 float sasqrtf(float fac);
163
164 int FloatCompare(float *v1, float *v2, float limit);
165 int FloatCompare4(float *v1, float *v2, float limit);
166 float FloatLerpf(float target, float origin, float fac);
167
168 float CalcNormFloat(float *v1, float *v2, float *v3, float *n);
169 float CalcNormFloat4(float *v1, float *v2, float *v3, float *v4, float *n);
170
171 void CalcNormLong(int *v1, int *v2, int *v3, float *n);
172 /* CalcNormShort: is ook uitprodukt - (translates as 'is also out/cross product') */
173 void CalcNormShort(short *v1, short *v2, short *v3, float *n);
174 float power_of_2(float val);
175
176 /**
177  * @section Euler conversion routines (With Custom Order)
178  */
179
180 /* Defines for rotation orders 
181  * WARNING: must match the eRotationModes in DNA_action_types.h
182  *                 order matters - types are saved to file!
183  */
184 typedef enum eEulerRotationOrders {
185         EULER_ORDER_DEFAULT = 1,        /* Blender 'default' (classic) is basically XYZ */
186         EULER_ORDER_XYZ = 1,            /* Blender 'default' (classic) - must be as 1 to sync with PoseChannel rotmode */
187         EULER_ORDER_XZY,
188         EULER_ORDER_YXZ,
189         EULER_ORDER_YZX,
190         EULER_ORDER_ZXY,
191         EULER_ORDER_ZYX,
192         /* NOTE: there are about 6 more entries when including duplicated entries too */
193 } eEulerRotationOrders;
194
195 void EulOToQuat(float eul[3], short order, float quat[4]);
196 void QuatToEulO(float quat[4], float eul[3], short order);
197
198 void EulOToMat3(float eul[3], short order, float Mat[3][3]);
199 void EulOToMat4(float eul[3], short order, float Mat[4][4]);
200  
201 void Mat3ToEulO(float Mat[3][3], float eul[3], short order);
202 void Mat4ToEulO(float Mat[4][4], float eul[3], short order);
203
204 void Mat3ToCompatibleEulO(float mat[3][3], float eul[3], float oldrot[3], short order);
205
206 void eulerO_rot(float beul[3], float ang, char axis, short order);
207  
208 /**
209  * @section Euler conversion routines (Blender XYZ)
210  */
211
212 void EulToMat3(float *eul, float mat[][3]);
213 void EulToMat4(float *eul, float mat[][4]);
214
215 void Mat3ToEul(float tmat[][3], float *eul);
216 void Mat4ToEul(float tmat[][4],float *eul);
217
218 void EulToQuat(float *eul, float *quat);
219
220 void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot);
221
222
223
224 void compatible_eul(float *eul, float *oldrot);
225 void euler_rot(float *beul, float ang, char axis);
226
227
228 /**
229  * @section Quaternion arithmetic routines
230  */
231
232 int  QuatIsNul(float *q);
233 void QuatToEul(float *quat, float *eul);
234 void QuatOne(float *);
235 void QuatMul(float *, float *, float *);
236 void QuatMulVecf(float *q, float *v);
237 void QuatMulf(float *q, float f);
238 void QuatMulFac(float *q, float fac);
239
240 void NormalQuat(float *);
241 void VecRotToQuat(float *vec, float phi, float *quat);
242
243 void QuatSub(float *q, float *q1, float *q2);
244 void QuatConj(float *q);
245 void QuatInv(float *q);
246 float QuatDot(float *q1, float *q2);
247 void QuatCopy(float *q1, float *q2);
248
249 void printquat(char *str, float q[4]);
250
251 void QuatInterpol(float *result, float *quat1, float *quat2, float t);
252 void QuatAdd(float *result, float *quat1, float *quat2, float t);
253
254 void QuatToMat3(float *q, float m[][3]);
255 void QuatToMat4(float *q, float m[][4]);
256
257 /**
258  * @section matrix multiplication and copying routines
259  */
260
261 void Mat3MulFloat(float *m, float f);
262 void Mat4MulFloat(float *m, float f);
263 void Mat4MulFloat3(float *m, float f);
264
265 void Mat3Transp(float mat[][3]);
266 void Mat4Transp(float mat[][4]);
267
268 int Mat4Invert(float inverse[][4], float mat[][4]);
269 void Mat4InvertSimp(float inverse[][4], float mat[][4]);
270 void Mat4Inv(float *m1, float *m2);
271 void Mat4InvGG(float out[][4], float in[][4]);
272 void Mat3Inv(float m1[][3], float m2[][3]);
273
274 void Mat3CpyMat4(float m1[][3],float m2[][4]);
275 void Mat4CpyMat3(float m1[][4], float m2[][3]); 
276
277 void Mat3BlendMat3(float out[][3], float dst[][3], float src[][3], float srcweight);
278 void Mat4BlendMat4(float out[][4], float dst[][4], float src[][4], float srcweight);
279
280 float Det2x2(float a,float b,float c, float d);
281
282 float Det3x3(
283         float a1, float a2, float a3,
284         float b1, float b2, float b3,
285         float c1, float c2, float c3 
286 );
287
288 float Det4x4(float m[][4]);
289
290 void Mat3Adj(float m1[][3], float m[][3]);
291 void Mat4Adj(float out[][4], float in[][4]);
292
293 void Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4]);
294 void subMat4MulMat4(float *m1, float *m2, float *m3);
295 #ifndef TEST_ACTIVE
296 void Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3]);
297 #else
298 void Mat3MulMat3(float *m1, float *m3, float *m2);
299 #endif
300 void Mat4MulMat34(float (*m1)[4], float (*m3)[3], float (*m2)[4]);
301 void Mat4CpyMat4(float m1[][4], float m2[][4]);
302 void Mat4SwapMat4(float m1[][4], float m2[][4]);
303 void Mat3CpyMat3(float m1[][3], float m2[][3]);
304
305 void Mat3MulSerie(float answ[][3],
306         float m1[][3], float m2[][3], float m3[][3],
307         float m4[][3], float m5[][3], float m6[][3],
308         float m7[][3], float m8[][3]
309 );
310
311 void Mat4MulSerie(float answ[][4], float m1[][4],
312         float m2[][4], float m3[][4], float m4[][4],
313         float m5[][4], float m6[][4], float m7[][4],
314         float m8[][4]
315 );
316         
317 void Mat4Clr(float *m);
318 void Mat3Clr(float *m);
319         
320 void Mat3One(float m[][3]);
321 void Mat4One(float m[][4]);
322
323 void Mat3Ortho(float mat[][3]);
324 void Mat4Ortho(float mat[][4]);
325
326 void VecMat4MulVecfl(float *in, float mat[][4], float *vec);
327 void Mat4MulMat43(float (*m1)[4], float (*m3)[4], float (*m2)[3]);
328 void Mat3IsMat3MulMat4(float m1[][3], float m2[][3], float m3[][4]);
329
330 void Mat4MulVec(float mat[][4],int *vec);
331 void Mat4MulVecfl(float mat[][4], float *vec);
332 void Mat4Mul3Vecfl(float mat[][4], float *vec);
333 void Mat4MulVec3Project(float mat[][4],float *vec);
334 void Mat4MulVec4fl(float mat[][4], float *vec);
335 void Mat3MulVec(float mat[][3],int *vec);
336 void Mat3MulVecfl(float mat[][3], float *vec);
337 void Mat3MulVecd(float mat[][3], double *vec);
338 void Mat3TransMulVecfl(float mat[][3], float *vec);
339
340 void Mat3AddMat3(float m1[][3], float m2[][3], float m3[][3]);
341 void Mat4AddMat4(float m1[][4], float m2[][4], float m3[][4]);
342
343 void VecUpMat3old(float *vec, float mat[][3], short axis);
344 void VecUpMat3(float *vec, float mat[][3], short axis);
345
346 void VecCopyf(float *v1, float *v2);
347 int VecLen(int *v1, int *v2);
348 float VecLenf(float v1[3], float v2[3]);
349 float VecLength(float *v);
350 void VecMulf(float *v1, float f);
351 void VecNegf(float *v1);
352
353 int VecLenCompare(float *v1, float *v2, float limit);
354 int VecCompare(float *v1, float *v2, float limit);
355 int VecEqual(float *v1, float *v2);
356 int VecIsNull(float *v);
357
358 void printvecf(char *str,float v[3]);
359 void printvec4f(char *str, float v[4]);
360
361 void VecAddf(float *v, float *v1, float *v2);
362 void VecSubf(float *v, float *v1, float *v2);
363 void VecMulVecf(float *v, float *v1, float *v2);
364 void VecLerpf(float *target, const float *a, const float *b, const float t);
365 void VecLerp3f(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3]);
366 void VecMidf(float *v, float *v1, float *v2);
367
368 void VecOrthoBasisf(float *v, float *v1, float *v2);
369
370 float Vec2Lenf(float *v1, float *v2);
371 float Vec2Length(float *v);
372 void Vec2Mulf(float *v1, float f);
373 void Vec2Addf(float *v, float *v1, float *v2);
374 void Vec2Subf(float *v, float *v1, float *v2);
375 void Vec2Copyf(float *v1, float *v2);
376 void Vec2Lerpf(float *target, const float *a, const float *b, const float t);
377 void Vec2Lerp3f(float p[2], const float v1[2], const float v2[2], const float v3[2], const float w[3]);
378
379 void AxisAngleToQuat(float q[4], float axis[3], float angle);
380 void QuatToAxisAngle(float q[4], float axis[3], float *angle);
381 void AxisAngleToEulO(float axis[3], float angle, float eul[3], short order);
382 void EulOToAxisAngle(float eul[3], short order, float axis[3], float *angle);
383 void AxisAngleToMat3(float axis[3], float angle, float mat[3][3]);
384 void AxisAngleToMat4(float axis[3], float angle, float mat[4][4]);
385 void Mat3ToAxisAngle(float mat[3][3], float axis[3], float *angle);
386 void Mat4ToAxisAngle(float mat[4][4], float axis[3], float *angle);
387
388 void Mat3ToVecRot(float mat[3][3], float axis[3], float *angle);
389 void Mat4ToVecRot(float mat[4][4], float axis[3], float *angle);
390 void VecRotToMat3(float *vec, float phi, float mat[][3]);
391 void VecRotToMat4(float *vec, float phi, float mat[][4]);
392
393 void RotationBetweenVectorsToQuat(float *q, float v1[3], float v2[3]);
394 void vectoquat(float *vec, short axis, short upflag, float *q);
395 void Mat3ToQuat_is_ok(float wmat[][3], float *q);
396
397 void VecReflect(float *out, float *v1, float *v2);
398 void VecBisect3(float *v, float *v1, float *v2, float *v3);
399 float VecAngle2(float *v1, float *v2);
400 float VecAngle3(float *v1, float *v2, float *v3);
401 float NormalizedVecAngle2(float *v1, float *v2);
402
403 float Vec2Angle3(float *v1, float *v2, float *v3);
404 float NormalizedVecAngle2_2D(float *v1, float *v2);
405         
406 void NormalShortToFloat(float *out, short *in);
407 void NormalFloatToShort(short *out, float *in);
408
409 float DistVL2Dfl(float *v1, float *v2, float *v3);
410 float PdistVL2Dfl(float *v1, float *v2, float *v3);
411 float PdistVL3Dfl(float *v1, float *v2, float *v3);
412 void PclosestVL3Dfl(float *closest, float v1[3], float v2[3], float v3[3]);
413 float AreaF2Dfl(float *v1, float *v2, float *v3);
414 float AreaQ3Dfl(float *v1, float *v2, float *v3, float *v4);
415 float AreaT3Dfl(float *v1, float *v2, float *v3);
416 float AreaPoly3Dfl(int nr, float *verts, float *normal);
417
418 /* intersect Line-Line
419         return:
420         -1: colliniar
421          0: no intersection of segments
422          1: exact intersection of segments
423          2: cross-intersection of segments
424 */
425 extern short IsectLL2Df(float *v1, float *v2, float *v3, float *v4);
426 extern short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4);
427
428 /*point in tri,  0 no intersection, 1 intersect */
429 int IsectPT2Df(float pt[2], float v1[2], float v2[2], float v3[2]);
430 /* point in quad,  0 no intersection, 1 intersect */
431 int IsectPQ2Df(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2]);
432
433 /* interpolation weights of point in a triangle or quad, v4 may be NULL */
434 void InterpWeightsQ3Dfl(float *v1, float *v2, float *v3, float *v4, float *co, float *w);
435 /* interpolation weights of point in a polygon with >= 3 vertices */
436 void MeanValueWeights(float v[][3], int n, float *co, float *w);
437
438 void i_lookat(
439         float vx, float vy, 
440         float vz, float px, 
441         float py, float pz, 
442         float twist, float mat[][4]
443 );
444
445 void i_window(
446         float left, float right,
447         float bottom, float top,
448         float nearClip, float farClip,
449         float mat[][4]
450 );
451
452 #define BLI_CS_SMPTE    0
453 #define BLI_CS_REC709   1
454 #define BLI_CS_CIE              2
455
456 #define RAD2DEG(_rad) ((_rad)*(180.0/M_PI))
457
458 void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
459 void hex_to_rgb(char *hexcol, float *r, float *g, float *b);
460 void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv);
461 void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb);
462 void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb);
463 void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr);
464 void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
465 void xyz_to_rgb(float x, float y, float z, float *r, float *g, float *b, int colorspace);
466 int constrain_rgb(float *r, float *g, float *b);
467 unsigned int hsv_to_cpack(float h, float s, float v);
468 unsigned int rgb_to_cpack(float r, float g, float b);
469 void cpack_to_rgb(unsigned int col, float *r, float *g, float *b);
470 void MinMaxRGB(short c[]);
471
472
473
474 void VecStar(float mat[][3],float *vec);
475
476 short EenheidsMat(float mat[][3]);
477
478 void i_ortho(float left, float right, float bottom, float top, float nearClip, float farClip, float matrix[][4]);
479 void i_polarview(float dist, float azimuth, float incidence, float twist, float Vm[][4]);
480 void i_translate(float Tx, float Ty, float Tz, float mat[][4]);
481 void i_multmatrix(float icand[][4], float Vm[][4]);
482 void i_rotate(float angle, char axis, float mat[][4]);
483
484
485
486 void MinMax3(float *min, float *max, float *vec);
487 void SizeToMat3(float *size, float mat[][3]);
488 void SizeToMat4(float *size, float mat[][4]);
489
490 float Mat3ToScalef(float mat[][3]);
491 float Mat4ToScalef(float mat[][4]);
492
493 void printmatrix3(char *str, float m[][3]);
494 void printmatrix4(char *str, float m[][4]);
495
496 /* uit Sig.Proc.85 pag 253 */
497 void Mat3ToQuat(float wmat[][3], float *q);
498 void Mat4ToQuat(float m[][4], float *q);
499
500 void Mat3ToSize(float mat[][3], float *size);
501 void Mat4ToSize(float mat[][4], float *size);
502
503 void triatoquat(float *v1, float *v2, float *v3, float *quat);
504
505 void LocEulSizeToMat4(float mat[4][4], float loc[3], float eul[3], float size[3]);
506 void LocEulOSizeToMat4(float mat[4][4], float loc[3], float eul[3], float size[3], short rotOrder);
507 void LocQuatSizeToMat4(float mat[4][4], float loc[3], float quat[4], float size[3]);
508
509 void tubemap(float x, float y, float z, float *u, float *v);
510 void spheremap(float x, float y, float z, float *u, float *v);
511
512 int LineIntersectLine(float v1[3], float v2[3], float v3[3], float v4[3], float i1[3], float i2[3]);
513 int LineIntersectLineStrict(float v1[3], float v2[3], float v3[3], float v4[3], float vi[3], float *lambda);
514 int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
515 int RayIntersectsTriangle(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
516 int RayIntersectsTriangleThreshold(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float threshold);
517 int SweepingSphereIntersectsTriangleUV(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint);
518 int AxialLineIntersectsTriangle(int axis, float co1[3], float co2[3], float v0[3], float v1[3], float v2[3], float *lambda);
519 int AabbIntersectAabb(float min1[3], float max1[3], float min2[3], float max2[3]);
520 void VecfCubicInterpol(float *x1, float *v1, float *x2, float *v2, float t, float *x, float *v);
521 void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
522 void PointInFace2DUV(int isquad, float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
523 int IsPointInTri2D(float v1[2], float v2[2], float v3[2], float pt[2]);
524 int IsPointInTri2DInts(int x1, int y1, int x2, int y2, int a, int b);
525 int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
526
527 float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3]);
528
529 float AngleToLength(const float angle);
530
531 typedef struct DualQuat {
532         float quat[4];
533         float trans[4];
534
535         float scale[4][4];
536         float scale_weight;
537 } DualQuat;
538
539 void Mat4ToDQuat(float basemat[][4], float mat[][4], DualQuat *dq);
540 void DQuatToMat4(DualQuat *dq, float mat[][4]);
541 void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight);
542 void DQuatNormalize(DualQuat *dq, float totweight);
543 void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3]);
544 void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2);
545                           
546 /* Tangent stuff */
547 typedef struct VertexTangent {
548         float tang[3], uv[2];
549         struct VertexTangent *next;
550 } VertexTangent;
551
552 void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, float *tang, float *uv);
553 float *find_vertex_tangent(VertexTangent *vtang, float *uv);
554 void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, float *co3, float *n, float *tang);
555
556 #ifdef __cplusplus
557 }
558 #endif
559         
560 #endif
561