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_ */