merge with 2.5 (not trunk, last merge message said that on accident) at r22252
[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 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 Crossd(double *c, double *a, double *b);
147 void Projf(float *c, float *v1, float *v2);
148
149 float Inpf(float *v1, float *v2);
150 float Inp2f(float *v1, float *v2);
151
152 float Normalize(float *n);
153 float Normalize2(float *n);
154 double Normalize_d(double *n);
155
156 float Sqrt3f(float f);
157 double Sqrt3d(double d);
158
159 float saacos(float fac);
160 float saasin(float fac);
161 float sasqrt(float fac);
162 float saacosf(float fac);
163 float saasinf(float fac);
164 float sasqrtf(float fac);
165
166 int FloatCompare(float *v1, float *v2, float limit);
167 int FloatCompare4(float *v1, float *v2, float limit);
168 float FloatLerpf(float target, float origin, float fac);
169
170 float CalcNormFloat(float *v1, float *v2, float *v3, float *n);
171 float CalcNormFloat4(float *v1, float *v2, float *v3, float *v4, float *n);
172
173 void CalcNormLong(int *v1, int *v2, int *v3, float *n);
174 /* CalcNormShort: is ook uitprodukt - (translates as 'is also out/cross product') */
175 void CalcNormShort(short *v1, short *v2, short *v3, float *n);
176 float power_of_2(float val);
177
178 /**
179  * @section Euler conversion routines
180  */
181
182 void EulToMat3(float *eul, float mat[][3]);
183 void EulToMat4(float *eul, float mat[][4]);
184
185 void Mat3ToEul(float tmat[][3], float *eul);
186 void Mat4ToEul(float tmat[][4],float *eul);
187
188 void EulToQuat(float *eul, float *quat);
189
190 void compatible_eul(float *eul, float *oldrot);
191
192 void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot);
193
194
195 /**
196  * @section Quaternion arithmetic routines
197  */
198
199 int  QuatIsNul(float *q);
200 void QuatToEul(float *quat, float *eul);
201 void QuatOne(float *);
202 void QuatMul(float *, float *, float *);
203 void QuatMulVecf(float *q, float *v);
204 void QuatMulf(float *q, float f);
205 void QuatMulFac(float *q, float fac);
206
207 void NormalQuat(float *);
208 void VecRotToQuat(float *vec, float phi, float *quat);
209
210 void QuatSub(float *q, float *q1, float *q2);
211 void QuatConj(float *q);
212 void QuatInv(float *q);
213 float QuatDot(float *q1, float *q2);
214 void QuatCopy(float *q1, float *q2);
215
216 void printquat(char *str, float q[4]);
217
218 void QuatInterpol(float *result, float *quat1, float *quat2, float t);
219 void QuatAdd(float *result, float *quat1, float *quat2, float t);
220
221
222 /**
223  * @section matrix multiplication and copying routines
224  */
225
226 void Mat3MulFloat(float *m, float f);
227 void Mat4MulFloat(float *m, float f);
228 void Mat4MulFloat3(float *m, float f);
229
230 void Mat3Transp(float mat[][3]);
231 void Mat4Transp(float mat[][4]);
232
233 int Mat4Invert(float inverse[][4], float mat[][4]);
234 void Mat4InvertSimp(float inverse[][4], float mat[][4]);
235 void Mat4Inv(float *m1, float *m2);
236 void Mat4InvGG(float out[][4], float in[][4]);
237 void Mat3Inv(float m1[][3], float m2[][3]);
238
239 void Mat3CpyMat4(float m1[][3],float m2[][4]);
240 void Mat4CpyMat3(float m1[][4], float m2[][3]); 
241
242 void Mat3BlendMat3(float out[][3], float dst[][3], float src[][3], float srcweight);
243 void Mat4BlendMat4(float out[][4], float dst[][4], float src[][4], float srcweight);
244
245 float Det2x2(float a,float b,float c, float d);
246
247 float Det3x3(
248         float a1, float a2, float a3,
249         float b1, float b2, float b3,
250         float c1, float c2, float c3 
251 );
252
253 float Det4x4(float m[][4]);
254
255 void Mat3Adj(float m1[][3], float m[][3]);
256 void Mat4Adj(float out[][4], float in[][4]);
257
258 void Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4]);
259 void subMat4MulMat4(float *m1, float *m2, float *m3);
260 #ifndef TEST_ACTIVE
261 void Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3]);
262 #else
263 void Mat3MulMat3(float *m1, float *m3, float *m2);
264 #endif
265 void Mat4MulMat34(float (*m1)[4], float (*m3)[3], float (*m2)[4]);
266 void Mat4CpyMat4(float m1[][4], float m2[][4]);
267 void Mat4SwapMat4(float *m1, float *m2);
268 void Mat3CpyMat3(float m1[][3], float m2[][3]);
269
270 void Mat3MulSerie(float answ[][3],
271         float m1[][3], float m2[][3], float m3[][3],
272         float m4[][3], float m5[][3], float m6[][3],
273         float m7[][3], float m8[][3]
274 );
275
276 void Mat4MulSerie(float answ[][4], float m1[][4],
277         float m2[][4], float m3[][4], float m4[][4],
278         float m5[][4], float m6[][4], float m7[][4],
279         float m8[][4]
280 );
281         
282 void Mat4Clr(float *m);
283 void Mat3Clr(float *m);
284         
285 void Mat3One(float m[][3]);
286 void Mat4One(float m[][4]);
287
288 void Mat3Ortho(float mat[][3]);
289 void Mat4Ortho(float mat[][4]);
290
291 void VecMat4MulVecfl(float *in, float mat[][4], float *vec);
292 void Mat4MulMat43(float (*m1)[4], float (*m3)[4], float (*m2)[3]);
293 void Mat3IsMat3MulMat4(float m1[][3], float m2[][3], float m3[][4]);
294
295 void Mat4MulVec(float mat[][4],int *vec);
296 void Mat4MulVecfl(float mat[][4], float *vec);
297 void Mat4Mul3Vecfl(float mat[][4], float *vec);
298 void Mat4MulVec3Project(float mat[][4],float *vec);
299 void Mat4MulVec4fl(float mat[][4], float *vec);
300 void Mat3MulVec(float mat[][3],int *vec);
301 void Mat3MulVecfl(float mat[][3], float *vec);
302 void Mat3MulVecd(float mat[][3], double *vec);
303 void Mat3TransMulVecfl(float mat[][3], float *vec);
304
305 void Mat3AddMat3(float m1[][3], float m2[][3], float m3[][3]);
306 void Mat4AddMat4(float m1[][4], float m2[][4], float m3[][4]);
307
308 void VecUpMat3old(float *vec, float mat[][3], short axis);
309 void VecUpMat3(float *vec, float mat[][3], short axis);
310 void VecRotToMat3(float *vec, float phi, float mat[][3]);
311 void VecRotToMat4(float *vec, float phi, float mat[][4]);
312
313 void VecCopyf(float *v1, float *v2);
314 int VecLen(int *v1, int *v2);
315 float VecLenf(float *v1, float *v2);
316 float VecLength(float *v);
317 void VecMulf(float *v1, float f);
318 void VecNegf(float *v1);
319
320 int VecLenCompare(float *v1, float *v2, float limit);
321 int VecCompare(float *v1, float *v2, float limit);
322 int VecEqual(float *v1, float *v2);
323 int VecIsNull(float *v);
324
325 void printvecf(char *str,float v[3]);
326 void printvec4f(char *str, float v[4]);
327
328 void VecAddf(float *v, float *v1, float *v2);
329 void VecSubf(float *v, float *v1, float *v2);
330 void VecLerpf(float *target, float *a, float *b, float t);
331 void VecMidf(float *v, float *v1, float *v2);
332
333 void VecOrthoBasisf(float *v, float *v1, float *v2);
334
335 float Vec2Lenf(float *v1, float *v2);
336 float Vec2Length(float *v);
337 void Vec2Mulf(float *v1, float f);
338 void Vec2Addf(float *v, float *v1, float *v2);
339 void Vec2Subf(float *v, float *v1, float *v2);
340 void Vec2Copyf(float *v1, float *v2);
341 void Vec2Lerpf(float *target, float *a, float *b, float t);
342
343 void AxisAngleToQuatd(float *q, float *axis, double angle);
344 void AxisAngleToQuat(float *q, float *axis, float angle);
345 void RotationBetweenVectorsToQuat(float *q, float v1[3], float v2[3]);
346 void vectoquat(float *vec, short axis, short upflag, float *q);
347
348 float VecAngle2(float *v1, float *v2);
349 float VecAngle3(float *v1, float *v2, float *v3);
350 float NormalizedVecAngle2(float *v1, float *v2);
351
352 float VecAngle3_2D(float *v1, float *v2, float *v3);
353 float NormalizedVecAngle2_2D(float *v1, float *v2);
354
355 void euler_rot(float *beul, float ang, char axis);
356         
357 void NormalShortToFloat(float *out, short *in);
358 void NormalFloatToShort(short *out, float *in);
359
360 float DistVL2Dfl(float *v1, float *v2, float *v3);
361 float PdistVL2Dfl(float *v1, float *v2, float *v3);
362 float PdistVL3Dfl(float *v1, float *v2, float *v3);
363 void PclosestVL3Dfl(float *closest, float *v1, float *v2, float *v3);
364 float AreaF2Dfl(float *v1, float *v2, float *v3);
365 float AreaQ3Dfl(float *v1, float *v2, float *v3, float *v4);
366 float AreaT3Dfl(float *v1, float *v2, float *v3);
367 float AreaPoly3Dfl(int nr, float *verts, float *normal);
368
369 /* intersect Line-Line
370         return:
371         -1: colliniar
372          0: no intersection of segments
373          1: exact intersection of segments
374          2: cross-intersection of segments
375 */
376 extern short IsectLL2Df(float *v1, float *v2, float *v3, float *v4);
377 extern short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4);
378
379 /*point in tri,  0 no intersection, 1 intersect */
380 int IsectPT2Df(float pt[2], float v1[2], float v2[2], float v3[2]);
381 /* point in quad,  0 no intersection, 1 intersect */
382 int IsectPQ2Df(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2]);
383
384 /* interpolation weights of point in a triangle or quad, v4 may be NULL */
385 void InterpWeightsQ3Dfl(float *v1, float *v2, float *v3, float *v4, float *co, float *w);
386 /* interpolation weights of point in a polygon with >= 3 vertices */
387 void MeanValueWeights(float v[][3], int n, float *co, float *w);
388
389 void i_lookat(
390         float vx, float vy, 
391         float vz, float px, 
392         float py, float pz, 
393         float twist, float mat[][4]
394 );
395
396 void i_window(
397         float left, float right,
398         float bottom, float top,
399         float nearClip, float farClip,
400         float mat[][4]
401 );
402
403 #define BLI_CS_SMPTE    0
404 #define BLI_CS_REC709   1
405 #define BLI_CS_CIE              2
406
407 void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
408 void hex_to_rgb(char *hexcol, float *r, float *g, float *b);
409 void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv);
410 void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb);
411 void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb);
412 void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr);
413 void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
414 void xyz_to_rgb(float x, float y, float z, float *r, float *g, float *b, int colorspace);
415 int constrain_rgb(float *r, float *g, float *b);
416 unsigned int hsv_to_cpack(float h, float s, float v);
417 unsigned int rgb_to_cpack(float r, float g, float b);
418 void cpack_to_rgb(unsigned int col, float *r, float *g, float *b);
419 void MinMaxRGB(short c[]);
420
421
422
423 void VecStar(float mat[][3],float *vec);
424
425 short EenheidsMat(float mat[][3]);
426
427 void QuatToMat3(float *q, float m[][3]);
428 void QuatToMat4(float *q, float m[][4]);
429
430 void Mat3ToQuat_is_ok(float wmat[][3], float *q);
431
432 void i_ortho(float left, float right, float bottom, float top, float nearClip, float farClip, float matrix[][4]);
433 void i_polarview(float dist, float azimuth, float incidence, float twist, float Vm[][4]);
434 void i_translate(float Tx, float Ty, float Tz, float mat[][4]);
435 void i_multmatrix(float icand[][4], float Vm[][4]);
436 void i_rotate(float angle, char axis, float mat[][4]);
437
438
439
440
441
442 void MinMax3(float *min, float *max, float *vec);
443 void SizeToMat3(float *size, float mat[][3]);
444 void SizeToMat4(float *size, float mat[][4]);
445
446 float Mat3ToScalef(float mat[][3]);
447 float Mat4ToScalef(float mat[][4]);
448
449 void printmatrix3(char *str, float m[][3]);
450 void printmatrix4(char *str, float m[][4]);
451
452 /* uit Sig.Proc.85 pag 253 */
453 void Mat3ToQuat(float wmat[][3], float *q);
454 void Mat4ToQuat(float m[][4], float *q);
455
456 void Mat3ToSize(float mat[][3], float *size);
457 void Mat4ToSize(float mat[][4], float *size);
458
459 void triatoquat(float *v1, float *v2, float *v3, float *quat);
460
461 void LocEulSizeToMat4(float mat[][4], float loc[3], float eul[3], float size[3]);
462 void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3]);
463
464 void tubemap(float x, float y, float z, float *u, float *v);
465 void spheremap(float x, float y, float z, float *u, float *v);
466
467 int LineIntersectLine(float v1[3], float v2[3], float v3[3], float v4[3], float i1[3], float i2[3]);
468 int LineIntersectLineStrict(float v1[3], float v2[3], float v3[3], float v4[3], float vi[3], float *lambda);
469 int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
470 int RayIntersectsTriangle(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
471 int RayIntersectsTriangleThreshold(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float threshold);
472 int SweepingSphereIntersectsTriangleUV(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint);
473 int AxialLineIntersectsTriangle(int axis, float co1[3], float co2[3], float v0[3], float v1[3], float v2[3], float *lambda);
474 int AabbIntersectAabb(float min1[3], float max1[3], float min2[3], float max2[3]);
475 void VecfCubicInterpol(float *x1, float *v1, float *x2, float *v2, float t, float *x, float *v);
476 void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
477 void PointInFace2DUV(int isquad, float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
478 int IsPointInTri2D(float v1[2], float v2[2], float v3[2], float pt[2]);
479 int IsPointInTri2DInts(int x1, int y1, int x2, int y2, int a, int b);
480 int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
481
482 float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3]);
483
484 typedef struct DualQuat {
485         float quat[4];
486         float trans[4];
487
488         float scale[4][4];
489         float scale_weight;
490 } DualQuat;
491
492 void Mat4ToDQuat(float basemat[][4], float mat[][4], DualQuat *dq);
493 void DQuatToMat4(DualQuat *dq, float mat[][4]);
494 void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight);
495 void DQuatNormalize(DualQuat *dq, float totweight);
496 void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3]);
497 void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2);
498                           
499 /* Tangent stuff */
500 typedef struct VertexTangent {
501         float tang[3], uv[2];
502         struct VertexTangent *next;
503 } VertexTangent;
504
505 void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, float *tang, float *uv);
506 float *find_vertex_tangent(VertexTangent *vtang, float *uv);
507 void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, float *co3, float *n, float *tang);
508
509 #ifdef __cplusplus
510 }
511 #endif
512         
513 #endif
514