00001 #ifndef __INSTANTIO_ROTATION_H
00002 #define __INSTANTIO_ROTATION_H
00003
00004 #ifdef _MSC_VER
00005 # pragma once
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "InstantIODef.h"
00027 #include "TypeName.h"
00028 #ifdef _MSC_VER
00029 # pragma warning (push)
00030 # pragma warning (disable: 4351)
00031 #endif
00032
00033
00034 namespace InstantIO
00035 {
00036
00037
00038 template <class T> class Vec3;
00039 typedef Vec3<float> Vec3f;
00040
00041
00064 class INSTANTIO_DLLMAPPING Rotation
00065 {
00066 public:
00067
00069 inline Rotation(): quat_()
00070 { quat_[0] = quat_[1] = quat_[2] = quat_[3] = 0.f; }
00071
00080 inline Rotation(float q1, float q2, float q3, float q4): quat_()
00081 { quat_[0] = q1; quat_[1] = q2; quat_[2] = q3; quat_[3] = q4; }
00082
00090 inline Rotation(const float *quat): quat_()
00091 {
00092 quat_[0] = quat[0]; quat_[1] = quat[1];
00093 quat_[2] = quat[2]; quat_[3] = quat[3];
00094 }
00095
00102 inline Rotation(const Rotation &rot): quat_()
00103 {
00104 quat_[0] = rot.quat_[0]; quat_[1] = rot.quat_[1];
00105 quat_[2] = rot.quat_[2]; quat_[3] = rot.quat_[3];
00106 }
00107
00114 inline Rotation(const Vec3f &axis, float angle): quat_()
00115 { set(axis, angle); }
00116
00123 inline const Rotation &operator=(const Rotation &rot)
00124 {
00125 quat_[0] = rot.quat_[0]; quat_[1] = rot.quat_[1];
00126 quat_[2] = rot.quat_[2]; quat_[3] = rot.quat_[3];
00127 return rot;
00128 }
00129
00137 inline const float *operator=(const float *quat)
00138 {
00139 quat_[0] = quat[0]; quat_[1] = quat[1];
00140 quat_[2] = quat[2]; quat_[3] = quat[3];
00141 return quat;
00142 }
00143
00148 inline void setQ1(float q1) { quat_[0] = q1; }
00149
00154 inline float getQ1() const { return quat_[0]; }
00155
00160 inline void setQ2(float q2) { quat_[1] = q2; }
00161
00166 inline float getQ2() const { return quat_[1]; }
00167
00172 inline void setQ3(float q3) { quat_[2] = q3; }
00173
00178 inline float getQ3() const { return quat_[2]; }
00179
00184 inline void setQ4(float q4) { quat_[3] = q4; }
00185
00190 inline float getQ4() const { return quat_[3]; }
00191
00199 inline void set(float q1, float q2, float q3, float q4)
00200 { quat_[0] = q1; quat_[1] = q2; quat_[2] = q3; quat_[3] = q4; }
00201
00208 inline void set(const float *quat)
00209 {
00210 quat_[0] = quat[0];
00211 quat_[1] = quat[1];
00212 quat_[2] = quat[2];
00213 quat_[3] = quat[3];
00214 }
00215
00221 inline void set(const Rotation &rot)
00222 {
00223 quat_[0] = rot.quat_[0];
00224 quat_[1] = rot.quat_[1];
00225 quat_[2] = rot.quat_[2];
00226 quat_[3] = rot.quat_[3];
00227 }
00228
00235 void set(const Vec3f &axis, float angle);
00236
00245 inline void get(float &q1, float &q2, float &q3, float &q4) const
00246 { q1 = quat_[0]; q2 = quat_[1]; q3 = quat_[2]; q4 = quat_[3]; }
00247
00254 inline void get(float *quat) const
00255 {
00256 quat[0] = quat_[0];
00257 quat[1] = quat_[1];
00258 quat[2] = quat_[2];
00259 quat[3] = quat_[3];
00260 }
00261
00267 inline void get(Rotation &rot) const
00268 {
00269 rot.quat_[0] = quat_[0];
00270 rot.quat_[1] = quat_[1];
00271 rot.quat_[2] = quat_[2];
00272 rot.quat_[3] = quat_[3];
00273 }
00274
00281 float get(Vec3f &axis) const;
00282
00288 inline const float *get() const { return quat_; }
00289
00295 inline float *get() { return quat_; }
00296
00303 inline float operator[](int i) const { return quat_[i]; }
00304
00311 inline float &operator[](int i) { return quat_[i]; }
00312
00319 inline operator float *() { return &quat_[0]; }
00320
00327 inline operator const float *() const { return &quat_[0]; }
00328
00335 Rotation &operator*=(const Rotation &rot);
00336
00337 private:
00338
00340 float quat_[4];
00341
00342 };
00343
00344
00351 template <>
00352 class INSTANTIO_DLLMAPPING TypeName<Rotation>
00353 {
00354 public:
00355
00360 static const char *getName();
00361
00362 private:
00363
00365 TypeName();
00366
00368 TypeName(const TypeName &);
00369
00371 const TypeName &operator=(const TypeName &);
00372 };
00373
00374
00375 }
00376
00377
00378 #ifdef _MSC_VER
00379 # pragma warning (pop)
00380 #endif
00381
00382 #endif // __INSTANTIO_ROTATION_H