| [1963] | 1 | /* | 
|---|
 | 2 | Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans  http://continuousphysics.com/Bullet/ | 
|---|
 | 3 |  | 
|---|
 | 4 | This software is provided 'as-is', without any express or implied warranty. | 
|---|
 | 5 | In no event will the authors be held liable for any damages arising from the use of this software. | 
|---|
 | 6 | Permission is granted to anyone to use this software for any purpose,  | 
|---|
 | 7 | including commercial applications, and to alter it and redistribute it freely,  | 
|---|
 | 8 | subject to the following restrictions: | 
|---|
 | 9 |  | 
|---|
 | 10 | 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. | 
|---|
 | 11 | 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. | 
|---|
 | 12 | 3. This notice may not be removed or altered from any source distribution. | 
|---|
 | 13 | */ | 
|---|
 | 14 |  | 
|---|
 | 15 |  | 
|---|
 | 16 | #ifndef SIMD_QUADWORD_H | 
|---|
 | 17 | #define SIMD_QUADWORD_H | 
|---|
 | 18 |  | 
|---|
 | 19 | #include "btScalar.h" | 
|---|
 | 20 | #include "btMinMax.h" | 
|---|
 | 21 |  | 
|---|
 | 22 |  | 
|---|
| [2430] | 23 | #if defined (__CELLOS_LV2) && defined (__SPU__) | 
|---|
 | 24 | #include <altivec.h> | 
|---|
 | 25 | #endif | 
|---|
| [1963] | 26 |  | 
|---|
| [2882] | 27 | /**@brief The btQuadWord class is base class for btVector3 and btQuaternion.  | 
|---|
| [2430] | 28 |  * Some issues under PS3 Linux with IBM 2.1 SDK, gcc compiler prevent from using aligned quadword. | 
|---|
 | 29 |  */ | 
|---|
 | 30 | #ifndef USE_LIBSPE2 | 
|---|
| [2882] | 31 | ATTRIBUTE_ALIGNED16(class) btQuadWord | 
|---|
| [2430] | 32 | #else | 
|---|
| [2882] | 33 | class btQuadWord | 
|---|
| [2430] | 34 | #endif | 
|---|
| [1963] | 35 | { | 
|---|
 | 36 | protected: | 
|---|
 | 37 |  | 
|---|
| [2430] | 38 | #if defined (__SPU__) && defined (__CELLOS_LV2__) | 
|---|
 | 39 |         union { | 
|---|
 | 40 |                 vec_float4 mVec128; | 
|---|
 | 41 |                 btScalar        m_floats[4]; | 
|---|
 | 42 |         }; | 
|---|
| [1963] | 43 | public: | 
|---|
| [2430] | 44 |         vec_float4      get128() const | 
|---|
 | 45 |         { | 
|---|
 | 46 |                 return mVec128; | 
|---|
 | 47 |         } | 
|---|
| [2882] | 48 | protected: | 
|---|
| [2430] | 49 | #else //__CELLOS_LV2__ __SPU__ | 
|---|
 | 50 |         btScalar        m_floats[4]; | 
|---|
 | 51 | #endif //__CELLOS_LV2__ __SPU__ | 
|---|
| [1963] | 52 |  | 
|---|
 | 53 |         public: | 
|---|
| [2430] | 54 |    | 
|---|
| [1963] | 55 |  | 
|---|
| [2430] | 56 |   /**@brief Return the x value */ | 
|---|
 | 57 |                 SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; } | 
|---|
 | 58 |   /**@brief Return the y value */ | 
|---|
 | 59 |                 SIMD_FORCE_INLINE const btScalar& getY() const { return m_floats[1]; } | 
|---|
 | 60 |   /**@brief Return the z value */ | 
|---|
 | 61 |                 SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; } | 
|---|
 | 62 |   /**@brief Set the x value */ | 
|---|
 | 63 |                 SIMD_FORCE_INLINE void  setX(btScalar x) { m_floats[0] = x;}; | 
|---|
 | 64 |   /**@brief Set the y value */ | 
|---|
 | 65 |                 SIMD_FORCE_INLINE void  setY(btScalar y) { m_floats[1] = y;}; | 
|---|
 | 66 |   /**@brief Set the z value */ | 
|---|
 | 67 |                 SIMD_FORCE_INLINE void  setZ(btScalar z) { m_floats[2] = z;}; | 
|---|
 | 68 |   /**@brief Set the w value */ | 
|---|
 | 69 |                 SIMD_FORCE_INLINE void  setW(btScalar w) { m_floats[3] = w;}; | 
|---|
 | 70 |   /**@brief Return the x value */ | 
|---|
 | 71 |                 SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; } | 
|---|
 | 72 |   /**@brief Return the y value */ | 
|---|
 | 73 |                 SIMD_FORCE_INLINE const btScalar& y() const { return m_floats[1]; } | 
|---|
 | 74 |   /**@brief Return the z value */ | 
|---|
 | 75 |                 SIMD_FORCE_INLINE const btScalar& z() const { return m_floats[2]; } | 
|---|
 | 76 |   /**@brief Return the w value */ | 
|---|
 | 77 |                 SIMD_FORCE_INLINE const btScalar& w() const { return m_floats[3]; } | 
|---|
| [1963] | 78 |  | 
|---|
| [2430] | 79 |         //SIMD_FORCE_INLINE btScalar&       operator[](int i)       { return (&m_floats[0])[i]; }       | 
|---|
 | 80 |         //SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_floats[0])[i]; } | 
|---|
 | 81 |         ///operator btScalar*() replaces operator[], using implicit conversion. We added operator != and operator == to avoid pointer comparisons. | 
|---|
 | 82 |         SIMD_FORCE_INLINE       operator       btScalar *()       { return &m_floats[0]; } | 
|---|
 | 83 |         SIMD_FORCE_INLINE       operator const btScalar *() const { return &m_floats[0]; } | 
|---|
| [1963] | 84 |  | 
|---|
| [2430] | 85 |         SIMD_FORCE_INLINE       bool    operator==(const btQuadWord& other) const | 
|---|
 | 86 |         { | 
|---|
 | 87 |                 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])); | 
|---|
 | 88 |         } | 
|---|
| [1963] | 89 |  | 
|---|
| [2430] | 90 |         SIMD_FORCE_INLINE       bool    operator!=(const btQuadWord& other) const | 
|---|
 | 91 |         { | 
|---|
 | 92 |                 return !(*this == other); | 
|---|
 | 93 |         } | 
|---|
| [1963] | 94 |  | 
|---|
| [2430] | 95 |   /**@brief Set x,y,z and zero w  | 
|---|
 | 96 |    * @param x Value of x | 
|---|
 | 97 |    * @param y Value of y | 
|---|
 | 98 |    * @param z Value of z | 
|---|
 | 99 |    */ | 
|---|
| [1963] | 100 |                 SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z) | 
|---|
 | 101 |                 { | 
|---|
| [2430] | 102 |                         m_floats[0]=x; | 
|---|
 | 103 |                         m_floats[1]=y; | 
|---|
 | 104 |                         m_floats[2]=z; | 
|---|
 | 105 |                         m_floats[3] = 0.f; | 
|---|
| [1963] | 106 |                 } | 
|---|
 | 107 |  | 
|---|
 | 108 | /*              void getValue(btScalar *m) const  | 
|---|
 | 109 |                 { | 
|---|
| [2430] | 110 |                         m[0] = m_floats[0]; | 
|---|
 | 111 |                         m[1] = m_floats[1]; | 
|---|
 | 112 |                         m[2] = m_floats[2]; | 
|---|
| [1963] | 113 |                 } | 
|---|
 | 114 | */ | 
|---|
| [2430] | 115 | /**@brief Set the values  | 
|---|
 | 116 |    * @param x Value of x | 
|---|
 | 117 |    * @param y Value of y | 
|---|
 | 118 |    * @param z Value of z | 
|---|
 | 119 |    * @param w Value of w | 
|---|
 | 120 |    */ | 
|---|
| [1963] | 121 |                 SIMD_FORCE_INLINE void  setValue(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w) | 
|---|
 | 122 |                 { | 
|---|
| [2430] | 123 |                         m_floats[0]=x; | 
|---|
 | 124 |                         m_floats[1]=y; | 
|---|
 | 125 |                         m_floats[2]=z; | 
|---|
 | 126 |                         m_floats[3]=w; | 
|---|
| [1963] | 127 |                 } | 
|---|
| [2430] | 128 |   /**@brief No initialization constructor */ | 
|---|
| [1963] | 129 |                 SIMD_FORCE_INLINE btQuadWord() | 
|---|
| [2430] | 130 |                 //      :m_floats[0](btScalar(0.)),m_floats[1](btScalar(0.)),m_floats[2](btScalar(0.)),m_floats[3](btScalar(0.)) | 
|---|
| [1963] | 131 |                 { | 
|---|
 | 132 |                 } | 
|---|
| [2882] | 133 |   | 
|---|
| [2430] | 134 |   /**@brief Three argument constructor (zeros w) | 
|---|
 | 135 |    * @param x Value of x | 
|---|
 | 136 |    * @param y Value of y | 
|---|
 | 137 |    * @param z Value of z | 
|---|
 | 138 |    */ | 
|---|
| [1963] | 139 |                 SIMD_FORCE_INLINE btQuadWord(const btScalar& x, const btScalar& y, const btScalar& z)            | 
|---|
 | 140 |                 { | 
|---|
| [2430] | 141 |                         m_floats[0] = x, m_floats[1] = y, m_floats[2] = z, m_floats[3] = 0.0f; | 
|---|
| [1963] | 142 |                 } | 
|---|
 | 143 |  | 
|---|
| [2430] | 144 | /**@brief Initializing constructor | 
|---|
 | 145 |    * @param x Value of x | 
|---|
 | 146 |    * @param y Value of y | 
|---|
 | 147 |    * @param z Value of z | 
|---|
 | 148 |    * @param w Value of w | 
|---|
 | 149 |    */ | 
|---|
| [1963] | 150 |                 SIMD_FORCE_INLINE btQuadWord(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w)  | 
|---|
 | 151 |                 { | 
|---|
| [2430] | 152 |                         m_floats[0] = x, m_floats[1] = y, m_floats[2] = z, m_floats[3] = w; | 
|---|
| [1963] | 153 |                 } | 
|---|
 | 154 |  | 
|---|
| [2430] | 155 |   /**@brief Set each element to the max of the current values and the values of another btQuadWord | 
|---|
 | 156 |    * @param other The other btQuadWord to compare with  | 
|---|
 | 157 |    */ | 
|---|
| [1963] | 158 |                 SIMD_FORCE_INLINE void  setMax(const btQuadWord& other) | 
|---|
 | 159 |                 { | 
|---|
| [2430] | 160 |                         btSetMax(m_floats[0], other.m_floats[0]); | 
|---|
 | 161 |                         btSetMax(m_floats[1], other.m_floats[1]); | 
|---|
 | 162 |                         btSetMax(m_floats[2], other.m_floats[2]); | 
|---|
 | 163 |                         btSetMax(m_floats[3], other.m_floats[3]); | 
|---|
| [1963] | 164 |                 } | 
|---|
| [2430] | 165 |   /**@brief Set each element to the min of the current values and the values of another btQuadWord | 
|---|
 | 166 |    * @param other The other btQuadWord to compare with  | 
|---|
 | 167 |    */ | 
|---|
| [1963] | 168 |                 SIMD_FORCE_INLINE void  setMin(const btQuadWord& other) | 
|---|
 | 169 |                 { | 
|---|
| [2430] | 170 |                         btSetMin(m_floats[0], other.m_floats[0]); | 
|---|
 | 171 |                         btSetMin(m_floats[1], other.m_floats[1]); | 
|---|
 | 172 |                         btSetMin(m_floats[2], other.m_floats[2]); | 
|---|
 | 173 |                         btSetMin(m_floats[3], other.m_floats[3]); | 
|---|
| [1963] | 174 |                 } | 
|---|
 | 175 |  | 
|---|
 | 176 |  | 
|---|
 | 177 |  | 
|---|
 | 178 | }; | 
|---|
 | 179 |  | 
|---|
 | 180 | #endif //SIMD_QUADWORD_H | 
|---|