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

#ifndef DSE_GS_EFFECT_CONSTANT_TABLE_HPP
#define DSE_GS_EFFECT_CONSTANT_TABLE_HPP

#include <Darkstar/common.hpp>

#include <Darkstar/Graphic System/Direct3D/direct3d_include.hpp>
#include <Darkstar/Graphic System/Effect/shader_reflection.hpp>

namespace gs
{
	enum CONSTANT_TYPE
	{
		TYPE_UNKNOWN = -100,
		VS_CONST = 0,
		PS_CONST = 1,
		GS_CONST = 2
	};

	struct Constant
	{
		CONSTANT_TYPE type;
		unsigned short register_index;
	};

	class ConstantTable
	{
	public:
		typedef std::multimap<std::string, Constant> storage;
	private:
		storage constants;
	public:
		ConstantTable();
		ConstantTable(const shared_ptr<ShaderReflection>& vs_refl, const shared_ptr<ShaderReflection>& ps_refl);
		~ConstantTable();

		bool setFloatArray(const std::string& name, const float* values, unsigned int count_float4);
		bool setIntArray(const std::string& name, const int* values, unsigned int count_float4);
		bool setBoolArray(const std::string& name, const bool* values, unsigned int count);
	
		bool getIsConstantExist(const std::string& name);
		short getConstantIndex(const std::string& name);
		CONSTANT_TYPE getConstantType(const std::string& name);

		const storage& getStorage() const;
		void setNewStorage(const storage& new_storage);
	};
};

#endif