Documentation


linearX3DTK.h

Go to the documentation of this file.
00001 #ifndef animal_x3dtk_linear__________________________
00002 #define animal_x3dtk_linear__________________________
00003 
00008 #include <animal/value.h>
00009 #include <X3DTK/kernel.h>
00010 #include <animal/matrix.h>
00011 
00012 namespace animal
00013 {
00014 
00015 //=========== SFVec3f ================================================
00016 
00018   template<>
00019     struct container_traits<X3DTK::SFVec3f>
00020     {
00021       typedef float* iterator;   
00022       typedef float value_type; 
00023       typedef value_type& reference; 
00024       typedef std::size_t size_type; 
00025 
00027       static iterator begin(X3DTK::SFVec3f& v) { return &(v.x); }
00029       static inline iterator end(X3DTK::SFVec3f& v) { return &v.x + 3; }
00031       static inline size_type size(X3DTK::SFVec3f&) { return 3; }
00032     };
00033     
00035   template<>
00036     struct container_traits<X3DTK::SFVec3f const>
00037     {
00038       typedef const float* iterator;   
00039       typedef float value_type; 
00040       typedef const value_type& reference; 
00041       typedef std::size_t size_type; 
00042 
00044       static inline iterator begin(X3DTK::SFVec3f& v) { return &v.x; }
00046       static inline iterator end(X3DTK::SFVec3f& v) { return &v.x + 3; }
00048       static inline size_type size(X3DTK::SFVec3f& v) { return 3; }
00049     };
00050     
00051     template<>
00052 struct Value<X3DTK::SFVec3f>
00053 {
00054     static inline X3DTK::SFVec3f zero()
00055     {
00056         return X3DTK::SFVec3f(0,0,0);
00057     }
00058 };
00059 
00060 template<>
00061 struct value_type<X3DTK::SFVec3f>
00062 {
00063     typedef float type;
00064 };
00065 
00066 inline std::size_t size(const X3DTK::SFVec3f& ){ return 3;}
00067 inline const float* begin(const X3DTK::SFVec3f& v){ return &(v.x);}
00068 inline float* begin(X3DTK::SFVec3f& v){ return &(v.x);}
00069 inline const float* end(const X3DTK::SFVec3f& v){ return &(v.x) + 3;}
00070 inline float* end(X3DTK::SFVec3f& v){ return &(v.x) + 3;}
00071 
00072 
00073 inline X3DTK::SFVec3f& operator *= (X3DTK::SFVec3f& v, float f)
00074 {
00075     for( int i=0; i<3; ++i )
00076         v.f_data()[i]*= f;
00077     return v;
00078 }
00079 // 
00080 // inline void v_meq (X3DTK::SFVec3f& v, const X3DTK::SFVec3f& u)
00081 // {
00082 //     v -= u;
00083 // }
00084 // inline void v_peq (X3DTK::SFVec3f& v, const X3DTK::SFVec3f& u)
00085 // {
00086 //     v += u;
00087 // }
00088 // inline void v_peq_ (X3DTK::SFVec3f& v, float a, const X3DTK::SFVec3f& u)
00089 // {
00090 //     X3DTK::SFVec3f t = u;
00091 //     t *= a;
00092 //     v += t;
00093 // }
00094 // inline void v_meq_ (X3DTK::SFVec3f& v, float a, const X3DTK::SFVec3f& u)
00095 // {
00096 //     X3DTK::SFVec3f t = u;
00097 //     t *= a;
00098 //     v -= t;
00099 // }
00100 // inline void v_teq (X3DTK::SFVec3f& v, float a )
00101 // {
00102 //     v *= a;
00103 // }
00104 // inline void v_eq_ab (X3DTK::SFVec3f& v, float a, const X3DTK::SFVec3f& b  )
00105 // {
00106 //     v=b;
00107 //     v *= a;
00108 // }
00109 // inline unsigned int size( const X3DTK::SFVec3f& )
00110 // {
00111 //     return 3;
00112 // }
00113 // 
00114 // inline float v_dot( const X3DTK::SFVec3f& u, const X3DTK::SFVec3f& v )
00115 // {
00116 //     return u*v;
00117 // }
00118 // 
00119 // inline void v_normalize( X3DTK::SFVec3f& v )
00120 // {
00121 //     v.normalize();
00122 // }
00123 // 
00124 // 
00125 // inline float v_norm( X3DTK::SFVec3f& v )
00126 // {
00127 //     return v.norm();
00128 // }
00129 // 
00130 // 
00131 // inline void v_eq_cross( X3DTK::SFVec3f& v, const X3DTK::SFVec3f& a, const X3DTK::SFVec3f& b)
00132 // {
00133 //     v = crossprod( a, b );
00134 // }
00135 // 
00136 // inline void v_eq_Ab ( X3DTK::SFVec3f& v, const animal::Array<3,Array<3,X3DTK::SFFloat> >& A, const X3DTK::SFVec3f& b )
00137 // {
00138 //     assert( static_cast<const void*>(&v) != static_cast<const void*>(&b) );
00139 // 
00140 //     v.x = A[0][0]*b.x + A[0][1]*b.y + A[0][2]*b.z;
00141 //     v.y = A[1][0]*b.x + A[1][1]*b.y + A[1][2]*b.z;
00142 //     v.z = A[2][0]*b.x + A[2][1]*b.y + A[2][2]*b.z;
00143 // }
00144 // 
00145 // 
00146 // inline void v_peq_Ab ( X3DTK::SFVec3f& v, const animal::Array<3,Array<3,X3DTK::SFFloat> >& A, const X3DTK::SFVec3f& b )
00147 // {
00148 //     assert( static_cast<const void*>(&v) != static_cast<const void*>(&b) );
00149 // 
00150 //     v.x += A[0][0]*b.x + A[0][1]*b.y + A[0][2]*b.z;
00151 //     v.y += A[1][0]*b.x + A[1][1]*b.y + A[1][2]*b.z;
00152 //     v.z += A[2][0]*b.x + A[2][1]*b.y + A[2][2]*b.z;
00153 // }
00154 // 
00155 
00156 
00157 
00158 
00159 //=========== MFVec3f ================================================
00160 inline float v_dot( const X3DTK::MFVec3f& u, const X3DTK::MFVec3f& v )
00161 {
00162     float p=0;
00163     for( unsigned int i=0, iend=size(u); i!=iend; ++i )
00164         p += v_dot( u[i], v[i] );
00165     return p;
00166 }
00167 
00168 inline void v_peq (X3DTK::MFVec3f& v, const X3DTK::MFVec3f& u)
00169 {
00170     for( unsigned int i=0, iend=size(u); i!=iend; ++i )
00171         v_peq( v[i], u[i] );
00172 }
00173 
00174 inline void v_peq (X3DTK::MFVec3f& v, float a, const X3DTK::MFVec3f& u)
00175 {
00176     for( unsigned int i=0, iend=size(u); i!=iend; ++i )
00177         v_peq( v[i], a, u[i] );
00178 }
00179 
00180 inline float v_norm(const X3DTK::MFVec3f& u)
00181 {
00182     return sqrt( v_dot(u,u) );
00183 }
00184 
00185 }//animal
00186 #endif

Generated on Thu Dec 23 13:52:25 2004 by doxygen 1.3.6