// __author__ = Juan Carlos De Abreu (jcabreur@gmail.com)
//
// TODO(jcabreur): write a general comment here
// Define a general camera for the app. ...

#ifndef CAMERA_H__
#define CAMERA_H__

#include "../global.h"
#include "../Includes/Basic.h"
#include "../Math/Vector.h"
//#include "../Base/Singleton.h"
#include "../Math/Quaternion/Quaternion-inl.h"
#include "../Util/Time/TimeManagement.h"

#include "../Base/Memory/MMObject.h"

BEGIN_TEG_NAMESPACE();

#define UP				 1.0f		// Forward speed.
#define DOWN			-1.0f		// Backward speed.
#define LEFT			 1.0f		// Left speed.
#define RIGHT			-1.0f		// Right speed.
#define STRAFE_LEFT		-1.0f		// Left straft speed.
#define STRAFE_RIGHT	 1.0f		// Right straft speed.

//definicion del aestructura de la camara
//class Camera : public Singleton<Camera> {
class Camera : public IMMObject {
public:
	// Attributes
	Vec3f pos;		//posicion de la camara
	Vec3f view;		//punto a donde mira la camara
	Vec3f up;		//direccion del vector up
	Vec3f strafe;	//direccion dels Strafe
//	float currentRotationAngle;			// Keeps us from going too far up or down.
	float frameInterval;				//usado para los movimientos basados en el tiempo

	// Constructor
	Camera() { set(Vec3f(0,0,2), Vec3f(0, 0, 0), Vec3f(0, 1, 0)); }

	// Destructor
	~Camera() { }

	// Methods
	void init();
	void set(const Vec3f &_pos, const Vec3f &_view, const Vec3f &_up);
	void move(const float &direction);
	void update(Vec3f lookDir, float dir);
	void StrafeCam(float direction);
	void CalculateStrafe();
	void RotateCamera(float AngleDir, Vec3f speed);	// by keys
	void RotateByMouse(int mousePosX, int mousePosY,int midX, int midY);
	void CalculateTime();	//usado para los movimientos basados en el tiempo

	void rotateX(float angleDir);
	void rotateY(float angleDir);

	void lookAt(void) const;
	AUTO_SIZE();
};

END_TEG_NAMESPACE();

#endif  // CAMERA_H__
