Operator docstring patch from Ron Walker, added console operator docs too.
[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 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 ePchan_RotMode 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, float *m2);
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 void VecRotToMat3(float *vec, float phi, float mat[][3]);
346 void VecRotToMat4(float *vec, float phi, float mat[][4]);
347
348 void VecCopyf(float *v1, float *v2);
349 int VecLen(int *v1, int *v2);
350 float VecLenf(float *v1, float *v2);
351 float VecLength(float *v);
352 void VecMulf(float *v1, float f);
353 void VecNegf(float *v1);
354
355 int VecLenCompare(float *v1, float *v2, float limit);
356 int VecCompare(float *v1, float *v2, float limit);
357 int VecEqual(float *v1, float *v2);
358 int VecIsNull(float *v);
359
360 void printvecf(char *str,float v[3]);
361 void printvec4f(char *str, float v[4]);
362
363 void VecAddf(float *v, float *v1, float *v2);
364 void VecSubf(float *v, float *v1, float *v2);
365 void VecMulVecf(float *v, float *v1, float *v2);
366 void VecLerpf(float *target, float *a, float *b, float t);
367 void VecMidf(float *v, float *v1, float *v2);
368
369 void VecOrthoBasisf(float *v, float *v1, float *v2);
370
371 float Vec2Lenf(float *v1, float *v2);
372 float Vec2Length(float *v);
373 void Vec2Mulf(float *v1, float f);
374 void Vec2Addf(float *v, float *v1, float *v2);
375 void Vec2Subf(float *v, float *v1, float *v2);
376 void Vec2Copyf(float *v1, float *v2);
377 void Vec2Lerpf(float *target, float *a, float *b, float t);
378
379 void AxisAngleToQuat(float *q, float *axis, float angle);
380 void RotationBetweenVectorsToQuat(float *q, float v1[3], float v2[3]);
381 void vectoquat(float *vec, short axis, short upflag, float *q);
382
383 float VecAngle2(float *v1, float *v2);
384 float VecAngle3(float *v1, float *v2, float *v3);
385 float NormalizedVecAngle2(float *v1, float *v2);
386
387 float VecAngle3_2D(float *v1, float *v2, float *v3);
388 float NormalizedVecAngle2_2D(float *v1, float *v2);
389         
390 void NormalShortToFloat(float *out, short *in);
391 void NormalFloatToShort(short *out, float *in);
392
393 float DistVL2Dfl(float *v1, float *v2, float *v3);
394 float PdistVL2Dfl(float *v1, float *v2, float *v3);
395 float PdistVL3Dfl(float *v1, float *v2, float *v3);
396 void PclosestVL3Dfl(float *closest, float *v1, float *v2, float *v3);
397 float AreaF2Dfl(float *v1, float *v2, float *v3);
398 float AreaQ3Dfl(float *v1, float *v2, float *v3, float *v4);
399 float AreaT3Dfl(float *v1, float *v2, float *v3);
400 float AreaPoly3Dfl(int nr, float *verts, float *normal);
401
402 /* intersect Line-Line
403         return:
404         -1: colliniar
405          0: no intersection of segments
406          1: exact intersection of segments
407          2: cross-intersection of segments
408 */
409 extern short IsectLL2Df(float *v1, float *v2, float *v3, float *v4);
410 extern short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4);
411
412 /*point in tri,  0 no intersection, 1 intersect */
413 int IsectPT2Df(float pt[2], float v1[2], float v2[2], float v3[2]);
414 /* point in quad,  0 no intersection, 1 intersect */
415 int IsectPQ2Df(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2]);
416
417 /* interpolation weights of point in a triangle or quad, v4 may be NULL */
418 void InterpWeightsQ3Dfl(float *v1, float *v2, float *v3, float *v4, float *co, float *w);
419 /* interpolation weights of point in a polygon with >= 3 vertices */
420 void MeanValueWeights(float v[][3], int n, float *co, float *w);
421
422 void i_lookat(
423         float vx, float vy, 
424         float vz, float px, 
425         float py, float pz, 
426         float twist, float mat[][4]
427 );
428
429 void i_window(
430         float left, float right,
431         float bottom, float top,
432         float nearClip, float farClip,
433         float mat[][4]
434 );
435
436 #define BLI_CS_SMPTE    0
437 #define BLI_CS_REC709   1
438 #define BLI_CS_CIE              2
439
440 void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
441 void hex_to_rgb(char *hexcol, float *r, float *g, float *b);
442 void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv);
443 void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb);
444 void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb);
445 void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr);
446 void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
447 void xyz_to_rgb(float x, float y, float z, float *r, float *g, float *b, int colorspace);
448 int constrain_rgb(float *r, float *g, float *b);
449 unsigned int hsv_to_cpack(float h, float s, float v);
450 unsigned int rgb_to_cpack(float r, float g, float b);
451 void cpack_to_rgb(unsigned int col, float *r, float *g, float *b);
452 void MinMaxRGB(short c[]);
453
454
455
456 void VecStar(float mat[][3],float *vec);
457
458 short EenheidsMat(float mat[][3]);
459
460 void Mat3ToQuat_is_ok(float wmat[][3], float *q);
461
462 void i_ortho(float left, float right, float bottom, float top, float nearClip, float farClip, float matrix[][4]);
463 void i_polarview(float dist, float azimuth, float incidence, float twist, float Vm[][4]);
464 void i_translate(float Tx, float Ty, float Tz, float mat[][4]);
465 void i_multmatrix(float icand[][4], float Vm[][4]);
466 void i_rotate(float angle, char axis, float mat[][4]);
467
468
469
470 void MinMax3(float *min, float *max, float *vec);
471 void SizeToMat3(float *size, float mat[][3]);
472 void SizeToMat4(float *size, float mat[][4]);
473
474 float Mat3ToScalef(float mat[][3]);
475 float Mat4ToScalef(float mat[][4]);
476
477 void printmatrix3(char *str, float m[][3]);
478 void printmatrix4(char *str, float m[][4]);
479
480 /* uit Sig.Proc.85 pag 253 */
481 void Mat3ToQuat(float wmat[][3], float *q);
482 void Mat4ToQuat(float m[][4], float *q);
483
484 void Mat3ToSize(float mat[][3], float *size);
485 void Mat4ToSize(float mat[][4], float *size);
486
487 void triatoquat(float *v1, float *v2, float *v3, float *quat);
488
489 void LocEulSizeToMat4(float mat[4][4], float loc[3], float eul[3], float size[3]);
490 void LocEulOSizeToMat4(float mat[4][4], float loc[3], float eul[3], float size[3], short rotOrder);
491 void LocQuatSizeToMat4(float mat[4][4], float loc[3], float quat[4], float size[3]);
492
493 void tubemap(float x, float y, float z, float *u, float *v);
494 void spheremap(float x, float y, float z, float *u, float *v);
495
496 int LineIntersectLine(float v1[3], float v2[3], float v3[3], float v4[3], float i1[3], float i2[3]);
497 int LineIntersectLineStrict(float v1[3], float v2[3], float v3[3], float v4[3], float vi[3], float *lambda);
498 int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
499 int RayIntersectsTriangle(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
500 int RayIntersectsTriangleThreshold(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float threshold);
501 int SweepingSphereIntersectsTriangleUV(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint);
502 int AxialLineIntersectsTriangle(int axis, float co1[3], float co2[3], float v0[3], float v1[3], float v2[3], float *lambda);
503 int AabbIntersectAabb(float min1[3], float max1[3], float min2[3], float max2[3]);
504 void VecfCubicInterpol(float *x1, float *v1, float *x2, float *v2, float t, float *x, float *v);
505 void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
506 void PointInFace2DUV(int isquad, float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
507 int IsPointInTri2D(float v1[2], float v2[2], float v3[2], float pt[2]);
508 int IsPointInTri2DInts(int x1, int y1, int x2, int y2, int a, int b);
509 int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
510
511 float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3]);
512
513 typedef struct DualQuat {
514         float quat[4];
515         float trans[4];
516
517         float scale[4][4];
518         float scale_weight;
519 } DualQuat;
520
521 void Mat4ToDQuat(float basemat[][4], float mat[][4], DualQuat *dq);
522 void DQuatToMat4(DualQuat *dq, float mat[][4]);
523 void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight);
524 void DQuatNormalize(DualQuat *dq, float totweight);
525 void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3]);
526 void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2);
527                           
528 /* Tangent stuff */
529 typedef struct VertexTangent {
530         float tang[3], uv[2];
531         struct VertexTangent *next;
532 } VertexTangent;
533
534 void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, float *tang, float *uv);
535 float *find_vertex_tangent(VertexTangent *vtang, float *uv);
536 void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, float *co3, float *n, float *tang);
537
538 #ifdef __cplusplus
539 }
540 #endif
541         
542 #endif
543