/*
*	SimpleCamera.h
*
*	Programmé par Hillaire Sébastien
*
*
*	- utilité :
*		gére la position et l'orientation d'un objet dans l'espace
*
*	- version :
*		1.0
*
*	- update :
*		29/08/2004 : otpimisation. seulement 4 sin et cos sont salculer au lieu de 12
*
*/


#ifndef POSITION_H
#define POSITION_H

#include "math_lib.h"

#ifdef WIN32
#include <windows.h>
#endif
#include "GL/gl.h"

#include "MemoryManager/DebugNew.h"


/**
* Classe permettant de gérer la position d'un objet dans un espace 3D
* gére aussis le repere local de l'objet
*/
class Position
{
private:

protected:

	/**
	* La position de l'objet
	*/
	vector3 pos;
	/**
	* l'axe x du repere local à l'objet
	*/
	vector3 vx;
	/**
	* l'axe y du repere local à l'objet
	*/
	vector3 vy;
	/**
	* l'axe z du repere local à l'objet
	*/
	vector3 vz;

	/**
	* angle de X vers Y
	*/
	float alphaXZ;
	/**
	* angle de Z vers Y
	*/
	float alphaZY;

public:

	/**
	* Constructeur
	*/
	Position();

	/**
	* Destructeur
	*/
	~Position();

	/**
	* affecte l'angle sur XZ en radian
	* => appeler ensuite compute() pour recalculer le repère
	*
	* @param a la nouvelle valeur de l'angle
	*/
	void setAlphaXZ(const float a);
	/**
	* récupere l'angle sur XZ en radian
	*/
	float getAlphaXZ();
	/**
	* applique une variation de l'angle alphaXZ en radian
	*
	* @param da la valeur de la varaition
	*/
	void deltaAlphaXZ(const float da);

	/**
	* affecte l'angle sur ZY en radian
	* => appeler ensuite compute() pour recalculer le repère
	*
	* @param a la nouvelle valeur de l'angle
	*/
	void setAlphaZY(const float a);
	/**
	* récupere l'angle sur ZY en radian
	*/
	float getAlphaZY();
	/**
	* applique une variation de l'angle alphaZY en radian
	*
	* @param da la valeur de la varaition
	*/
	void deltaAlphaZY(const float da);

	/**
	* affecte l'angle sur XZ en radian
	*
	* @param *v la nouvelle position
	*/
	void setPosition(const vector3 *v);
	/**
	*
	* @param x la nouvelle position ur l'axe X
	* @param y la nouvelle position ur l'axe Y
	* @param z la nouvelle position ur l'axe Z
	*/
	void setPosition(const float x,const float y,const float z);
	/**
	* récupere la position
	*/
	const vector3* getPosition();
	/**
	* applique une variation de la position
	*
	* @param *v le vecteur variation de la position
	*/
	void deltaPosition(const vector3 *v);
	/**
	* applique une variation de la position
	*
	* @param x la variantion de la position sur l'axe X
	* @param y la variantion de la position sur l'axe Y
	* @param z la variantion de la position sur l'axe Z
	*/
	void deltaPosition(const float x,const float y,const float z);

	/**
	* récupere le vecteur X de la base local
	*/
	const vector3* getBaseX();
	/**
	* récupere le vecteur Y de la base local
	*/
	const vector3* getBaseY();
	/**
	* récupere le vecteur Z de la base local
	*/
	const vector3* getBaseZ();

	/**
	* Calcule le nouveau repere en fonction des angles spécifiées
	*/
	void compute();

	/**
	* affiche le repère à l'écran
	*/
	void debug_render();

	/**
	* transforme un vecteur dans le repere local
	*
	* @pré v et dest ne doivent pas pointé sur le même vecteur. (optimisation)
	*
	* @param *v le pointeur sur le vecteur a transformer
	* @param *dest le pointeur sur le vecteur transforma
	*/
	void transformeIntoLocalSpace(vector3 *v,vector3 *dest);
};

#include "MemoryManager/DebugNewOff.h"

#endif