Blender V2.61 - r43446
|
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