Blender  V2.59
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         m_floats[0]=m_floats[1]=m_floats[2]=m_floats[3]=btScalar(0.);}
00075 
00076  
00077         
00083         SIMD_FORCE_INLINE btVector3(const btScalar& x, const btScalar& y, const btScalar& z)
00084         {
00085                 m_floats[0] = x;
00086                 m_floats[1] = y;
00087                 m_floats[2] = z;
00088                 m_floats[3] = btScalar(0.);
00089         }
00090 
00091         
00094         SIMD_FORCE_INLINE btVector3& operator+=(const btVector3& v)
00095         {
00096 
00097                 m_floats[0] += v.m_floats[0]; m_floats[1] += v.m_floats[1];m_floats[2] += v.m_floats[2];
00098                 return *this;
00099         }
00100 
00101 
00104         SIMD_FORCE_INLINE btVector3& operator-=(const btVector3& v) 
00105         {
00106                 m_floats[0] -= v.m_floats[0]; m_floats[1] -= v.m_floats[1];m_floats[2] -= v.m_floats[2];
00107                 return *this;
00108         }
00111         SIMD_FORCE_INLINE btVector3& operator*=(const btScalar& s)
00112         {
00113                 m_floats[0] *= s; m_floats[1] *= s;m_floats[2] *= s;
00114                 return *this;
00115         }
00116 
00119         SIMD_FORCE_INLINE btVector3& operator/=(const btScalar& s) 
00120         {
00121                 btFullAssert(s != btScalar(0.0));
00122                 return *this *= btScalar(1.0) / s;
00123         }
00124 
00127         SIMD_FORCE_INLINE btScalar dot(const btVector3& v) const
00128         {
00129                 return m_floats[0] * v.m_floats[0] + m_floats[1] * v.m_floats[1] +m_floats[2] * v.m_floats[2];
00130         }
00131 
00133         SIMD_FORCE_INLINE btScalar length2() const
00134         {
00135                 return dot(*this);
00136         }
00137 
00139         SIMD_FORCE_INLINE btScalar length() const
00140         {
00141                 return btSqrt(length2());
00142         }
00143 
00146         SIMD_FORCE_INLINE btScalar distance2(const btVector3& v) const;
00147 
00150         SIMD_FORCE_INLINE btScalar distance(const btVector3& v) const;
00151 
00152         SIMD_FORCE_INLINE btVector3& safeNormalize() 
00153         {
00154                 btVector3 absVec = this->absolute();
00155                 int maxIndex = absVec.maxAxis();
00156                 if (absVec[maxIndex]>0)
00157                 {
00158                         *this /= absVec[maxIndex];
00159                         return *this /= length();
00160                 }
00161                 setValue(1,0,0);
00162                 return *this;
00163         }
00164 
00167         SIMD_FORCE_INLINE btVector3& normalize() 
00168         {
00169                 return *this /= length();
00170         }
00171 
00173         SIMD_FORCE_INLINE btVector3 normalized() const;
00174 
00178         SIMD_FORCE_INLINE btVector3 rotate( const btVector3& wAxis, const btScalar angle ) const;
00179 
00182         SIMD_FORCE_INLINE btScalar angle(const btVector3& v) const 
00183         {
00184                 btScalar s = btSqrt(length2() * v.length2());
00185                 btFullAssert(s != btScalar(0.0));
00186                 return btAcos(dot(v) / s);
00187         }
00189         SIMD_FORCE_INLINE btVector3 absolute() const 
00190         {
00191                 return btVector3(
00192                         btFabs(m_floats[0]), 
00193                         btFabs(m_floats[1]), 
00194                         btFabs(m_floats[2]));
00195         }
00198         SIMD_FORCE_INLINE btVector3 cross(const btVector3& v) const
00199         {
00200                 return btVector3(
00201                         m_floats[1] * v.m_floats[2] -m_floats[2] * v.m_floats[1],
00202                         m_floats[2] * v.m_floats[0] - m_floats[0] * v.m_floats[2],
00203                         m_floats[0] * v.m_floats[1] - m_floats[1] * v.m_floats[0]);
00204         }
00205 
00206         SIMD_FORCE_INLINE btScalar triple(const btVector3& v1, const btVector3& v2) const
00207         {
00208                 return m_floats[0] * (v1.m_floats[1] * v2.m_floats[2] - v1.m_floats[2] * v2.m_floats[1]) + 
00209                         m_floats[1] * (v1.m_floats[2] * v2.m_floats[0] - v1.m_floats[0] * v2.m_floats[2]) + 
00210                         m_floats[2] * (v1.m_floats[0] * v2.m_floats[1] - v1.m_floats[1] * v2.m_floats[0]);
00211         }
00212 
00215         SIMD_FORCE_INLINE int minAxis() const
00216         {
00217                 return m_floats[0] < m_floats[1] ? (m_floats[0] <m_floats[2] ? 0 : 2) : (m_floats[1] <m_floats[2] ? 1 : 2);
00218         }
00219 
00222         SIMD_FORCE_INLINE int maxAxis() const 
00223         {
00224                 return m_floats[0] < m_floats[1] ? (m_floats[1] <m_floats[2] ? 2 : 1) : (m_floats[0] <m_floats[2] ? 2 : 0);
00225         }
00226 
00227         SIMD_FORCE_INLINE int furthestAxis() const
00228         {
00229                 return absolute().minAxis();
00230         }
00231 
00232         SIMD_FORCE_INLINE int closestAxis() const 
00233         {
00234                 return absolute().maxAxis();
00235         }
00236 
00237         SIMD_FORCE_INLINE void setInterpolate3(const btVector3& v0, const btVector3& v1, btScalar rt)
00238         {
00239                 btScalar s = btScalar(1.0) - rt;
00240                 m_floats[0] = s * v0.m_floats[0] + rt * v1.m_floats[0];
00241                 m_floats[1] = s * v0.m_floats[1] + rt * v1.m_floats[1];
00242                 m_floats[2] = s * v0.m_floats[2] + rt * v1.m_floats[2];
00243                 //don't do the unused w component
00244                 //              m_co[3] = s * v0[3] + rt * v1[3];
00245         }
00246 
00250         SIMD_FORCE_INLINE btVector3 lerp(const btVector3& v, const btScalar& t) const 
00251         {
00252                 return btVector3(m_floats[0] + (v.m_floats[0] - m_floats[0]) * t,
00253                         m_floats[1] + (v.m_floats[1] - m_floats[1]) * t,
00254                         m_floats[2] + (v.m_floats[2] -m_floats[2]) * t);
00255         }
00256 
00259         SIMD_FORCE_INLINE btVector3& operator*=(const btVector3& v)
00260         {
00261                 m_floats[0] *= v.m_floats[0]; m_floats[1] *= v.m_floats[1];m_floats[2] *= v.m_floats[2];
00262                 return *this;
00263         }
00264 
00266                 SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; }
00268                 SIMD_FORCE_INLINE const btScalar& getY() const { return m_floats[1]; }
00270                 SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; }
00272                 SIMD_FORCE_INLINE void  setX(btScalar x) { m_floats[0] = x;};
00274                 SIMD_FORCE_INLINE void  setY(btScalar y) { m_floats[1] = y;};
00276                 SIMD_FORCE_INLINE void  setZ(btScalar z) {m_floats[2] = z;};
00278                 SIMD_FORCE_INLINE void  setW(btScalar w) { m_floats[3] = w;};
00280                 SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; }
00282                 SIMD_FORCE_INLINE const btScalar& y() const { return m_floats[1]; }
00284                 SIMD_FORCE_INLINE const btScalar& z() const { return m_floats[2]; }
00286                 SIMD_FORCE_INLINE const btScalar& w() const { return m_floats[3]; }
00287 
00288         //SIMD_FORCE_INLINE btScalar&       operator[](int i)       { return (&m_floats[0])[i]; }      
00289         //SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_floats[0])[i]; }
00291         SIMD_FORCE_INLINE       operator       btScalar *()       { return &m_floats[0]; }
00292         SIMD_FORCE_INLINE       operator const btScalar *() const { return &m_floats[0]; }
00293 
00294         SIMD_FORCE_INLINE       bool    operator==(const btVector3& other) const
00295         {
00296                 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]));
00297         }
00298 
00299         SIMD_FORCE_INLINE       bool    operator!=(const btVector3& other) const
00300         {
00301                 return !(*this == other);
00302         }
00303 
00307                 SIMD_FORCE_INLINE void  setMax(const btVector3& other)
00308                 {
00309                         btSetMax(m_floats[0], other.m_floats[0]);
00310                         btSetMax(m_floats[1], other.m_floats[1]);
00311                         btSetMax(m_floats[2], other.m_floats[2]);
00312                         btSetMax(m_floats[3], other.w());
00313                 }
00317                 SIMD_FORCE_INLINE void  setMin(const btVector3& other)
00318                 {
00319                         btSetMin(m_floats[0], other.m_floats[0]);
00320                         btSetMin(m_floats[1], other.m_floats[1]);
00321                         btSetMin(m_floats[2], other.m_floats[2]);
00322                         btSetMin(m_floats[3], other.w());
00323                 }
00324 
00325                 SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z)
00326                 {
00327                         m_floats[0]=x;
00328                         m_floats[1]=y;
00329                         m_floats[2]=z;
00330                         m_floats[3] = btScalar(0.);
00331                 }
00332 
00333                 void    getSkewSymmetricMatrix(btVector3* v0,btVector3* v1,btVector3* v2) const
00334                 {
00335                         v0->setValue(0.         ,-z()           ,y());
00336                         v1->setValue(z()        ,0.                     ,-x());
00337                         v2->setValue(-y()       ,x()    ,0.);
00338                 }
00339 
00340                 void    setZero()
00341                 {
00342                         setValue(btScalar(0.),btScalar(0.),btScalar(0.));
00343                 }
00344 
00345                 SIMD_FORCE_INLINE bool isZero() const 
00346                 {
00347                         return m_floats[0] == btScalar(0) && m_floats[1] == btScalar(0) && m_floats[2] == btScalar(0);
00348                 }
00349 
00350                 SIMD_FORCE_INLINE bool fuzzyZero() const 
00351                 {
00352                         return length2() < SIMD_EPSILON;
00353                 }
00354 
00355                 SIMD_FORCE_INLINE       void    serialize(struct        btVector3Data& dataOut) const;
00356 
00357                 SIMD_FORCE_INLINE       void    deSerialize(const struct        btVector3Data& dataIn);
00358 
00359                 SIMD_FORCE_INLINE       void    serializeFloat(struct   btVector3FloatData& dataOut) const;
00360 
00361                 SIMD_FORCE_INLINE       void    deSerializeFloat(const struct   btVector3FloatData& dataIn);
00362 
00363                 SIMD_FORCE_INLINE       void    serializeDouble(struct  btVector3DoubleData& dataOut) const;
00364 
00365                 SIMD_FORCE_INLINE       void    deSerializeDouble(const struct  btVector3DoubleData& dataIn);
00366 
00367 };
00368 
00370 SIMD_FORCE_INLINE btVector3 
00371 operator+(const btVector3& v1, const btVector3& v2) 
00372 {
00373         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]);
00374 }
00375 
00377 SIMD_FORCE_INLINE btVector3 
00378 operator*(const btVector3& v1, const btVector3& v2) 
00379 {
00380         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]);
00381 }
00382 
00384 SIMD_FORCE_INLINE btVector3 
00385 operator-(const btVector3& v1, const btVector3& v2)
00386 {
00387         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]);
00388 }
00390 SIMD_FORCE_INLINE btVector3 
00391 operator-(const btVector3& v)
00392 {
00393         return btVector3(-v.m_floats[0], -v.m_floats[1], -v.m_floats[2]);
00394 }
00395 
00397 SIMD_FORCE_INLINE btVector3 
00398 operator*(const btVector3& v, const btScalar& s)
00399 {
00400         return btVector3(v.m_floats[0] * s, v.m_floats[1] * s, v.m_floats[2] * s);
00401 }
00402 
00404 SIMD_FORCE_INLINE btVector3 
00405 operator*(const btScalar& s, const btVector3& v)
00406 { 
00407         return v * s; 
00408 }
00409 
00411 SIMD_FORCE_INLINE btVector3
00412 operator/(const btVector3& v, const btScalar& s)
00413 {
00414         btFullAssert(s != btScalar(0.0));
00415         return v * (btScalar(1.0) / s);
00416 }
00417 
00419 SIMD_FORCE_INLINE btVector3
00420 operator/(const btVector3& v1, const btVector3& v2)
00421 {
00422         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]);
00423 }
00424 
00426 SIMD_FORCE_INLINE btScalar 
00427 btDot(const btVector3& v1, const btVector3& v2) 
00428 { 
00429         return v1.dot(v2); 
00430 }
00431 
00432 
00434 SIMD_FORCE_INLINE btScalar
00435 btDistance2(const btVector3& v1, const btVector3& v2) 
00436 { 
00437         return v1.distance2(v2); 
00438 }
00439 
00440 
00442 SIMD_FORCE_INLINE btScalar
00443 btDistance(const btVector3& v1, const btVector3& v2) 
00444 { 
00445         return v1.distance(v2); 
00446 }
00447 
00449 SIMD_FORCE_INLINE btScalar
00450 btAngle(const btVector3& v1, const btVector3& v2) 
00451 { 
00452         return v1.angle(v2); 
00453 }
00454 
00456 SIMD_FORCE_INLINE btVector3 
00457 btCross(const btVector3& v1, const btVector3& v2) 
00458 { 
00459         return v1.cross(v2); 
00460 }
00461 
00462 SIMD_FORCE_INLINE btScalar
00463 btTriple(const btVector3& v1, const btVector3& v2, const btVector3& v3)
00464 {
00465         return v1.triple(v2, v3);
00466 }
00467 
00472 SIMD_FORCE_INLINE btVector3 
00473 lerp(const btVector3& v1, const btVector3& v2, const btScalar& t)
00474 {
00475         return v1.lerp(v2, t);
00476 }
00477 
00478 
00479 
00480 SIMD_FORCE_INLINE btScalar btVector3::distance2(const btVector3& v) const
00481 {
00482         return (v - *this).length2();
00483 }
00484 
00485 SIMD_FORCE_INLINE btScalar btVector3::distance(const btVector3& v) const
00486 {
00487         return (v - *this).length();
00488 }
00489 
00490 SIMD_FORCE_INLINE btVector3 btVector3::normalized() const
00491 {
00492         return *this / length();
00493 } 
00494 
00495 SIMD_FORCE_INLINE btVector3 btVector3::rotate( const btVector3& wAxis, const btScalar angle ) const
00496 {
00497         // wAxis must be a unit lenght vector
00498 
00499         btVector3 o = wAxis * wAxis.dot( *this );
00500         btVector3 x = *this - o;
00501         btVector3 y;
00502 
00503         y = wAxis.cross( *this );
00504 
00505         return ( o + x * btCos( angle ) + y * btSin( angle ) );
00506 }
00507 
00508 class btVector4 : public btVector3
00509 {
00510 public:
00511 
00512         SIMD_FORCE_INLINE btVector4() {}
00513 
00514 
00515         SIMD_FORCE_INLINE btVector4(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w) 
00516                 : btVector3(x,y,z)
00517         {
00518                 m_floats[3] = w;
00519         }
00520 
00521 
00522         SIMD_FORCE_INLINE btVector4 absolute4() const 
00523         {
00524                 return btVector4(
00525                         btFabs(m_floats[0]), 
00526                         btFabs(m_floats[1]), 
00527                         btFabs(m_floats[2]),
00528                         btFabs(m_floats[3]));
00529         }
00530 
00531 
00532 
00533         btScalar        getW() const { return m_floats[3];}
00534 
00535 
00536                 SIMD_FORCE_INLINE int maxAxis4() const
00537         {
00538                 int maxIndex = -1;
00539                 btScalar maxVal = btScalar(-BT_LARGE_FLOAT);
00540                 if (m_floats[0] > maxVal)
00541                 {
00542                         maxIndex = 0;
00543                         maxVal = m_floats[0];
00544                 }
00545                 if (m_floats[1] > maxVal)
00546                 {
00547                         maxIndex = 1;
00548                         maxVal = m_floats[1];
00549                 }
00550                 if (m_floats[2] > maxVal)
00551                 {
00552                         maxIndex = 2;
00553                         maxVal =m_floats[2];
00554                 }
00555                 if (m_floats[3] > maxVal)
00556                 {
00557                         maxIndex = 3;
00558                         maxVal = m_floats[3];
00559                 }
00560                 
00561                 
00562                 
00563 
00564                 return maxIndex;
00565 
00566         }
00567 
00568 
00569         SIMD_FORCE_INLINE int minAxis4() const
00570         {
00571                 int minIndex = -1;
00572                 btScalar minVal = btScalar(BT_LARGE_FLOAT);
00573                 if (m_floats[0] < minVal)
00574                 {
00575                         minIndex = 0;
00576                         minVal = m_floats[0];
00577                 }
00578                 if (m_floats[1] < minVal)
00579                 {
00580                         minIndex = 1;
00581                         minVal = m_floats[1];
00582                 }
00583                 if (m_floats[2] < minVal)
00584                 {
00585                         minIndex = 2;
00586                         minVal =m_floats[2];
00587                 }
00588                 if (m_floats[3] < minVal)
00589                 {
00590                         minIndex = 3;
00591                         minVal = m_floats[3];
00592                 }
00593                 
00594                 return minIndex;
00595 
00596         }
00597 
00598 
00599         SIMD_FORCE_INLINE int closestAxis4() const 
00600         {
00601                 return absolute4().maxAxis4();
00602         }
00603 
00604         
00605  
00606 
00614 /*              void getValue(btScalar *m) const 
00615                 {
00616                         m[0] = m_floats[0];
00617                         m[1] = m_floats[1];
00618                         m[2] =m_floats[2];
00619                 }
00620 */
00627                 SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w)
00628                 {
00629                         m_floats[0]=x;
00630                         m_floats[1]=y;
00631                         m_floats[2]=z;
00632                         m_floats[3]=w;
00633                 }
00634 
00635 
00636 };
00637 
00638 
00640 SIMD_FORCE_INLINE void  btSwapScalarEndian(const btScalar& sourceVal, btScalar& destVal)
00641 {
00642         #ifdef BT_USE_DOUBLE_PRECISION
00643         unsigned char* dest = (unsigned char*) &destVal;
00644         unsigned char* src  = (unsigned char*) &sourceVal;
00645         dest[0] = src[7];
00646     dest[1] = src[6];
00647     dest[2] = src[5];
00648     dest[3] = src[4];
00649     dest[4] = src[3];
00650     dest[5] = src[2];
00651     dest[6] = src[1];
00652     dest[7] = src[0];
00653 #else
00654         unsigned char* dest = (unsigned char*) &destVal;
00655         unsigned char* src  = (unsigned char*) &sourceVal;
00656         dest[0] = src[3];
00657     dest[1] = src[2];
00658     dest[2] = src[1];
00659     dest[3] = src[0];
00660 #endif //BT_USE_DOUBLE_PRECISION
00661 }
00663 SIMD_FORCE_INLINE void  btSwapVector3Endian(const btVector3& sourceVec, btVector3& destVec)
00664 {
00665         for (int i=0;i<4;i++)
00666         {
00667                 btSwapScalarEndian(sourceVec[i],destVec[i]);
00668         }
00669 
00670 }
00671 
00673 SIMD_FORCE_INLINE void  btUnSwapVector3Endian(btVector3& vector)
00674 {
00675 
00676         btVector3       swappedVec;
00677         for (int i=0;i<4;i++)
00678         {
00679                 btSwapScalarEndian(vector[i],swappedVec[i]);
00680         }
00681         vector = swappedVec;
00682 }
00683 
00684 template <class T>
00685 SIMD_FORCE_INLINE void btPlaneSpace1 (const T& n, T& p, T& q)
00686 {
00687   if (btFabs(n[2]) > SIMDSQRT12) {
00688     // choose p in y-z plane
00689     btScalar a = n[1]*n[1] + n[2]*n[2];
00690     btScalar k = btRecipSqrt (a);
00691     p[0] = 0;
00692         p[1] = -n[2]*k;
00693         p[2] = n[1]*k;
00694     // set q = n x p
00695     q[0] = a*k;
00696         q[1] = -n[0]*p[2];
00697         q[2] = n[0]*p[1];
00698   }
00699   else {
00700     // choose p in x-y plane
00701     btScalar a = n[0]*n[0] + n[1]*n[1];
00702     btScalar k = btRecipSqrt (a);
00703     p[0] = -n[1]*k;
00704         p[1] = n[0]*k;
00705         p[2] = 0;
00706     // set q = n x p
00707     q[0] = -n[2]*p[1];
00708         q[1] = n[2]*p[0];
00709         q[2] = a*k;
00710   }
00711 }
00712 
00713 
00714 struct  btVector3FloatData
00715 {
00716         float   m_floats[4];
00717 };
00718 
00719 struct  btVector3DoubleData
00720 {
00721         double  m_floats[4];
00722 
00723 };
00724 
00725 SIMD_FORCE_INLINE       void    btVector3::serializeFloat(struct        btVector3FloatData& dataOut) const
00726 {
00728         for (int i=0;i<4;i++)
00729                 dataOut.m_floats[i] = float(m_floats[i]);
00730 }
00731 
00732 SIMD_FORCE_INLINE void  btVector3::deSerializeFloat(const struct        btVector3FloatData& dataIn)
00733 {
00734         for (int i=0;i<4;i++)
00735                 m_floats[i] = btScalar(dataIn.m_floats[i]);
00736 }
00737 
00738 
00739 SIMD_FORCE_INLINE       void    btVector3::serializeDouble(struct       btVector3DoubleData& dataOut) const
00740 {
00742         for (int i=0;i<4;i++)
00743                 dataOut.m_floats[i] = double(m_floats[i]);
00744 }
00745 
00746 SIMD_FORCE_INLINE void  btVector3::deSerializeDouble(const struct       btVector3DoubleData& dataIn)
00747 {
00748         for (int i=0;i<4;i++)
00749                 m_floats[i] = btScalar(dataIn.m_floats[i]);
00750 }
00751 
00752 
00753 SIMD_FORCE_INLINE       void    btVector3::serialize(struct     btVector3Data& dataOut) const
00754 {
00756         for (int i=0;i<4;i++)
00757                 dataOut.m_floats[i] = m_floats[i];
00758 }
00759 
00760 SIMD_FORCE_INLINE void  btVector3::deSerialize(const struct     btVector3Data& dataIn)
00761 {
00762         for (int i=0;i<4;i++)
00763                 m_floats[i] = dataIn.m_floats[i];
00764 }
00765 
00766 
00767 #endif //SIMD__VECTOR3_H