#pragma once
#include "structures.h"
#include "matrix.h"
namespace M3D
{

class OpenGLState;

/**
 * По умолчанию (при 0-м повороте) вверх - положительная ось y, вправо - положительная ось x? вглубь - отрицательная ось z 
 *@author Denis A. Biryukov <denis.birukov@gmail.com>
 */
class Camera
{
	public:
		Camera();
		~Camera();
		/**
		 * Получение текущих координат камеры
		 * @return текущие координаты камеры
		 */
		const Coords& get_location() const { return _location_; }
		/**
		 * Получение текущей ориентации камеры в пространстве 
		 * @return ориентация камеры в пространстве
		 */
		const Rotation& get_rotation() const { return _rotation_; }
		/**
		 * Получение параметров камеры
		 * @return текущие параметры камеры
		 */
		const CameraParams& get_camera_params() const { return _camera_params_;}
		/**
		 * Смена текущего положения камеры 
		 * @param location новое положение камеры
		 */
		void set_location( const Coords &location );
		/**
		 * Смена текущей ориентации камеры в пространстве. Вращение по оси z определяет вращение раструба камеры
		 * @param rotation новая ориентация камеры в пространстве
		 */
		void set_rotation( const Rotation &rotation );
		/**
		 * Установка параметров камеры. Производит пересчитывание Projection матрицы
		 */
		void set_camera_params(CameraParams& params);
		/**
		 * Устанавливает данные камеры
		 * @param state текущее состояние OpenGL
		 */
		void set_camera(OpenGLState *state);
	private:
		Coords _location_;
		Rotation _rotation_;
		CameraParams _camera_params_;
		GLMatrix4x4 _projection_matrix_;
};

}

