- Timestamp:
- Feb 27, 2011, 7:43:24 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/kicklib/src/external/bullet/LinearMath/btVector3.h
r5781 r7983 20 20 21 21 #include "btScalar.h" 22 #include "btScalar.h"23 22 #include "btMinMax.h" 23 24 #ifdef BT_USE_DOUBLE_PRECISION 25 #define btVector3Data btVector3DoubleData 26 #define btVector3DataName "btVector3DoubleData" 27 #else 28 #define btVector3Data btVector3FloatData 29 #define btVector3DataName "btVector3FloatData" 30 #endif //BT_USE_DOUBLE_PRECISION 31 32 33 34 24 35 /**@brief btVector3 can be used to represent 3D points and vectors. 25 36 * It has an un-used w component to suit 16-byte alignment when btVector3 is stored in containers. This extra component can be used by derived classes (Quaternion?) or by user 26 37 * Ideally, this class should be replaced by a platform optimized SIMD version that keeps the data in registers 27 38 */ 28 29 39 ATTRIBUTE_ALIGNED16(class) btVector3 30 40 { … … 32 42 33 43 #if defined (__SPU__) && defined (__CELLOS_LV2__) 34 union {35 vec_float4 mVec128;36 44 btScalar m_floats[4]; 37 };38 45 public: 39 vec_float4get128() const40 { 41 return mVec128;46 SIMD_FORCE_INLINE const vec_float4& get128() const 47 { 48 return *((const vec_float4*)&m_floats[0]); 42 49 } 43 50 public: 44 51 #else //__CELLOS_LV2__ __SPU__ 45 #ifdef BT_USE_SSE // WIN3252 #ifdef BT_USE_SSE // _WIN32 46 53 union { 47 54 __m128 mVec128; … … 142 149 SIMD_FORCE_INLINE btScalar distance(const btVector3& v) const; 143 150 151 SIMD_FORCE_INLINE btVector3& safeNormalize() 152 { 153 btVector3 absVec = this->absolute(); 154 int maxIndex = absVec.maxAxis(); 155 if (absVec[maxIndex]>0) 156 { 157 *this /= absVec[maxIndex]; 158 return *this /= length(); 159 } 160 setValue(1,0,0); 161 return *this; 162 } 163 144 164 /**@brief Normalize this vector 145 165 * x^2 + y^2 + z^2 = 1 */ … … 152 172 SIMD_FORCE_INLINE btVector3 normalized() const; 153 173 154 /**@brief R otate this vector174 /**@brief Return a rotated version of this vector 155 175 * @param wAxis The axis to rotate about 156 176 * @param angle The angle to rotate by */ 157 SIMD_FORCE_INLINE btVector3 rotate( const btVector3& wAxis, const btScalar angle ) ;177 SIMD_FORCE_INLINE btVector3 rotate( const btVector3& wAxis, const btScalar angle ) const; 158 178 159 179 /**@brief Return the angle between this and another vector … … 307 327 m_floats[1]=y; 308 328 m_floats[2]=z; 309 m_floats[3] = 0.f;329 m_floats[3] = btScalar(0.); 310 330 } 311 331 … … 316 336 v2->setValue(-y() ,x() ,0.); 317 337 } 338 339 void setZero() 340 { 341 setValue(btScalar(0.),btScalar(0.),btScalar(0.)); 342 } 343 344 SIMD_FORCE_INLINE bool isZero() const 345 { 346 return m_floats[0] == btScalar(0) && m_floats[1] == btScalar(0) && m_floats[2] == btScalar(0); 347 } 348 349 SIMD_FORCE_INLINE bool fuzzyZero() const 350 { 351 return length2() < SIMD_EPSILON; 352 } 353 354 SIMD_FORCE_INLINE void serialize(struct btVector3Data& dataOut) const; 355 356 SIMD_FORCE_INLINE void deSerialize(const struct btVector3Data& dataIn); 357 358 SIMD_FORCE_INLINE void serializeFloat(struct btVector3FloatData& dataOut) const; 359 360 SIMD_FORCE_INLINE void deSerializeFloat(const struct btVector3FloatData& dataIn); 361 362 SIMD_FORCE_INLINE void serializeDouble(struct btVector3DoubleData& dataOut) const; 363 364 SIMD_FORCE_INLINE void deSerializeDouble(const struct btVector3DoubleData& dataIn); 318 365 319 366 }; … … 377 424 /**@brief Return the dot product between two vectors */ 378 425 SIMD_FORCE_INLINE btScalar 379 dot(const btVector3& v1, const btVector3& v2)426 btDot(const btVector3& v1, const btVector3& v2) 380 427 { 381 428 return v1.dot(v2); … … 385 432 /**@brief Return the distance squared between two vectors */ 386 433 SIMD_FORCE_INLINE btScalar 387 distance2(const btVector3& v1, const btVector3& v2)434 btDistance2(const btVector3& v1, const btVector3& v2) 388 435 { 389 436 return v1.distance2(v2); … … 393 440 /**@brief Return the distance between two vectors */ 394 441 SIMD_FORCE_INLINE btScalar 395 distance(const btVector3& v1, const btVector3& v2)442 btDistance(const btVector3& v1, const btVector3& v2) 396 443 { 397 444 return v1.distance(v2); … … 400 447 /**@brief Return the angle between two vectors */ 401 448 SIMD_FORCE_INLINE btScalar 402 angle(const btVector3& v1, const btVector3& v2)449 btAngle(const btVector3& v1, const btVector3& v2) 403 450 { 404 451 return v1.angle(v2); … … 407 454 /**@brief Return the cross product of two vectors */ 408 455 SIMD_FORCE_INLINE btVector3 409 cross(const btVector3& v1, const btVector3& v2)456 btCross(const btVector3& v1, const btVector3& v2) 410 457 { 411 458 return v1.cross(v2); … … 413 460 414 461 SIMD_FORCE_INLINE btScalar 415 triple(const btVector3& v1, const btVector3& v2, const btVector3& v3)462 btTriple(const btVector3& v1, const btVector3& v2, const btVector3& v3) 416 463 { 417 464 return v1.triple(v2, v3); … … 445 492 } 446 493 447 SIMD_FORCE_INLINE btVector3 btVector3::rotate( const btVector3& wAxis, const btScalar angle ) 494 SIMD_FORCE_INLINE btVector3 btVector3::rotate( const btVector3& wAxis, const btScalar angle ) const 448 495 { 449 496 // wAxis must be a unit lenght vector … … 489 536 { 490 537 int maxIndex = -1; 491 btScalar maxVal = btScalar(- 1e30);538 btScalar maxVal = btScalar(-BT_LARGE_FLOAT); 492 539 if (m_floats[0] > maxVal) 493 540 { … … 522 569 { 523 570 int minIndex = -1; 524 btScalar minVal = btScalar( 1e30);571 btScalar minVal = btScalar(BT_LARGE_FLOAT); 525 572 if (m_floats[0] < minVal) 526 573 { … … 585 632 } 586 633 587 588 589 634 590 635 }; … … 636 681 } 637 682 683 template <class T> 684 SIMD_FORCE_INLINE void btPlaneSpace1 (const T& n, T& p, T& q) 685 { 686 if (btFabs(n[2]) > SIMDSQRT12) { 687 // choose p in y-z plane 688 btScalar a = n[1]*n[1] + n[2]*n[2]; 689 btScalar k = btRecipSqrt (a); 690 p[0] = 0; 691 p[1] = -n[2]*k; 692 p[2] = n[1]*k; 693 // set q = n x p 694 q[0] = a*k; 695 q[1] = -n[0]*p[2]; 696 q[2] = n[0]*p[1]; 697 } 698 else { 699 // choose p in x-y plane 700 btScalar a = n[0]*n[0] + n[1]*n[1]; 701 btScalar k = btRecipSqrt (a); 702 p[0] = -n[1]*k; 703 p[1] = n[0]*k; 704 p[2] = 0; 705 // set q = n x p 706 q[0] = -n[2]*p[1]; 707 q[1] = n[2]*p[0]; 708 q[2] = a*k; 709 } 710 } 711 712 713 struct btVector3FloatData 714 { 715 float m_floats[4]; 716 }; 717 718 struct btVector3DoubleData 719 { 720 double m_floats[4]; 721 722 }; 723 724 SIMD_FORCE_INLINE void btVector3::serializeFloat(struct btVector3FloatData& dataOut) const 725 { 726 ///could also do a memcpy, check if it is worth it 727 for (int i=0;i<4;i++) 728 dataOut.m_floats[i] = float(m_floats[i]); 729 } 730 731 SIMD_FORCE_INLINE void btVector3::deSerializeFloat(const struct btVector3FloatData& dataIn) 732 { 733 for (int i=0;i<4;i++) 734 m_floats[i] = btScalar(dataIn.m_floats[i]); 735 } 736 737 738 SIMD_FORCE_INLINE void btVector3::serializeDouble(struct btVector3DoubleData& dataOut) const 739 { 740 ///could also do a memcpy, check if it is worth it 741 for (int i=0;i<4;i++) 742 dataOut.m_floats[i] = double(m_floats[i]); 743 } 744 745 SIMD_FORCE_INLINE void btVector3::deSerializeDouble(const struct btVector3DoubleData& dataIn) 746 { 747 for (int i=0;i<4;i++) 748 m_floats[i] = btScalar(dataIn.m_floats[i]); 749 } 750 751 752 SIMD_FORCE_INLINE void btVector3::serialize(struct btVector3Data& dataOut) const 753 { 754 ///could also do a memcpy, check if it is worth it 755 for (int i=0;i<4;i++) 756 dataOut.m_floats[i] = m_floats[i]; 757 } 758 759 SIMD_FORCE_INLINE void btVector3::deSerialize(const struct btVector3Data& dataIn) 760 { 761 for (int i=0;i<4;i++) 762 m_floats[i] = dataIn.m_floats[i]; 763 } 764 765 638 766 #endif //SIMD__VECTOR3_H
Note: See TracChangeset
for help on using the changeset viewer.