Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Apr 8, 2009, 12:58:47 AM (16 years ago)
Author:
dafrick
Message:

Reverted to revision 2906 (because I'm too stupid to merge correctly, 2nd try will follow shortly. ;))

Location:
code/branches/questsystem5
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/questsystem5

  • code/branches/questsystem5/src/bullet/BulletDynamics/ConstraintSolver/btSolverBody.h

    r2907 r2908  
    2424#include "LinearMath/btTransformUtil.h"
    2525
    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
    10626
    10727///The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packed to increase cache coherence/performance.
     
    10929{
    11030        BT_DECLARE_ALIGNED_ALLOCATOR();
    111         btVector3               m_deltaLinearVelocity;
    112         btVector3               m_deltaAngularVelocity;
    113         btScalar                m_angularFactor;
    114         btScalar                m_invMass;
    115         btScalar                m_friction;
     31       
     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;
    11643        btRigidBody*    m_originalBody;
    117         btVector3               m_pushVelocity;
    118         //btVector3             m_turnVelocity;
    119 
    12044       
    121         SIMD_FORCE_INLINE void  getVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity ) const
     45       
     46        SIMD_FORCE_INLINE void  getVelocityInLocalPoint(const btVector3& rel_pos, btVector3& velocity ) const
    12247        {
    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);
     48                velocity = m_linearVelocity + m_angularVelocity.cross(rel_pos);
    12749        }
    12850
    129         SIMD_FORCE_INLINE void  getAngularVelocity(btVector3& angVel) const
     51        //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)
    13053        {
    131                 if (m_originalBody)
    132                         angVel = m_originalBody->getAngularVelocity()+m_deltaAngularVelocity;
    133                 else
    134                         angVel.setValue(0,0,0);
     54                if (m_invMass)
     55                {
     56                        m_linearVelocity += linearComponent*impulseMagnitude;
     57                        m_angularVelocity += angularComponent*(impulseMagnitude*m_angularFactor);
     58                }
    13559        }
    136 
    137 
    138         //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position
    139         SIMD_FORCE_INLINE void applyImpulse(const btVector3& linearComponent, const btVector3& angularComponent,const btScalar impulseMagnitude)
     60       
     61        SIMD_FORCE_INLINE void internalApplyPushImpulse(const btVector3& linearComponent, const btVector3& angularComponent,btScalar impulseMagnitude)
    14062        {
    141                 //if (m_invMass)
     63                if (m_invMass)
    14264                {
    143                         m_deltaLinearVelocity += linearComponent*impulseMagnitude;
    144                         m_deltaAngularVelocity += angularComponent*(impulseMagnitude*m_angularFactor);
     65                        m_pushVelocity += linearComponent*impulseMagnitude;
     66                        m_turnVelocity += angularComponent*(impulseMagnitude*m_angularFactor);
    14567                }
    14668        }
    14769
    148        
    149 /*
    15070       
    15171        void    writebackVelocity()
     
    15373                if (m_invMass)
    15474                {
    155                         m_originalBody->setLinearVelocity(m_originalBody->getLinearVelocity()+ m_deltaLinearVelocity);
    156                         m_originalBody->setAngularVelocity(m_originalBody->getAngularVelocity()+m_deltaAngularVelocity);
     75                        m_originalBody->setLinearVelocity(m_linearVelocity);
     76                        m_originalBody->setAngularVelocity(m_angularVelocity);
    15777                       
    15878                        //m_originalBody->setCompanionId(-1);
    15979                }
    16080        }
    161         */
     81       
    16282
    163         void    writebackVelocity(btScalar timeStep=0)
     83        void    writebackVelocity(btScalar timeStep)
    16484        {
    16585                if (m_invMass)
    16686                {
    167                         m_originalBody->setLinearVelocity(m_originalBody->getLinearVelocity()+m_deltaLinearVelocity);
    168                         m_originalBody->setAngularVelocity(m_originalBody->getAngularVelocity()+m_deltaAngularVelocity);
     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                       
    16995                        //m_originalBody->setCompanionId(-1);
    17096                }
    17197        }
     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
    172108       
    173109
Note: See TracChangeset for help on using the changeset viewer.