istereo
diff libs/vmath/quat.h @ 28:c0ae8e668447
added vmath library
author | John Tsiombikas <nuclear@mutantstargoat.com> |
---|---|
date | Thu, 08 Sep 2011 08:30:42 +0300 |
parents | |
children | ff055bff6a15 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libs/vmath/quat.h Thu Sep 08 08:30:42 2011 +0300 1.3 @@ -0,0 +1,101 @@ 1.4 +#ifndef VMATH_QUATERNION_H_ 1.5 +#define VMATH_QUATERNION_H_ 1.6 + 1.7 +#include <stdio.h> 1.8 +#include "vmath_types.h" 1.9 +#include "vector.h" 1.10 + 1.11 +#ifdef __cplusplus 1.12 +extern "C" { 1.13 +#endif /* __cplusplus */ 1.14 + 1.15 +#define quat_cons(s, x, y, z) v4_cons(x, y, z, s) 1.16 +#define quat_vec(q) v3_cons((q).x, (q).y, (q).z) 1.17 +#define quat_s(q) ((q).w) 1.18 +#define quat_identity() quat_cons(1.0, 0.0, 0.0, 0.0) 1.19 +void quat_print(FILE *fp, quat_t q); 1.20 + 1.21 +#define quat_add v4_add 1.22 +#define quat_sub v4_sub 1.23 +#define quat_neg v4_neg 1.24 + 1.25 +static inline quat_t quat_mul(quat_t q1, quat_t q2); 1.26 + 1.27 +static inline quat_t quat_conjugate(quat_t q); 1.28 + 1.29 +#define quat_length v4_length 1.30 +#define quat_length_sq v4_length_sq 1.31 + 1.32 +#define quat_normalize v4_normalize 1.33 +static inline quat_t quat_inverse(quat_t q); 1.34 + 1.35 +quat_t quat_rotate(quat_t q, scalar_t angle, scalar_t x, scalar_t y, scalar_t z); 1.36 +quat_t quat_rotate_quat(quat_t q, quat_t rotq); 1.37 + 1.38 +static inline void quat_to_mat3(mat3_t res, quat_t q); 1.39 +static inline void quat_to_mat4(mat4_t res, quat_t q); 1.40 + 1.41 +#define quat_lerp quat_slerp 1.42 +quat_t quat_slerp(quat_t q1, quat_t q2, scalar_t t); 1.43 + 1.44 + 1.45 +#ifdef __cplusplus 1.46 +} /* extern "C" */ 1.47 + 1.48 +#include <iostream> 1.49 + 1.50 +/* Quaternion */ 1.51 +class Quaternion { 1.52 +public: 1.53 + scalar_t s; 1.54 + Vector3 v; 1.55 + 1.56 + Quaternion(); 1.57 + Quaternion(scalar_t s, const Vector3 &v); 1.58 + Quaternion(scalar_t s, scalar_t x, scalar_t y, scalar_t z); 1.59 + Quaternion(const Vector3 &axis, scalar_t angle); 1.60 + Quaternion(const quat_t &quat); 1.61 + 1.62 + Quaternion operator +(const Quaternion &quat) const; 1.63 + Quaternion operator -(const Quaternion &quat) const; 1.64 + Quaternion operator -() const; 1.65 + Quaternion operator *(const Quaternion &quat) const; 1.66 + 1.67 + void operator +=(const Quaternion &quat); 1.68 + void operator -=(const Quaternion &quat); 1.69 + void operator *=(const Quaternion &quat); 1.70 + 1.71 + void reset_identity(); 1.72 + 1.73 + Quaternion conjugate() const; 1.74 + 1.75 + scalar_t length() const; 1.76 + scalar_t length_sq() const; 1.77 + 1.78 + void normalize(); 1.79 + Quaternion normalized() const; 1.80 + 1.81 + Quaternion inverse() const; 1.82 + 1.83 + void set_rotation(const Vector3 &axis, scalar_t angle); 1.84 + void rotate(const Vector3 &axis, scalar_t angle); 1.85 + /* note: this is a totally different operation from the above 1.86 + * this treats the quaternion as signifying direction and rotates 1.87 + * it by a rotation quaternion by rot * q * rot' 1.88 + */ 1.89 + void rotate(const Quaternion &q); 1.90 + 1.91 + Matrix3x3 get_rotation_matrix() const; 1.92 + 1.93 + friend Quaternion slerp(const Quaternion &q1, const Quaternion &q2, scalar_t t); 1.94 + 1.95 + friend std::ostream &operator <<(std::ostream &out, const Quaternion &q); 1.96 +}; 1.97 + 1.98 +Quaternion slerp(const Quaternion &q1, const Quaternion &q2, scalar_t t); 1.99 +inline Quaternion lerp(const Quaternion &q1, const Quaternion &q2, scalar_t t); 1.100 +#endif /* __cplusplus */ 1.101 + 1.102 +#include "quat.inl" 1.103 + 1.104 +#endif /* VMATH_QUATERNION_H_ */