include/crbn/basic/vec3_c.hpp

00001 
00002 #ifndef __vec3d_c_hpp__
00003 #define __vec3d_c_hpp__
00004 
00005 #include <crbn/basic/scalar.hpp>
00006 
00007 struct vec3 {
00008   // Force data alignement
00009   union{
00010     float data[ 3 ];
00011     struct { float x, y, z; };
00012   };
00013 
00014   vec3() : x( 0.f ), y( 0.f ), z( 0.f ) {}
00015   vec3( const float& a ) : x( a ), y( a ), z( a ) {}
00016   vec3( const float& a, const float& b, const float& c ) : x( a ), y( b ), z( c ) {}
00017   vec3( const vec3& v ) : x( v.x ), y( v.y ), z( v.z ) {}
00018 };
00019 
00020 // a = b + c
00021 static inline void
00022 vadd( vec3& a, const vec3& b, const vec3& c ) {
00023   a.x = b.x + c.x;
00024   a.y = b.y + c.y;
00025   a.z = b.z + c.z;
00026 }
00027 // a += b
00028 static inline void
00029 vadd( vec3& a, const vec3& b ) {
00030   a.x += b.x;
00031   a.y += b.y;
00032   a.z += b.z;
00033 }
00034 // a = b - c
00035 static inline void
00036 vsub( vec3& a, const vec3& b, const vec3& c ){
00037   a.x = b.x - c.x;
00038   a.y = b.y - c.y;
00039   a.z = b.z - c.z;
00040 } 
00041 // a -= b
00042 static inline void
00043 vsub( vec3& a, const vec3& b ) {
00044   a.x -= b.x;
00045   a.y -= b.y;
00046   a.z -= b.z;
00047 }
00048 // a = -b
00049 static inline void
00050 vneg( vec3& a, const vec3& b ) {
00051   a.x = - b.x;
00052   a.y = - b.y;
00053   a.z = - b.z;
00054 }
00055 // a = -a
00056 static inline void
00057 vneg( vec3& a ) {
00058   a.x = - a.x;
00059   a.y = - a.y;
00060   a.z = - a.z;
00061 }
00062 
00063 //  a = f * b
00064 static inline void
00065 vmul( vec3& a, const float& f, const vec3& b ) {
00066   a.x = f * b.x;
00067   a.y = f * b.y;
00068   a.z = f * b.z;
00069 }
00070 //  a *= f
00071 static inline void
00072 vmul( vec3& a, const float& f ) {
00073   a.x *= f;
00074   a.y *= f;
00075   a.z *= f;
00076 }
00077 //  a = b / f
00078 static inline void
00079 vdiv( vec3& a, const vec3& b, const float& f ) {
00080   float d = 1.0f / f;
00081   a.x = b.x * d;
00082   a.y = b.y * d;
00083   a.z = b.z * d;
00084 }
00085 //  a /= f
00086 static inline void
00087 vdiv( vec3& a, const float& f ) {
00088   float d = 1.0f / f;
00089   a.x *= d;
00090   a.y *= d;
00091   a.z *= d;
00092 }
00093 
00094 // a_i = b_i * c_i for each component
00095 static inline void
00096 vmul( vec3& a, const vec3& b, const vec3& c ) {
00097   a.x = b.x * c.x;
00098   a.y = b.y * c.y;
00099   a.z = b.z * c.z;
00100 }
00101 // a_i *= b_i for each component
00102 static inline void
00103 vmul( vec3& a, vec3& b ) {
00104   a.x *= b.x;
00105   a.y *= b.y;
00106   a.z *= b.z;
00107 }
00108 
00109 // a_i = b_i / c_i for each component
00110 static inline void
00111 vdiv( vec3& a, const vec3& b, const vec3& c ) {
00112   a.x = b.x / c.x;
00113   a.y = b.y / c.y;
00114   a.z = b.z / c.z;
00115 }
00116 // a_i /= b_i for each component
00117 static inline void
00118 vdiv( vec3& a, const vec3& b ) {
00119   a.x /= b.x;
00120   a.y /= b.y;
00121   a.z /= b.z;
00122 }
00123 
00124 // a = b + f * c
00125 static inline void
00126 vaddfmul( vec3& a, const vec3& b, const float& f, const vec3& c ) {
00127   a.x = b.x + f * c.x;
00128   a.y = b.y + f * c.y;
00129   a.z = b.z + f * c.z;
00130 }
00131 
00132 // a += f * b
00133 static inline void
00134 vaddfmul( vec3& a, const float& f, const vec3& b ) {
00135   a.x += f * b.x;
00136   a.y += f * b.y;
00137   a.z += f * b.z;
00138 }
00139 
00140 // a = b + c * d
00141 static inline void
00142 vaddmul( vec3& a, const vec3& b, const vec3& c, const vec3& d ) {
00143   a.x = b.x + c.x * d.x;
00144   a.y = b.y + c.y * d.y;
00145   a.z = b.z + c.z * d.z;
00146 }
00147 
00148 // a += b * c
00149 static inline void
00150 vaddmul( vec3& a, const vec3& b, const vec3& c ) {
00151   a.x += b.x * c.x;
00152   a.y += b.y * c.y;
00153   a.z += b.z * c.z;
00154 }
00155 
00156 // a = normalize( b )
00157 static inline void
00158 vnormalize( vec3& a, const vec3& b ) {
00159   float l = 1.0f / sqrtf( sqr( b.x ) + sqr( b.y ) + sqr( b.z ) );
00160   a.x = b.x * l;
00161   a.y = b.y * l;
00162   a.z = b.z * l;
00163 }
00164 // a = normalize( a )
00165 static inline void
00166 vnormalize( vec3& a ) {
00167   float l = 1.0f / sqrtf( sqr( a.x ) + sqr( a.y ) + sqr( a.z ) );
00168   a.x *= l;
00169   a.y *= l;
00170   a.z *= l;
00171 }
00172 // ret = norm( a )
00173 static inline float
00174 vlength( const vec3& a ) {
00175   return sqrtf( sqr( a.x ) + sqr( a.y ) + sqr( a.z ) );
00176 }
00177 
00178 // ret = norm( a ) ^ 2
00179 static inline float
00180 vlength2( const vec3& a ) {
00181   return sqr( a.x ) + sqr( a.y ) + sqr( a.z );
00182 }
00183 
00184 // ret = distance( a, b )
00185 static inline float
00186 vdistance( const vec3& a, const vec3& b ) {
00187   return sqrtf( sqr( a.x - b.x ) + sqr( a.y - b.y ) + sqr( a.z - b.z ) );
00188 }
00189 // ret = distance( a, b ) ^ 2
00190 static inline float
00191 vdistance2( const vec3& a, const vec3& b ) {
00192   return sqr( a.x - b.x ) + sqr( a.y - b.y ) + sqr( a.z - b.z );
00193 }
00194 
00195 // ret = a . b
00196 static inline float
00197 vdot( const vec3& a, const vec3& b ) {
00198   return a.x * b.x + a.y * b.y + a.z * b.z;
00199 }
00200 // a = b ^ c
00201 static inline void
00202 vcross( vec3& a, const vec3& b, const vec3& c ) {
00203   a.x = b.y * c.z - b.z * c.y;
00204   a.y = b.z * c.x - b.x * c.z;
00205   a.z = b.x * c.y - b.y * c.x;
00206 }
00207 
00208 // v_i = min( a_i, b_i ) for each component
00209 static inline void
00210 vmin( vec3& v, const vec3& a, const vec3& b ) {
00211   v.x = min( a.x, b.x );
00212   v.y = min( a.y, b.y );
00213   v.z = min( a.z, b.z );
00214 }
00215 // v_i = max( a_i, b_i ) for each component
00216 static inline void
00217 vmax( vec3& v, const vec3& a, const vec3& b ) {
00218   v.x = max( a.x, b.x );
00219   v.y = max( a.y, b.y );
00220   v.z = max( a.z, b.z );
00221 }
00222 
00223 // compute coordinate system from a vector
00224 static inline void
00225 coordinate_system(vec3& v1, vec3& v2, vec3& v3) {
00226   float inv_length;
00227   if(fabs(v1.x) > fabs(v1.y)) {
00228     inv_length = 1.0f / sqrtf((v1.x * v1.x) + (v1.z * v1.z));
00229     v2 = vec3(-v1.z * inv_length, 0.0f, v1.x * inv_length);
00230   }
00231   else {
00232     inv_length = 1.0f / sqrtf((v1.y * v1.y) + (v1.z * v1.z));
00233     v2 = vec3(0.0f, v1.z * inv_length, -v1.y * inv_length);
00234   }
00235   vcross(v3, v1, v2);
00236 }
00237 
00238 #endif // __vec3d_c_hpp__

Generated on Tue Nov 14 15:40:08 2006 for libcrbn by  doxygen 1.5.0