diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-11-10 22:13:05 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-11-10 22:13:05 +0300 |
commit | 385875632d7953080375ef4bf74f894c1053fc4b (patch) | |
tree | 8f7d69622d67953cfc413f0d5b2e87ef013042d7 /source | |
parent | d611dd373558814ea2fc21bcd5418404f1c77a4d (diff) |
Math Lib
* 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.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/BLI_math_geom.h | 7 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_math_matrix.h | 35 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_math_rotation.h | 8 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_math_vector.h | 83 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_geom.c | 14 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_matrix.c | 71 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_rotation.c | 65 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_vector.c | 245 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_vector_inline.c | 258 |
9 files changed, 399 insertions, 387 deletions
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h index 05530bce0e5..d54be9d5e03 100644 --- a/source/blender/blenlib/BLI_math_geom.h +++ b/source/blender/blenlib/BLI_math_geom.h @@ -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 diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index 9a9c1be6258..53476e4d03c 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -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); diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h index b1546e3db6c..814dc3ba1a6 100644 --- a/source/blender/blenlib/BLI_math_rotation.h +++ b/source/blender/blenlib/BLI_math_rotation.h @@ -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); diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index 1cb1912208e..26602353425 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -32,64 +32,73 @@ 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]); diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c index 5c7890ffee4..30dce25fea3 100644 --- a/source/blender/blenlib/intern/math_geom.c +++ b/source/blender/blenlib/intern/math_geom.c @@ -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 diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c index f25f24927b4..edab1cc2440 100644 --- a/source/blender/blenlib/intern/math_matrix.c +++ b/source/blender/blenlib/intern/math_matrix.c @@ -34,12 +34,12 @@ /********************************* 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; diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index 85436d3a639..ea7851858fe 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -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); } } diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index 8336b529da3..8d36c3ac524 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -32,234 +32,11 @@ #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 index 00000000000..6830f44ae1b --- /dev/null +++ b/source/blender/blenlib/intern/math_vector_inline.c @@ -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 */ + |