voxelTerrain
 All Classes Functions Variables Typedefs Enumerations Pages
quaternion.hpp
1 #ifndef QUATERNION_HPP
2 #define QUATERNION_HPP
3 
4 #include "blub/core/globals.hpp"
5 #include "blub/math/predecl.hpp"
6 #include "blub/serialization/access.hpp"
7 #include "blub/serialization/nameValuePair.hpp"
8 
9 #ifdef BLUB_USE_PHYSX
10 # include <foundation/PxQuat.h>
11 #endif
12 
13 
14 class btQuaternion;
15 namespace Ogre
16 {
17  class Quaternion;
18 }
19 
20 
21 namespace blub
22 {
23 
24 
26 {
27 public:
28  inline quaternion ()
29  : w(1), x(0), y(0), z(0)
30  {
31  }
33  inline quaternion (
34  real fX, real fY, real fZ, real fW)
35  : w(fW), x(fX), y(fY), z(fZ)
36  {
37  }
38  inline quaternion(const real& rfAngle, const vector3& rkAxis)
39  {
40  this->FromAngleAxis(rfAngle, rkAxis);
41  }
42 
43 #ifndef BLUB_NO_OGRE3D
44  quaternion(const Ogre::Quaternion &quat);
45  operator Ogre::Quaternion() const;
46 #endif
47 #ifndef BLUB_NO_BULLET
48  quaternion(const btQuaternion &quat);
49  operator btQuaternion() const;
50 #endif
51 #ifdef BLUB_USE_PHYSX
52  quaternion(const physx::PxQuat& other)
53  : w(other.w), x(other.x), y(other.y), z(other.z)
54  {}
55  operator physx::PxQuat() const
56  {return physx::PxQuat(x,y,z,w);}
57 #endif
58 
61  inline void swap(quaternion& other);
62 
64  inline real operator [] ( const size_t i ) const
65  {
66  BASSERT( i < 4 );
67 
68  return *(&w+i);
69  }
70 
72  inline real& operator [] ( const size_t i )
73  {
74  BASSERT( i < 4 );
75 
76  return *(&w+i);
77  }
78 
80  inline real* ptr()
81  {
82  return &w;
83  }
84 
86  inline const real* ptr() const
87  {
88  return &w;
89  }
90 
91  /*depricated inline quaternion& operator= (const quaternion& rkQ)
92  {
93  w = rkQ.w;
94  x = rkQ.x;
95  y = rkQ.y;
96  z = rkQ.z;
97  return *this;
98  }*/
99  quaternion operator+ (const quaternion& rkQ) const;
100  quaternion operator- (const quaternion& rkQ) const;
101  quaternion operator* (const quaternion& rkQ) const;
102  quaternion operator* (real fScalar) const;
103  friend quaternion operator* (real fScalar, const quaternion& rkQ)
104  {
105  return quaternion(fScalar*rkQ.x, fScalar*rkQ.y, fScalar*rkQ.z, fScalar*rkQ.w);
106  }
107  vector3 operator* (const vector3& rkVector) const;
108  quaternion operator- () const;
109 
110 
111  inline bool operator== (const quaternion& rhs) const
112  {
113  return (rhs.x == x) && (rhs.y == y) &&
114  (rhs.z == z) && (rhs.w == w);
115  }
116  inline bool operator!= (const quaternion& rhs) const
117  {
118  return !operator==(rhs);
119  }
120 
121  real Dot (const quaternion& rkQ) const;
122  real Norm () const;
123  real normalise();
124  quaternion getNormalised() const;
125  quaternion Inverse () const; // apply to non-zero quaternion
126  quaternion UnitInverse () const; // apply to unit-length quaternion
127  quaternion Exp () const;
128  quaternion Log () const;
129  void FromAngleAxis (const real& rfAngle, const vector3& rkAxis);
130 
131  static quaternion Slerp (real fT, const quaternion& rkP,
132  const quaternion& rkQ, bool shortestPath = false);
133 
138  static quaternion SlerpExtraSpins (real fT,
139  const quaternion& rkP, const quaternion& rkQ,
140  int iExtraSpins);
141 
142  // setup for spherical quadratic interpolation
143  static void Intermediate (const quaternion& rkQ0,
144  const quaternion& rkQ1, const quaternion& rkQ2,
145  quaternion& rkA, quaternion& rkB);
146 
147  // spherical quadratic interpolation
148  static quaternion Squad (real fT, const quaternion& rkP,
149  const quaternion& rkA, const quaternion& rkB,
150  const quaternion& rkQ, bool shortestPath = false);
151 
166  static quaternion nlerp(real fT, const quaternion& rkP,
167  const quaternion& rkQ, bool shortestPath = false);
168 
169  // special values
170  static const quaternion ZERO;
171  static const quaternion IDENTITY;
172 
173 public:
174  real w, x, y, z;
175 
176 protected:
177  BLUB_SERIALIZATION_ACCESS
178  template<typename Archive>
179  void serialize(Archive & readWrite, const unsigned int version)
180  {
181  (void)version;
182 
183  readWrite & BLUB_SERIALIZATION_NAMEVALUEPAIR(x);
184  readWrite & BLUB_SERIALIZATION_NAMEVALUEPAIR(y);
185  readWrite & BLUB_SERIALIZATION_NAMEVALUEPAIR(z);
186  readWrite & BLUB_SERIALIZATION_NAMEVALUEPAIR(w);
187  }
188 
189 };
190 
191 
192 std::ostream& operator << (std::ostream& ostr, const quaternion& toCast);
193 
194 
195 }
196 
197 #endif // QUATERNION_HPP
Definition: quaternion.hpp:25
void swap(quaternion &other)
Definition: quaternion.cpp:49
quaternion(real fX, real fY, real fZ, real fW)
Construct from an explicit list of values.
Definition: quaternion.hpp:33
real * ptr()
Pointer accessor for direct copying.
Definition: quaternion.hpp:80
Definition: vector3.hpp:26
real operator[](const size_t i) const
Array accessor operator.
Definition: quaternion.hpp:64
static quaternion SlerpExtraSpins(real fT, const quaternion &rkP, const quaternion &rkQ, int iExtraSpins)
Definition: quaternion.cpp:262
const real * ptr() const
Pointer accessor for direct copying.
Definition: quaternion.hpp:86
Definition: deadlineTimer.hpp:10
Definition: axisAlignedBox.hpp:10
static quaternion nlerp(real fT, const quaternion &rkP, const quaternion &rkQ, bool shortestPath=false)
Definition: quaternion.cpp:301