
#ifndef _JL_Quaternion_H_
#define _JL_Quaternion_H_


#include <stdlib.h>
#include <iostream.h>

#include "jllib_include.h"
#include "vec4.h"


class JLmatrix;


class Quaternion {

	private:
		real	_data[4];

	public: 
		Quaternion() { Zero(); }
		Quaternion(const Quaternion &Q) { CopyFrom(Q); }
		~Quaternion() { }

		Quaternion& CopyFrom(const Quaternion&);
		Quaternion& operator=(const Quaternion &Q) { return CopyFrom(Q); }

		void Zero() { _data[0] = _data[1] = _data[2] = 0; _data[3] = 1; }
		void Normalize();

		void SetAxisAngle(const real axis[3], real angle);
		void SetAxisAngle(const Vec4& axis, real angle)
				{ SetAxisAngle(axis._data, angle); }

		void BuildMatrix(Matrix M) const;
		void BuildMatrix(JLmatrix &M) const;

		friend void Add(Quaternion &q1,
						const Quaternion &q2, const Quaternion &q3);


		friend ostream& operator<<(ostream&, const Quaternion&);
};

#endif
