- Timestamp:
- Apr 8, 2009, 12:58:47 AM (16 years ago)
- Location:
- code/branches/questsystem5
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/questsystem5
- Property svn:mergeinfo changed
-
code/branches/questsystem5/src/bullet/LinearMath/btVector3.h
r2907 r2908 18 18 #define SIMD__VECTOR3_H 19 19 20 21 #include "btScalar.h" 22 #include "btScalar.h" 23 #include "btMinMax.h" 20 #include "btQuadWord.h" 21 24 22 /**@brief btVector3 can be used to represent 3D points and vectors. 25 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 26 24 * Ideally, this class should be replaced by a platform optimized SIMD version that keeps the data in registers 27 25 */ 28 29 ATTRIBUTE_ALIGNED16(class) btVector3 30 { 26 class btVector3 : public btQuadWord { 27 31 28 public: 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() const40 {41 return mVec128;42 }43 public:44 #else //__CELLOS_LV2__ __SPU__45 #ifdef BT_USE_SSE // WIN3246 union {47 __m128 mVec128;48 btScalar m_floats[4];49 };50 SIMD_FORCE_INLINE __m128 get128() const51 {52 return mVec128;53 }54 SIMD_FORCE_INLINE void set128(__m128 v128)55 {56 mVec128 = v128;57 }58 #else59 btScalar m_floats[4];60 #endif61 #endif //__CELLOS_LV2__ __SPU__62 63 public:64 65 29 /**@brief No initialization constructor */ 66 30 SIMD_FORCE_INLINE btVector3() {} 67 31 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 } 69 38 70 39 /**@brief Constructor from scalars … … 73 42 * @param z Z value 74 43 */ 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 // } 82 53 83 54 … … 87 58 { 88 59 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(); 90 61 return *this; 91 62 } … … 96 67 SIMD_FORCE_INLINE btVector3& operator-=(const btVector3& v) 97 68 { 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(); 99 70 return *this; 100 71 } … … 103 74 SIMD_FORCE_INLINE btVector3& operator*=(const btScalar& s) 104 75 { 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; 106 77 return *this; 107 78 } … … 119 90 SIMD_FORCE_INLINE btScalar dot(const btVector3& v) const 120 91 { 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(); 122 93 } 123 94 … … 178 149 { 179 150 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()); 183 154 } 184 155 185 156 SIMD_FORCE_INLINE btScalar triple(const btVector3& v1, const btVector3& v2) const 186 157 { 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()); 190 161 } 191 162 … … 194 165 SIMD_FORCE_INLINE int minAxis() const 195 166 { 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); 197 168 } 198 169 … … 201 172 SIMD_FORCE_INLINE int maxAxis() const 202 173 { 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); 204 175 } 205 176 … … 217 188 { 218 189 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(); 222 193 //don't do the unused w component 223 194 // m_co[3] = s * v0[3] + rt * v1[3]; … … 229 200 SIMD_FORCE_INLINE btVector3 lerp(const btVector3& v, const btScalar& t) const 230 201 { 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); 234 205 } 235 206 … … 238 209 SIMD_FORCE_INLINE btVector3& operator*=(const btVector3& v) 239 210 { 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(); 241 212 return *this; 242 213 } 243 214 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 318 216 319 217 }; … … 323 221 operator+(const btVector3& v1, const btVector3& v2) 324 222 { 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()); 326 224 } 327 225 … … 330 228 operator*(const btVector3& v1, const btVector3& v2) 331 229 { 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()); 333 231 } 334 232 … … 337 235 operator-(const btVector3& v1, const btVector3& v2) 338 236 { 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()); 340 238 } 341 239 /**@brief Return the negative of the vector */ … … 343 241 operator-(const btVector3& v) 344 242 { 345 return btVector3(-v. m_floats[0], -v.m_floats[1], -v.m_floats[2]);243 return btVector3(-v.x(), -v.y(), -v.z()); 346 244 } 347 245 … … 350 248 operator*(const btVector3& v, const btScalar& s) 351 249 { 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); 353 251 } 354 252 … … 372 270 operator/(const btVector3& v1, const btVector3& v2) 373 271 { 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()); 375 273 } 376 274 … … 428 326 } 429 327 430 328 /**@brief Test if each element of the vector is equivalent */ 329 SIMD_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 } 431 333 432 334 SIMD_FORCE_INLINE btScalar btVector3::distance2(const btVector3& v) const … … 503 405 { 504 406 maxIndex = 2; 505 maxVal = m_floats[2];407 maxVal = m_floats[2]; 506 408 } 507 409 if (m_floats[3] > maxVal) … … 536 438 { 537 439 minIndex = 2; 538 minVal = m_floats[2];440 minVal = m_floats[2]; 539 441 } 540 442 if (m_floats[3] < minVal) … … 553 455 return absolute4().maxAxis4(); 554 456 } 555 556 557 558 559 /**@brief Set x,y,z and zero w560 * @param x Value of x561 * @param y Value of y562 * @param z Value of z563 */564 565 566 /* void getValue(btScalar *m) const567 {568 m[0] = m_floats[0];569 m[1] = m_floats[1];570 m[2] =m_floats[2];571 }572 */573 /**@brief Set the values574 * @param x Value of x575 * @param y Value of y576 * @param z Value of z577 * @param w Value of w578 */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 589 457 590 458 };
Note: See TracChangeset
for help on using the changeset viewer.