|
Blender
V2.59
|
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