/*
*	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 RTSCAMERA_H
#define RTSCAMERA_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 "Case.h"

#include "MemoryManager/DebugNew.h"

#define RTSC_NB_MOUVEMENT	1
#define RTSC_NONE			0	//un exemple de commande opur si on en ajoute

/**
*	Classe permetant de gérer le déplacement d'une caméra. Permet de positioner cette caméra pour
* l'API OpenGL.
*/
class RTSCamera  
{
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;

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

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

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

	/**
	* la largeur de l'écran
	*/
	int screenWidth;
	/**
	* la hauteur de l'acran
	*/
	int screenHeight;

	/**
	* tableau indiquant les mouvements en cours par des booléens
	*/
	bool activeMovement[RTSC_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 _headUpSensibility sensibilité vertical de la tete
	*/
	void setProperties(const float _headUpSensibility,const float _move_speed,int screenW, int screenH);

	/**
	* 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);

	/**
	*	Donen la position de la souris cette image pour tanslater si nécessaire
	*
	* @param dx position horizontal
	* @param dy position vertical
	*/
	void setCurMousePos(const float mx,const float my);


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

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

	/**
	*
	*/
	float getMoveSpeed();
	/**
	*
	*/
	void setMoveSpeed(float s);

};

#include "MemoryManager/DebugNewOff.h"

#endif
