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

#ifndef DSE_GS_EFFECT_EFFECT_MANAGER_HPP
#define DSE_GS_EFFECT_EFFECT_MANAGER_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/Graphic System/Effect/effect.hpp>
#include <Darkstar/Graphic System/Effect/constant_table.hpp>
#include <Darkstar/Kernel/misc.hpp>
#include <Darkstar/Kernel/file_system.hpp>
#include <Darkstar/Graphic System/Effect/shader_include.hpp>
#include <Darkstar/Graphic System/Effect/effect_parser.hpp>
#include <Darkstar/Graphic System/Effect/compiled_effect_file.hpp>

namespace gs
{
	class EffectManager : public ker::SingletonHolder<EffectManager>
	{
	private:
		stdext::hash_map<std::string, weak_ptr<Effect> > effect_cash;

		std::list<_Technique> _tech;
		std::vector<shared_ptr<ShaderReflection> > tmp_vertex_shader_reflection;
		ker::Blob tmp_input_signature;
		shared_ptr<CompiledEffectFile> compiled_effect_file;

		unsigned int input_sig_num;

		bool _compileTechnique(std::list<_Technique>::iterator& it);

		void _fillContibutionMacrosField(std::list<_Technique>::iterator& it);
		void _getMacroAdditionalInfo(std::list<_Technique>::iterator& it, unsigned int& num_concrete_effect, unsigned int& num_ps_macros, unsigned int& num_vs_macros, std::vector<short>& cur_values);
	
		bool _checkInputSignature();

		bool load_last_effect_success;
	public:
		EffectManager();
		~EffectManager();

		shared_ptr<Effect> load(const std::string& effect_name);
		bool getIsLoadLastEffect() const;
	};
};

#endif