Math Lib
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 10 Nov 2009 19:13:05 +0000 (19:13 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 10 Nov 2009 19:13:05 +0000 (19:13 +0000)
* Fix remaining issues before conversion.
* Inline various vector functions, currently enabled for all platforms.
  I expect this to work in GCC/MSVC at least, if other platforms don't
  support it, #ifdef's can be added.

source/blender/blenlib/BLI_math_geom.h
source/blender/blenlib/BLI_math_matrix.h
source/blender/blenlib/BLI_math_rotation.h
source/blender/blenlib/BLI_math_vector.h
source/blender/blenlib/intern/math_geom.c
source/blender/blenlib/intern/math_matrix.c
source/blender/blenlib/intern/math_rotation.c
source/blender/blenlib/intern/math_vector.c
source/blender/blenlib/intern/math_vector_inline.c [new file with mode: 0644]

index 05530bce0e57e527d990628276f4e671b23587c5..d54be9d5e0308ec0d4e37aec6e141f40270b450e 100644 (file)
@@ -43,7 +43,7 @@ float normal_quad_v3(float r[3], float a[3], float b[3], float c[3], float d[3])
 float area_tri_v2(float a[2], float b[2], float c[2]);
 float area_tri_v3(float a[3], float b[3], float c[3]);
 float area_quad_v3(float a[3], float b[3], float c[3], float d[3]);
-float area_poly_v3(int nr, float *verts, float normal[3]); // TODO float verts[][3]
+float area_poly_v3(int nr, float verts[][3], float normal[3]);
 
 /********************************* Distance **********************************/
 
@@ -56,7 +56,6 @@ void closest_to_line_segment_v3(float r[3], float p[3], float l1[3], float l2[3]
 
 /******************************* Intersection ********************************/
 
-/* TODO return values are not always first yet */
 /* TODO int return value consistency */
 
 /* line-line */
@@ -65,8 +64,8 @@ void closest_to_line_segment_v3(float r[3], float p[3], float l1[3], float l2[3]
 #define ISECT_LINE_LINE_EXACT           1
 #define ISECT_LINE_LINE_CROSS           2
 
-short isect_line_line_v2(float a1[2], float a2[2], float b1[2], float b2[2]); // TODO return int
-short isect_line_line_v2_short(short a1[2], short a2[2], short b1[2], short b2[2]); // TODO return int
+int isect_line_line_v2(float a1[2], float a2[2], float b1[2], float b2[2]);
+int isect_line_line_v2_short(short a1[2], short a2[2], short b1[2], short b2[2]);
 
 /* Returns the number of point of interests
  * 0 - lines are colinear
index 9a9c1be6258281cb4b92bea4e7e49dadc455c99f..53476e4d03cb7595b2bd7cb8a75fa15bf4256f01 100644 (file)
@@ -43,8 +43,8 @@ extern "C" {
                                        { 0.0, 1.0, 0.0},\
                                        { 0.0, 0.0, 1.0}}
 
-void zero_m3(float *R); // TODO R[3][3]);
-void zero_m4(float *R); // TODO R[4][4]);
+void zero_m3(float R[3][3]);
+void zero_m4(float R[4][4]);
 
 void unit_m3(float R[3][3]);
 void unit_m4(float R[4][4]);
@@ -62,8 +62,6 @@ void swap_m4m4(float A[4][4], float B[4][4]);
 void add_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
 void add_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
 
-// TODO review mul order
-
 void mul_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
 void mul_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
 void mul_m4_m3m4(float R[4][4], float A[3][3], float B[4][4]);
@@ -77,24 +75,24 @@ void mul_serie_m4(float R[4][4],
        float M1[4][4], float M2[4][4], float M3[4][4], float M4[4][4],
        float M5[4][4], float M6[4][4], float M7[4][4], float M8[4][4]);
 
-void mul_m4_v3(float M[4][4], float r[3]); // TODO order
+void mul_m4_v3(float M[4][4], float r[3]);
 void mul_v3_m4v3(float r[3], float M[4][4], float v[3]);
-void mul_no_transl_m4v3(float M[4][4], float r[3]);
-void mul_m4_v4(float M[4][4], float r[3]); // TODO order
-void mul_project_m4_v4(float M[4][4], float r[3]); // TODO order
+void mul_mat3_m4_v3(float M[4][4], float r[3]);
+void mul_m4_v4(float M[4][4], float r[3]);
+void mul_project_m4_v4(float M[4][4], float r[3]);
 
-void mul_m3_v3(float M[3][3], float r[3]); // TODO order
-void mul_transposed_m3_v3(float M[3][3], float r[3]); // TODO order
+void mul_m3_v3(float M[3][3], float r[3]);
+void mul_transposed_m3_v3(float M[3][3], float r[3]);
 void mul_m3_v3_double(float M[3][3], double r[3]);
 
-void mul_m3_fl(float *R, float f); // TODO R[3][3], float f);
-void mul_m4_fl(float *R, float f); // TODO R[4][4], float f);
-void mul_no_transl_m4_fl(float *R, float f); // TODO R[4][4], float f);
+void mul_m3_fl(float R[3][3], float f);
+void mul_m4_fl(float R[4][4], float f);
+void mul_mat3_m4_fl(float R[4][4], float f);
 
-void invert_m3(float R[3][3]);
-void invert_m3_m3(float R[3][3], float A[3][3]);
-void invert_m4(float R[4][4]); // TODO does not exist
-int invert_m4_m4(float R[4][4], float A[4][4]); // TODO return int
+int invert_m3(float R[3][3]);
+int invert_m3_m3(float R[3][3], float A[3][3]);
+int invert_m4(float R[4][4]);
+int invert_m4_m4(float R[4][4], float A[4][4]);
 
 /****************************** Linear Algebra *******************************/
 
@@ -113,9 +111,6 @@ int is_orthogonal_m4(float mat[4][4]);
 void adjoint_m3_m3(float R[3][3], float A[3][3]);
 void adjoint_m4_m4(float R[4][4], float A[4][4]);
 
-//float determinant_m2(float A[2][2]); // TODO params
-//float determinant_m3(float A[3][3]); // TODO params
-
 float determinant_m2(
        float a, float b,
        float c, float d);
index b1546e3db6c1c9f9ec33d3664b6a65b568956d56..814dc3ba1a6191c6d2a4bef9055eb015bc6e53c3 100644 (file)
@@ -44,7 +44,7 @@ void copy_qt_qt(float q[4], float a[4]);
 
 /* arithmetic */
 void mul_qt_qtqt(float q[4], float a[4], float b[4]);
-void mul_qt_v3(float q[4], float r[3]); // TODO order
+void mul_qt_v3(float q[4], float r[3]);
 void mul_qt_fl(float q[4], float f);
 void mul_fac_qt_fl(float q[4], float f);
 
@@ -60,7 +60,7 @@ int is_zero_qt(float q[4]);
 
 /* interpolation */
 void interp_qt_qtqt(float q[4], float a[4], float b[4], float t);
-void add_qt_qtqt(float q[4], float a[4], float b[4], float t); // TODO name
+void add_qt_qtqt(float q[4], float a[4], float b[4], float t);
 
 /* conversion */
 void quat_to_mat3(float mat[3][3], float q[4]);
@@ -72,8 +72,6 @@ void tri_to_quat(float q[4], float a[3], float b[3], float c[3]);
 void vec_to_quat(float q[4], float vec[3], short axis, short upflag);
 void rotation_between_vecs_to_quat(float q[4], float v1[3], float v2[3]);
 
-void Mat3ToQuat_is_ok(float wmat[][3], float *q); // TODO what is this?
-
 /* other */
 void print_qt(char *str, float q[4]);
 
@@ -96,7 +94,7 @@ void mat4_to_axis_angle(float axis[3], float *angle, float M[4][4]);
 void mat3_to_vec_rot(float vec[3], float *phi, float mat[3][3]);
 void mat4_to_vec_rot(float vec[3], float *phi, float mat[4][4]);
 
-void vec_rot_to_quat(float quat[4], float vec[3], float phi); // TODO
+void vec_rot_to_quat(float quat[4], float vec[3], float phi);
 void vec_rot_to_mat3(float mat[3][3], float vec[3], float phi);
 void vec_rot_to_mat4(float mat[4][4], float vec[3], float phi);
 
index 1cb1912208e27766ee2cc40e472f15c7eebbdf4a..26602353425baf96ed93f48b94dbdac772dc0b3c 100644 (file)
 extern "C" {
 #endif
 
+/* add platform/compiler checks here if it is not supported */
+#define BLI_MATH_INLINE
+
+#ifdef BLI_MATH_INLINE
+#ifdef _MSC_VER
+#define MINLINE static __inline
+#else
+#define MINLINE static inline
+#endif
+#include "intern/math_vector_inline.c"
+#else
 #define MINLINE
-
-//#define static inline
-//#include "intern/math_vector_inline.h"
+#endif
 
 /************************************* Init ***********************************/
 
-void zero_v2(float r[2]);
-void zero_v3(float r[3]);
+MINLINE void zero_v2(float r[2]);
+MINLINE void zero_v3(float r[3]);
 
-void copy_v2_v2(float r[2], float a[2]);
-void copy_v3_v3(float r[3], float a[3]);
+MINLINE void copy_v2_v2(float r[2], float a[2]);
+MINLINE void copy_v3_v3(float r[3], float a[3]);
 
 /********************************* Arithmetic ********************************/
 
-void add_v2_v2(float r[2], float a[2]);
-void add_v2_v2v2(float r[2], float a[2], float b[2]);
-void add_v3_v3(float r[3], float a[3]);
-void add_v3_v3v3(float r[3], float a[3], float b[3]);
+MINLINE void add_v2_v2(float r[2], float a[2]);
+MINLINE void add_v2_v2v2(float r[2], float a[2], float b[2]);
+MINLINE void add_v3_v3(float r[3], float a[3]);
+MINLINE void add_v3_v3v3(float r[3], float a[3], float b[3]);
 
-void sub_v2_v2(float r[2], float a[2]);
-void sub_v2_v2v2(float r[2], float a[2], float b[2]);
-void sub_v3_v3(float r[3], float a[3]);
-void sub_v3_v3v3(float r[3], float a[3], float b[3]);
+MINLINE void sub_v2_v2(float r[2], float a[2]);
+MINLINE void sub_v2_v2v2(float r[2], float a[2], float b[2]);
+MINLINE void sub_v3_v3(float r[3], float a[3]);
+MINLINE void sub_v3_v3v3(float r[3], float a[3], float b[3]);
 
-void mul_v2_fl(float r[2], float f);
-void mul_v3_fl(float r[3], float f);
-void mul_v3_v3fl(float r[3], float a[3], float f);
-void mul_v3_v3(float r[3], float a[3]);
-void mul_v3_v3v3(float r[3], float a[3], float b[3]);
+MINLINE void mul_v2_fl(float r[2], float f);
+MINLINE void mul_v3_fl(float r[3], float f);
+MINLINE void mul_v3_v3fl(float r[3], float a[3], float f);
+MINLINE void mul_v3_v3(float r[3], float a[3]);
+MINLINE void mul_v3_v3v3(float r[3], float a[3], float b[3]);
 
-void negate_v3(float r[3]);
-void negate_v3_v3(float r[3], float a[3]);
+MINLINE void negate_v3(float r[3]);
+MINLINE void negate_v3_v3(float r[3], float a[3]);
 
-float dot_v2v2(float a[2], float b[2]); 
-float dot_v3v3(float a[3], float b[3]);
+MINLINE float dot_v2v2(float a[2], float b[2]); 
+MINLINE float dot_v3v3(float a[3], float b[3]);
 
-float cross_v2v2(float a[2], float b[2]);
-void cross_v3_v3v3(float r[3], float a[3], float b[3]);
+MINLINE float cross_v2v2(float a[2], float b[2]);
+MINLINE void cross_v3_v3v3(float r[3], float a[3], float b[3]);
 
-void star_m3_v3(float R[3][3],float a[3]);
+MINLINE void star_m3_v3(float R[3][3],float a[3]);
 
 /*********************************** Length **********************************/
 
-float len_v2(float a[2]);
-float len_v2v2(float a[2], float b[2]);
-float len_v3(float a[3]);
-float len_v3v3(float a[3], float b[3]);
+MINLINE float len_v2(float a[2]);
+MINLINE float len_v2v2(float a[2], float b[2]);
+MINLINE float len_v3(float a[3]);
+MINLINE float len_v3v3(float a[3], float b[3]);
 
-float normalize_v2(float r[2]);
-float normalize_v3(float r[3]);
+MINLINE float normalize_v2(float r[2]);
+MINLINE float normalize_v3(float r[3]);
 
 /******************************* Interpolation *******************************/
 
-void interp_v2_v2v2(float r[2], const float a[2], const float b[2], const float t); // TODO const
-void interp_v2_v2v2v2(float r[2], const float a[2], const float b[2], const float c[3], const float t[3]); // TODO const
-void interp_v3_v3v3(float r[3], const float a[3], const float b[3], const float t); // TODO const
-void interp_v3_v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3]); // TODO const
+void interp_v2_v2v2(float r[2], float a[2], float b[2], float t);
+void interp_v2_v2v2v2(float r[2], float a[2], float b[2], float c[3], float t[3]);
+void interp_v3_v3v3(float r[3], float a[3], float b[3], float t);
+void interp_v3_v3v3v3(float p[3], float v1[3], float v2[3], float v3[3], float w[3]);
 
 void mid_v3_v3v3(float r[3], float a[3], float b[3]);
 
index 5c7890ffee478876604a34c2fbc16c95316d6d6d..30dce25fea3c9c3bc436ccf594c852c95a25cb46 100644 (file)
@@ -124,7 +124,7 @@ float area_tri_v3(float *v1, float *v2, float *v3)  /* Triangles */
 #define MAX3(x,y,z)            MAX2(MAX2((x),(y)) , (z))
 
 
-float area_poly_v3(int nr, float *verts, float *normal)
+float area_poly_v3(int nr, float verts[][3], float *normal)
 {
        float x, y, z, area, max;
        float *cur, *prev;
@@ -142,13 +142,13 @@ float area_poly_v3(int nr, float *verts, float *normal)
        }
 
        /* The Trapezium Area Rule */
-       prev= verts+3*(nr-1);
-       cur= verts;
+       prev= verts[nr-1];
+       cur= verts[0];
        area= 0;
        for(a=0; a<nr; a++) {
                area+= (cur[px]-prev[px])*(cur[py]+prev[py]);
-               prev= cur;
-               cur+=3;
+               prev= verts[a];
+               cur= verts[a+1];
        }
 
        return (float)fabs(0.5*area/max);
@@ -232,7 +232,7 @@ float dist_to_line_segment_v3(float *v1, float *v2, float *v3)
 /******************************* Intersection ********************************/
 
 /* intersect Line-Line, shorts */
-short isect_line_line_v2_short(short *v1, short *v2, short *v3, short *v4)
+int isect_line_line_v2_short(short *v1, short *v2, short *v3, short *v4)
 {
        /* return:
        -1: colliniar
@@ -257,7 +257,7 @@ short isect_line_line_v2_short(short *v1, short *v2, short *v3, short *v4)
 }
 
 /* intersect Line-Line, floats */
-short isect_line_line_v2(float *v1, float *v2, float *v3, float *v4)
+int isect_line_line_v2(float *v1, float *v2, float *v3, float *v4)
 {
        /* return:
        -1: colliniar
index f25f24927b4da70ecbbbb2fa30beb107d77c404b..edab1cc2440e96ff2c3e8771bf53b9c991413181 100644 (file)
 
 /********************************* Init **************************************/
 
-void zero_m3(float *m)
+void zero_m3(float m[3][3])
 {
        memset(m, 0, 3*3*sizeof(float));
 }
 
-void zero_m4(float *m)
+void zero_m4(float m[4][4])
 {
        memset(m, 0, 4*4*sizeof(float));
 }
@@ -183,6 +183,7 @@ void mul_m4_m4m3(float (*m1)[4], float (*m3)[4], float (*m2)[3])
        m1[2][1]= m2[2][0]*m3[0][1] + m2[2][1]*m3[1][1] + m2[2][2]*m3[2][1];
        m1[2][2]= m2[2][0]*m3[0][2] + m2[2][1]*m3[1][2] + m2[2][2]*m3[2][2];
 }
+
 /* m1 = m2 * m3, ignore the elements on the 4th row/column of m3*/
 void mul_m3_m3m4(float m1[][3], float m2[][3], float m3[][4])
 {
@@ -200,8 +201,6 @@ void mul_m3_m3m4(float m1[][3], float m2[][3], float m3[][4])
     m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] +m2[2][2] * m3[2][2];
 }
 
-
-
 void mul_m4_m3m4(float (*m1)[4], float (*m3)[3], float (*m2)[4])
 {
        m1[0][0]= m2[0][0]*m3[0][0] + m2[0][1]*m3[1][0] + m2[0][2]*m3[2][0];
@@ -223,7 +222,6 @@ void mul_serie_m3(float answ[][3],
        float temp[3][3];
        
        if(m1==0 || m2==0) return;
-
        
        mul_m3_m3m3(answ, m2, m1);
        if(m3) {
@@ -304,7 +302,7 @@ void mul_v3_m4v3(float *in, float mat[][4], float *vec)
        in[2]= x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2] + mat[3][2];
 }
 
-void mul_no_transl_m4v3(float mat[][4], float *vec)
+void mul_mat3_m4_v3(float mat[][4], float *vec)
 {
        float x,y;
 
@@ -362,30 +360,31 @@ void mul_transposed_m3_v3(float mat[][3], float *vec)
        vec[2]= x*mat[2][0] + y*mat[2][1] + mat[2][2]*vec[2];
 }
 
-void mul_m3_fl(float *m, float f)
+void mul_m3_fl(float m[3][3], float f)
 {
-       int i;
+       int i, j;
 
-       for(i=0;i<9;i++) m[i]*=f;
+       for(i=0;i<3;i++)
+               for(j=0;j<3;j++)
+                       m[i][j] *= f;
 }
 
-void mul_m4_fl(float *m, float f)
+void mul_m4_fl(float m[4][4], float f)
 {
-       int i;
+       int i, j;
 
-       for(i=0;i<16;i++) m[i]*=f;      /* count to 12: without vector component */
+       for(i=0;i<4;i++)
+               for(j=0;j<4;j++)
+                       m[i][j] *= f;
 }
 
-void mul_no_transl_m4_fl(float *m, float f)            /* only scale component */
+void mul_mat3_m4_fl(float m[4][4], float f)
 {
-       int i,j;
+       int i, j;
 
-       for(i=0; i<3; i++) {
-               for(j=0; j<3; j++) {
-                       
-                       m[4*i+j] *= f;
-               }
-       }
+       for(i=0; i<3; i++)
+               for(j=0; j<3; j++)
+                       m[i][j] *= f;
 }
 
 void mul_m3_v3_double(float mat[][3], double *vec)
@@ -417,10 +416,21 @@ void add_m4_m4m4(float m1[][4], float m2[][4], float m3[][4])
                        m1[i][j]= m2[i][j] + m3[i][j];
 }
 
-void invert_m3_m3(float m1[][3], float m2[][3])
+int invert_m3(float m[3][3])
+{
+       float tmp[3][3];
+       int success;
+
+       success= invert_m3_m3(tmp, m);
+       copy_m3_m3(m, tmp);
+
+       return success;
+}
+
+int invert_m3_m3(float m1[3][3], float m2[3][3])
 {
-       short a,b;
        float det;
+       int a, b, success;
 
        /* calc adjoint */
        adjoint_m3_m3(m1,m2);
@@ -430,6 +440,8 @@ void invert_m3_m3(float m1[][3], float m2[][3])
            -m2[1][0]* (m2[0][1]*m2[2][2] - m2[0][2]*m2[2][1])
            +m2[2][0]* (m2[0][1]*m2[1][2] - m2[0][2]*m2[1][1]);
 
+       success= (det != 0);
+
        if(det==0) det=1;
        det= 1/det;
        for(a=0;a<3;a++) {
@@ -437,6 +449,19 @@ void invert_m3_m3(float m1[][3], float m2[][3])
                        m1[a][b]*=det;
                }
        }
+
+       return success;
+}
+
+int invert_m4(float m[4][4])
+{
+       float tmp[4][4];
+       int success;
+
+       success= invert_m4_m4(tmp, m);
+       copy_m4_m4(m, tmp);
+
+       return success;
 }
 
 /*
@@ -448,7 +473,7 @@ void invert_m3_m3(float m1[][3], float m2[][3])
  *                                     Mark Segal - 1992
  */
 
-int invert_m4_m4(float inverse[][4], float mat[][4])
+int invert_m4_m4(float inverse[4][4], float mat[4][4])
 {
        int i, j, k;
        double temp;
index 85436d3a639147f6ffbe880cda89a7a0ed19e4da..ea7851858fe63765a6cdf4b3e229b7c14dec78b6 100644 (file)
@@ -209,7 +209,7 @@ void quat_to_mat4(float m[][4], float *q)
        m[3][3]= 1.0f;
 }
 
-void mat3_to_quat(float *q,float wmat[][3])
+void mat3_to_quat(float *q, float wmat[][3])
 {
        double tr, s;
        float mat[3][3];
@@ -257,53 +257,9 @@ void mat3_to_quat(float *q,float wmat[][3])
                        q[2]= (float)((mat[2][1] + mat[1][2])*s);
                }
        }
-       normalize_qt(q);
-}
-
-#if 0
-void Mat3ToQuat_is_ok(float wmat[][3], float *q)
-{
-       float mat[3][3], matr[3][3], matn[3][3], q1[4], q2[4], angle, si, co, nor[3];
-
-       /* work on a copy */
-       copy_m3_m3(mat, wmat);
-       normalize_m3(mat);
-       
-       /* rotate z-axis of matrix to z-axis */
-
-       nor[0] = mat[2][1];             /* cross product with (0,0,1) */
-       nor[1] =  -mat[2][0];
-       nor[2] = 0.0;
-       normalize_v3(nor);
-       
-       co= mat[2][2];
-       angle= 0.5f*saacos(co);
-       
-       co= (float)cos(angle);
-       si= (float)sin(angle);
-       q1[0]= co;
-       q1[1]= -nor[0]*si;              /* negative here, but why? */
-       q1[2]= -nor[1]*si;
-       q1[3]= -nor[2]*si;
 
-       /* rotate back x-axis from mat, using inverse q1 */
-       quat_to_mat3(matr,q1);
-       invert_m3_m3(matn, matr);
-       mul_m3_v3(matn, mat[0]);
-       
-       /* and align x-axes */
-       angle= (float)(0.5*atan2(mat[0][1], mat[0][0]));
-       
-       co= (float)cos(angle);
-       si= (float)sin(angle);
-       q2[0]= co;
-       q2[1]= 0.0f;
-       q2[2]= 0.0f;
-       q2[3]= si;
-       
-       mul_qt_qtqt(q, q1, q2);
+       normalize_qt(q);
 }
-#endif
 
 void mat4_to_quat(float *q, float m[][4])
 {
@@ -311,20 +267,17 @@ void mat4_to_quat(float *q, float m[][4])
        
        copy_m3_m4(mat, m);
        mat3_to_quat(q,mat);
-       
 }
 
 void normalize_qt(float *q)
 {
        float len;
        
-       len= (float)sqrt(q[0]*q[0]+q[1]*q[1]+q[2]*q[2]+q[3]*q[3]);
+       len= (float)sqrt(dot_qtqt(q, q));
        if(len!=0.0) {
-               q[0]/= len;
-               q[1]/= len;
-               q[2]/= len;
-               q[3]/= len;
-       } else {
+               mul_qt_fl(q, 1.0f/len);
+       }
+       else {
                q[1]= 1.0f;
                q[0]= q[2]= q[3]= 0.0f;                 
        }
@@ -1422,7 +1375,7 @@ void add_weighted_dq_dq(DualQuat *dqsum, DualQuat *dq, float weight)
                        weight= -weight;
                
                copy_m4_m4(wmat, dq->scale);
-               mul_m4_fl((float*)wmat, weight);
+               mul_m4_fl(wmat, weight);
                add_m4_m4m4(dqsum->scale, dqsum->scale, wmat);
                dqsum->scale_weight += weight;
        }
@@ -1445,7 +1398,7 @@ void normalize_dq(DualQuat *dq, float totweight)
                        dq->scale[3][3] += addweight;
                }
 
-               mul_m4_fl((float*)dq->scale, scale);
+               mul_m4_fl(dq->scale, scale);
                dq->scale_weight= 1.0f;
        }
 }
@@ -1496,7 +1449,7 @@ void mul_v3m3_dq(float *co, float mat[][3],DualQuat *dq)
                }
                else
                        copy_m3_m3(mat, M);
-               mul_m3_fl((float*)mat, len2);
+               mul_m3_fl(mat, len2);
        }
 }
 
index 8336b529da37acf142b019455b31780fef017346..8d36c3ac524f2beb9a0d7c369fe6bb1d06a07e1e 100644 (file)
 
 #include "BLI_math.h"
 
-/********************************** Init *************************************/
+//******************************* Interpolation *******************************/
 
-void zero_v2(float r[2])
+void interp_v2_v2v2(float *target, float *a, float *b, float t)
 {
-       r[0]= 0.0f;
-       r[1]= 0.0f;
-}
-
-void zero_v3(float r[3])
-{
-       r[0]= 0.0f;
-       r[1]= 0.0f;
-       r[2]= 0.0f;
-}
-
-void copy_v2_v2(float r[2], float a[2])
-{
-       r[0]= a[0];
-       r[1]= a[1];
-}
-
-void copy_v3_v3(float r[3], float a[3])
-{
-       r[0]= a[0];
-       r[1]= a[1];
-       r[2]= a[2];
-}
-
-/********************************* Arithmetic ********************************/
-
-void add_v2_v2(float *r, float *a)
-{
-       r[0] += a[0];
-       r[1] += a[1];
-}
-
-void add_v2_v2v2(float *r, float *a, float *b)
-{
-       r[0]= a[0] + b[0];
-       r[1]= a[1] + b[1];
-}
-
-void add_v3_v3(float *r, float *a)
-{
-       r[0] += a[0];
-       r[1] += a[1];
-       r[1] += a[1];
-}
-
-void add_v3_v3v3(float *r, float *a, float *b)
-{
-       r[0]= a[0] + b[0];
-       r[1]= a[1] + b[1];
-       r[2]= a[2] + b[2];
-}
-
-void sub_v2_v2(float *r, float *a)
-{
-       r[0] -= a[0];
-       r[1] -= a[1];
-}
-
-void sub_v2_v2v2(float *r, float *a, float *b)
-{
-       r[0]= a[0] - b[0];
-       r[1]= a[1] - b[1];
-}
-
-void sub_v3_v3(float *r, float *a)
-{
-       r[0] -= a[0];
-       r[1] -= a[1];
-       r[1] -= a[1];
-}
-
-void sub_v3_v3v3(float *r, float *a, float *b)
-{
-       r[0]= a[0] - b[0];
-       r[1]= a[1] - b[1];
-       r[2]= a[2] - b[2];
-}
-
-void mul_v2_fl(float *v1, float f)
-{
-       v1[0]*= f;
-       v1[1]*= f;
-}
-
-void mul_v3_fl(float r[3], float f)
-{
-       r[0] *= f;
-       r[1] *= f;
-       r[2] *= f;
-}
-
-void mul_v3_v3fl(float r[3], float a[3], float f)
-{
-       r[0]= a[0]*f;
-       r[1]= a[1]*f;
-       r[2]= a[2]*f;
-}
-
-void mul_v3_v3(float r[3], float a[3])
-{
-       r[0] *= a[0];
-       r[1] *= a[1];
-       r[2] *= a[2];
-}
-
-void mul_v3_v3v3(float *v, float *v1, float *v2)
-{
-       v[0] = v1[0] * v2[0];
-       v[1] = v1[1] * v2[1];
-       v[2] = v1[2] * v2[2];
-}
-
-void negate_v3(float r[3])
-{
-       r[0]= -r[0];
-       r[1]= -r[1];
-       r[2]= -r[2];
-}
-
-void negate_v3_v3(float r[3], float a[3])
-{
-       r[0]= -a[0];
-       r[1]= -a[1];
-       r[2]= -a[2];
-}
-
-float dot_v2v2(float *a, float *b)
-{
-       return a[0]*b[0] + a[1]*b[1];
-}
-
-float dot_v3v3(float a[3], float b[3])
-{
-       return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
-}
-
-void cross_v3_v3v3(float r[3], float a[3], float b[3])
-{
-       r[0]= a[1]*b[2] - a[2]*b[1];
-       r[1]= a[2]*b[0] - a[0]*b[2];
-       r[2]= a[0]*b[1] - a[1]*b[0];
-}
-
-void star_m3_v3(float mat[][3], float *vec)
-{
-       mat[0][0]= mat[1][1]= mat[2][2]= 0.0;
-       mat[0][1]= -vec[2];     
-       mat[0][2]= vec[1];
-       mat[1][0]= vec[2];      
-       mat[1][2]= -vec[0];
-       mat[2][0]= -vec[1];     
-       mat[2][1]= vec[0];
-       
-}
-
-/*********************************** Length **********************************/
-
-float len_v2(float *v)
-{
-       return (float)sqrt(v[0]*v[0] + v[1]*v[1]);
-}
-
-float len_v2v2(float *v1, float *v2)
-{
-       float x, y;
-
-       x = v1[0]-v2[0];
-       y = v1[1]-v2[1];
-       return (float)sqrt(x*x+y*y);
-}
-
-float len_v3(float a[3])
-{
-       return sqrtf(dot_v3v3(a, a));
-}
-
-float len_v3v3(float a[3], float b[3])
-{
-       float d[3];
-
-       sub_v3_v3v3(d, b, a);
-       return len_v3(d);
-}
-
-float normalize_v2(float n[2])
-{
-       float d;
-       
-       d= n[0]*n[0]+n[1]*n[1];
-
-       if(d>1.0e-35f) {
-               d= (float)sqrt(d);
-               n[0]/=d; 
-               n[1]/=d; 
-       } else {
-               n[0]=n[1]= 0.0f;
-               d= 0.0f;
-       }
-       return d;
-}
-
-float normalize_v3(float n[3])
-{
-       float d= dot_v3v3(n, n);
-
-       /* a larger value causes normalize errors in a
-          scaled down models with camera xtreme close */
-       if(d > 1.0e-35f) {
-               d= sqrtf(d);
-               mul_v3_fl(n, 1.0f/d);
-       }
-       else {
-               zero_v3(n);
-               d= 0.0f;
-       }
-
-       return d;
-}
-
-/******************************* Interpolation *******************************/
-
-void interp_v2_v2v2(float *target, const float *a, const float *b, const float t)
-{
-       const float s = 1.0f-t;
+       float s = 1.0f-t;
 
        target[0]= s*a[0] + t*b[0];
        target[1]= s*a[1] + t*b[1];
@@ -267,17 +44,15 @@ void interp_v2_v2v2(float *target, const float *a, const float *b, const float t
 
 /* weight 3 2D vectors,
  * 'w' must be unit length but is not a vector, just 3 weights */
-void interp_v2_v2v2v2(float p[2], const float v1[2], const float v2[2], const float v3[2], const float w[3])
+void interp_v2_v2v2v2(float p[2], float v1[2], float v2[2], float v3[2], float w[3])
 {
        p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
        p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
 }
 
-
-
-void interp_v3_v3v3(float *target, const float *a, const float *b, const float t)
+void interp_v3_v3v3(float *target, float *a, float *b, float t)
 {
-       const float s = 1.0f-t;
+       float s = 1.0f-t;
 
        target[0]= s*a[0] + t*b[0];
        target[1]= s*a[1] + t*b[1];
@@ -286,7 +61,7 @@ void interp_v3_v3v3(float *target, const float *a, const float *b, const float t
 
 /* weight 3 vectors,
  * 'w' must be unit length but is not a vector, just 3 weights */
-void interp_v3_v3v3v3(float p[3], const float v1[3], const float v2[3], const float v3[3], const float w[3])
+void interp_v3_v3v3v3(float p[3], float v1[3], float v2[3], float v3[3], float w[3])
 {
        p[0] = v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2];
        p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
@@ -295,9 +70,9 @@ void interp_v3_v3v3v3(float p[3], const float v1[3], const float v2[3], const fl
 
 void mid_v3_v3v3(float *v, float *v1, float *v2)
 {
-       v[0]= 0.5f*(v1[0]+ v2[0]);
-       v[1]= 0.5f*(v1[1]+ v2[1]);
-       v[2]= 0.5f*(v1[2]+ v2[2]);
+       v[0]= 0.5f*(v1[0] + v2[0]);
+       v[1]= 0.5f*(v1[1] + v2[1]);
+       v[2]= 0.5f*(v1[2] + v2[2]);
 }
 
 /********************************* Comparison ********************************/
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
new file mode 100644 (file)
index 0000000..6830f44
--- /dev/null
@@ -0,0 +1,258 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ * The Original Code is: some of this file.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * */
+
+#include "BLI_math.h"
+
+#ifndef BLI_MATH_VECTOR_INLINE
+#define BLI_MATH_VECTOR_INLINE
+
+/********************************** Init *************************************/
+
+MINLINE void zero_v2(float r[2])
+{
+       r[0]= 0.0f;
+       r[1]= 0.0f;
+}
+
+MINLINE void zero_v3(float r[3])
+{
+       r[0]= 0.0f;
+       r[1]= 0.0f;
+       r[2]= 0.0f;
+}
+
+MINLINE void copy_v2_v2(float r[2], float a[2])
+{
+       r[0]= a[0];
+       r[1]= a[1];
+}
+
+MINLINE void copy_v3_v3(float r[3], float a[3])
+{
+       r[0]= a[0];
+       r[1]= a[1];
+       r[2]= a[2];
+}
+
+/********************************* Arithmetic ********************************/
+
+MINLINE void add_v2_v2(float *r, float *a)
+{
+       r[0] += a[0];
+       r[1] += a[1];
+}
+
+MINLINE void add_v2_v2v2(float *r, float *a, float *b)
+{
+       r[0]= a[0] + b[0];
+       r[1]= a[1] + b[1];
+}
+
+MINLINE void add_v3_v3(float *r, float *a)
+{
+       r[0] += a[0];
+       r[1] += a[1];
+       r[1] += a[1];
+}
+
+MINLINE void add_v3_v3v3(float *r, float *a, float *b)
+{
+       r[0]= a[0] + b[0];
+       r[1]= a[1] + b[1];
+       r[2]= a[2] + b[2];
+}
+
+MINLINE void sub_v2_v2(float *r, float *a)
+{
+       r[0] -= a[0];
+       r[1] -= a[1];
+}
+
+MINLINE void sub_v2_v2v2(float *r, float *a, float *b)
+{
+       r[0]= a[0] - b[0];
+       r[1]= a[1] - b[1];
+}
+
+MINLINE void sub_v3_v3(float *r, float *a)
+{
+       r[0] -= a[0];
+       r[1] -= a[1];
+       r[1] -= a[1];
+}
+
+MINLINE void sub_v3_v3v3(float *r, float *a, float *b)
+{
+       r[0]= a[0] - b[0];
+       r[1]= a[1] - b[1];
+       r[2]= a[2] - b[2];
+}
+
+MINLINE void mul_v2_fl(float *v1, float f)
+{
+       v1[0]*= f;
+       v1[1]*= f;
+}
+
+MINLINE void mul_v3_fl(float r[3], float f)
+{
+       r[0] *= f;
+       r[1] *= f;
+       r[2] *= f;
+}
+
+MINLINE void mul_v3_v3fl(float r[3], float a[3], float f)
+{
+       r[0]= a[0]*f;
+       r[1]= a[1]*f;
+       r[2]= a[2]*f;
+}
+
+MINLINE void mul_v3_v3(float r[3], float a[3])
+{
+       r[0] *= a[0];
+       r[1] *= a[1];
+       r[2] *= a[2];
+}
+
+MINLINE void mul_v3_v3v3(float *v, float *v1, float *v2)
+{
+       v[0] = v1[0] * v2[0];
+       v[1] = v1[1] * v2[1];
+       v[2] = v1[2] * v2[2];
+}
+
+MINLINE void negate_v3(float r[3])
+{
+       r[0]= -r[0];
+       r[1]= -r[1];
+       r[2]= -r[2];
+}
+
+MINLINE void negate_v3_v3(float r[3], float a[3])
+{
+       r[0]= -a[0];
+       r[1]= -a[1];
+       r[2]= -a[2];
+}
+
+MINLINE float dot_v2v2(float *a, float *b)
+{
+       return a[0]*b[0] + a[1]*b[1];
+}
+
+MINLINE float dot_v3v3(float a[3], float b[3])
+{
+       return a[0]*b[0] + a[1]*b[1] + a[2]*b[2];
+}
+
+MINLINE float cross_v2v2(float a[2], float b[2])
+{
+        return a[0]*b[1] - a[1]*b[0];
+}
+
+MINLINE void cross_v3_v3v3(float r[3], float a[3], float b[3])
+{
+       r[0]= a[1]*b[2] - a[2]*b[1];
+       r[1]= a[2]*b[0] - a[0]*b[2];
+       r[2]= a[0]*b[1] - a[1]*b[0];
+}
+
+MINLINE void star_m3_v3(float mat[][3], float *vec)
+{
+       mat[0][0]= mat[1][1]= mat[2][2]= 0.0;
+       mat[0][1]= -vec[2];     
+       mat[0][2]= vec[1];
+       mat[1][0]= vec[2];      
+       mat[1][2]= -vec[0];
+       mat[2][0]= -vec[1];     
+       mat[2][1]= vec[0];
+}
+
+/*********************************** Length **********************************/
+
+MINLINE float len_v2(float *v)
+{
+       return (float)sqrt(v[0]*v[0] + v[1]*v[1]);
+}
+
+MINLINE float len_v2v2(float *v1, float *v2)
+{
+       float x, y;
+
+       x = v1[0]-v2[0];
+       y = v1[1]-v2[1];
+       return (float)sqrt(x*x+y*y);
+}
+
+MINLINE float len_v3(float a[3])
+{
+       return sqrtf(dot_v3v3(a, a));
+}
+
+MINLINE float len_v3v3(float a[3], float b[3])
+{
+       float d[3];
+
+       sub_v3_v3v3(d, b, a);
+       return len_v3(d);
+}
+
+MINLINE float normalize_v2(float n[2])
+{
+       float d= dot_v2v2(n, n);
+
+       if(d > 1.0e-35f) {
+               d= sqrtf(d);
+               mul_v2_fl(n, 1.0f/d);
+       } else {
+               zero_v2(n);
+               d= 0.0f;
+       }
+       return d;
+}
+
+MINLINE float normalize_v3(float n[3])
+{
+       float d= dot_v3v3(n, n);
+
+       /* a larger value causes normalize errors in a
+          scaled down models with camera xtreme close */
+       if(d > 1.0e-35f) {
+               d= sqrtf(d);
+               mul_v3_fl(n, 1.0f/d);
+       }
+       else {
+               zero_v3(n);
+               d= 0.0f;
+       }
+
+       return d;
+}
+
+#endif /* BLI_MATH_VECTOR_INLINE */
+