Revision 5 (by guilt, 2006/03/06 11:11:58)
#ifndef __XGL_QUAT_H__

#define __XGL_QUAT_H__


#include <allegro.h>

#include <alleggl.h>

#include <math.h>


class Quaternion
{
public:
   double x, y, z, w;

   Quaternion() : x(0), y(0), z(0), w(0) { }
   Quaternion (float _c) : x(_c), y(_c), z(_c), w(_c)  { }
   Quaternion(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w) { }
   Quaternion(const QUAT &q) {
      x = q.x;
      y = q.y;
      z = q.z;
      w = q.w;
   }
   Quaternion(const Quaternion &q) {
      x = q.x;
      y = q.y;
      z = q.z;
      w = q.w;
   }

   QUAT toQUAT(){
	QUAT q;
	q.x=x; q.y=y; q.z=z; q.w=w;
	return q;
   } 

   // Operators

   inline Quaternion operator = (QUAT Q){
	return Quaternion(Q);
   }   

   inline Vector operator + (Vector v)
   {
	QUAT q=toQUAT();
	float x, y, z;

	apply_quat(&q, v.x, v.y, v.z, &x, &y, &z);
    
	return Vector(x,y,z);
   }

   inline Quaternion operator * (Quaternion q)
   {
	QUAT q1,q2,q3;

	q1=toQUAT();
	q2=q.toQUAT();

	quat_mul(&q3, &q1, &q2);			
    
	return Quaternion(q3);
   }

   inline Quaternion operator *= (Quaternion q)
   {
	QUAT q1,q2;

	q1=q.toQUAT();
	q2=toQUAT();

	quat_mul(&q2, &q1, &q2);

	x=q2.x;
	y=q2.y;
	z=q2.z;
	w=q2.w;
    
	return *this;
   }

   inline Quaternion operator * (QUAT q) {
	QUAT q1,q2;

	q1=toQUAT();

	quat_mul(&q2, &q1, &q);
    
	return Quaternion(q2);
   }  

};

#endif /* __XGL_QUAT_H__ */