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

#ifndef DSE_GS_EFFECT_EFFECT_PARSER_HPP
#define DSE_GS_EFFECT_EFFECT_PARSER_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/Kernel/file_system.hpp>
#include <Darkstar/Kernel/parser.hpp>
#include <Darkstar/Graphic System/Effect/effect.hpp>

namespace gs
{
	struct _TechniqueShaderFile
	{
		shared_ptr<ker::DFile> vfile;
		shared_ptr<ker::DFile> pfile;

		bool is_the_same;
	};

	struct _Technique
	{
		shared_ptr<Technique> tech;
		std::string tech_name;
		std::string vertex_shader_name;
		std::string pixel_shader_name;
		std::string vertex_shader_target;
		std::string pixel_shader_target;
		std::string vertex_shader_function;
		std::string pixel_shader_function;
		std::vector<std::string> include_files;
		_TechniqueShaderFile files;
	};

	class EffectParser
	{
	private:
		std::list<_Technique> _tech;
		shared_ptr<ker::SystemTime> effect_last_write_time;
		std::string effect_file_path;

		bool _parseTechnique(const shared_ptr<ker::Section>& tech_section, _Technique& t);
		bool _parseMacro(const shared_ptr<ker::Section>& macro_section, Macro& m);
		bool _parseSampler(const shared_ptr<ker::Section>& sampler_section, shared_ptr<SamplerRenderState>& s);
		bool _parseShader(const shared_ptr<ker::Section>& shader_section, std::string& shader_name, std::string& shader_target, std::string& shader_function, bool is_pixel);
		bool _parseInclude(const shared_ptr<ker::Section>& include_section, std::vector<std::string>& names);
	public:
		EffectParser();
		~EffectParser();

		bool parseFile(const std::string& filename);

		const std::list<_Technique>& getFileData() const;
		const shared_ptr<ker::SystemTime>& getEffectFileLastWriteTime() const;
		const std::string& getEffectFilePath() const;
	};
};

#endif