Merge from Harmonic Skeleton branch
[blender.git] / source / blender / blenlib / BLI_arithb.h
index 2942439504c144158cbc338bb6fab5dc1eb871db..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,7 +132,6 @@ 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);
 
@@ -247,6 +252,7 @@ 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);
@@ -280,6 +286,11 @@ 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 */
@@ -357,9 +368,17 @@ 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];
@@ -371,7 +390,7 @@ typedef struct 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, float factor);
+void DQuatNormalize(DualQuat *dq, float totweight);
 void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3]);
 void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2);