Merge from Harmonic Skeleton branch
[blender.git] / source / blender / blenlib / BLI_arithb.h
index a732f09ca58fc8f85abd38c64df6415123d0e705..1e86f8fe5b37b6150b3ac985431eb17052bdb54d 100644 (file)
@@ -54,6 +54,10 @@ extern "C" {
 #define M_SQRT1_2      0.70710678118654752440
 #endif
 
+#ifdef WIN32
+    #define isnan(n) _isnan(n)
+#endif
+
 #define MAT4_UNITY {{ 1.0, 0.0, 0.0, 0.0},\
                                        { 0.0, 1.0, 0.0, 0.0},\
                                        { 0.0, 0.0, 1.0, 0.0},\
@@ -119,6 +123,8 @@ void QuatToEul(float *quat, float *eul);
 void QuatOne(float *);
 void QuatMul(float *, float *, float *);
 void QuatMulVecf(float *q, float *v);
+void QuatMulf(float *q, float f);
+void QuatMulFac(float *q, float fac);
 
 void NormalQuat(float *);
 void VecRotToQuat(float *vec, float phi, float *quat);
@@ -126,8 +132,8 @@ void VecRotToQuat(float *vec, float phi, float *quat);
 void QuatSub(float *q, float *q1, float *q2);
 void QuatConj(float *q);
 void QuatInv(float *q);
-void QuatMulf(float *q, float f);
 float QuatDot(float *q1, float *q2);
+void QuatCopy(float *q1, float *q2);
 
 void printquat(char *str, float q[4]);
 
@@ -217,6 +223,8 @@ void Mat3MulVecfl(float mat[][3], float *vec);
 void Mat3MulVecd(float mat[][3], double *vec);
 void Mat3TransMulVecfl(float mat[][3], float *vec);
 
+void Mat3AddMat3(float m1[][3], float m2[][3], float m3[][3]);
+void Mat4AddMat4(float m1[][4], float m2[][4], float m3[][4]);
 
 void VecUpMat3old(float *vec, float mat[][3], short axis);
 void VecUpMat3(float *vec, float mat[][3], short axis);
@@ -241,7 +249,10 @@ void VecSubf(float *v, float *v1, float *v2);
 void VecLerpf(float *target, float *a, float *b, float t);
 void VecMidf(float *v, float *v1, float *v2);
 
+void VecOrthoBasisf(float *v, float *v1, float *v2);
+
 float Vec2Lenf(float *v1, float *v2);
+float Vec2Length(float *v);
 void Vec2Mulf(float *v1, float f);
 void Vec2Addf(float *v, float *v1, float *v2);
 void Vec2Subf(float *v, float *v1, float *v2);
@@ -275,9 +286,15 @@ float AreaPoly3Dfl(int nr, float *verts, float *normal);
 extern short IsectLL2Df(float *v1, float *v2, float *v3, float *v4);
 extern short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4);
 
+/*point in tri,  0 no intersection, 1 intersect */
+int IsectPT2Df(float pt[2], float v1[2], float v2[2], float v3[2]);
+/* point in quad,  0 no intersection, 1 intersect */
+int IsectPQ2Df(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2]);
+
 /* interpolation weights of point in a triangle or quad, v4 may be NULL */
 void InterpWeightsQ3Dfl(float *v1, float *v2, float *v3, float *v4, float *co, float *w);
-
+/* interpolation weights of point in a polygon with >= 3 vertices */
+void MeanValueWeights(float v[][3], int n, float *co, float *w);
 
 void i_lookat(
        float vx, float vy, 
@@ -330,6 +347,9 @@ void MinMax3(float *min, float *max, float *vec);
 void SizeToMat3(float *size, float mat[][3]);
 void SizeToMat4(float *size, float mat[][4]);
 
+float Mat3ToScalef(float mat[][3]);
+float Mat4ToScalef(float mat[][4]);
+
 void printmatrix3(char *str, float m[][3]);
 void printmatrix4(char *str, float m[][4]);
 
@@ -348,9 +368,32 @@ void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3
 void tubemap(float x, float y, float z, float *u, float *v);
 void spheremap(float x, float y, float z, float *u, float *v);
 
-int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda);
+int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
+int SweepingSphereIntersectsTriangleUV(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint);
+int AxialLineIntersectsTriangle(int axis, float co1[3], float co2[3], float v0[3], float v1[3], float v2[3], float *lambda);
+int AabbIntersectAabb(float min1[3], float max1[3], float min2[3], float max2[3]);
+void VecfCubicInterpol(float *x1, float *v1, float *x2, float *v2, float t, float *x, float *v);
+void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
+void PointInFace2DUV(int isquad, float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
 int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
 
+float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3]);
+
+typedef struct DualQuat {
+       float quat[4];
+       float trans[4];
+
+       float scale[4][4];
+       float scale_weight;
+} DualQuat;
+
+void Mat4ToDQuat(float basemat[][4], float mat[][4], DualQuat *dq);
+void DQuatToMat4(DualQuat *dq, float mat[][4]);
+void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight);
+void DQuatNormalize(DualQuat *dq, float totweight);
+void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3]);
+void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2);
+                         
 #ifdef __cplusplus
 }
 #endif