#pragma once
#define GLM_ENABLE_EXPERIMENTAL
#include "glm/glm.hpp"
#include "glm/gtc/quaternion.hpp"

namespace Deer {
	class Camera {
	public:
		Camera(float aspect, float fov = 60, float nearZ = 0.1f, float farZ = 500);

		void setPosition(const glm::vec3& position) { m_position = position; }
		const glm::vec3& getPosition() { return m_position; }

		void setRotation(const glm::quat& rotation) { m_rotation = rotation; }
		const glm::quat& getRotation() { return m_rotation; }

		void setAspect(float aspect) { m_aspect = aspect; }
		float getAspect() { return m_aspect; }

		void setFov(float fov) { m_fov = fov; }
		float getFov() { return m_fov; }

		void recalculateMatrices();
		const glm::mat4& getProjectionMatrix() { return m_projectionMatrix; }
		const glm::mat4& getViewMatrix() { return m_viewMatrix; }
	private:
		float m_fov, m_aspect, m_nearZ, m_farZ;
		glm::mat4 m_projectionMatrix;
		glm::mat4 m_viewMatrix;

		glm::vec3 m_position;
		glm::quat m_rotation;
	};
}

