/*
*	SimpleCamera.h
*
*	Programmé par Hillaire Sébastien
*
*
*	- utilité :
*		gère les déplacement d'un caméra sans mouvement de roulis.
*		permet à l'utilisateur de "positionner" la caméra pour OpenGL
*
*	- version :
*		1.1
*
*	- update :
*		29/08/2004 : première nouvelle version de SimpleCaméra utilisant la classe Position
*
*	- NOTE :
*		Bibliothèque glu.h nécessaire
*
*/


#ifndef SIMPLECAMERA_H
#define SIMPLECAMERA_H

#include "Math.h"
#ifdef WIN32
#include <windows.h>
#endif
#include "GL\gl.h"
#include "GL\glu.h"

#include "math_lib.h"
#include "position.h"

#include "MemoryManager/DebugNew.h"

#define NB_MOUVEMENT	6
#define AVANCE			0
#define RECULE			1
#define GAUCHE			2
#define DROITE			3
#define HAUT			4
#define BAS				5


/**
*	Classe permetant de gérer le déplacement d'une caméra. Permet de positioner cette caméra pour
* l'API OpenGL.
*/
class SimpleCamera  
{
private:

	/**
	* sensibilité sur x de la souris pour le regard
	*/
	float mouse_x_sensibility;

	/**
	* sensibilité sur y de la souris pour le regard
	*/
	float mouse_y_sensibility;

	/**
	* dernier mouvement de la souris sur x
	*/
	float last_mouse_x_move;

	/**
	* dernier mouvement de la souris sur y
	*/
	float last_mouse_y_move;

	/**
	* vitesse de deplacement
	*/
	float move_speed;

	/**
	* tableau indiquant les mouvements en cours par des booléens
	*/
	bool activeMovement[NB_MOUVEMENT];

protected:

public:

	/**
	* la représentation de la position & orientation de la caméra
	*/
	Position p;

	/**
	* permet de positionner la caméra pour l'API OpenGL en utilisant la bib glu.
	*/
	void gluLookAt();

	/**
	* Donne la sensibilité de déplacement de la caméra
	*
	* @param mouse_x_sensibility sensibilité horizontal
	* @param mouse_y_sensibility sensibilité vertical
	* @param move_speed vitesse de déplacement
	*/
	void setProperties(const float _mouse_x_sensibility,const float _mouse_y_sensibility,const float _move_speed);

	/**
	* Calcul le mouvement suivant en fonction des fonctionnalité activée
	*
	* @param elapsedTime le temps écoulé depuis la dernière image
	*/
	void computeMovement(const float elapsedTime);

	/**
	* affecte le déplacement de la souris depuis la dernière image
	* il faut appelé cette méthode chaque fois que la souris bouge pour faire tourné la caméra.
	*
	* @param dx variation de position horizontal
	* @param dy variation de position vertical
	*/
	void setLastMouseMove(const float dx,const float dy);

	/**
	* Indique le mouvement de descente de la caméra
	*
	* @param m active ou désactive le mouvement
	*/
	void setBas(const bool m);

	/**
	* Indique le mouvement de monter de la caméra
	*
	* @param m active ou désactive le mouvement
	*/
	void setHaut(const bool m);

	/**
	* Indique le mouvement d'avancement de la caméra
	*
	* @param m active ou désactive le mouvement
	*/
	void setDroite(const bool m);

	/**
	* Indique le mouvement de reculement de la caméra
	*
	* @param m active ou désactive le mouvement
	*/
	void setGauche(const bool m);

	/**
	* Indique le mouvement de strafe gauche de la caméra
	*
	* @param m active ou désactive le mouvement
	*/
	void setRecule(const bool m);

	/**
	* Indique le mouvement de strafe droit de la caméra
	*
	* @param m active ou désactive le mouvement
	*/
	void setAvance(const bool m);


	/**
	* Constructeur initialisant la caméra avec valeur par défaut
	*/
	SimpleCamera();

	/**
	* destructeur
	*/
	virtual ~SimpleCamera();

};

#include "MemoryManager/DebugNewOff.h"

#endif
