Hopefully a working merge with trunk (could be one error left in raytrace.c - will...
[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 #ifndef M_PI
42 #define M_PI            3.14159265358979323846
43 #endif
44 #ifndef M_PI_2
45 #define M_PI_2          1.57079632679489661923
46 #endif
47 #ifndef M_SQRT2
48 #define M_SQRT2         1.41421356237309504880
49 #endif
50 #ifndef M_SQRT1_2
51 #define M_SQRT1_2       0.70710678118654752440
52 #endif
53 #ifndef M_1_PI
54 #define M_1_PI          0.318309886183790671538
55 #endif
56
57 #ifdef WIN32
58         #ifndef FREE_WINDOWS
59                 #define isnan(n) _isnan(n)
60                 #define finite _finite
61         #endif
62 #endif
63
64 #define MAT4_UNITY {{ 1.0, 0.0, 0.0, 0.0},\
65                                         { 0.0, 1.0, 0.0, 0.0},\
66                                         { 0.0, 0.0, 1.0, 0.0},\
67                                         { 0.0, 0.0, 0.0, 1.0}}
68
69 #define MAT3_UNITY {{ 1.0, 0.0, 0.0},\
70                                         { 0.0, 1.0, 0.0},\
71                                         { 0.0, 0.0, 1.0}}
72
73
74 void CalcCent3f(float *cent,  float *v1, float *v2, float *v3);
75 void CalcCent4f(float *cent, float *v1, float *v2, float *v3, float *v4);
76
77 void Crossf(float *c, float *a, float *b);
78 void Projf(float *c, float *v1, float *v2);
79
80 float Inpf(float *v1, float *v2);
81 float Inp2f(float *v1, float *v2);
82
83 float Normalize(float *n);
84 float Normalize2(float *n);
85
86 float Sqrt3f(float f);
87 double Sqrt3d(double d);
88
89 float saacos(float fac);
90 float saasin(float fac);
91 float sasqrt(float fac);
92
93 int FloatCompare(float *v1, float *v2, float limit);
94 int FloatCompare4(float *v1, float *v2, float limit);
95 float FloatLerpf(float target, float origin, float fac);
96
97 float CalcNormFloat(float *v1, float *v2, float *v3, float *n);
98 float CalcNormFloat4(float *v1, float *v2, float *v3, float *v4, float *n);
99
100 void CalcNormLong(int *v1, int *v2, int *v3, float *n);
101 /* CalcNormShort: is ook uitprodukt - (translates as 'is also out/cross product') */
102 void CalcNormShort(short *v1, short *v2, short *v3, float *n);
103 float power_of_2(float val);
104
105 /**
106  * @section Euler conversion routines
107  */
108
109 void EulToMat3(float *eul, float mat[][3]);
110 void EulToMat4(float *eul, float mat[][4]);
111
112 void Mat3ToEul(float tmat[][3], float *eul);
113 void Mat4ToEul(float tmat[][4],float *eul);
114
115 void EulToQuat(float *eul, float *quat);
116
117 void compatible_eul(float *eul, float *oldrot);
118
119 void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot);
120
121
122 /**
123  * @section Quaternion arithmetic routines
124  */
125
126 void QuatToEul(float *quat, float *eul);
127 void QuatOne(float *);
128 void QuatMul(float *, float *, float *);
129 void QuatMulVecf(float *q, float *v);
130 void QuatMulf(float *q, float f);
131 void QuatMulFac(float *q, float fac);
132
133 void NormalQuat(float *);
134 void VecRotToQuat(float *vec, float phi, float *quat);
135
136 void QuatSub(float *q, float *q1, float *q2);
137 void QuatConj(float *q);
138 void QuatInv(float *q);
139 float QuatDot(float *q1, float *q2);
140 void QuatCopy(float *q1, float *q2);
141
142 void printquat(char *str, float q[4]);
143
144 void QuatInterpol(float *result, float *quat1, float *quat2, float t);
145 void QuatAdd(float *result, float *quat1, float *quat2, float t);
146
147
148 /**
149  * @section matrix multiplication and copying routines
150  */
151
152 void Mat3MulFloat(float *m, float f);
153 void Mat4MulFloat(float *m, float f);
154 void Mat4MulFloat3(float *m, float f);
155
156 void Mat3Transp(float mat[][3]);
157 void Mat4Transp(float mat[][4]);
158
159 int Mat4Invert(float inverse[][4], float mat[][4]);
160 void Mat4InvertSimp(float inverse[][4], float mat[][4]);
161 void Mat4Inv(float *m1, float *m2);
162 void Mat4InvGG(float out[][4], float in[][4]);
163 void Mat3Inv(float m1[][3], float m2[][3]);
164
165 void Mat3CpyMat4(float m1[][3],float m2[][4]);
166 void Mat4CpyMat3(float m1[][4], float m2[][3]); 
167
168 void Mat3BlendMat3(float out[][3], float dst[][3], float src[][3], float srcweight);
169 void Mat4BlendMat4(float out[][4], float dst[][4], float src[][4], float srcweight);
170
171 float Det2x2(float a,float b,float c, float d);
172
173 float Det3x3(
174         float a1, float a2, float a3,
175         float b1, float b2, float b3,
176         float c1, float c2, float c3 
177 );
178
179 float Det4x4(float m[][4]);
180
181 void Mat3Adj(float m1[][3], float m[][3]);
182 void Mat4Adj(float out[][4], float in[][4]);
183
184 void Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4]);
185 void subMat4MulMat4(float *m1, float *m2, float *m3);
186 #ifndef TEST_ACTIVE
187 void Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3]);
188 #else
189 void Mat3MulMat3(float *m1, float *m3, float *m2);
190 #endif
191 void Mat4MulMat34(float (*m1)[4], float (*m3)[3], float (*m2)[4]);
192 void Mat4CpyMat4(float m1[][4], float m2[][4]);
193 void Mat4SwapMat4(float *m1, float *m2);
194 void Mat3CpyMat3(float m1[][3], float m2[][3]);
195
196 void Mat3MulSerie(float answ[][3],
197         float m1[][3], float m2[][3], float m3[][3],
198         float m4[][3], float m5[][3], float m6[][3],
199         float m7[][3], float m8[][3]
200 );
201
202 void Mat4MulSerie(float answ[][4], float m1[][4],
203         float m2[][4], float m3[][4], float m4[][4],
204         float m5[][4], float m6[][4], float m7[][4],
205         float m8[][4]
206 );
207         
208 void Mat4Clr(float *m);
209 void Mat3Clr(float *m);
210         
211 void Mat3One(float m[][3]);
212 void Mat4One(float m[][4]);
213
214 void Mat3Ortho(float mat[][3]);
215 void Mat4Ortho(float mat[][4]);
216
217 void VecMat4MulVecfl(float *in, float mat[][4], float *vec);
218 void Mat4MulMat43(float (*m1)[4], float (*m3)[4], float (*m2)[3]);
219 void Mat3IsMat3MulMat4(float m1[][3], float m2[][3], float m3[][4]);
220
221 void Mat4MulVec(float mat[][4],int *vec);
222 void Mat4MulVecfl(float mat[][4], float *vec);
223 void Mat4Mul3Vecfl(float mat[][4], float *vec);
224 void Mat4MulVec3Project(float mat[][4],float *vec);
225 void Mat4MulVec4fl(float mat[][4], float *vec);
226 void Mat3MulVec(float mat[][3],int *vec);
227 void Mat3MulVecfl(float mat[][3], float *vec);
228 void Mat3MulVecd(float mat[][3], double *vec);
229 void Mat3TransMulVecfl(float mat[][3], float *vec);
230
231 void Mat3AddMat3(float m1[][3], float m2[][3], float m3[][3]);
232 void Mat4AddMat4(float m1[][4], float m2[][4], float m3[][4]);
233
234 void VecUpMat3old(float *vec, float mat[][3], short axis);
235 void VecUpMat3(float *vec, float mat[][3], short axis);
236 void VecRotToMat3(float *vec, float phi, float mat[][3]);
237 void VecRotToMat4(float *vec, float phi, float mat[][4]);
238
239 void VecCopyf(float *v1, float *v2);
240 int VecLen(int *v1, int *v2);
241 float VecLenf(float *v1, float *v2);
242 float VecLength(float *v);
243 void VecMulf(float *v1, float f);
244 void VecNegf(float *v1);
245
246 int VecLenCompare(float *v1, float *v2, float limit);
247 int VecCompare(float *v1, float *v2, float limit);
248 int VecEqual(float *v1, float *v2);
249 int VecIsNull(float *v);
250
251 void printvecf(char *str,float v[3]);
252 void printvec4f(char *str, float v[4]);
253
254 void VecAddf(float *v, float *v1, float *v2);
255 void VecSubf(float *v, float *v1, float *v2);
256 void VecMulVecf(float *v, float *v1, float *v2);
257 void VecLerpf(float *target, float *a, float *b, float t);
258 void VecMidf(float *v, float *v1, float *v2);
259
260 void VecOrthoBasisf(float *v, float *v1, float *v2);
261
262 float Vec2Lenf(float *v1, float *v2);
263 float Vec2Length(float *v);
264 void Vec2Mulf(float *v1, float f);
265 void Vec2Addf(float *v, float *v1, float *v2);
266 void Vec2Subf(float *v, float *v1, float *v2);
267 void Vec2Copyf(float *v1, float *v2);
268 void Vec2Lerpf(float *target, float *a, float *b, float t);
269
270 void AxisAngleToQuat(float *q, float *axis, float angle);
271 void RotationBetweenVectorsToQuat(float *q, float v1[3], float v2[3]);
272 void vectoquat(float *vec, short axis, short upflag, float *q);
273
274 float VecAngle2(float *v1, float *v2);
275 float VecAngle3(float *v1, float *v2, float *v3);
276 float NormalizedVecAngle2(float *v1, float *v2);
277
278 float VecAngle3_2D(float *v1, float *v2, float *v3);
279 float NormalizedVecAngle2_2D(float *v1, float *v2);
280
281 void euler_rot(float *beul, float ang, char axis);
282         
283 void NormalShortToFloat(float *out, short *in);
284 void NormalFloatToShort(short *out, float *in);
285
286 float DistVL2Dfl(float *v1, float *v2, float *v3);
287 float PdistVL2Dfl(float *v1, float *v2, float *v3);
288 float PdistVL3Dfl(float *v1, float *v2, float *v3);
289 void PclosestVL3Dfl(float *closest, float *v1, float *v2, float *v3);
290 float AreaF2Dfl(float *v1, float *v2, float *v3);
291 float AreaQ3Dfl(float *v1, float *v2, float *v3, float *v4);
292 float AreaT3Dfl(float *v1, float *v2, float *v3);
293 float AreaPoly3Dfl(int nr, float *verts, float *normal);
294
295 /* intersect Line-Line
296         return:
297         -1: colliniar
298          0: no intersection of segments
299          1: exact intersection of segments
300          2: cross-intersection of segments
301 */
302 extern short IsectLL2Df(float *v1, float *v2, float *v3, float *v4);
303 extern short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4);
304
305 /*point in tri,  0 no intersection, 1 intersect */
306 int IsectPT2Df(float pt[2], float v1[2], float v2[2], float v3[2]);
307 /* point in quad,  0 no intersection, 1 intersect */
308 int IsectPQ2Df(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2]);
309
310 /* interpolation weights of point in a triangle or quad, v4 may be NULL */
311 void InterpWeightsQ3Dfl(float *v1, float *v2, float *v3, float *v4, float *co, float *w);
312 /* interpolation weights of point in a polygon with >= 3 vertices */
313 void MeanValueWeights(float v[][3], int n, float *co, float *w);
314
315 void i_lookat(
316         float vx, float vy, 
317         float vz, float px, 
318         float py, float pz, 
319         float twist, float mat[][4]
320 );
321
322 void i_window(
323         float left, float right,
324         float bottom, float top,
325         float nearClip, float farClip,
326         float mat[][4]
327 );
328
329 #define BLI_CS_SMPTE    0
330 #define BLI_CS_REC709   1
331 #define BLI_CS_CIE              2
332
333 void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
334 void hex_to_rgb(char *hexcol, float *r, float *g, float *b);
335 void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv);
336 void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb);
337 void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb);
338 void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr);
339 void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
340 void xyz_to_rgb(float x, float y, float z, float *r, float *g, float *b, int colorspace);
341 int constrain_rgb(float *r, float *g, float *b);
342 void gamma_correct_rgb(float *r, float *g, float *b);
343 unsigned int hsv_to_cpack(float h, float s, float v);
344 unsigned int rgb_to_cpack(float r, float g, float b);
345 void cpack_to_rgb(unsigned int col, float *r, float *g, float *b);
346 void MinMaxRGB(short c[]);
347
348
349
350 void VecStar(float mat[][3],float *vec);
351
352 short EenheidsMat(float mat[][3]);
353
354 void QuatToMat3(float *q, float m[][3]);
355 void QuatToMat4(float *q, float m[][4]);
356
357 void Mat3ToQuat_is_ok(float wmat[][3], float *q);
358
359 void i_ortho(float left, float right, float bottom, float top, float nearClip, float farClip, float matrix[][4]);
360 void i_polarview(float dist, float azimuth, float incidence, float twist, float Vm[][4]);
361 void i_translate(float Tx, float Ty, float Tz, float mat[][4]);
362 void i_multmatrix(float icand[][4], float Vm[][4]);
363 void i_rotate(float angle, char axis, float mat[][4]);
364
365
366
367
368
369 void MinMax3(float *min, float *max, float *vec);
370 void SizeToMat3(float *size, float mat[][3]);
371 void SizeToMat4(float *size, float mat[][4]);
372
373 float Mat3ToScalef(float mat[][3]);
374 float Mat4ToScalef(float mat[][4]);
375
376 void printmatrix3(char *str, float m[][3]);
377 void printmatrix4(char *str, float m[][4]);
378
379 /* uit Sig.Proc.85 pag 253 */
380 void Mat3ToQuat(float wmat[][3], float *q);
381 void Mat4ToQuat(float m[][4], float *q);
382
383 void Mat3ToSize(float mat[][3], float *size);
384 void Mat4ToSize(float mat[][4], float *size);
385
386 void triatoquat(float *v1, float *v2, float *v3, float *quat);
387
388 void LocEulSizeToMat4(float mat[][4], float loc[3], float eul[3], float size[3]);
389 void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3]);
390
391 void tubemap(float x, float y, float z, float *u, float *v);
392 void spheremap(float x, float y, float z, float *u, float *v);
393
394 int LineIntersectLine(float v1[3], float v2[3], float v3[3], float v4[3], float i1[3], float i2[3]);
395 int LineIntersectLineStrict(float v1[3], float v2[3], float v3[3], float v4[3], float vi[3], float *lambda);
396 int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
397 int RayIntersectsTriangle(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
398 int RayIntersectsTriangleThreshold(float p1[3], float d[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv, float threshold);
399 int SweepingSphereIntersectsTriangleUV(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint);
400 int AxialLineIntersectsTriangle(int axis, float co1[3], float co2[3], float v0[3], float v1[3], float v2[3], float *lambda);
401 int AabbIntersectAabb(float min1[3], float max1[3], float min2[3], float max2[3]);
402 void VecfCubicInterpol(float *x1, float *v1, float *x2, float *v2, float t, float *x, float *v);
403 void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
404 void PointInFace2DUV(int isquad, float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
405 int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
406
407 float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3]);
408
409 typedef struct DualQuat {
410         float quat[4];
411         float trans[4];
412
413         float scale[4][4];
414         float scale_weight;
415 } DualQuat;
416
417 void Mat4ToDQuat(float basemat[][4], float mat[][4], DualQuat *dq);
418 void DQuatToMat4(DualQuat *dq, float mat[][4]);
419 void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight);
420 void DQuatNormalize(DualQuat *dq, float totweight);
421 void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3]);
422 void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2);
423                           
424 /* Tangent stuff */
425 typedef struct VertexTangent {
426         float tang[3], uv[2];
427         struct VertexTangent *next;
428 } VertexTangent;
429
430 void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, float *tang, float *uv);
431 float *find_vertex_tangent(VertexTangent *vtang, float *uv);
432 void tangent_from_uv(float *uv1, float *uv2, float *uv3, float *co1, float *co2, float *co3, float *n, float *tang);
433
434 #ifdef __cplusplus
435 }
436 #endif
437         
438 #endif
439