Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Dec 13, 2008, 11:45:51 PM (16 years ago)
Author:
rgrieder
Message:

Updated to Bullet 2.73 (first part).

Location:
code/branches/physics/src/bullet/LinearMath
Files:
1 deleted
14 edited

Legend:

Unmodified
Added
Removed
  • code/branches/physics/src/bullet/LinearMath/CMakeLists.txt

    r2192 r2430  
    1 ADD_LIBRARY(LibLinearMath
    2                 btAlignedObjectArray.h
    3                 btList.h
    4                 btPoolAllocator.h
    5                 btRandom.h
    6                 btVector3.h
    7                 btDefaultMotionState.h
    8                 btMatrix3x3.h
    9                 btQuadWord.h
    10                 btHashMap.h
    11                 btScalar.h
    12                 btAabbUtil2.h
    13                 btConvexHull.h
     1SET(LinearMath_SRCS
    142                btConvexHull.cpp
    15                 btMinMax.h
    16                 btQuaternion.h
    17                 btStackAlloc.h
    18                 btGeometryUtil.h
    19                 btMotionState.h
    20                 btTransform.h
    21                 btAlignedAllocator.h
    22                 btIDebugDraw.h
    23                 btPoint3.h
    24                 btQuickprof.h
    25                 btTransformUtil.h
    263                btQuickprof.cpp
    274                btGeometryUtil.cpp
     
    296)
    307
     8ADD_LIBRARY(LinearMath ${LinearMath_SRCS})
  • code/branches/physics/src/bullet/LinearMath/btAabbUtil2.h

    r2192 r2430  
    2222#include "btMinMax.h"
    2323
     24
     25
    2426SIMD_FORCE_INLINE void AabbExpand (btVector3& aabbMin,
    2527                                                                   btVector3& aabbMax,
     
    3133}
    3234
     35/// conservative test for overlap between two aabbs
     36SIMD_FORCE_INLINE bool TestPointAgainstAabb2(const btVector3 &aabbMin1, const btVector3 &aabbMax1,
     37                                                                const btVector3 &point)
     38{
     39        bool overlap = true;
     40        overlap = (aabbMin1.getX() > point.getX() || aabbMax1.getX() < point.getX()) ? false : overlap;
     41        overlap = (aabbMin1.getZ() > point.getZ() || aabbMax1.getZ() < point.getZ()) ? false : overlap;
     42        overlap = (aabbMin1.getY() > point.getY() || aabbMax1.getY() < point.getY()) ? false : overlap;
     43        return overlap;
     44}
     45
    3346
    3447/// conservative test for overlap between two aabbs
     
    3750{
    3851        bool overlap = true;
    39         overlap = (aabbMin1[0] > aabbMax2[0] || aabbMax1[0] < aabbMin2[0]) ? false : overlap;
    40         overlap = (aabbMin1[2] > aabbMax2[2] || aabbMax1[2] < aabbMin2[2]) ? false : overlap;
    41         overlap = (aabbMin1[1] > aabbMax2[1] || aabbMax1[1] < aabbMin2[1]) ? false : overlap;
     52        overlap = (aabbMin1.getX() > aabbMax2.getX() || aabbMax1.getX() < aabbMin2.getX()) ? false : overlap;
     53        overlap = (aabbMin1.getZ() > aabbMax2.getZ() || aabbMax1.getZ() < aabbMin2.getZ()) ? false : overlap;
     54        overlap = (aabbMin1.getY() > aabbMax2.getY() || aabbMax1.getY() < aabbMin2.getY()) ? false : overlap;
    4255        return overlap;
    4356}
     
    7285                   (p.getZ() >  halfExtent.getZ() ? 0x20 : 0x0);
    7386}
     87
    7488
    7589
     
    8397{
    8498        btScalar tmax, tymin, tymax, tzmin, tzmax;
    85         tmin = (bounds[raySign[0]][0] - rayFrom[0]) * rayInvDirection[0];
    86         tmax = (bounds[1-raySign[0]][0] - rayFrom[0]) * rayInvDirection[0];
    87         tymin = (bounds[raySign[1]][1] - rayFrom[1]) * rayInvDirection[1];
    88         tymax = (bounds[1-raySign[1]][1] - rayFrom[1]) * rayInvDirection[1];
     99        tmin = (bounds[raySign[0]].getX() - rayFrom.getX()) * rayInvDirection.getX();
     100        tmax = (bounds[1-raySign[0]].getX() - rayFrom.getX()) * rayInvDirection.getX();
     101        tymin = (bounds[raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY();
     102        tymax = (bounds[1-raySign[1]].getY() - rayFrom.getY()) * rayInvDirection.getY();
    89103
    90104        if ( (tmin > tymax) || (tymin > tmax) )
     
    97111                tmax = tymax;
    98112
    99         tzmin = (bounds[raySign[2]][2] - rayFrom[2]) * rayInvDirection[2];
    100         tzmax = (bounds[1-raySign[2]][2] - rayFrom[2]) * rayInvDirection[2];
     113        tzmin = (bounds[raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ();
     114        tzmax = (bounds[1-raySign[2]].getZ() - rayFrom.getZ()) * rayInvDirection.getZ();
    101115
    102116        if ( (tmin > tzmax) || (tzmin > tmax) )
     
    197211}
    198212
     213#define USE_BANCHLESS 1
     214#ifdef USE_BANCHLESS
     215        //This block replaces the block below and uses no branches, and replaces the 8 bit return with a 32 bit return for improved performance (~3x on XBox 360)
     216        SIMD_FORCE_INLINE unsigned testQuantizedAabbAgainstQuantizedAabb(const unsigned short int* aabbMin1,const unsigned short int* aabbMax1,const unsigned short int* aabbMin2,const unsigned short int* aabbMax2)
     217        {               
     218                return static_cast<unsigned int>(btSelect((unsigned)((aabbMin1[0] <= aabbMax2[0]) & (aabbMax1[0] >= aabbMin2[0])
     219                        & (aabbMin1[2] <= aabbMax2[2]) & (aabbMax1[2] >= aabbMin2[2])
     220                        & (aabbMin1[1] <= aabbMax2[1]) & (aabbMax1[1] >= aabbMin2[1])),
     221                        1, 0));
     222        }
     223#else
     224        SIMD_FORCE_INLINE bool testQuantizedAabbAgainstQuantizedAabb(const unsigned short int* aabbMin1,const unsigned short int* aabbMax1,const unsigned short int* aabbMin2,const unsigned short int* aabbMax2)
     225        {
     226                bool overlap = true;
     227                overlap = (aabbMin1[0] > aabbMax2[0] || aabbMax1[0] < aabbMin2[0]) ? false : overlap;
     228                overlap = (aabbMin1[2] > aabbMax2[2] || aabbMax1[2] < aabbMin2[2]) ? false : overlap;
     229                overlap = (aabbMin1[1] > aabbMax2[1] || aabbMax1[1] < aabbMin2[1]) ? false : overlap;
     230                return overlap;
     231        }
     232#endif //USE_BANCHLESS
    199233
    200234#endif
  • code/branches/physics/src/bullet/LinearMath/btConvexHull.cpp

    r2192 r2430  
    343343}
    344344
    345 class Tri;
    346 
    347 
    348 
    349 class Tri : public int3
     345class btHullTriangle;
     346
     347
     348
     349class btHullTriangle : public int3
    350350{
    351351public:
     
    354354        int vmax;
    355355        btScalar rise;
    356         Tri(int a,int b,int c):int3(a,b,c),n(-1,-1,-1)
     356        btHullTriangle(int a,int b,int c):int3(a,b,c),n(-1,-1,-1)
    357357        {
    358358                vmax=-1;
    359359                rise = btScalar(0.0);
    360360        }
    361         ~Tri()
     361        ~btHullTriangle()
    362362        {
    363363        }
     
    366366
    367367
    368 int &Tri::neib(int a,int b)
     368int &btHullTriangle::neib(int a,int b)
    369369{
    370370        static int er=-1;
     
    380380        return er;
    381381}
    382 void HullLibrary::b2bfix(Tri* s,Tri*t)
     382void HullLibrary::b2bfix(btHullTriangle* s,btHullTriangle*t)
    383383{
    384384        int i;
     
    396396}
    397397
    398 void HullLibrary::removeb2b(Tri* s,Tri*t)
     398void HullLibrary::removeb2b(btHullTriangle* s,btHullTriangle*t)
    399399{
    400400        b2bfix(s,t);
     
    404404}
    405405
    406 void HullLibrary::checkit(Tri *t)
     406void HullLibrary::checkit(btHullTriangle *t)
    407407{
    408408        (void)t;
     
    428428}
    429429
    430 Tri*    HullLibrary::allocateTriangle(int a,int b,int c)
    431 {
    432         void* mem = btAlignedAlloc(sizeof(Tri),16);
    433         Tri* tr = new (mem)Tri(a,b,c);
     430btHullTriangle* HullLibrary::allocateTriangle(int a,int b,int c)
     431{
     432        void* mem = btAlignedAlloc(sizeof(btHullTriangle),16);
     433        btHullTriangle* tr = new (mem)btHullTriangle(a,b,c);
    434434        tr->id = m_tris.size();
    435435        m_tris.push_back(tr);
     
    438438}
    439439
    440 void    HullLibrary::deAllocateTriangle(Tri* tri)
     440void    HullLibrary::deAllocateTriangle(btHullTriangle* tri)
    441441{
    442442        btAssert(m_tris[tri->id]==tri);
    443443        m_tris[tri->id]=NULL;
    444         tri->~Tri();
     444        tri->~btHullTriangle();
    445445        btAlignedFree(tri);
    446446}
    447447
    448448
    449 void HullLibrary::extrude(Tri *t0,int v)
     449void HullLibrary::extrude(btHullTriangle *t0,int v)
    450450{
    451451        int3 t= *t0;
    452452        int n = m_tris.size();
    453         Tri* ta = allocateTriangle(v,t[1],t[2]);
     453        btHullTriangle* ta = allocateTriangle(v,t[1],t[2]);
    454454        ta->n = int3(t0->n[0],n+1,n+2);
    455455        m_tris[t0->n[0]]->neib(t[1],t[2]) = n+0;
    456         Tri* tb = allocateTriangle(v,t[2],t[0]);
     456        btHullTriangle* tb = allocateTriangle(v,t[2],t[0]);
    457457        tb->n = int3(t0->n[1],n+2,n+0);
    458458        m_tris[t0->n[1]]->neib(t[2],t[0]) = n+1;
    459         Tri* tc = allocateTriangle(v,t[0],t[1]);
     459        btHullTriangle* tc = allocateTriangle(v,t[0],t[1]);
    460460        tc->n = int3(t0->n[2],n+0,n+1);
    461461        m_tris[t0->n[2]]->neib(t[0],t[1]) = n+2;
     
    470470}
    471471
    472 Tri* HullLibrary::extrudable(btScalar epsilon)
     472btHullTriangle* HullLibrary::extrudable(btScalar epsilon)
    473473{
    474474        int i;
    475         Tri *t=NULL;
     475        btHullTriangle *t=NULL;
    476476        for(i=0;i<m_tris.size();i++)
    477477        {
     
    551551
    552552        btVector3 center = (verts[p[0]]+verts[p[1]]+verts[p[2]]+verts[p[3]]) / btScalar(4.0);  // a valid interior point
    553         Tri *t0 = allocateTriangle(p[2],p[3],p[1]); t0->n=int3(2,3,1);
    554         Tri *t1 = allocateTriangle(p[3],p[2],p[0]); t1->n=int3(3,2,0);
    555         Tri *t2 = allocateTriangle(p[0],p[1],p[3]); t2->n=int3(0,1,3);
    556         Tri *t3 = allocateTriangle(p[1],p[0],p[2]); t3->n=int3(1,0,2);
     553        btHullTriangle *t0 = allocateTriangle(p[2],p[3],p[1]); t0->n=int3(2,3,1);
     554        btHullTriangle *t1 = allocateTriangle(p[3],p[2],p[0]); t1->n=int3(3,2,0);
     555        btHullTriangle *t2 = allocateTriangle(p[0],p[1],p[3]); t2->n=int3(0,1,3);
     556        btHullTriangle *t3 = allocateTriangle(p[1],p[0],p[2]); t3->n=int3(1,0,2);
    557557        isextreme[p[0]]=isextreme[p[1]]=isextreme[p[2]]=isextreme[p[3]]=1;
    558558        checkit(t0);checkit(t1);checkit(t2);checkit(t3);
     
    560560        for(j=0;j<m_tris.size();j++)
    561561        {
    562                 Tri *t=m_tris[j];
     562                btHullTriangle *t=m_tris[j];
    563563                btAssert(t);
    564564                btAssert(t->vmax<0);
     
    567567                t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]);
    568568        }
    569         Tri *te;
     569        btHullTriangle *te;
    570570        vlimit-=4;
    571571        while(vlimit >0 && ((te=extrudable(epsilon)) != 0))
     
    595595                        if(above(verts,nt,center,btScalar(0.01)*epsilon)  || cross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]).length()< epsilon*epsilon*btScalar(0.1) )
    596596                        {
    597                                 Tri *nb = m_tris[m_tris[j]->n[0]];
     597                                btHullTriangle *nb = m_tris[m_tris[j]->n[0]];
    598598                                btAssert(nb);btAssert(!hasvert(*nb,v));btAssert(nb->id<j);
    599599                                extrude(nb,v);
     
    604604                while(j--)
    605605                {
    606                         Tri *t=m_tris[j];
     606                        btHullTriangle *t=m_tris[j];
    607607                        if(!t) continue;
    608608                        if(t->vmax>=0) break;
  • code/branches/physics/src/bullet/LinearMath/btConvexHull.h

    r2192 r2430  
    138138        ConvexH()
    139139        {
    140                 int i;
    141                 i=0;
    142140        }
    143141        ~ConvexH()
    144142        {
    145                 int i;
    146                 i=0;
    147143        }
    148144        btAlignedObjectArray<btVector3> vertices;
     
    189185{
    190186
    191         btAlignedObjectArray<class Tri*> m_tris;
     187        btAlignedObjectArray<class btHullTriangle*> m_tris;
    192188
    193189public:
     
    204200        bool ComputeHull(unsigned int vcount,const btVector3 *vertices,PHullResult &result,unsigned int vlimit);
    205201
    206         class Tri*      allocateTriangle(int a,int b,int c);
    207         void    deAllocateTriangle(Tri*);
    208         void b2bfix(Tri* s,Tri*t);
    209 
    210         void removeb2b(Tri* s,Tri*t);
    211 
    212         void checkit(Tri *t);
    213 
    214         Tri* extrudable(btScalar epsilon);
     202        class btHullTriangle*   allocateTriangle(int a,int b,int c);
     203        void    deAllocateTriangle(btHullTriangle*);
     204        void b2bfix(btHullTriangle* s,btHullTriangle*t);
     205
     206        void removeb2b(btHullTriangle* s,btHullTriangle*t);
     207
     208        void checkit(btHullTriangle *t);
     209
     210        btHullTriangle* extrudable(btScalar epsilon);
    215211
    216212        int calchull(btVector3 *verts,int verts_count, TUIntArray& tris_out, int &tris_count,int vlimit);
     
    222218        class ConvexH* ConvexHCrop(ConvexH& convex,const btPlane& slice);
    223219
    224         void extrude(class Tri* t0,int v);
     220        void extrude(class btHullTriangle* t0,int v);
    225221
    226222        ConvexH* test_cube();
  • code/branches/physics/src/bullet/LinearMath/btMatrix3x3.h

    r2192 r2430  
    2424
    2525
    26 ///The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with btQuaternion, btTransform and btVector3.
    27 ///Make sure to only include a pure orthogonal matrix without scaling.
     26/**@brief The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with btQuaternion, btTransform and btVector3.
     27 * Make sure to only include a pure orthogonal matrix without scaling. */
    2828class btMatrix3x3 {
    2929        public:
     30  /** @brief No initializaion constructor */
    3031                btMatrix3x3 () {}
    3132               
    3233//              explicit btMatrix3x3(const btScalar *m) { setFromOpenGLSubMatrix(m); }
    3334               
     35  /**@brief Constructor from Quaternion */
    3436                explicit btMatrix3x3(const btQuaternion& q) { setRotation(q); }
    3537                /*
     
    4042                }
    4143                */
     44  /** @brief Constructor with row major formatting */
    4245                btMatrix3x3(const btScalar& xx, const btScalar& xy, const btScalar& xz,
    4346                                  const btScalar& yx, const btScalar& yy, const btScalar& yz,
     
    4851                                         zx, zy, zz);
    4952                }
    50                
     53  /** @brief Copy constructor */
    5154                SIMD_FORCE_INLINE btMatrix3x3 (const btMatrix3x3& other)
    5255                {
     
    5558                        m_el[2] = other.m_el[2];
    5659                }
    57 
     60  /** @brief Assignment Operator */
    5861                SIMD_FORCE_INLINE btMatrix3x3& operator=(const btMatrix3x3& other)
    5962                {
     
    6467                }
    6568
     69  /** @brief Get a column of the matrix as a vector
     70   *  @param i Column number 0 indexed */
    6671                SIMD_FORCE_INLINE btVector3 getColumn(int i) const
    6772                {
     
    7075               
    7176
    72 
     77  /** @brief Get a row of the matrix as a vector
     78   *  @param i Row number 0 indexed */
    7379                SIMD_FORCE_INLINE const btVector3& getRow(int i) const
    7480                {
     81                        btFullAssert(0 <= i && i < 3);
    7582                        return m_el[i];
    7683                }
    7784
    78 
     85  /** @brief Get a mutable reference to a row of the matrix as a vector
     86   *  @param i Row number 0 indexed */
    7987                SIMD_FORCE_INLINE btVector3&  operator[](int i)
    8088                {
     
    8391                }
    8492               
     93  /** @brief Get a const reference to a row of the matrix as a vector
     94   *  @param i Row number 0 indexed */
    8595                SIMD_FORCE_INLINE const btVector3& operator[](int i) const
    8696                {
     
    8999                }
    90100               
     101  /** @brief Multiply by the target matrix on the right
     102   *  @param m Rotation matrix to be applied
     103   * Equivilant to this = this * m */
    91104                btMatrix3x3& operator*=(const btMatrix3x3& m);
    92105               
    93        
     106  /** @brief Set from a carray of btScalars
     107   *  @param m A pointer to the beginning of an array of 9 btScalars */
    94108        void setFromOpenGLSubMatrix(const btScalar *m)
    95109                {
     
    99113
    100114                }
    101 
     115  /** @brief Set the values of the matrix explicitly (row major)
     116   *  @param xx Top left
     117   *  @param xy Top Middle
     118   *  @param xz Top Right
     119   *  @param yx Middle Left
     120   *  @param yy Middle Middle
     121   *  @param yz Middle Right
     122   *  @param zx Bottom Left
     123   *  @param zy Bottom Middle
     124   *  @param zz Bottom Right*/
    102125                void setValue(const btScalar& xx, const btScalar& xy, const btScalar& xz,
    103126                                          const btScalar& yx, const btScalar& yy, const btScalar& yz,
     
    108131                        m_el[2].setValue(zx,zy,zz);
    109132                }
    110  
     133
     134  /** @brief Set the matrix from a quaternion
     135   *  @param q The Quaternion to match */ 
    111136                void setRotation(const btQuaternion& q)
    112137                {
     
    124149               
    125150
    126 
     151  /** @brief Set the matrix from euler angles using YPR around YXZ respectively
     152   *  @param yaw Yaw about Y axis
     153   *  @param pitch Pitch about X axis
     154   *  @param roll Roll about Z axis
     155   */
    127156                void setEulerYPR(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
    128157                {
    129 
    130                         btScalar cy(btCos(yaw));
    131                         btScalar  sy(btSin(yaw));
    132                         btScalar  cp(btCos(pitch));
    133                         btScalar  sp(btSin(pitch));
    134                         btScalar  cr(btCos(roll));
    135                         btScalar  sr(btSin(roll));
    136                         btScalar  cc = cy * cr;
    137                         btScalar  cs = cy * sr;
    138                         btScalar  sc = sy * cr;
    139                         btScalar  ss = sy * sr;
    140                         setValue(cc - sp * ss, -cs - sp * sc, -sy * cp,
    141                      cp * sr,       cp * cr,      -sp,
    142                                          sc + sp * cs, -ss + sp * cc,  cy * cp);
    143                
    144                 }
    145 
    146         /**
    147          * setEulerZYX
    148          * @param euler a const reference to a btVector3 of euler angles
     158                        setEulerZYX(roll, pitch, yaw);
     159                }
     160
     161        /** @brief Set the matrix from euler angles YPR around ZYX axes
     162         * @param eulerX Roll about X axis
     163         * @param eulerY Pitch around Y axis
     164         * @param eulerZ Yaw aboud Z axis
     165         *
    149166         * These angles are used to produce a rotation matrix. The euler
    150167         * angles are applied in ZYX order. I.e a vector is first rotated
    151168         * about X then Y and then Z
    152169         **/
    153        
    154         void setEulerZYX(btScalar eulerX,btScalar eulerY,btScalar eulerZ) {
     170        void setEulerZYX(btScalar eulerX,btScalar eulerY,btScalar eulerZ) {
     171  ///@todo proposed to reverse this since it's labeled zyx but takes arguments xyz and it will match all other parts of the code
    155172                btScalar ci ( btCos(eulerX));
    156173                btScalar cj ( btCos(eulerY));
     
    169186        }
    170187
     188  /**@brief Set the matrix to the identity */
    171189                void setIdentity()
    172190                {
     
    175193                                         btScalar(0.0), btScalar(0.0), btScalar(1.0));
    176194                }
    177    
     195  /**@brief Fill the values of the matrix into a 9 element array
     196   * @param m The array to be filled */
    178197                void getOpenGLSubMatrix(btScalar *m) const
    179198                {
     
    192211                }
    193212
     213  /**@brief Get the matrix represented as a quaternion
     214   * @param q The quaternion which will be set */
    194215                void getRotation(btQuaternion& q) const
    195216                {
     
    225246                        q.setValue(temp[0],temp[1],temp[2],temp[3]);
    226247                }
    227        
    228                 void getEuler(btScalar& yaw, btScalar& pitch, btScalar& roll) const
     248
     249  /**@brief Get the matrix represented as euler angles around YXZ, roundtrip with setEulerYPR
     250   * @param yaw Yaw around Y axis
     251   * @param pitch Pitch around X axis
     252   * @param roll around Z axis */       
     253                void getEulerYPR(btScalar& yaw, btScalar& pitch, btScalar& roll) const
    229254                {
    230255                       
    231                         if (btScalar(m_el[1].z()) < btScalar(1))
    232                         {
    233                                 if (btScalar(m_el[1].z()) > -btScalar(1))
    234                                 {
    235                                         yaw = btScalar(btAtan2(m_el[1].x(), m_el[0].x()));
    236                                         pitch = btScalar(btAsin(-m_el[1].y()));
    237                                         roll = btScalar(btAtan2(m_el[2].y(), m_el[2].z()));
    238                                 }
    239                                 else
    240                                 {
    241                                         yaw = btScalar(-btAtan2(-m_el[0].y(), m_el[0].z()));
    242                                         pitch = SIMD_HALF_PI;
    243                                         roll = btScalar(0.0);
    244                                 }
    245                         }
    246                         else
    247                         {
    248                                 yaw = btScalar(btAtan2(-m_el[0].y(), m_el[0].z()));
    249                                 pitch = -SIMD_HALF_PI;
    250                                 roll = btScalar(0.0);
    251                         }
    252                 }
    253                
    254 
    255        
     256                        // first use the normal calculus
     257                        yaw = btScalar(btAtan2(m_el[1].x(), m_el[0].x()));
     258                        pitch = btScalar(btAsin(-m_el[2].x()));
     259                        roll = btScalar(btAtan2(m_el[2].y(), m_el[2].z()));
     260
     261                        // on pitch = +/-HalfPI
     262                        if (btFabs(pitch)==SIMD_HALF_PI)
     263                        {
     264                                if (yaw>0)
     265                                        yaw-=SIMD_PI;
     266                                else
     267                                        yaw+=SIMD_PI;
     268
     269                                if (roll>0)
     270                                        roll-=SIMD_PI;
     271                                else
     272                                        roll+=SIMD_PI;
     273                        }
     274                };
     275
     276
     277  /**@brief Get the matrix represented as euler angles around ZYX
     278   * @param yaw Yaw around X axis
     279   * @param pitch Pitch around Y axis
     280   * @param roll around X axis
     281   * @param solution_number Which solution of two possible solutions ( 1 or 2) are possible values*/   
     282  void getEulerZYX(btScalar& yaw, btScalar& pitch, btScalar& roll, unsigned int solution_number = 1) const
     283  {
     284    struct Euler{btScalar yaw, pitch, roll;};
     285    Euler euler_out;
     286    Euler euler_out2; //second solution
     287    //get the pointer to the raw data
     288   
     289    // Check that pitch is not at a singularity
     290    if (btFabs(m_el[2].x()) >= 1)
     291    {
     292      euler_out.yaw = 0;
     293      euler_out2.yaw = 0;
     294       
     295      // From difference of angles formula
     296      btScalar delta = btAtan2(m_el[0].x(),m_el[0].z());
     297      if (m_el[2].x() > 0)  //gimbal locked up
     298      {
     299        euler_out.pitch = SIMD_PI / btScalar(2.0);
     300        euler_out2.pitch = SIMD_PI / btScalar(2.0);
     301        euler_out.roll = euler_out.pitch + delta;
     302        euler_out2.roll = euler_out.pitch + delta;
     303      }
     304      else // gimbal locked down
     305      {
     306        euler_out.pitch = -SIMD_PI / btScalar(2.0);
     307        euler_out2.pitch = -SIMD_PI / btScalar(2.0);
     308        euler_out.roll = -euler_out.pitch + delta;
     309        euler_out2.roll = -euler_out.pitch + delta;
     310      }
     311    }
     312    else
     313    {
     314      euler_out.pitch = - btAsin(m_el[2].x());
     315      euler_out2.pitch = SIMD_PI - euler_out.pitch;
     316       
     317      euler_out.roll = btAtan2(m_el[2].y()/btCos(euler_out.pitch),
     318                               m_el[2].z()/btCos(euler_out.pitch));
     319      euler_out2.roll = btAtan2(m_el[2].y()/btCos(euler_out2.pitch),
     320                                m_el[2].z()/btCos(euler_out2.pitch));
     321       
     322      euler_out.yaw = btAtan2(m_el[1].x()/btCos(euler_out.pitch),
     323                              m_el[0].x()/btCos(euler_out.pitch));
     324      euler_out2.yaw = btAtan2(m_el[1].x()/btCos(euler_out2.pitch),
     325                               m_el[0].x()/btCos(euler_out2.pitch));
     326    }
     327   
     328    if (solution_number == 1)
     329    {
     330                yaw = euler_out.yaw;
     331                pitch = euler_out.pitch;
     332                roll = euler_out.roll;
     333    }
     334    else
     335    {
     336                yaw = euler_out2.yaw;
     337                pitch = euler_out2.pitch;
     338                roll = euler_out2.roll;
     339    }
     340  }
     341
     342  /**@brief Create a scaled copy of the matrix
     343   * @param s Scaling vector The elements of the vector will scale each column */
    256344               
    257345                btMatrix3x3 scaled(const btVector3& s) const
     
    262350                }
    263351
     352  /**@brief Return the determinant of the matrix */
    264353                btScalar            determinant() const;
     354  /**@brief Return the adjoint of the matrix */
    265355                btMatrix3x3 adjoint() const;
     356  /**@brief Return the matrix with all values non negative */
    266357                btMatrix3x3 absolute() const;
     358  /**@brief Return the transpose of the matrix */
    267359                btMatrix3x3 transpose() const;
     360  /**@brief Return the inverse of the matrix */
    268361                btMatrix3x3 inverse() const;
    269362               
     
    285378               
    286379
    287                 ///diagonalizes this matrix by the Jacobi method. rot stores the rotation
    288                 ///from the coordinate system in which the matrix is diagonal to the original
    289                 ///coordinate system, i.e., old_this = rot * new_this * rot^T. The iteration
    290                 ///stops when all off-diagonal elements are less than the threshold multiplied
    291                 ///by the sum of the absolute values of the diagonal, or when maxSteps have
    292                 ///been executed. Note that this matrix is assumed to be symmetric.
     380  /**@brief diagonalizes this matrix by the Jacobi method.
     381   * @param rot stores the rotation from the coordinate system in which the matrix is diagonal to the original
     382   * coordinate system, i.e., old_this = rot * new_this * rot^T.
     383   * @param threshold See iteration
     384   * @param iteration The iteration stops when all off-diagonal elements are less than the threshold multiplied
     385   * by the sum of the absolute values of the diagonal, or when maxSteps have been executed.
     386   *
     387   * Note that this matrix is assumed to be symmetric.
     388   */
    293389                void diagonalize(btMatrix3x3& rot, btScalar threshold, int maxSteps)
    294390                {
     
    372468               
    373469        protected:
     470  /**@brief Calculate the matrix cofactor
     471   * @param r1 The first row to use for calculating the cofactor
     472   * @param c1 The first column to use for calculating the cofactor
     473   * @param r1 The second row to use for calculating the cofactor
     474   * @param c1 The second column to use for calculating the cofactor
     475   * See http://en.wikipedia.org/wiki/Cofactor_(linear_algebra) for more details
     476   */
    374477                btScalar cofac(int r1, int c1, int r2, int c2) const
    375478                {
    376479                        return m_el[r1][c1] * m_el[r2][c2] - m_el[r1][c2] * m_el[r2][c1];
    377480                }
    378 
     481  ///Data storage for the matrix, each vector is a row of the matrix
    379482                btVector3 m_el[3];
    380483        };
     
    495598*/
    496599
     600/**@brief Equality operator between two matrices
     601 * It will test all elements are equal.  */
    497602SIMD_FORCE_INLINE bool operator==(const btMatrix3x3& m1, const btMatrix3x3& m2)
    498603{
  • code/branches/physics/src/bullet/LinearMath/btQuadWord.h

    r2192 r2430  
    1919#include "btScalar.h"
    2020#include "btMinMax.h"
    21 #include <math.h>
    2221
    2322
     23#if defined (__CELLOS_LV2) && defined (__SPU__)
     24#include <altivec.h>
     25#endif
    2426
    25 ///The btQuadWordStorage class is base class for btVector3 and btQuaternion.
    26 ///Some issues under PS3 Linux with IBM 2.1 SDK, gcc compiler prevent from using aligned quadword. todo: look into this
    27 ///ATTRIBUTE_ALIGNED16(class) btQuadWordStorage
     27/**@brief The btQuadWordStorage class is base class for btVector3 and btQuaternion.
     28 * Some issues under PS3 Linux with IBM 2.1 SDK, gcc compiler prevent from using aligned quadword.
     29 */
     30#ifndef USE_LIBSPE2
     31ATTRIBUTE_ALIGNED16(class) btQuadWordStorage
     32#else
    2833class btQuadWordStorage
     34#endif
    2935{
    3036protected:
    3137
    32         btScalar        m_x;
    33         btScalar        m_y;
    34         btScalar        m_z;
    35         btScalar        m_unusedW;
    36 
     38#if defined (__SPU__) && defined (__CELLOS_LV2__)
     39        union {
     40                vec_float4 mVec128;
     41                btScalar        m_floats[4];
     42        };
    3743public:
     44        vec_float4      get128() const
     45        {
     46                return mVec128;
     47        }
     48#else //__CELLOS_LV2__ __SPU__
     49        btScalar        m_floats[4];
     50#endif //__CELLOS_LV2__ __SPU__
    3851
    3952};
    4053
    41 
    42 ///btQuadWord is base-class for vectors, points
     54/** @brief The btQuadWord is base-class for vectors, points */
    4355class   btQuadWord : public btQuadWordStorage
    4456{
    4557        public:
    46        
    47 //              SIMD_FORCE_INLINE btScalar&       operator[](int i)       { return (&m_x)[i];   }     
    48 //              SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_x)[i]; }
     58 
    4959
    50                 SIMD_FORCE_INLINE const btScalar& getX() const { return m_x; }
     60  /**@brief Return the x value */
     61                SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; }
     62  /**@brief Return the y value */
     63                SIMD_FORCE_INLINE const btScalar& getY() const { return m_floats[1]; }
     64  /**@brief Return the z value */
     65                SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; }
     66  /**@brief Set the x value */
     67                SIMD_FORCE_INLINE void  setX(btScalar x) { m_floats[0] = x;};
     68  /**@brief Set the y value */
     69                SIMD_FORCE_INLINE void  setY(btScalar y) { m_floats[1] = y;};
     70  /**@brief Set the z value */
     71                SIMD_FORCE_INLINE void  setZ(btScalar z) { m_floats[2] = z;};
     72  /**@brief Set the w value */
     73                SIMD_FORCE_INLINE void  setW(btScalar w) { m_floats[3] = w;};
     74  /**@brief Return the x value */
     75                SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; }
     76  /**@brief Return the y value */
     77                SIMD_FORCE_INLINE const btScalar& y() const { return m_floats[1]; }
     78  /**@brief Return the z value */
     79                SIMD_FORCE_INLINE const btScalar& z() const { return m_floats[2]; }
     80  /**@brief Return the w value */
     81                SIMD_FORCE_INLINE const btScalar& w() const { return m_floats[3]; }
    5182
    52                 SIMD_FORCE_INLINE const btScalar& getY() const { return m_y; }
     83        //SIMD_FORCE_INLINE btScalar&       operator[](int i)       { return (&m_floats[0])[i]; }     
     84        //SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_floats[0])[i]; }
     85        ///operator btScalar*() replaces operator[], using implicit conversion. We added operator != and operator == to avoid pointer comparisons.
     86        SIMD_FORCE_INLINE       operator       btScalar *()       { return &m_floats[0]; }
     87        SIMD_FORCE_INLINE       operator const btScalar *() const { return &m_floats[0]; }
    5388
    54                 SIMD_FORCE_INLINE const btScalar& getZ() const { return m_z; }
     89        SIMD_FORCE_INLINE       bool    operator==(const btQuadWord& other) const
     90        {
     91                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]));
     92        }
    5593
    56                 SIMD_FORCE_INLINE void  setX(btScalar x) { m_x = x;};
     94        SIMD_FORCE_INLINE       bool    operator!=(const btQuadWord& other) const
     95        {
     96                return !(*this == other);
     97        }
    5798
    58                 SIMD_FORCE_INLINE void  setY(btScalar y) { m_y = y;};
    59 
    60                 SIMD_FORCE_INLINE void  setZ(btScalar z) { m_z = z;};
    61 
    62                 SIMD_FORCE_INLINE void  setW(btScalar w) { m_unusedW = w;};
    63 
    64                 SIMD_FORCE_INLINE const btScalar& x() const { return m_x; }
    65 
    66                 SIMD_FORCE_INLINE const btScalar& y() const { return m_y; }
    67 
    68                 SIMD_FORCE_INLINE const btScalar& z() const { return m_z; }
    69 
    70                 SIMD_FORCE_INLINE const btScalar& w() const { return m_unusedW; }
    71 
    72 
    73                 SIMD_FORCE_INLINE       operator       btScalar *()       { return &m_x; }
    74                 SIMD_FORCE_INLINE       operator const btScalar *() const { return &m_x; }
    75 
    76 
    77 
     99  /**@brief Set x,y,z and zero w
     100   * @param x Value of x
     101   * @param y Value of y
     102   * @param z Value of z
     103   */
    78104                SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z)
    79105                {
    80                         m_x=x;
    81                         m_y=y;
    82                         m_z=z;
    83                         m_unusedW = 0.f;
     106                        m_floats[0]=x;
     107                        m_floats[1]=y;
     108                        m_floats[2]=z;
     109                        m_floats[3] = 0.f;
    84110                }
    85111
    86112/*              void getValue(btScalar *m) const
    87113                {
    88                         m[0] = m_x;
    89                         m[1] = m_y;
    90                         m[2] = m_z;
     114                        m[0] = m_floats[0];
     115                        m[1] = m_floats[1];
     116                        m[2] = m_floats[2];
    91117                }
    92118*/
     119/**@brief Set the values
     120   * @param x Value of x
     121   * @param y Value of y
     122   * @param z Value of z
     123   * @param w Value of w
     124   */
    93125                SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w)
    94126                {
    95                         m_x=x;
    96                         m_y=y;
    97                         m_z=z;
    98                         m_unusedW=w;
     127                        m_floats[0]=x;
     128                        m_floats[1]=y;
     129                        m_floats[2]=z;
     130                        m_floats[3]=w;
    99131                }
    100 
     132  /**@brief No initialization constructor */
    101133                SIMD_FORCE_INLINE btQuadWord()
    102                 //      :m_x(btScalar(0.)),m_y(btScalar(0.)),m_z(btScalar(0.)),m_unusedW(btScalar(0.))
     134                //      :m_floats[0](btScalar(0.)),m_floats[1](btScalar(0.)),m_floats[2](btScalar(0.)),m_floats[3](btScalar(0.))
    103135                {
    104136                }
    105 
     137  /**@brief Copy constructor */
    106138                SIMD_FORCE_INLINE btQuadWord(const btQuadWordStorage& q)
    107139                {
    108140                        *((btQuadWordStorage*)this) = q;
    109141                }
    110 
     142  /**@brief Three argument constructor (zeros w)
     143   * @param x Value of x
     144   * @param y Value of y
     145   * @param z Value of z
     146   */
    111147                SIMD_FORCE_INLINE btQuadWord(const btScalar& x, const btScalar& y, const btScalar& z)           
    112148                {
    113                         m_x = x, m_y = y, m_z = z, m_unusedW = 0.0f;
     149                        m_floats[0] = x, m_floats[1] = y, m_floats[2] = z, m_floats[3] = 0.0f;
    114150                }
    115151
     152/**@brief Initializing constructor
     153   * @param x Value of x
     154   * @param y Value of y
     155   * @param z Value of z
     156   * @param w Value of w
     157   */
    116158                SIMD_FORCE_INLINE btQuadWord(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w)
    117159                {
    118                         m_x = x, m_y = y, m_z = z, m_unusedW = w;
     160                        m_floats[0] = x, m_floats[1] = y, m_floats[2] = z, m_floats[3] = w;
    119161                }
    120162
    121 
     163  /**@brief Set each element to the max of the current values and the values of another btQuadWord
     164   * @param other The other btQuadWord to compare with
     165   */
    122166                SIMD_FORCE_INLINE void  setMax(const btQuadWord& other)
    123167                {
    124                         btSetMax(m_x, other.m_x);
    125                         btSetMax(m_y, other.m_y);
    126                         btSetMax(m_z, other.m_z);
    127                         btSetMax(m_unusedW, other.m_unusedW);
     168                        btSetMax(m_floats[0], other.m_floats[0]);
     169                        btSetMax(m_floats[1], other.m_floats[1]);
     170                        btSetMax(m_floats[2], other.m_floats[2]);
     171                        btSetMax(m_floats[3], other.m_floats[3]);
    128172                }
    129 
     173  /**@brief Set each element to the min of the current values and the values of another btQuadWord
     174   * @param other The other btQuadWord to compare with
     175   */
    130176                SIMD_FORCE_INLINE void  setMin(const btQuadWord& other)
    131177                {
    132                         btSetMin(m_x, other.m_x);
    133                         btSetMin(m_y, other.m_y);
    134                         btSetMin(m_z, other.m_z);
    135                         btSetMin(m_unusedW, other.m_unusedW);
     178                        btSetMin(m_floats[0], other.m_floats[0]);
     179                        btSetMin(m_floats[1], other.m_floats[1]);
     180                        btSetMin(m_floats[2], other.m_floats[2]);
     181                        btSetMin(m_floats[3], other.m_floats[3]);
    136182                }
    137183
  • code/branches/physics/src/bullet/LinearMath/btQuaternion.h

    r2192 r2430  
    1818#define SIMD__QUATERNION_H_
    1919
     20
    2021#include "btVector3.h"
    2122
    22 ///The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatrix3x3, btVector3 and btTransform.
     23/**@brief The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatrix3x3, btVector3 and btTransform. */
    2324class btQuaternion : public btQuadWord {
    2425public:
     26  /**@brief No initialization constructor */
    2527        btQuaternion() {}
    2628
    2729        //              template <typename btScalar>
    2830        //              explicit Quaternion(const btScalar *v) : Tuple4<btScalar>(v) {}
    29 
     31  /**@brief Constructor from scalars */
    3032        btQuaternion(const btScalar& x, const btScalar& y, const btScalar& z, const btScalar& w)
    3133                : btQuadWord(x, y, z, w)
    3234        {}
    33 
     35  /**@brief Axis angle Constructor
     36   * @param axis The axis which the rotation is around
     37   * @param angle The magnitude of the rotation around the angle (Radians) */
    3438        btQuaternion(const btVector3& axis, const btScalar& angle)
    3539        {
    3640                setRotation(axis, angle);
    3741        }
    38 
     42  /**@brief Constructor from Euler angles
     43   * @param yaw Angle around Y unless BT_EULER_DEFAULT_ZYX defined then Z
     44   * @param pitch Angle around X unless BT_EULER_DEFAULT_ZYX defined then Y
     45   * @param roll Angle around Z unless BT_EULER_DEFAULT_ZYX defined then X */
    3946        btQuaternion(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
    4047        {
     48#ifndef BT_EULER_DEFAULT_ZYX
    4149                setEuler(yaw, pitch, roll);
    42         }
    43 
     50#else
     51                setEulerZYX(yaw, pitch, roll);
     52#endif
     53        }
     54  /**@brief Set the rotation using axis angle notation
     55   * @param axis The axis around which to rotate
     56   * @param angle The magnitude of the rotation in Radians */
    4457        void setRotation(const btVector3& axis, const btScalar& angle)
    4558        {
     
    5063                        btCos(angle * btScalar(0.5)));
    5164        }
    52 
     65  /**@brief Set the quaternion using Euler angles
     66   * @param yaw Angle around Y
     67   * @param pitch Angle around X
     68   * @param roll Angle around Z */
    5369        void setEuler(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
    5470        {
     
    6783                        cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw);
    6884        }
    69 
    70         btQuaternion& operator+=(const btQuaternion& q)
    71         {
    72                 m_x += q.x(); m_y += q.y(); m_z += q.z(); m_unusedW += q.m_unusedW;
     85  /**@brief Set the quaternion using euler angles
     86   * @param yaw Angle around Z
     87   * @param pitch Angle around Y
     88   * @param roll Angle around X */
     89        void setEulerZYX(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
     90        {
     91                btScalar halfYaw = btScalar(yaw) * btScalar(0.5); 
     92                btScalar halfPitch = btScalar(pitch) * btScalar(0.5); 
     93                btScalar halfRoll = btScalar(roll) * btScalar(0.5); 
     94                btScalar cosYaw = btCos(halfYaw);
     95                btScalar sinYaw = btSin(halfYaw);
     96                btScalar cosPitch = btCos(halfPitch);
     97                btScalar sinPitch = btSin(halfPitch);
     98                btScalar cosRoll = btCos(halfRoll);
     99                btScalar sinRoll = btSin(halfRoll);
     100                setValue(sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw, //x
     101                         cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw, //y
     102                         cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw, //z
     103                         cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw); //formerly yzx
     104        }
     105  /**@brief Add two quaternions
     106   * @param q The quaternion to add to this one */
     107        SIMD_FORCE_INLINE       btQuaternion& operator+=(const btQuaternion& q)
     108        {
     109                m_floats[0] += q.x(); m_floats[1] += q.y(); m_floats[2] += q.z(); m_floats[3] += q.m_floats[3];
    73110                return *this;
    74111        }
    75112
     113  /**@brief Subtract out a quaternion
     114   * @param q The quaternion to subtract from this one */
    76115        btQuaternion& operator-=(const btQuaternion& q)
    77116        {
    78                 m_x -= q.x(); m_y -= q.y(); m_z -= q.z(); m_unusedW -= q.m_unusedW;
     117                m_floats[0] -= q.x(); m_floats[1] -= q.y(); m_floats[2] -= q.z(); m_floats[3] -= q.m_floats[3];
    79118                return *this;
    80119        }
    81120
     121  /**@brief Scale this quaternion
     122   * @param s The scalar to scale by */
    82123        btQuaternion& operator*=(const btScalar& s)
    83124        {
    84                 m_x *= s; m_y *= s; m_z *= s; m_unusedW *= s;
     125                m_floats[0] *= s; m_floats[1] *= s; m_floats[2] *= s; m_floats[3] *= s;
    85126                return *this;
    86127        }
    87128
    88 
     129  /**@brief Multiply this quaternion by q on the right
     130   * @param q The other quaternion
     131   * Equivilant to this = this * q */
    89132        btQuaternion& operator*=(const btQuaternion& q)
    90133        {
    91                 setValue(m_unusedW * q.x() + m_x * q.m_unusedW + m_y * q.z() - m_z * q.y(),
    92                         m_unusedW * q.y() + m_y * q.m_unusedW + m_z * q.x() - m_x * q.z(),
    93                         m_unusedW * q.z() + m_z * q.m_unusedW + m_x * q.y() - m_y * q.x(),
    94                         m_unusedW * q.m_unusedW - m_x * q.x() - m_y * q.y() - m_z * q.z());
     134                setValue(m_floats[3] * q.x() + m_floats[0] * q.m_floats[3] + m_floats[1] * q.z() - m_floats[2] * q.y(),
     135                        m_floats[3] * q.y() + m_floats[1] * q.m_floats[3] + m_floats[2] * q.x() - m_floats[0] * q.z(),
     136                        m_floats[3] * q.z() + m_floats[2] * q.m_floats[3] + m_floats[0] * q.y() - m_floats[1] * q.x(),
     137                        m_floats[3] * q.m_floats[3] - m_floats[0] * q.x() - m_floats[1] * q.y() - m_floats[2] * q.z());
    95138                return *this;
    96139        }
    97 
     140  /**@brief Return the dot product between this quaternion and another
     141   * @param q The other quaternion */
    98142        btScalar dot(const btQuaternion& q) const
    99143        {
    100                 return m_x * q.x() + m_y * q.y() + m_z * q.z() + m_unusedW * q.m_unusedW;
    101         }
    102 
     144                return m_floats[0] * q.x() + m_floats[1] * q.y() + m_floats[2] * q.z() + m_floats[3] * q.m_floats[3];
     145        }
     146
     147  /**@brief Return the length squared of the quaternion */
    103148        btScalar length2() const
    104149        {
     
    106151        }
    107152
     153  /**@brief Return the length of the quaternion */
    108154        btScalar length() const
    109155        {
     
    111157        }
    112158
     159  /**@brief Normalize the quaternion
     160   * Such that x^2 + y^2 + z^2 +w^2 = 1 */
    113161        btQuaternion& normalize()
    114162        {
     
    116164        }
    117165
     166  /**@brief Return a scaled version of this quaternion
     167   * @param s The scale factor */
    118168        SIMD_FORCE_INLINE btQuaternion
    119169        operator*(const btScalar& s) const
    120170        {
    121                 return btQuaternion(x() * s, y() * s, z() * s, m_unusedW * s);
    122         }
    123 
    124 
    125 
     171                return btQuaternion(x() * s, y() * s, z() * s, m_floats[3] * s);
     172        }
     173
     174
     175  /**@brief Return an inversely scaled versionof this quaternion
     176   * @param s The inverse scale factor */
    126177        btQuaternion operator/(const btScalar& s) const
    127178        {
     
    130181        }
    131182
    132 
     183  /**@brief Inversely scale this quaternion
     184   * @param s The scale factor */
    133185        btQuaternion& operator/=(const btScalar& s)
    134186        {
     
    137189        }
    138190
    139 
     191  /**@brief Return a normalized version of this quaternion */
    140192        btQuaternion normalized() const
    141193        {
    142194                return *this / length();
    143195        }
    144 
     196  /**@brief Return the angle between this quaternion and the other
     197   * @param q The other quaternion */
    145198        btScalar angle(const btQuaternion& q) const
    146199        {
     
    149202                return btAcos(dot(q) / s);
    150203        }
    151 
     204  /**@brief Return the angle of rotation represented by this quaternion */
    152205        btScalar getAngle() const
    153206        {
    154                 btScalar s = btScalar(2.) * btAcos(m_unusedW);
     207                btScalar s = btScalar(2.) * btAcos(m_floats[3]);
    155208                return s;
    156209        }
    157210
    158211
    159 
     212  /**@brief Return the inverse of this quaternion */
    160213        btQuaternion inverse() const
    161214        {
    162                 return btQuaternion(-m_x, -m_y, -m_z, m_unusedW);
    163         }
    164 
     215                return btQuaternion(-m_floats[0], -m_floats[1], -m_floats[2], m_floats[3]);
     216        }
     217
     218  /**@brief Return the sum of this quaternion and the other
     219   * @param q2 The other quaternion */
    165220        SIMD_FORCE_INLINE btQuaternion
    166221        operator+(const btQuaternion& q2) const
    167222        {
    168223                const btQuaternion& q1 = *this;
    169                 return btQuaternion(q1.x() + q2.x(), q1.y() + q2.y(), q1.z() + q2.z(), q1.m_unusedW + q2.m_unusedW);
    170         }
    171 
     224                return btQuaternion(q1.x() + q2.x(), q1.y() + q2.y(), q1.z() + q2.z(), q1.m_floats[3] + q2.m_floats[3]);
     225        }
     226
     227  /**@brief Return the difference between this quaternion and the other
     228   * @param q2 The other quaternion */
    172229        SIMD_FORCE_INLINE btQuaternion
    173230        operator-(const btQuaternion& q2) const
    174231        {
    175232                const btQuaternion& q1 = *this;
    176                 return btQuaternion(q1.x() - q2.x(), q1.y() - q2.y(), q1.z() - q2.z(), q1.m_unusedW - q2.m_unusedW);
    177         }
    178 
     233                return btQuaternion(q1.x() - q2.x(), q1.y() - q2.y(), q1.z() - q2.z(), q1.m_floats[3] - q2.m_floats[3]);
     234        }
     235
     236  /**@brief Return the negative of this quaternion
     237   * This simply negates each element */
    179238        SIMD_FORCE_INLINE btQuaternion operator-() const
    180239        {
    181240                const btQuaternion& q2 = *this;
    182                 return btQuaternion( - q2.x(), - q2.y(),  - q2.z(),  - q2.m_unusedW);
    183         }
    184 
     241                return btQuaternion( - q2.x(), - q2.y(),  - q2.z(),  - q2.m_floats[3]);
     242        }
     243  /**@todo document this and it's use */
    185244        SIMD_FORCE_INLINE btQuaternion farthest( const btQuaternion& qd) const
    186245        {
     
    193252        }
    194253
     254  /**@brief Return the quaternion which is the result of Spherical Linear Interpolation between this and the other quaternion
     255   * @param q The other quaternion to interpolate with
     256   * @param t The ratio between this and q to interpolate.  If t = 0 the result is this, if t=1 the result is q.
     257   * Slerp interpolates assuming constant velocity.  */
    195258        btQuaternion slerp(const btQuaternion& q, const btScalar& t) const
    196259        {
     
    201264                        btScalar s0 = btSin((btScalar(1.0) - t) * theta);
    202265                        btScalar s1 = btSin(t * theta);   
    203                         return btQuaternion((m_x * s0 + q.x() * s1) * d,
    204                                 (m_y * s0 + q.y() * s1) * d,
    205                                 (m_z * s0 + q.z() * s1) * d,
    206                                 (m_unusedW * s0 + q.m_unusedW * s1) * d);
     266                        return btQuaternion((m_floats[0] * s0 + q.x() * s1) * d,
     267                                (m_floats[1] * s0 + q.y() * s1) * d,
     268                                (m_floats[2] * s0 + q.z() * s1) * d,
     269                                (m_floats[3] * s0 + q.m_floats[3] * s1) * d);
    207270                }
    208271                else
     
    212275        }
    213276
    214         SIMD_FORCE_INLINE const btScalar& getW() const { return m_unusedW; }
     277        SIMD_FORCE_INLINE const btScalar& getW() const { return m_floats[3]; }
    215278
    216279       
     
    218281
    219282
    220 
     283/**@brief Return the negative of a quaternion */
    221284SIMD_FORCE_INLINE btQuaternion
    222285operator-(const btQuaternion& q)
     
    227290
    228291
    229 
     292/**@brief Return the product of two quaternions */
    230293SIMD_FORCE_INLINE btQuaternion
    231294operator*(const btQuaternion& q1, const btQuaternion& q2) {
     
    254317}
    255318
     319/**@brief Calculate the dot product between two quaternions */
    256320SIMD_FORCE_INLINE btScalar
    257321dot(const btQuaternion& q1, const btQuaternion& q2)
     
    261325
    262326
     327/**@brief Return the length of a quaternion */
    263328SIMD_FORCE_INLINE btScalar
    264329length(const btQuaternion& q)
     
    267332}
    268333
     334/**@brief Return the angle between two quaternions*/
    269335SIMD_FORCE_INLINE btScalar
    270336angle(const btQuaternion& q1, const btQuaternion& q2)
     
    273339}
    274340
    275 
     341/**@brief Return the inverse of a quaternion*/
    276342SIMD_FORCE_INLINE btQuaternion
    277343inverse(const btQuaternion& q)
     
    280346}
    281347
     348/**@brief Return the result of spherical linear interpolation betwen two quaternions
     349 * @param q1 The first quaternion
     350 * @param q2 The second quaternion
     351 * @param t The ration between q1 and q2.  t = 0 return q1, t=1 returns q2
     352 * Slerp assumes constant velocity between positions. */
    282353SIMD_FORCE_INLINE btQuaternion
    283354slerp(const btQuaternion& q1, const btQuaternion& q2, const btScalar& t)
  • code/branches/physics/src/bullet/LinearMath/btQuickprof.cpp

    r2192 r2430  
    111111        TotalCalls = 0;
    112112        TotalTime = 0.0f;
    113         gProfileClock.reset();
     113       
    114114
    115115        if ( Child ) {
     
    252252void    CProfileManager::Reset( void )
    253253{
     254        gProfileClock.reset();
    254255        Root.Reset();
    255256    Root.Call();
     
    279280}
    280281
     282#include <stdio.h>
     283
     284void    CProfileManager::dumpRecursive(CProfileIterator* profileIterator, int spacing)
     285{
     286        profileIterator->First();
     287        if (profileIterator->Is_Done())
     288                return;
     289
     290        float accumulated_time=0,parent_time = profileIterator->Is_Root() ? CProfileManager::Get_Time_Since_Reset() : profileIterator->Get_Current_Parent_Total_Time();
     291        int i;
     292        int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset();
     293        for (i=0;i<spacing;i++) printf(".");
     294        printf("----------------------------------\n");
     295        for (i=0;i<spacing;i++) printf(".");
     296        printf("Profiling: %s (total running time: %.3f ms) ---\n",     profileIterator->Get_Current_Parent_Name(), parent_time );
     297        float totalTime = 0.f;
     298
     299       
     300        int numChildren = 0;
     301       
     302        for (i = 0; !profileIterator->Is_Done(); i++,profileIterator->Next())
     303        {
     304                numChildren++;
     305                float current_total_time = profileIterator->Get_Current_Total_Time();
     306                accumulated_time += current_total_time;
     307                float fraction = parent_time > SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f;
     308                {
     309                        int i;  for (i=0;i<spacing;i++) printf(".");
     310                }
     311                printf("%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)\n",i, profileIterator->Get_Current_Name(), fraction,(current_total_time / (double)frames_since_reset),profileIterator->Get_Current_Total_Calls());
     312                totalTime += current_total_time;
     313                //recurse into children
     314        }
     315
     316        if (parent_time < accumulated_time)
     317        {
     318                printf("what's wrong\n");
     319        }
     320        for (i=0;i<spacing;i++) printf(".");
     321        printf("%s (%.3f %%) :: %.3f ms\n", "Unaccounted:",parent_time > SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time);
     322       
     323        for (i=0;i<numChildren;i++)
     324        {
     325                profileIterator->Enter_Child(i);
     326                dumpRecursive(profileIterator,spacing+3);
     327                profileIterator->Enter_Parent();
     328        }
     329}
     330
     331
     332
     333void    CProfileManager::dumpAll()
     334{
     335        CProfileIterator* profileIterator = 0;
     336        profileIterator = CProfileManager::Get_Iterator();
     337
     338        dumpRecursive(profileIterator,0);
     339
     340        CProfileManager::Release_Iterator(profileIterator);
     341}
     342
     343
     344
    281345#endif //USE_BT_CLOCK
    282346
  • code/branches/physics/src/bullet/LinearMath/btQuickprof.h

    r2192 r2430  
    1111// Ogre (www.ogre3d.org).
    1212
     13
     14
    1315#ifndef QUICK_PROF_H
    1416#define QUICK_PROF_H
     17
     18//To disable built-in profiling, please comment out next line
     19//#define BT_NO_PROFILE 1
     20#ifndef BT_NO_PROFILE
    1521
    1622#include "btScalar.h"
    1723#include "LinearMath/btAlignedAllocator.h"
    1824#include <new>
    19 //To disable built-in profiling, please comment out next line
    20 //#define BT_NO_PROFILE 1
     25
     26
    2127
    2228
     
    322328        static  void                                            Release_Iterator( CProfileIterator * iterator ) { delete ( iterator); }
    323329
     330        static void     dumpRecursive(CProfileIterator* profileIterator, int spacing);
     331
     332        static void     dumpAll();
     333
    324334private:
    325335        static  CProfileNode                    Root;
     
    345355};
    346356
    347 #if !defined(BT_NO_PROFILE)
     357
    348358#define BT_PROFILE( name )                      CProfileSample __profile( name )
    349 #else
     359
     360#else
     361
    350362#define BT_PROFILE( name )
    351 #endif
    352 
     363
     364#endif //#ifndef BT_NO_PROFILE
    353365
    354366
  • code/branches/physics/src/bullet/LinearMath/btScalar.h

    r2192 r2430  
    1919
    2020#include <math.h>
     21
    2122#include <stdlib.h>//size_t for MSVC 6.0
    2223
     
    2526#include <float.h>
    2627
    27 #define BT_BULLET_VERSION 272
     28#define BT_BULLET_VERSION 273
    2829
    2930inline int      btGetVersion()
     
    6667
    6768                #include <assert.h>
    68 #if defined(DEBUG) || defined (_DEBUG)
     69#ifdef BT_DEBUG
    6970                #define btAssert assert
    7071#else
     
    8687                #include <assert.h>
    8788                #endif
     89#ifdef BT_DEBUG
    8890                #define btAssert assert
     91#else
     92                #define btAssert(x)
     93#endif
    8994                //btFullAssert is optional, slows down a lot
    9095                #define btFullAssert(x)
     
    103108                #include <assert.h>
    104109                #endif
     110#ifdef BT_DEBUG
    105111                #define btAssert assert
     112#else
     113                #define btAssert(x)
     114#endif
    106115                //btFullAssert is optional, slows down a lot
    107116                #define btFullAssert(x)
  • code/branches/physics/src/bullet/LinearMath/btStackAlloc.h

    r2192 r2430  
    2424#include "btAlignedAllocator.h"
    2525
     26///The btBlock class is an internal structure for the btStackAlloc memory allocator.
    2627struct btBlock
    2728{
  • code/branches/physics/src/bullet/LinearMath/btTransform.h

    r2192 r2430  
    2222
    2323
    24 ///The btTransform class supports rigid transforms with only translation and rotation and no scaling/shear.
    25 ///It can be used in combination with btVector3, btQuaternion and btMatrix3x3 linear algebra classes.
     24/**@brief The btTransform class supports rigid transforms with only translation and rotation and no scaling/shear.
     25 *It can be used in combination with btVector3, btQuaternion and btMatrix3x3 linear algebra classes. */
    2626class btTransform {
    2727       
     
    2929public:
    3030       
    31        
     31  /**@brief No initialization constructor */
    3232        btTransform() {}
    33 
     33  /**@brief Constructor from btQuaternion (optional btVector3 )
     34   * @param q Rotation from quaternion
     35   * @param c Translation from Vector (default 0,0,0) */
    3436        explicit SIMD_FORCE_INLINE btTransform(const btQuaternion& q,
    3537                const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0)))
     
    3840        {}
    3941
     42  /**@brief Constructor from btMatrix3x3 (optional btVector3)
     43   * @param b Rotation from Matrix
     44   * @param c Translation from Vector default (0,0,0)*/
    4045        explicit SIMD_FORCE_INLINE btTransform(const btMatrix3x3& b,
    4146                const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0)))
     
    4348                m_origin(c)
    4449        {}
    45 
     50  /**@brief Copy constructor */
    4651        SIMD_FORCE_INLINE btTransform (const btTransform& other)
    4752                : m_basis(other.m_basis),
     
    4954        {
    5055        }
    51 
     56  /**@brief Assignment Operator */
    5257        SIMD_FORCE_INLINE btTransform& operator=(const btTransform& other)
    5358        {
     
    5863
    5964
     65  /**@brief Set the current transform as the value of the product of two transforms
     66   * @param t1 Transform 1
     67   * @param t2 Transform 2
     68   * This = Transform1 * Transform2 */
    6069                SIMD_FORCE_INLINE void mult(const btTransform& t1, const btTransform& t2) {
    6170                        m_basis = t1.m_basis * t2.m_basis;
     
    7079                */
    7180
    72 
     81/**@brief Return the transform of the vector */
    7382        SIMD_FORCE_INLINE btVector3 operator()(const btVector3& x) const
    7483        {
     
    7887        }
    7988
     89  /**@brief Return the transform of the vector */
    8090        SIMD_FORCE_INLINE btVector3 operator*(const btVector3& x) const
    8191        {
     
    8393        }
    8494
     95  /**@brief Return the transform of the btQuaternion */
     96        SIMD_FORCE_INLINE btQuaternion operator*(const btQuaternion& q) const
     97        {
     98                return getRotation() * q;
     99        }
     100
     101  /**@brief Return the basis matrix for the rotation */
    85102        SIMD_FORCE_INLINE btMatrix3x3&       getBasis()          { return m_basis; }
     103  /**@brief Return the basis matrix for the rotation */
    86104        SIMD_FORCE_INLINE const btMatrix3x3& getBasis()    const { return m_basis; }
    87105
     106  /**@brief Return the origin vector translation */
    88107        SIMD_FORCE_INLINE btVector3&         getOrigin()         { return m_origin; }
     108  /**@brief Return the origin vector translation */
    89109        SIMD_FORCE_INLINE const btVector3&   getOrigin()   const { return m_origin; }
    90110
     111  /**@brief Return a quaternion representing the rotation */
    91112        btQuaternion getRotation() const {
    92113                btQuaternion q;
     
    96117       
    97118       
     119  /**@brief Set from an array
     120   * @param m A pointer to a 15 element array (12 rotation(row major padded on the right by 1), and 3 translation */
    98121        void setFromOpenGLMatrix(const btScalar *m)
    99122        {
     
    102125        }
    103126
     127  /**@brief Fill an array representation
     128   * @param m A pointer to a 15 element array (12 rotation(row major padded on the right by 1), and 3 translation */
    104129        void getOpenGLMatrix(btScalar *m) const
    105130        {
     
    111136        }
    112137
     138  /**@brief Set the translational element
     139   * @param origin The vector to set the translation to */
    113140        SIMD_FORCE_INLINE void setOrigin(const btVector3& origin)
    114141        {
     
    119146
    120147
    121 
     148  /**@brief Set the rotational element by btMatrix3x3 */
    122149        SIMD_FORCE_INLINE void setBasis(const btMatrix3x3& basis)
    123150        {
     
    125152        }
    126153
     154  /**@brief Set the rotational element by btQuaternion */
    127155        SIMD_FORCE_INLINE void setRotation(const btQuaternion& q)
    128156        {
     
    131159
    132160
    133 
     161  /**@brief Set this transformation to the identity */
    134162        void setIdentity()
    135163        {
     
    138166        }
    139167
    140        
     168  /**@brief Multiply this Transform by another(this = this * another)
     169   * @param t The other transform */
    141170        btTransform& operator*=(const btTransform& t)
    142171        {
     
    146175        }
    147176
     177  /**@brief Return the inverse of this transform */
    148178        btTransform inverse() const
    149179        {
     
    152182        }
    153183
     184  /**@brief Return the inverse of this transform times the other transform
     185   * @param t The other transform
     186   * return this.inverse() * the other */
    154187        btTransform inverseTimes(const btTransform& t) const; 
    155188
     189  /**@brief Return the product of this transform and the other */
    156190        btTransform operator*(const btTransform& t) const;
    157191
     192  /**@brief Return an identity transform */
    158193        static btTransform      getIdentity()
    159194        {
     
    164199       
    165200private:
    166 
     201  ///Storage for the rotation
    167202        btMatrix3x3 m_basis;
     203  ///Storage for the translation
    168204        btVector3   m_origin;
    169205};
     
    192228}
    193229
     230/**@brief Test if two transforms have all elements equal */
    194231SIMD_FORCE_INLINE bool operator==(const btTransform& t1, const btTransform& t2)
    195232{
  • code/branches/physics/src/bullet/LinearMath/btTransformUtil.h

    r2192 r2430  
    101101        }
    102102
     103        static void     calculateVelocityQuaternion(const btVector3& pos0,const btVector3& pos1,const btQuaternion& orn0,const btQuaternion& orn1,btScalar timeStep,btVector3& linVel,btVector3& angVel)
     104        {
     105                linVel = (pos1 - pos0) / timeStep;
     106                btVector3 axis;
     107                btScalar  angle;
     108                if (orn0 != orn1)
     109                {
     110                        calculateDiffAxisAngleQuaternion(orn0,orn1,axis,angle);
     111                        angVel = axis * angle / timeStep;
     112                } else
     113                {
     114                        angVel.setValue(0,0,0);
     115                }
     116        }
     117
     118        static void calculateDiffAxisAngleQuaternion(const btQuaternion& orn0,const btQuaternion& orn1a,btVector3& axis,btScalar& angle)
     119        {
     120                btQuaternion orn1 = orn0.farthest(orn1a);
     121                btQuaternion dorn = orn1 * orn0.inverse();
     122                ///floating point inaccuracy can lead to w component > 1..., which breaks
     123                dorn.normalize();
     124                angle = dorn.getAngle();
     125                axis = btVector3(dorn.x(),dorn.y(),dorn.z());
     126                axis[3] = btScalar(0.);
     127                //check for axis length
     128                btScalar len = axis.length2();
     129                if (len < SIMD_EPSILON*SIMD_EPSILON)
     130                        axis = btVector3(btScalar(1.),btScalar(0.),btScalar(0.));
     131                else
     132                        axis /= btSqrt(len);
     133        }
     134
    103135        static void     calculateVelocity(const btTransform& transform0,const btTransform& transform1,btScalar timeStep,btVector3& linVel,btVector3& angVel)
    104136        {
     
    112144        static void calculateDiffAxisAngle(const btTransform& transform0,const btTransform& transform1,btVector3& axis,btScalar& angle)
    113145        {
    114        
    115         #ifdef USE_QUATERNION_DIFF
    116                 btQuaternion orn0 = transform0.getRotation();
    117                 btQuaternion orn1a = transform1.getRotation();
    118                 btQuaternion orn1 = orn0.farthest(orn1a);
    119                 btQuaternion dorn = orn1 * orn0.inverse();
    120 #else
    121146                btMatrix3x3 dmat = transform1.getBasis() * transform0.getBasis().inverse();
    122147                btQuaternion dorn;
    123148                dmat.getRotation(dorn);
    124 #endif//USE_QUATERNION_DIFF
    125        
     149
    126150                ///floating point inaccuracy can lead to w component > 1..., which breaks
    127 
    128151                dorn.normalize();
    129152               
     
    141164};
    142165
     166
     167///The btConvexSeparatingDistanceUtil can help speed up convex collision detection
     168///by conservatively updating a cached separating distance/vector instead of re-calculating the closest distance
     169class   btConvexSeparatingDistanceUtil
     170{
     171        btQuaternion    m_ornA;
     172        btQuaternion    m_ornB;
     173        btVector3       m_posA;
     174        btVector3       m_posB;
     175       
     176        btVector3       m_separatingNormal;
     177
     178        btScalar        m_boundingRadiusA;
     179        btScalar        m_boundingRadiusB;
     180        btScalar        m_separatingDistance;
     181
     182public:
     183
     184        btConvexSeparatingDistanceUtil(btScalar boundingRadiusA,btScalar        boundingRadiusB)
     185                :m_boundingRadiusA(boundingRadiusA),
     186                m_boundingRadiusB(boundingRadiusB),
     187                m_separatingDistance(0.f)
     188        {
     189        }
     190
     191        btScalar        getConservativeSeparatingDistance()
     192        {
     193                return m_separatingDistance;
     194        }
     195
     196        void    updateSeparatingDistance(const btTransform& transA,const btTransform& transB)
     197        {
     198                const btVector3& toPosA = transA.getOrigin();
     199                const btVector3& toPosB = transB.getOrigin();
     200                btQuaternion toOrnA = transA.getRotation();
     201                btQuaternion toOrnB = transB.getRotation();
     202
     203                if (m_separatingDistance>0.f)
     204                {
     205                       
     206
     207                        btVector3 linVelA,angVelA,linVelB,angVelB;
     208                        btTransformUtil::calculateVelocityQuaternion(m_posA,toPosA,m_ornA,toOrnA,btScalar(1.),linVelA,angVelA);
     209                        btTransformUtil::calculateVelocityQuaternion(m_posB,toPosB,m_ornB,toOrnB,btScalar(1.),linVelB,angVelB);
     210                        btScalar maxAngularProjectedVelocity = angVelA.length() * m_boundingRadiusA + angVelB.length() * m_boundingRadiusB;
     211                        btVector3 relLinVel = (linVelB-linVelA);
     212                        btScalar relLinVelocLength = (linVelB-linVelA).dot(m_separatingNormal);
     213                        if (relLinVelocLength<0.f)
     214                        {
     215                                relLinVelocLength = 0.f;
     216                        }
     217       
     218                        btScalar        projectedMotion = maxAngularProjectedVelocity +relLinVelocLength;
     219                        m_separatingDistance -= projectedMotion;
     220                }
     221       
     222                m_posA = toPosA;
     223                m_posB = toPosB;
     224                m_ornA = toOrnA;
     225                m_ornB = toOrnB;
     226        }
     227
     228        void    initSeparatingDistance(const btVector3& separatingVector,btScalar separatingDistance,const btTransform& transA,const btTransform& transB)
     229        {
     230                m_separatingNormal = separatingVector;
     231                m_separatingDistance = separatingDistance;
     232               
     233                const btVector3& toPosA = transA.getOrigin();
     234                const btVector3& toPosB = transB.getOrigin();
     235                btQuaternion toOrnA = transA.getRotation();
     236                btQuaternion toOrnB = transB.getRotation();
     237                m_posA = toPosA;
     238                m_posB = toPosB;
     239                m_ornA = toOrnA;
     240                m_ornB = toOrnB;
     241        }
     242
     243};
     244
     245
    143246#endif //SIMD_TRANSFORM_UTIL_H
    144247
  • code/branches/physics/src/bullet/LinearMath/btVector3.h

    r2192 r2430  
    2020#include "btQuadWord.h"
    2121
    22 ///btVector3 can be used to represent 3D points and vectors.
    23 ///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
    24 ///Ideally, this class should be replaced by a platform optimized SIMD version that keeps the data in registers
     22/**@brief btVector3 can be used to represent 3D points and vectors.
     23 * 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
     24 * Ideally, this class should be replaced by a platform optimized SIMD version that keeps the data in registers
     25 */
    2526class   btVector3 : public btQuadWord {
    2627
    2728public:
     29  /**@brief No initialization constructor */
    2830        SIMD_FORCE_INLINE btVector3() {}
    2931
     32  /**@brief Constructor from btQuadWordStorage (btVector3 inherits from this so is also valid)
     33   * Note: Vector3 derives from btQuadWordStorage*/
    3034        SIMD_FORCE_INLINE btVector3(const btQuadWordStorage& q)
    3135                : btQuadWord(q)
     
    3337        }
    3438       
    35 
     39  /**@brief Constructor from scalars
     40   * @param x X value
     41   * @param y Y value
     42   * @param z Z value
     43   */
    3644        SIMD_FORCE_INLINE btVector3(const btScalar& x, const btScalar& y, const btScalar& z)
    3745                :btQuadWord(x,y,z,btScalar(0.))
     
    4553
    4654       
    47 
     55/**@brief Add a vector to this one
     56 * @param The vector to add to this one */
    4857        SIMD_FORCE_INLINE btVector3& operator+=(const btVector3& v)
    4958        {
    5059
    51                 m_x += v.x(); m_y += v.y(); m_z += v.z();
     60                m_floats[0] += v.x(); m_floats[1] += v.y(); m_floats[2] += v.z();
    5261                return *this;
    5362        }
    5463
    5564
    56 
     65  /**@brief Subtract a vector from this one
     66   * @param The vector to subtract */
    5767        SIMD_FORCE_INLINE btVector3& operator-=(const btVector3& v)
    5868        {
    59                 m_x -= v.x(); m_y -= v.y(); m_z -= v.z();
     69                m_floats[0] -= v.x(); m_floats[1] -= v.y(); m_floats[2] -= v.z();
    6070                return *this;
    6171        }
    62 
     72  /**@brief Scale the vector
     73   * @param s Scale factor */
    6374        SIMD_FORCE_INLINE btVector3& operator*=(const btScalar& s)
    6475        {
    65                 m_x *= s; m_y *= s; m_z *= s;
     76                m_floats[0] *= s; m_floats[1] *= s; m_floats[2] *= s;
    6677                return *this;
    6778        }
    6879
     80  /**@brief Inversely scale the vector
     81   * @param s Scale factor to divide by */
    6982        SIMD_FORCE_INLINE btVector3& operator/=(const btScalar& s)
    7083        {
     
    7386        }
    7487
     88  /**@brief Return the dot product
     89   * @param v The other vector in the dot product */
    7590        SIMD_FORCE_INLINE btScalar dot(const btVector3& v) const
    7691        {
    77                 return m_x * v.x() + m_y * v.y() + m_z * v.z();
    78         }
    79 
     92                return m_floats[0] * v.x() + m_floats[1] * v.y() + m_floats[2] * v.z();
     93        }
     94
     95  /**@brief Return the length of the vector squared */
    8096        SIMD_FORCE_INLINE btScalar length2() const
    8197        {
     
    8399        }
    84100
     101  /**@brief Return the length of the vector */
    85102        SIMD_FORCE_INLINE btScalar length() const
    86103        {
     
    88105        }
    89106
     107  /**@brief Return the distance squared between the ends of this and another vector
     108   * This is symantically treating the vector like a point */
    90109        SIMD_FORCE_INLINE btScalar distance2(const btVector3& v) const;
    91110
     111  /**@brief Return the distance between the ends of this and another vector
     112   * This is symantically treating the vector like a point */
    92113        SIMD_FORCE_INLINE btScalar distance(const btVector3& v) const;
    93114
     115  /**@brief Normalize this vector
     116   * x^2 + y^2 + z^2 = 1 */
    94117        SIMD_FORCE_INLINE btVector3& normalize()
    95118        {
     
    97120        }
    98121
     122  /**@brief Return a normalized version of this vector */
    99123        SIMD_FORCE_INLINE btVector3 normalized() const;
    100124
     125  /**@brief Rotate this vector
     126   * @param wAxis The axis to rotate about
     127   * @param angle The angle to rotate by */
    101128        SIMD_FORCE_INLINE btVector3 rotate( const btVector3& wAxis, const btScalar angle );
    102129
     130  /**@brief Return the angle between this and another vector
     131   * @param v The other vector */
    103132        SIMD_FORCE_INLINE btScalar angle(const btVector3& v) const
    104133        {
     
    107136                return btAcos(dot(v) / s);
    108137        }
    109 
     138  /**@brief Return a vector will the absolute values of each element */
    110139        SIMD_FORCE_INLINE btVector3 absolute() const
    111140        {
    112141                return btVector3(
    113                         btFabs(m_x),
    114                         btFabs(m_y),
    115                         btFabs(m_z));
    116         }
    117 
     142                        btFabs(m_floats[0]),
     143                        btFabs(m_floats[1]),
     144                        btFabs(m_floats[2]));
     145        }
     146  /**@brief Return the cross product between this and another vector
     147   * @param v The other vector */
    118148        SIMD_FORCE_INLINE btVector3 cross(const btVector3& v) const
    119149        {
    120150                return btVector3(
    121                         m_y * v.z() - m_z * v.y(),
    122                         m_z * v.x() - m_x * v.z(),
    123                         m_x * v.y() - m_y * v.x());
     151                        m_floats[1] * v.z() - m_floats[2] * v.y(),
     152                        m_floats[2] * v.x() - m_floats[0] * v.z(),
     153                        m_floats[0] * v.y() - m_floats[1] * v.x());
    124154        }
    125155
    126156        SIMD_FORCE_INLINE btScalar triple(const btVector3& v1, const btVector3& v2) const
    127157        {
    128                 return m_x * (v1.y() * v2.z() - v1.z() * v2.y()) +
    129                         m_y * (v1.z() * v2.x() - v1.x() * v2.z()) +
    130                         m_z * (v1.x() * v2.y() - v1.y() * v2.x());
    131         }
    132 
     158                return m_floats[0] * (v1.y() * v2.z() - v1.z() * v2.y()) +
     159                        m_floats[1] * (v1.z() * v2.x() - v1.x() * v2.z()) +
     160                        m_floats[2] * (v1.x() * v2.y() - v1.y() * v2.x());
     161        }
     162
     163  /**@brief Return the axis with the smallest value
     164   * Note return values are 0,1,2 for x, y, or z */
    133165        SIMD_FORCE_INLINE int minAxis() const
    134166        {
    135                 return m_x < m_y ? (m_x < m_z ? 0 : 2) : (m_y < m_z ? 1 : 2);
    136         }
    137 
     167                return m_floats[0] < m_floats[1] ? (m_floats[0] < m_floats[2] ? 0 : 2) : (m_floats[1] < m_floats[2] ? 1 : 2);
     168        }
     169
     170  /**@brief Return the axis with the largest value
     171   * Note return values are 0,1,2 for x, y, or z */
    138172        SIMD_FORCE_INLINE int maxAxis() const
    139173        {
    140                 return m_x < m_y ? (m_y < m_z ? 2 : 1) : (m_x < m_z ? 2 : 0);
     174                return m_floats[0] < m_floats[1] ? (m_floats[1] < m_floats[2] ? 2 : 1) : (m_floats[0] < m_floats[2] ? 2 : 0);
    141175        }
    142176
     
    154188        {
    155189                btScalar s = btScalar(1.0) - rt;
    156                 m_x = s * v0.x() + rt * v1.x();
    157                 m_y = s * v0.y() + rt * v1.y();
    158                 m_z = s * v0.z() + rt * v1.z();
     190                m_floats[0] = s * v0.x() + rt * v1.x();
     191                m_floats[1] = s * v0.y() + rt * v1.y();
     192                m_floats[2] = s * v0.z() + rt * v1.z();
    159193                //don't do the unused w component
    160194                //              m_co[3] = s * v0[3] + rt * v1[3];
    161195        }
    162196
     197  /**@brief Return the linear interpolation between this and another vector
     198   * @param v The other vector
     199   * @param t The ration of this to v (t = 0 => return this, t=1 => return other) */
    163200        SIMD_FORCE_INLINE btVector3 lerp(const btVector3& v, const btScalar& t) const
    164201        {
    165                 return btVector3(m_x + (v.x() - m_x) * t,
    166                         m_y + (v.y() - m_y) * t,
    167                         m_z + (v.z() - m_z) * t);
    168         }
    169 
    170 
     202                return btVector3(m_floats[0] + (v.x() - m_floats[0]) * t,
     203                        m_floats[1] + (v.y() - m_floats[1]) * t,
     204                        m_floats[2] + (v.z() - m_floats[2]) * t);
     205        }
     206
     207  /**@brief Elementwise multiply this vector by the other
     208   * @param v The other vector */
    171209        SIMD_FORCE_INLINE btVector3& operator*=(const btVector3& v)
    172210        {
    173                 m_x *= v.x(); m_y *= v.y(); m_z *= v.z();
     211                m_floats[0] *= v.x(); m_floats[1] *= v.y(); m_floats[2] *= v.z();
    174212                return *this;
    175213        }
     
    179217};
    180218
     219/**@brief Return the sum of two vectors (Point symantics)*/
    181220SIMD_FORCE_INLINE btVector3
    182221operator+(const btVector3& v1, const btVector3& v2)
     
    185224}
    186225
     226/**@brief Return the elementwise product of two vectors */
    187227SIMD_FORCE_INLINE btVector3
    188228operator*(const btVector3& v1, const btVector3& v2)
     
    191231}
    192232
     233/**@brief Return the difference between two vectors */
    193234SIMD_FORCE_INLINE btVector3
    194235operator-(const btVector3& v1, const btVector3& v2)
     
    196237        return btVector3(v1.x() - v2.x(), v1.y() - v2.y(), v1.z() - v2.z());
    197238}
    198 
     239/**@brief Return the negative of the vector */
    199240SIMD_FORCE_INLINE btVector3
    200241operator-(const btVector3& v)
     
    203244}
    204245
     246/**@brief Return the vector scaled by s */
    205247SIMD_FORCE_INLINE btVector3
    206248operator*(const btVector3& v, const btScalar& s)
     
    209251}
    210252
     253/**@brief Return the vector scaled by s */
    211254SIMD_FORCE_INLINE btVector3
    212255operator*(const btScalar& s, const btVector3& v)
     
    215258}
    216259
     260/**@brief Return the vector inversely scaled by s */
    217261SIMD_FORCE_INLINE btVector3
    218262operator/(const btVector3& v, const btScalar& s)
     
    222266}
    223267
     268/**@brief Return the vector inversely scaled by s */
    224269SIMD_FORCE_INLINE btVector3
    225270operator/(const btVector3& v1, const btVector3& v2)
     
    228273}
    229274
     275/**@brief Return the dot product between two vectors */
    230276SIMD_FORCE_INLINE btScalar
    231277dot(const btVector3& v1, const btVector3& v2)
     
    235281
    236282
    237 
     283/**@brief Return the distance squared between two vectors */
    238284SIMD_FORCE_INLINE btScalar
    239285distance2(const btVector3& v1, const btVector3& v2)
     
    243289
    244290
     291/**@brief Return the distance between two vectors */
    245292SIMD_FORCE_INLINE btScalar
    246293distance(const btVector3& v1, const btVector3& v2)
     
    249296}
    250297
     298/**@brief Return the angle between two vectors */
    251299SIMD_FORCE_INLINE btScalar
    252300angle(const btVector3& v1, const btVector3& v2)
     
    255303}
    256304
     305/**@brief Return the cross product of two vectors */
    257306SIMD_FORCE_INLINE btVector3
    258307cross(const btVector3& v1, const btVector3& v2)
     
    267316}
    268317
     318/**@brief Return the linear interpolation between two vectors
     319 * @param v1 One vector
     320 * @param v2 The other vector
     321 * @param t The ration of this to v (t = 0 => return v1, t=1 => return v2) */
    269322SIMD_FORCE_INLINE btVector3
    270323lerp(const btVector3& v1, const btVector3& v2, const btScalar& t)
     
    273326}
    274327
    275 
     328/**@brief Test if each element of the vector is equivalent */
    276329SIMD_FORCE_INLINE bool operator==(const btVector3& p1, const btVector3& p2)
    277330{
     
    317370                : btVector3(x,y,z)
    318371        {
    319                 m_unusedW = w;
     372                m_floats[3] = w;
    320373        }
    321374
     
    324377        {
    325378                return btVector4(
    326                         btFabs(m_x),
    327                         btFabs(m_y),
    328                         btFabs(m_z),
    329                         btFabs(m_unusedW));
    330         }
    331 
    332 
    333 
    334         btScalar        getW() const { return m_unusedW;}
     379                        btFabs(m_floats[0]),
     380                        btFabs(m_floats[1]),
     381                        btFabs(m_floats[2]),
     382                        btFabs(m_floats[3]));
     383        }
     384
     385
     386
     387        btScalar        getW() const { return m_floats[3];}
    335388
    336389
     
    339392                int maxIndex = -1;
    340393                btScalar maxVal = btScalar(-1e30);
    341                 if (m_x > maxVal)
     394                if (m_floats[0] > maxVal)
    342395                {
    343396                        maxIndex = 0;
    344                         maxVal = m_x;
    345                 }
    346                 if (m_y > maxVal)
     397                        maxVal = m_floats[0];
     398                }
     399                if (m_floats[1] > maxVal)
    347400                {
    348401                        maxIndex = 1;
    349                         maxVal = m_y;
    350                 }
    351                 if (m_z > maxVal)
     402                        maxVal = m_floats[1];
     403                }
     404                if (m_floats[2] > maxVal)
    352405                {
    353406                        maxIndex = 2;
    354                         maxVal = m_z;
    355                 }
    356                 if (m_unusedW > maxVal)
     407                        maxVal = m_floats[2];
     408                }
     409                if (m_floats[3] > maxVal)
    357410                {
    358411                        maxIndex = 3;
    359                         maxVal = m_unusedW;
     412                        maxVal = m_floats[3];
    360413                }
    361414               
     
    372425                int minIndex = -1;
    373426                btScalar minVal = btScalar(1e30);
    374                 if (m_x < minVal)
     427                if (m_floats[0] < minVal)
    375428                {
    376429                        minIndex = 0;
    377                         minVal = m_x;
    378                 }
    379                 if (m_y < minVal)
     430                        minVal = m_floats[0];
     431                }
     432                if (m_floats[1] < minVal)
    380433                {
    381434                        minIndex = 1;
    382                         minVal = m_y;
    383                 }
    384                 if (m_z < minVal)
     435                        minVal = m_floats[1];
     436                }
     437                if (m_floats[2] < minVal)
    385438                {
    386439                        minIndex = 2;
    387                         minVal = m_z;
    388                 }
    389                 if (m_unusedW < minVal)
     440                        minVal = m_floats[2];
     441                }
     442                if (m_floats[3] < minVal)
    390443                {
    391444                        minIndex = 3;
    392                         minVal = m_unusedW;
     445                        minVal = m_floats[3];
    393446                }
    394447               
Note: See TracChangeset for help on using the changeset viewer.