//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: fpcamera.hpp
//      Краткое описание: First person camera
//

#ifndef DSE_GS_CAMERA_HPP
#define DSE_GS_CAMERA_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/math.hpp>

using math::Vect3;

namespace gs
{
	class Camera
	{
	private:
		Vect3 position;
		Vect3 target;
		Vect3 up;

		float fov;
		float znear, zfar;
		float aspect;

		bool is_correct_view;
		bool is_correct_proj;
		math::Matr4 view;
		math::Matr4 projection;

		void _recalcMatrix();
	public:
		Camera();
		Camera(const float fov, const float aspect, const float znear, const float zfar);
		~Camera();

		void create(const float fov, const float aspect, const float znear, const float zfar);
		void setLookAt(const Vect3& new_position, const Vect3& new_target, const Vect3& new_up);

		void setPosition(const Vect3& new_position, bool without_correct_view = false);
		void setTarget(const Vect3& new_target);
		void setUp(const Vect3& new_up);

		void setFOV(const float new_fov);
		void setZnear(const float new_znear);
		void setZfar(const float new_zfar);
		void setAspect(const float new_aspect);
		void setZnearFar(const float z_near, const float z_far);

		const Vect3& getPosition() const;
		const Vect3& getTarget() const;
		const Vect3& getUp() const;

		float getFOV() const;
		float getZnear() const;
		float getZfar() const;
		float getAspect() const;

		math::Matr4 getViewProjection();
		const math::Matr4& getViewMatrix();
		const math::Matr4& getProjectionMatrix();

		void recalcMatrix();
	};
};

#endif