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

#ifndef DSE_VE_HDR_HPP
#define DSE_VE_HDR_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/Resource System/Textures/baseTexture.hpp>
#include <Darkstar/Graphic System/Effect/effect.hpp>
#include <Darkstar/Graphic System/render_target_main.hpp>
#include <Darkstar/Resource System/Model/SimpleModels/quad.hpp>
#include <Darkstar/math.hpp>

namespace ve
{
	class HDR
	{
	private:
		shared_ptr<gs::Effect> hdr_operator;
		shared_ptr<gs::Effect> hdr_down_sampler;

		shared_ptr<gs::RenderTarget> scene_render_target;
		std::vector<shared_ptr<gs::RenderTarget> > scene_down_samples;
		shared_ptr<gs::RenderTarget> average_luminosity;
		std::vector<math::Vect2> inv_tex_size;
		std::vector<math::Vect2> tex_size;

		gs::DRTAATYPE aa_type;

#ifdef GD_D3D10
		shared_ptr<rs::Quad> d3d10_fullscreen_quad;
#endif
#ifdef GD_D3D9
		std::vector<shared_ptr<rs::Quad> > d3d9_fullscreen_quads;
#endif

		bool is_hdr_correct;

		bool _createAll(const unsigned int new_screen_width, const unsigned int new_screen_height, const gs::DRTAATYPE& aa_type);
	public:
		HDR(const std::string& hdr_operator_name, const std::string& hdr_down_sampler_name, const unsigned int screen_width, const unsigned int screen_height, const gs::DRTAATYPE& aa_type = gs::WITHOUT_AA);
		~HDR();

		void setHDROperator(const shared_ptr<gs::Effect>& new_hdr_operator);
		void setHDRDownSampler(const shared_ptr<gs::Effect>& new_hdr_down_sampler);
		void setAAType(const gs::DRTAATYPE& new_aa_type);
		const shared_ptr<gs::RenderTarget>& getSceneRenderTarget() const;
		const shared_ptr<gs::RenderTarget>& getAverageLuminosity() const;
		const shared_ptr<rs::Quad>& getFullscreenQuad(const unsigned int quad_level = 0) const;
		const shared_ptr<gs::RenderTarget>& getStrechedScene(unsigned int level) const;
		const math::Vect2& getStrechedSceneSize(unsigned int level) const;

		void calculateAverageLuminocity();
		void beginRenderObjects();
		void drawQuad();
		void end();
		void endWithCalculations();

		bool getIsHDRCorrect() const;

		void setScreenSize(const unsigned int screen_width, const unsigned int screen_height);
	};
};

#endif
