Blender V2.61 - r43446

btVector3.h

Go to the documentation of this file.
00001 /*
00002 Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans  http://continuousphysics.com/Bullet/
00003 
00004 This software is provided 'as-is', without any express or implied warranty.
00005 In no event will the authors be held liable for any damages arising from the use of this software.
00006 Permission is granted to anyone to use this software for any purpose, 
00007 including commercial applications, and to alter it and redistribute it freely, 
00008 subject to the following restrictions:
00009 
00010 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
00011 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
00012 3. This notice may not be removed or altered from any source distribution.
00013 */
00014 
00015 
00016 
00017 #ifndef SIMD__VECTOR3_H
00018 #define SIMD__VECTOR3_H
00019 
00020 
00021 #include "btScalar.h"
00022 #include "btMinMax.h"
00023 
00024 #ifdef BT_USE_DOUBLE_PRECISION
00025 #define btVector3Data btVector3DoubleData
00026 #define btVector3DataName "btVector3DoubleData"
00027 #else
00028 #define btVector3Data btVector3FloatData
00029 #define btVector3DataName "btVector3FloatData"
00030 #endif //BT_USE_DOUBLE_PRECISION
00031 
00032 
00033 
00034 
00039 ATTRIBUTE_ALIGNED16(class) btVector3
00040 {
00041 public:
00042 
00043 #if defined (__SPU__) && defined (__CELLOS_LV2__)
00044         btScalar    m_floats[4];
00045 public:
00046     SIMD_FORCE_INLINE const vec_float4& get128() const
00047     {
00048         return *((const vec_float4*)&m_floats[0]);
00049     }
00050 public:
00051 #else //__CELLOS_LV2__ __SPU__
00052 #ifdef BT_USE_SSE // _WIN32
00053     union {
00054         __m128 mVec128;
00055         btScalar    m_floats[4];
00056     };
00057     SIMD_FORCE_INLINE   __m128  get128() const
00058     {
00059         return mVec128;
00060     }
00061     SIMD_FORCE_INLINE   void    set128(__m128 v128)
00062     {
00063         mVec128 = v128;
00064     }
00065 #else
00066     btScalar    m_floats[4];
00067 #endif
00068 #endif //__CELLOS_LV2__ __SPU__
00069 
00070     public:
00071 
00073     SIMD_FORCE_INLINE btVector3() {}
00074 
00075  
00076     
00082     SIMD_FORCE_INLINE btVector3(const btScalar& x, const btScalar& y, const btScalar& z)
00083     {
00084         m_floats[0] = x;
00085         m_floats[1] = y;
00086         m_floats[2] = z;
00087         m_floats[3] = btScalar(0.);
00088     }
00089 
00090     
00093     SIMD_FORCE_INLINE btVector3& operator+=(const btVector3& v)
00094     {
00095 
00096         m_floats[0] += v.m_floats[0]; m_floats[1] += v.m_floats[1];m_floats[2] += v.m_floats[2];
00097         return *this;
00098     }
00099 
00100 
00103     SIMD_FORCE_INLINE btVector3& operator-=(const btVector3& v) 
00104     {
00105         m_floats[0] -= v.m_floats[0]; m_floats[1] -= v.m_floats[1];m_floats[2] -= v.m_floats[2];
00106         return *this;
00107     }
00110     SIMD_FORCE_INLINE btVector3& operator*=(const btScalar& s)
00111     {
00112         m_floats[0] *= s; m_floats[1] *= s;m_floats[2] *= s;
00113         return *this;
00114     }
00115 
00118     SIMD_FORCE_INLINE btVector3& operator/=(const btScalar& s) 
00119     {
00120         btFullAssert(s != btScalar(0.0));
00121         return *this *= btScalar(1.0) / s;
00122     }
00123 
00126     SIMD_FORCE_INLINE btScalar dot(const btVector3& v) const
00127     {
00128         return m_floats[0] * v.m_floats[0] + m_floats[1] * v.m_floats[1] +m_floats[2] * v.m_floats[2];
00129     }
00130 
00132     SIMD_FORCE_INLINE btScalar length2() const
00133     {
00134         return dot(*this);
00135     }
00136 
00138     SIMD_FORCE_INLINE btScalar length() const
00139     {
00140         return btSqrt(length2());
00141     }
00142 
00145     SIMD_FORCE_INLINE btScalar distance2(const btVector3& v) const;
00146 
00149     SIMD_FORCE_INLINE btScalar distance(const btVector3& v) const;
00150 
00151     SIMD_FORCE_INLINE btVector3& safeNormalize() 
00152     {
00153         btVector3 absVec = this->absolute();
00154         int maxIndex = absVec.maxAxis();
00155         if (absVec[maxIndex]>0)
00156         {
00157             *this /= absVec[maxIndex];
00158             return *this /= length();
00159         }
00160         setValue(1,0,0);
00161         return *this;
00162     }
00163 
00166     SIMD_FORCE_INLINE btVector3& normalize() 
00167     {
00168         return *this /= length();
00169     }
00170 
00172     SIMD_FORCE_INLINE btVector3 normalized() const;
00173 
00177     SIMD_FORCE_INLINE btVector3 rotate( const btVector3& wAxis, const btScalar angle ) const;
00178 
00181     SIMD_FORCE_INLINE btScalar angle(const btVector3& v) const 
00182     {
00183         btScalar s = btSqrt(length2() * v.length2());
00184         btFullAssert(s != btScalar(0.0));
00185         return btAcos(dot(v) / s);
00186     }
00188     SIMD_FORCE_INLINE btVector3 absolute() const 
00189     {
00190         return btVector3(
00191             btFabs(m_floats[0]), 
00192             btFabs(m_floats[1]), 
00193             btFabs(m_floats[2]));
00194     }
00197     SIMD_FORCE_INLINE btVector3 cross(const btVector3& v) const
00198     {
00199         return btVector3(
00200             m_floats[1] * v.m_floats[2] -m_floats[2] * v.m_floats[1],
00201             m_floats[2] * v.m_floats[0] - m_floats[0] * v.m_floats[2],
00202             m_floats[0] * v.m_floats[1] - m_floats[1] * v.m_floats[0]);
00203     }
00204 
00205     SIMD_FORCE_INLINE btScalar triple(const btVector3& v1, const btVector3& v2) const
00206     {
00207         return m_floats[0] * (v1.m_floats[1] * v2.m_floats[2] - v1.m_floats[2] * v2.m_floats[1]) + 
00208             m_floats[1] * (v1.m_floats[2] * v2.m_floats[0] - v1.m_floats[0] * v2.m_floats[2]) + 
00209             m_floats[2] * (v1.m_floats[0] * v2.m_floats[1] - v1.m_floats[1] * v2.m_floats[0]);
00210     }
00211 
00214     SIMD_FORCE_INLINE int minAxis() const
00215     {
00216         return m_floats[0] < m_floats[1] ? (m_floats[0] <m_floats[2] ? 0 : 2) : (m_floats[1] <m_floats[2] ? 1 : 2);
00217     }
00218 
00221     SIMD_FORCE_INLINE int maxAxis() const 
00222     {
00223         return m_floats[0] < m_floats[1] ? (m_floats[1] <m_floats[2] ? 2 : 1) : (m_floats[0] <m_floats[2] ? 2 : 0);
00224     }
00225 
00226     SIMD_FORCE_INLINE int furthestAxis() const
00227     {
00228         return absolute().minAxis();
00229     }
00230 
00231     SIMD_FORCE_INLINE int closestAxis() const 
00232     {
00233         return absolute().maxAxis();
00234     }
00235 
00236     SIMD_FORCE_INLINE void setInterpolate3(const btVector3& v0, const btVector3& v1, btScalar rt)
00237     {
00238         btScalar s = btScalar(1.0) - rt;
00239         m_floats[0] = s * v0.m_floats[0] + rt * v1.m_floats[0];
00240         m_floats[1] = s * v0.m_floats[1] + rt * v1.m_floats[1];
00241         m_floats[2] = s * v0.m_floats[2] + rt * v1.m_floats[2];
00242         //don't do the unused w component
00243         //      m_co[3] = s * v0[3] + rt * v1[3];
00244     }
00245 
00249     SIMD_FORCE_INLINE btVector3 lerp(const btVector3& v, const btScalar& t) const 
00250     {
00251         return btVector3(m_floats[0] + (v.m_floats[0] - m_floats[0]) * t,
00252             m_floats[1] + (v.m_floats[1] - m_floats[1]) * t,
00253             m_floats[2] + (v.m_floats[2] -m_floats[2]) * t);
00254     }
00255 
00258     SIMD_FORCE_INLINE btVector3& operator*=(const btVector3& v)
00259     {
00260         m_floats[0] *= v.m_floats[0]; m_floats[1] *= v.m_floats[1];m_floats[2] *= v.m_floats[2];
00261         return *this;
00262     }
00263 
00265         SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; }
00267         SIMD_FORCE_INLINE const btScalar& getY() const { return m_floats[1]; }
00269         SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; }
00271         SIMD_FORCE_INLINE void  setX(btScalar x) { m_floats[0] = x;};
00273         SIMD_FORCE_INLINE void  setY(btScalar y) { m_floats[1] = y;};
00275         SIMD_FORCE_INLINE void  setZ(btScalar z) {m_floats[2] = z;};
00277         SIMD_FORCE_INLINE void  setW(btScalar w) { m_floats[3] = w;};
00279         SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; }
00281         SIMD_FORCE_INLINE const btScalar& y() const { return m_floats[1]; }
00283         SIMD_FORCE_INLINE const btScalar& z() const { return m_floats[2]; }
00285         SIMD_FORCE_INLINE const btScalar& w() const { return m_floats[3]; }
00286 
00287     //SIMD_FORCE_INLINE btScalar&       operator[](int i)       { return (&m_floats[0])[i]; }      
00288     //SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_floats[0])[i]; }
00290     SIMD_FORCE_INLINE   operator       btScalar *()       { return &m_floats[0]; }
00291     SIMD_FORCE_INLINE   operator const btScalar *() const { return &m_floats[0]; }
00292 
00293     SIMD_FORCE_INLINE   bool    operator==(const btVector3& other) const
00294     {
00295         return ((m_floats[3]==other.m_floats[3]) && (m_floats[2]==other.m_floats[2]) && (m_floats[1]==other.m_floats[1]) && (m_floats[0]==other.m_floats[0]));
00296     }
00297 
00298     SIMD_FORCE_INLINE   bool    operator!=(const btVector3& other) const
00299     {
00300         return !(*this == other);
00301     }
00302 
00306         SIMD_FORCE_INLINE void  setMax(const btVector3& other)
00307         {
00308             btSetMax(m_floats[0], other.m_floats[0]);
00309             btSetMax(m_floats[1], other.m_floats[1]);
00310             btSetMax(m_floats[2], other.m_floats[2]);
00311             btSetMax(m_floats[3], other.w());
00312         }
00316         SIMD_FORCE_INLINE void  setMin(const btVector3& other)
00317         {
00318             btSetMin(m_floats[0], other.m_floats[0]);
00319             btSetMin(m_floats[1], other.m_floats[1]);
00320             btSetMin(m_floats[2], other.m_floats[2]);
00321             btSetMin(m_floats[3], other.w());
00322         }
00323 
00324         SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z)
00325         {
00326             m_floats[0]=x;
00327             m_floats[1]=y;
00328             m_floats[2]=z;
00329             m_floats[3] = btScalar(0.);
00330         }
00331 
00332         void    getSkewSymmetricMatrix(btVector3* v0,btVector3* v1,btVector3* v2) const
00333         {
00334             v0->setValue(0.     ,-z()       ,y());
00335             v1->setValue(z()    ,0.         ,-x());
00336             v2->setValue(-y()   ,x()    ,0.);
00337         }
00338 
00339         void    setZero()
00340         {
00341             setValue(btScalar(0.),btScalar(0.),btScalar(0.));
00342         }
00343 
00344         SIMD_FORCE_INLINE bool isZero() const 
00345         {
00346             return m_floats[0] == btScalar(0) && m_floats[1] == btScalar(0) && m_floats[2] == btScalar(0);
00347         }
00348 
00349         SIMD_FORCE_INLINE bool fuzzyZero() const 
00350         {
00351             return length2() < SIMD_EPSILON;
00352         }
00353 
00354         SIMD_FORCE_INLINE   void    serialize(struct    btVector3Data& dataOut) const;
00355 
00356         SIMD_FORCE_INLINE   void    deSerialize(const struct    btVector3Data& dataIn);
00357 
00358         SIMD_FORCE_INLINE   void    serializeFloat(struct   btVector3FloatData& dataOut) const;
00359 
00360         SIMD_FORCE_INLINE   void    deSerializeFloat(const struct   btVector3FloatData& dataIn);
00361 
00362         SIMD_FORCE_INLINE   void    serializeDouble(struct  btVector3DoubleData& dataOut) const;
00363 
00364         SIMD_FORCE_INLINE   void    deSerializeDouble(const struct  btVector3DoubleData& dataIn);
00365 
00366 };
00367 
00369 SIMD_FORCE_INLINE btVector3 
00370 operator+(const btVector3& v1, const btVector3& v2) 
00371 {
00372     return btVector3(v1.m_floats[0] + v2.m_floats[0], v1.m_floats[1] + v2.m_floats[1], v1.m_floats[2] + v2.m_floats[2]);
00373 }
00374 
00376 SIMD_FORCE_INLINE btVector3 
00377 operator*(const btVector3& v1, const btVector3& v2) 
00378 {
00379     return btVector3(v1.m_floats[0] * v2.m_floats[0], v1.m_floats[1] * v2.m_floats[1], v1.m_floats[2] * v2.m_floats[2]);
00380 }
00381 
00383 SIMD_FORCE_INLINE btVector3 
00384 operator-(const btVector3& v1, const btVector3& v2)
00385 {
00386     return btVector3(v1.m_floats[0] - v2.m_floats[0], v1.m_floats[1] - v2.m_floats[1], v1.m_floats[2] - v2.m_floats[2]);
00387 }
00389 SIMD_FORCE_INLINE btVector3 
00390 operator-(const btVector3& v)
00391 {
00392     return btVector3(-v.m_floats[0], -v.m_floats[1], -v.m_floats[2]);
00393 }
00394 
00396 SIMD_FORCE_INLINE btVector3 
00397 operator*(const btVector3& v, const btScalar& s)
00398 {
00399     return btVector3(v.m_floats[0] * s, v.m_floats[1] * s, v.m_floats[2] * s);
00400 }
00401 
00403 SIMD_FORCE_INLINE btVector3 
00404 operator*(const btScalar& s, const btVector3& v)
00405 { 
00406     return v * s; 
00407 }
00408 
00410 SIMD_FORCE_INLINE btVector3
00411 operator/(const btVector3& v, const btScalar& s)
00412 {
00413     btFullAssert(s != btScalar(0.0));
00414     return v * (btScalar(1.0) / s);
00415 }
00416 
00418 SIMD_FORCE_INLINE btVector3
00419 operator/(const btVector3& v1, const btVector3& v2)
00420 {
00421     return btVector3(v1.m_floats[0] / v2.m_floats[0],v1.m_floats[1] / v2.m_floats[1],v1.m_floats[2] / v2.m_floats[2]);
00422 }
00423 
00425 SIMD_FORCE_INLINE btScalar 
00426 btDot(const btVector3& v1, const btVector3& v2) 
00427 { 
00428     return v1.dot(v2); 
00429 }
00430 
00431 
00433 SIMD_FORCE_INLINE btScalar
00434 btDistance2(const btVector3& v1, const btVector3& v2) 
00435 { 
00436     return v1.distance2(v2); 
00437 }
00438 
00439 
00441 SIMD_FORCE_INLINE btScalar
00442 btDistance(const btVector3& v1, const btVector3& v2) 
00443 { 
00444     return v1.distance(v2); 
00445 }
00446 
00448 SIMD_FORCE_INLINE btScalar
00449 btAngle(const btVector3& v1, const btVector3& v2) 
00450 { 
00451     return v1.angle(v2); 
00452 }
00453 
00455 SIMD_FORCE_INLINE btVector3 
00456 btCross(const btVector3& v1, const btVector3& v2) 
00457 { 
00458     return v1.cross(v2); 
00459 }
00460 
00461 SIMD_FORCE_INLINE btScalar
00462 btTriple(const btVector3& v1, const btVector3& v2, const btVector3& v3)
00463 {
00464     return v1.triple(v2, v3);
00465 }
00466 
00471 SIMD_FORCE_INLINE btVector3 
00472 lerp(const btVector3& v1, const btVector3& v2, const btScalar& t)
00473 {
00474     return v1.lerp(v2, t);
00475 }
00476 
00477 
00478 
00479 SIMD_FORCE_INLINE btScalar btVector3::distance2(const btVector3& v) const
00480 {
00481     return (v - *this).length2();
00482 }
00483 
00484 SIMD_FORCE_INLINE btScalar btVector3::distance(const btVector3& v) const
00485 {
00486     return (v - *this).length();
00487 }
00488 
00489 SIMD_FORCE_INLINE btVector3 btVector3::normalized() const
00490 {
00491     return *this / length();
00492 } 
00493 
00494 SIMD_FORCE_INLINE btVector3 btVector3::rotate( const btVector3& wAxis, const btScalar angle ) const
00495 {
00496     // wAxis must be a unit lenght vector
00497 
00498     btVector3 o = wAxis * wAxis.dot( *this );
00499     btVector3 x = *this - o;
00500     btVector3 y;
00501 
00502     y = wAxis.cross( *this );
00503 
00504     return ( o + x * btCos( angle ) + y * btSin( angle ) );
00505 }
00506 
00507 class btVector4 : public btVector3
00508 {
00509 public:
00510 
00511     SIMD_FORCE_INLINE btVector4() {}
00512 
00513 
00514     SIMD_FORCE_INLINE btVector4(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w) 
00515         : btVector3(x,y,z)
00516     {
00517         m_floats[3] = w;
00518     }
00519 
00520 
00521     SIMD_FORCE_INLINE btVector4 absolute4() const 
00522     {
00523         return btVector4(
00524             btFabs(m_floats[0]), 
00525             btFabs(m_floats[1]), 
00526             btFabs(m_floats[2]),
00527             btFabs(m_floats[3]));
00528     }
00529 
00530 
00531 
00532     btScalar    getW() const { return m_floats[3];}
00533 
00534 
00535         SIMD_FORCE_INLINE int maxAxis4() const
00536     {
00537         int maxIndex = -1;
00538         btScalar maxVal = btScalar(-BT_LARGE_FLOAT);
00539         if (m_floats[0] > maxVal)
00540         {
00541             maxIndex = 0;
00542             maxVal = m_floats[0];
00543         }
00544         if (m_floats[1] > maxVal)
00545         {
00546             maxIndex = 1;
00547             maxVal = m_floats[1];
00548         }
00549         if (m_floats[2] > maxVal)
00550         {
00551             maxIndex = 2;
00552             maxVal =m_floats[2];
00553         }
00554         if (m_floats[3] > maxVal)
00555         {
00556             maxIndex = 3;
00557             maxVal = m_floats[3];
00558         }
00559         
00560         
00561         
00562 
00563         return maxIndex;
00564 
00565     }
00566 
00567 
00568     SIMD_FORCE_INLINE int minAxis4() const
00569     {
00570         int minIndex = -1;
00571         btScalar minVal = btScalar(BT_LARGE_FLOAT);
00572         if (m_floats[0] < minVal)
00573         {
00574             minIndex = 0;
00575             minVal = m_floats[0];
00576         }
00577         if (m_floats[1] < minVal)
00578         {
00579             minIndex = 1;
00580             minVal = m_floats[1];
00581         }
00582         if (m_floats[2] < minVal)
00583         {
00584             minIndex = 2;
00585             minVal =m_floats[2];
00586         }
00587         if (m_floats[3] < minVal)
00588         {
00589             minIndex = 3;
00590             minVal = m_floats[3];
00591         }
00592         
00593         return minIndex;
00594 
00595     }
00596 
00597 
00598     SIMD_FORCE_INLINE int closestAxis4() const 
00599     {
00600         return absolute4().maxAxis4();
00601     }
00602 
00603     
00604  
00605 
00613 /*      void getValue(btScalar *m) const 
00614         {
00615             m[0] = m_floats[0];
00616             m[1] = m_floats[1];
00617             m[2] =m_floats[2];
00618         }
00619 */
00626         SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w)
00627         {
00628             m_floats[0]=x;
00629             m_floats[1]=y;
00630             m_floats[2]=z;
00631             m_floats[3]=w;
00632         }
00633 
00634 
00635 };
00636 
00637 
00639 SIMD_FORCE_INLINE void  btSwapScalarEndian(const btScalar& sourceVal, btScalar& destVal)
00640 {
00641     #ifdef BT_USE_DOUBLE_PRECISION
00642     unsigned char* dest = (unsigned char*) &destVal;
00643     unsigned char* src  = (unsigned char*) &sourceVal;
00644     dest[0] = src[7];
00645     dest[1] = src[6];
00646     dest[2] = src[5];
00647     dest[3] = src[4];
00648     dest[4] = src[3];
00649     dest[5] = src[2];
00650     dest[6] = src[1];
00651     dest[7] = src[0];
00652 #else
00653     unsigned char* dest = (unsigned char*) &destVal;
00654     unsigned char* src  = (unsigned char*) &sourceVal;
00655     dest[0] = src[3];
00656     dest[1] = src[2];
00657     dest[2] = src[1];
00658     dest[3] = src[0];
00659 #endif //BT_USE_DOUBLE_PRECISION
00660 }
00662 SIMD_FORCE_INLINE void  btSwapVector3Endian(const btVector3& sourceVec, btVector3& destVec)
00663 {
00664     for (int i=0;i<4;i++)
00665     {
00666         btSwapScalarEndian(sourceVec[i],destVec[i]);
00667     }
00668 
00669 }
00670 
00672 SIMD_FORCE_INLINE void  btUnSwapVector3Endian(btVector3& vector)
00673 {
00674 
00675     btVector3   swappedVec;
00676     for (int i=0;i<4;i++)
00677     {
00678         btSwapScalarEndian(vector[i],swappedVec[i]);
00679     }
00680     vector = swappedVec;
00681 }
00682 
00683 template <class T>
00684 SIMD_FORCE_INLINE void btPlaneSpace1 (const T& n, T& p, T& q)
00685 {
00686   if (btFabs(n[2]) > SIMDSQRT12) {
00687     // choose p in y-z plane
00688     btScalar a = n[1]*n[1] + n[2]*n[2];
00689     btScalar k = btRecipSqrt (a);
00690     p[0] = 0;
00691     p[1] = -n[2]*k;
00692     p[2] = n[1]*k;
00693     // set q = n x p
00694     q[0] = a*k;
00695     q[1] = -n[0]*p[2];
00696     q[2] = n[0]*p[1];
00697   }
00698   else {
00699     // choose p in x-y plane
00700     btScalar a = n[0]*n[0] + n[1]*n[1];
00701     btScalar k = btRecipSqrt (a);
00702     p[0] = -n[1]*k;
00703     p[1] = n[0]*k;
00704     p[2] = 0;
00705     // set q = n x p
00706     q[0] = -n[2]*p[1];
00707     q[1] = n[2]*p[0];
00708     q[2] = a*k;
00709   }
00710 }
00711 
00712 
00713 struct  btVector3FloatData
00714 {
00715     float   m_floats[4];
00716 };
00717 
00718 struct  btVector3DoubleData
00719 {
00720     double  m_floats[4];
00721 
00722 };
00723 
00724 SIMD_FORCE_INLINE   void    btVector3::serializeFloat(struct    btVector3FloatData& dataOut) const
00725 {
00727     for (int i=0;i<4;i++)
00728         dataOut.m_floats[i] = float(m_floats[i]);
00729 }
00730 
00731 SIMD_FORCE_INLINE void  btVector3::deSerializeFloat(const struct    btVector3FloatData& dataIn)
00732 {
00733     for (int i=0;i<4;i++)
00734         m_floats[i] = btScalar(dataIn.m_floats[i]);
00735 }
00736 
00737 
00738 SIMD_FORCE_INLINE   void    btVector3::serializeDouble(struct   btVector3DoubleData& dataOut) const
00739 {
00741     for (int i=0;i<4;i++)
00742         dataOut.m_floats[i] = double(m_floats[i]);
00743 }
00744 
00745 SIMD_FORCE_INLINE void  btVector3::deSerializeDouble(const struct   btVector3DoubleData& dataIn)
00746 {
00747     for (int i=0;i<4;i++)
00748         m_floats[i] = btScalar(dataIn.m_floats[i]);
00749 }
00750 
00751 
00752 SIMD_FORCE_INLINE   void    btVector3::serialize(struct btVector3Data& dataOut) const
00753 {
00755     for (int i=0;i<4;i++)
00756         dataOut.m_floats[i] = m_floats[i];
00757 }
00758 
00759 SIMD_FORCE_INLINE void  btVector3::deSerialize(const struct btVector3Data& dataIn)
00760 {
00761     for (int i=0;i<4;i++)
00762         m_floats[i] = dataIn.m_floats[i];
00763 }
00764 
00765 
00766 #endif //SIMD__VECTOR3_H