// __author__ = Juan Carlos De Abreu (jcabreur@gmail.com)

/**
 * TODO(jcabreur): write a general comment here
 */

#ifndef MATH_QUATERNION_H__
#define MATH_QUATERNION_H__

#include "../../global.h"
#include "../Vector.h"
#include "../Matrix.h"

BEGIN_TEG_NAMESPACE();

#define PI 3.141592654										//definicion del valor de PI
#define GET_RADIANS(degree) (degree / 180.0 * PI)			//convierte grados a radianes.

namespace math {

template<class _T>
class Quaternion {
public:
	// Attributes
	//definicion de la estrcutura del quaternion
	union {
		struct { _T x, y, z, w; };	//componentes del quaternion
		_T values[4];
	};
	
	// Constructor
	Quaternion();
	Quaternion(const _T& xAxis, const _T& yAxis, const _T& zAxis, const _T& wAxis);

	// Destructor
	~Quaternion();

	// Operators
	void operator = (const Quaternion<_T>& q);
	
	Quaternion<_T> operator * (const Quaternion<_T>& q);
	//Quaternion<_T> operator + (const Quaternion<_T>& q);
	
	// Methods
	_T module();
	void normalize();
	void set(const _T& x_, const _T& y_, const _T& z_, const _T& w_);
	Quaternion<_T> conjugate();
	//void createMatrix(Mat4<_T>& m);
	Mat4<_T> createMatrix() const;
	void createQuatFromAxis(Vec4<_T> a, const double& radians);
};

//constructor pos defecto del quaternion
template<class _T>
Quaternion<_T>::Quaternion() : x(0), y(0), z(0), w(1) { }

//constructor con los valores de las componentes del quaternion
template<class _T>
Quaternion<_T>::Quaternion(const _T& x_, const _T& y_, const _T& z_, const _T& w_)
	: x(x_), y(y_), z(z_), w(w_) { }

template<class _T>
Quaternion<_T>::~Quaternion() { }

};	// Math namespace 

END_TEG_NAMESPACE();

#endif  // MATH_QUATERNION_H__
