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