Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

Location:
code/branches/questsystem5
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/questsystem5

  • code/branches/questsystem5/src/bullet/LinearMath/btVector3.h

    r2907 r2908  
    1818#define SIMD__VECTOR3_H
    1919
    20 
    21 #include "btScalar.h"
    22 #include "btScalar.h"
    23 #include "btMinMax.h"
     20#include "btQuadWord.h"
     21
    2422/**@brief btVector3 can be used to represent 3D points and vectors.
    2523 * 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
    2624 * Ideally, this class should be replaced by a platform optimized SIMD version that keeps the data in registers
    2725 */
    28 
    29 ATTRIBUTE_ALIGNED16(class) btVector3
    30 {
     26class   btVector3 : public btQuadWord {
     27
    3128public:
    32 
    33 #if defined (__SPU__) && defined (__CELLOS_LV2__)
    34         union {
    35                 vec_float4 mVec128;
    36                 btScalar        m_floats[4];
    37         };
    38 public:
    39         vec_float4      get128() const
    40         {
    41                 return mVec128;
    42         }
    43 public:
    44 #else //__CELLOS_LV2__ __SPU__
    45 #ifdef BT_USE_SSE // WIN32
    46         union {
    47                 __m128 mVec128;
    48                 btScalar        m_floats[4];
    49         };
    50         SIMD_FORCE_INLINE       __m128  get128() const
    51         {
    52                 return mVec128;
    53         }
    54         SIMD_FORCE_INLINE       void    set128(__m128 v128)
    55         {
    56                 mVec128 = v128;
    57         }
    58 #else
    59         btScalar        m_floats[4];
    60 #endif
    61 #endif //__CELLOS_LV2__ __SPU__
    62 
    63         public:
    64 
    6529  /**@brief No initialization constructor */
    6630        SIMD_FORCE_INLINE btVector3() {}
    6731
    68  
     32  /**@brief Constructor from btQuadWordStorage (btVector3 inherits from this so is also valid)
     33   * Note: Vector3 derives from btQuadWordStorage*/
     34        SIMD_FORCE_INLINE btVector3(const btQuadWordStorage& q)
     35                : btQuadWord(q)
     36        {
     37        }
    6938       
    7039  /**@brief Constructor from scalars
     
    7342   * @param z Z value
    7443   */
    75         SIMD_FORCE_INLINE btVector3(const btScalar& x, const btScalar& y, const btScalar& z)
    76         {
    77                 m_floats[0] = x;
    78                 m_floats[1] = y;
    79                 m_floats[2] = z;
    80                 m_floats[3] = btScalar(0.);
    81         }
     44        SIMD_FORCE_INLINE btVector3(const btScalar& x, const btScalar& y, const btScalar& z)
     45                :btQuadWord(x,y,z,btScalar(0.))
     46        {
     47        }
     48
     49//      SIMD_FORCE_INLINE btVector3(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w)
     50//              : btQuadWord(x,y,z,w)
     51//      {
     52//      }
    8253
    8354       
     
    8758        {
    8859
    89                 m_floats[0] += v.m_floats[0]; m_floats[1] += v.m_floats[1];m_floats[2] += v.m_floats[2];
     60                m_floats[0] += v.x(); m_floats[1] += v.y(); m_floats[2] += v.z();
    9061                return *this;
    9162        }
     
    9667        SIMD_FORCE_INLINE btVector3& operator-=(const btVector3& v)
    9768        {
    98                 m_floats[0] -= v.m_floats[0]; m_floats[1] -= v.m_floats[1];m_floats[2] -= v.m_floats[2];
     69                m_floats[0] -= v.x(); m_floats[1] -= v.y(); m_floats[2] -= v.z();
    9970                return *this;
    10071        }
     
    10374        SIMD_FORCE_INLINE btVector3& operator*=(const btScalar& s)
    10475        {
    105                 m_floats[0] *= s; m_floats[1] *= s;m_floats[2] *= s;
     76                m_floats[0] *= s; m_floats[1] *= s; m_floats[2] *= s;
    10677                return *this;
    10778        }
     
    11990        SIMD_FORCE_INLINE btScalar dot(const btVector3& v) const
    12091        {
    121                 return m_floats[0] * v.m_floats[0] + m_floats[1] * v.m_floats[1] +m_floats[2] * v.m_floats[2];
     92                return m_floats[0] * v.x() + m_floats[1] * v.y() + m_floats[2] * v.z();
    12293        }
    12394
     
    178149        {
    179150                return btVector3(
    180                         m_floats[1] * v.m_floats[2] -m_floats[2] * v.m_floats[1],
    181                         m_floats[2] * v.m_floats[0] - m_floats[0] * v.m_floats[2],
    182                         m_floats[0] * v.m_floats[1] - m_floats[1] * v.m_floats[0]);
     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());
    183154        }
    184155
    185156        SIMD_FORCE_INLINE btScalar triple(const btVector3& v1, const btVector3& v2) const
    186157        {
    187                 return m_floats[0] * (v1.m_floats[1] * v2.m_floats[2] - v1.m_floats[2] * v2.m_floats[1]) +
    188                         m_floats[1] * (v1.m_floats[2] * v2.m_floats[0] - v1.m_floats[0] * v2.m_floats[2]) +
    189                         m_floats[2] * (v1.m_floats[0] * v2.m_floats[1] - v1.m_floats[1] * v2.m_floats[0]);
     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());
    190161        }
    191162
     
    194165        SIMD_FORCE_INLINE int minAxis() const
    195166        {
    196                 return m_floats[0] < m_floats[1] ? (m_floats[0] <m_floats[2] ? 0 : 2) : (m_floats[1] <m_floats[2] ? 1 : 2);
     167                return m_floats[0] < m_floats[1] ? (m_floats[0] < m_floats[2] ? 0 : 2) : (m_floats[1] < m_floats[2] ? 1 : 2);
    197168        }
    198169
     
    201172        SIMD_FORCE_INLINE int maxAxis() const
    202173        {
    203                 return m_floats[0] < m_floats[1] ? (m_floats[1] <m_floats[2] ? 2 : 1) : (m_floats[0] <m_floats[2] ? 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);
    204175        }
    205176
     
    217188        {
    218189                btScalar s = btScalar(1.0) - rt;
    219                 m_floats[0] = s * v0.m_floats[0] + rt * v1.m_floats[0];
    220                 m_floats[1] = s * v0.m_floats[1] + rt * v1.m_floats[1];
    221                 m_floats[2] = s * v0.m_floats[2] + rt * v1.m_floats[2];
     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();
    222193                //don't do the unused w component
    223194                //              m_co[3] = s * v0[3] + rt * v1[3];
     
    229200        SIMD_FORCE_INLINE btVector3 lerp(const btVector3& v, const btScalar& t) const
    230201        {
    231                 return btVector3(m_floats[0] + (v.m_floats[0] - m_floats[0]) * t,
    232                         m_floats[1] + (v.m_floats[1] - m_floats[1]) * t,
    233                         m_floats[2] + (v.m_floats[2] -m_floats[2]) * t);
     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);
    234205        }
    235206
     
    238209        SIMD_FORCE_INLINE btVector3& operator*=(const btVector3& v)
    239210        {
    240                 m_floats[0] *= v.m_floats[0]; m_floats[1] *= v.m_floats[1];m_floats[2] *= v.m_floats[2];
     211                m_floats[0] *= v.x(); m_floats[1] *= v.y(); m_floats[2] *= v.z();
    241212                return *this;
    242213        }
    243214
    244          /**@brief Return the x value */
    245                 SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; }
    246   /**@brief Return the y value */
    247                 SIMD_FORCE_INLINE const btScalar& getY() const { return m_floats[1]; }
    248   /**@brief Return the z value */
    249                 SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; }
    250   /**@brief Set the x value */
    251                 SIMD_FORCE_INLINE void  setX(btScalar x) { m_floats[0] = x;};
    252   /**@brief Set the y value */
    253                 SIMD_FORCE_INLINE void  setY(btScalar y) { m_floats[1] = y;};
    254   /**@brief Set the z value */
    255                 SIMD_FORCE_INLINE void  setZ(btScalar z) {m_floats[2] = z;};
    256   /**@brief Set the w value */
    257                 SIMD_FORCE_INLINE void  setW(btScalar w) { m_floats[3] = w;};
    258   /**@brief Return the x value */
    259                 SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; }
    260   /**@brief Return the y value */
    261                 SIMD_FORCE_INLINE const btScalar& y() const { return m_floats[1]; }
    262   /**@brief Return the z value */
    263                 SIMD_FORCE_INLINE const btScalar& z() const { return m_floats[2]; }
    264   /**@brief Return the w value */
    265                 SIMD_FORCE_INLINE const btScalar& w() const { return m_floats[3]; }
    266 
    267         //SIMD_FORCE_INLINE btScalar&       operator[](int i)       { return (&m_floats[0])[i]; }     
    268         //SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_floats[0])[i]; }
    269         ///operator btScalar*() replaces operator[], using implicit conversion. We added operator != and operator == to avoid pointer comparisons.
    270         SIMD_FORCE_INLINE       operator       btScalar *()       { return &m_floats[0]; }
    271         SIMD_FORCE_INLINE       operator const btScalar *() const { return &m_floats[0]; }
    272 
    273         SIMD_FORCE_INLINE       bool    operator==(const btVector3& other) const
    274         {
    275                 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]));
    276         }
    277 
    278         SIMD_FORCE_INLINE       bool    operator!=(const btVector3& other) const
    279         {
    280                 return !(*this == other);
    281         }
    282 
    283          /**@brief Set each element to the max of the current values and the values of another btVector3
    284    * @param other The other btVector3 to compare with
    285    */
    286                 SIMD_FORCE_INLINE void  setMax(const btVector3& other)
    287                 {
    288                         btSetMax(m_floats[0], other.m_floats[0]);
    289                         btSetMax(m_floats[1], other.m_floats[1]);
    290                         btSetMax(m_floats[2], other.m_floats[2]);
    291                         btSetMax(m_floats[3], other.w());
    292                 }
    293   /**@brief Set each element to the min of the current values and the values of another btVector3
    294    * @param other The other btVector3 to compare with
    295    */
    296                 SIMD_FORCE_INLINE void  setMin(const btVector3& other)
    297                 {
    298                         btSetMin(m_floats[0], other.m_floats[0]);
    299                         btSetMin(m_floats[1], other.m_floats[1]);
    300                         btSetMin(m_floats[2], other.m_floats[2]);
    301                         btSetMin(m_floats[3], other.w());
    302                 }
    303 
    304                 SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z)
    305                 {
    306                         m_floats[0]=x;
    307                         m_floats[1]=y;
    308                         m_floats[2]=z;
    309                         m_floats[3] = 0.f;
    310                 }
    311 
    312                 void    getSkewSymmetricMatrix(btVector3* v0,btVector3* v1,btVector3* v2) const
    313                 {
    314                         v0->setValue(0.         ,-z()           ,y());
    315                         v1->setValue(z()        ,0.                     ,-x());
    316                         v2->setValue(-y()       ,x()    ,0.);
    317                 }
     215       
    318216
    319217};
     
    323221operator+(const btVector3& v1, const btVector3& v2)
    324222{
    325         return btVector3(v1.m_floats[0] + v2.m_floats[0], v1.m_floats[1] + v2.m_floats[1], v1.m_floats[2] + v2.m_floats[2]);
     223        return btVector3(v1.x() + v2.x(), v1.y() + v2.y(), v1.z() + v2.z());
    326224}
    327225
     
    330228operator*(const btVector3& v1, const btVector3& v2)
    331229{
    332         return btVector3(v1.m_floats[0] * v2.m_floats[0], v1.m_floats[1] * v2.m_floats[1], v1.m_floats[2] * v2.m_floats[2]);
     230        return btVector3(v1.x() * v2.x(), v1.y() * v2.y(), v1.z() * v2.z());
    333231}
    334232
     
    337235operator-(const btVector3& v1, const btVector3& v2)
    338236{
    339         return btVector3(v1.m_floats[0] - v2.m_floats[0], v1.m_floats[1] - v2.m_floats[1], v1.m_floats[2] - v2.m_floats[2]);
     237        return btVector3(v1.x() - v2.x(), v1.y() - v2.y(), v1.z() - v2.z());
    340238}
    341239/**@brief Return the negative of the vector */
     
    343241operator-(const btVector3& v)
    344242{
    345         return btVector3(-v.m_floats[0], -v.m_floats[1], -v.m_floats[2]);
     243        return btVector3(-v.x(), -v.y(), -v.z());
    346244}
    347245
     
    350248operator*(const btVector3& v, const btScalar& s)
    351249{
    352         return btVector3(v.m_floats[0] * s, v.m_floats[1] * s, v.m_floats[2] * s);
     250        return btVector3(v.x() * s, v.y() * s, v.z() * s);
    353251}
    354252
     
    372270operator/(const btVector3& v1, const btVector3& v2)
    373271{
    374         return btVector3(v1.m_floats[0] / v2.m_floats[0],v1.m_floats[1] / v2.m_floats[1],v1.m_floats[2] / v2.m_floats[2]);
     272        return btVector3(v1.x() / v2.x(),v1.y() / v2.y(),v1.z() / v2.z());
    375273}
    376274
     
    428326}
    429327
    430 
     328/**@brief Test if each element of the vector is equivalent */
     329SIMD_FORCE_INLINE bool operator==(const btVector3& p1, const btVector3& p2)
     330{
     331        return p1.x() == p2.x() && p1.y() == p2.y() && p1.z() == p2.z();
     332}
    431333
    432334SIMD_FORCE_INLINE btScalar btVector3::distance2(const btVector3& v) const
     
    503405                {
    504406                        maxIndex = 2;
    505                         maxVal =m_floats[2];
     407                        maxVal = m_floats[2];
    506408                }
    507409                if (m_floats[3] > maxVal)
     
    536438                {
    537439                        minIndex = 2;
    538                         minVal =m_floats[2];
     440                        minVal = m_floats[2];
    539441                }
    540442                if (m_floats[3] < minVal)
     
    553455                return absolute4().maxAxis4();
    554456        }
    555 
    556        
    557  
    558 
    559   /**@brief Set x,y,z and zero w
    560    * @param x Value of x
    561    * @param y Value of y
    562    * @param z Value of z
    563    */
    564                
    565 
    566 /*              void getValue(btScalar *m) const
    567                 {
    568                         m[0] = m_floats[0];
    569                         m[1] = m_floats[1];
    570                         m[2] =m_floats[2];
    571                 }
    572 */
    573 /**@brief Set the values
    574    * @param x Value of x
    575    * @param y Value of y
    576    * @param z Value of z
    577    * @param w Value of w
    578    */
    579                 SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w)
    580                 {
    581                         m_floats[0]=x;
    582                         m_floats[1]=y;
    583                         m_floats[2]=z;
    584                         m_floats[3]=w;
    585                 }
    586 
    587 
    588  
    589457
    590458};
Note: See TracChangeset for help on using the changeset viewer.