00001
00002 #ifndef __vec3d_c_hpp__
00003 #define __vec3d_c_hpp__
00004
00005 #include <crbn/basic/scalar.hpp>
00006
00007 struct vec3 {
00008
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
00173 static inline float
00174 vlength( const vec3& a ) {
00175 return sqrtf( sqr( a.x ) + sqr( a.y ) + sqr( a.z ) );
00176 }
00177
00178
00179 static inline float
00180 vlength2( const vec3& a ) {
00181 return sqr( a.x ) + sqr( a.y ) + sqr( a.z );
00182 }
00183
00184
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
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
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
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
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
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
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__