- Timestamp:
- Mar 31, 2009, 8:05:51 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h
r2662 r2882 24 24 #include "LinearMath/btTransformUtil.h" 25 25 26 ///Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later, and not double precision 27 #ifdef BT_USE_SSE 28 #define USE_SIMD 1 29 #endif // 30 31 32 #ifdef USE_SIMD 33 34 struct btSimdScalar 35 { 36 SIMD_FORCE_INLINE btSimdScalar() 37 { 38 39 } 40 41 SIMD_FORCE_INLINE btSimdScalar(float fl) 42 :m_vec128 (_mm_set1_ps(fl)) 43 { 44 } 45 46 SIMD_FORCE_INLINE btSimdScalar(__m128 v128) 47 :m_vec128(v128) 48 { 49 } 50 union 51 { 52 __m128 m_vec128; 53 float m_floats[4]; 54 int m_ints[4]; 55 btScalar m_unusedPadding; 56 }; 57 SIMD_FORCE_INLINE __m128 get128() 58 { 59 return m_vec128; 60 } 61 62 SIMD_FORCE_INLINE const __m128 get128() const 63 { 64 return m_vec128; 65 } 66 67 SIMD_FORCE_INLINE void set128(__m128 v128) 68 { 69 m_vec128 = v128; 70 } 71 72 SIMD_FORCE_INLINE operator __m128() 73 { 74 return m_vec128; 75 } 76 SIMD_FORCE_INLINE operator const __m128() const 77 { 78 return m_vec128; 79 } 80 81 SIMD_FORCE_INLINE operator float() const 82 { 83 return m_floats[0]; 84 } 85 86 }; 87 88 ///@brief Return the elementwise product of two btSimdScalar 89 SIMD_FORCE_INLINE btSimdScalar 90 operator*(const btSimdScalar& v1, const btSimdScalar& v2) 91 { 92 return btSimdScalar(_mm_mul_ps(v1.get128(),v2.get128())); 93 } 94 95 ///@brief Return the elementwise product of two btSimdScalar 96 SIMD_FORCE_INLINE btSimdScalar 97 operator+(const btSimdScalar& v1, const btSimdScalar& v2) 98 { 99 return btSimdScalar(_mm_add_ps(v1.get128(),v2.get128())); 100 } 101 102 103 #else 104 #define btSimdScalar btScalar 105 #endif 26 106 27 107 ///The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packed to increase cache coherence/performance. … … 29 109 { 30 110 BT_DECLARE_ALIGNED_ALLOCATOR(); 111 btVector3 m_deltaLinearVelocity; 112 btVector3 m_deltaAngularVelocity; 113 btScalar m_angularFactor; 114 btScalar m_invMass; 115 btScalar m_friction; 116 btRigidBody* m_originalBody; 117 btVector3 m_pushVelocity; 118 //btVector3 m_turnVelocity; 119 31 120 32 btMatrix3x3 m_worldInvInertiaTensor; 33 34 btVector3 m_angularVelocity; 35 btVector3 m_linearVelocity; 36 btVector3 m_centerOfMassPosition; 37 btVector3 m_pushVelocity; 38 btVector3 m_turnVelocity; 39 40 float m_angularFactor; 41 float m_invMass; 42 float m_friction; 43 btRigidBody* m_originalBody; 44 45 46 SIMD_FORCE_INLINE void getVelocityInLocalPoint(const btVector3& rel_pos, btVector3& velocity ) const 121 SIMD_FORCE_INLINE void getVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity ) const 47 122 { 48 velocity = m_linearVelocity + m_angularVelocity.cross(rel_pos); 123 if (m_originalBody) 124 velocity = m_originalBody->getLinearVelocity()+m_deltaLinearVelocity + (m_originalBody->getAngularVelocity()+m_deltaAngularVelocity).cross(rel_pos); 125 else 126 velocity.setValue(0,0,0); 49 127 } 50 128 129 SIMD_FORCE_INLINE void getAngularVelocity(btVector3& angVel) const 130 { 131 if (m_originalBody) 132 angVel = m_originalBody->getAngularVelocity()+m_deltaAngularVelocity; 133 else 134 angVel.setValue(0,0,0); 135 } 136 137 51 138 //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position 52 SIMD_FORCE_INLINE void internalApplyImpulse(const btVector3& linearComponent, const btVector3& angularComponent,btScalar impulseMagnitude)139 SIMD_FORCE_INLINE void applyImpulse(const btVector3& linearComponent, const btVector3& angularComponent,const btScalar impulseMagnitude) 53 140 { 54 if (m_invMass)141 //if (m_invMass) 55 142 { 56 m_linearVelocity += linearComponent*impulseMagnitude; 57 m_angularVelocity += angularComponent*(impulseMagnitude*m_angularFactor); 58 } 59 } 60 61 SIMD_FORCE_INLINE void internalApplyPushImpulse(const btVector3& linearComponent, const btVector3& angularComponent,btScalar impulseMagnitude) 62 { 63 if (m_invMass) 64 { 65 m_pushVelocity += linearComponent*impulseMagnitude; 66 m_turnVelocity += angularComponent*(impulseMagnitude*m_angularFactor); 143 m_deltaLinearVelocity += linearComponent*impulseMagnitude; 144 m_deltaAngularVelocity += angularComponent*(impulseMagnitude*m_angularFactor); 67 145 } 68 146 } 69 147 148 149 /* 70 150 71 151 void writebackVelocity() … … 73 153 if (m_invMass) 74 154 { 75 m_originalBody->setLinearVelocity(m_ linearVelocity);76 m_originalBody->setAngularVelocity(m_ angularVelocity);155 m_originalBody->setLinearVelocity(m_originalBody->getLinearVelocity()+ m_deltaLinearVelocity); 156 m_originalBody->setAngularVelocity(m_originalBody->getAngularVelocity()+m_deltaAngularVelocity); 77 157 78 158 //m_originalBody->setCompanionId(-1); 79 159 } 80 160 } 81 161 */ 82 162 83 void writebackVelocity(btScalar timeStep )163 void writebackVelocity(btScalar timeStep=0) 84 164 { 85 165 if (m_invMass) 86 166 { 87 m_originalBody->setLinearVelocity(m_linearVelocity); 88 m_originalBody->setAngularVelocity(m_angularVelocity); 89 90 //correct the position/orientation based on push/turn recovery 91 btTransform newTransform; 92 btTransformUtil::integrateTransform(m_originalBody->getWorldTransform(),m_pushVelocity,m_turnVelocity,timeStep,newTransform); 93 m_originalBody->setWorldTransform(newTransform); 94 167 m_originalBody->setLinearVelocity(m_originalBody->getLinearVelocity()+m_deltaLinearVelocity); 168 m_originalBody->setAngularVelocity(m_originalBody->getAngularVelocity()+m_deltaAngularVelocity); 95 169 //m_originalBody->setCompanionId(-1); 96 170 } 97 171 } 98 99 void readVelocity()100 {101 if (m_invMass)102 {103 m_linearVelocity = m_originalBody->getLinearVelocity();104 m_angularVelocity = m_originalBody->getAngularVelocity();105 }106 }107 108 172 109 173
Note: See TracChangeset
for help on using the changeset viewer.