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

#ifndef DSE_RS_MATERIAL_MATERIAL_HPP
#define DSE_RS_MATERIAL_MATERIAL_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/Resource System/Textures/baseTexture.hpp>
#include <Darkstar/math.hpp>
#include <Darkstar/Graphic System/Render State/blend_render_state.hpp>
#include <Darkstar/Graphic System/Render State/cull_render_state.hpp>
#include <Darkstar/Graphic System/Effect/effect.hpp>
#include <Darkstar/Resource System/Material/material_params.hpp>

namespace rs
{
	class Material
	{
	private:
		std::map<std::string, shared_ptr<BaseMaterialParameter> > params;

		std::map<std::string, unsigned int> flags;
		std::string technique_name;

		shared_ptr<gs::BlendRenderState> blend_state;
		shared_ptr<gs::CullModeRenderState> cull_mode;

		shared_ptr<gs::Effect> effect;
	public:
		Material();
		~Material();

		void addTexture(const std::string& name, const shared_ptr<BaseTexture>& texture);
		void addFloatArray(const std::string& name, const shared_array<float>& values, const unsigned int float_number);
		void addVect2(const std::string& name, const math::Vect2& value);
		void addVect3(const std::string& name, const math::Vect3& value);
		void addVect4(const std::string& name, const math::Vect4& value);
		
		void setBlendState(const shared_ptr<gs::BlendRenderState>& bs);
		const shared_ptr<gs::BlendRenderState>& getBlendState() const;

		void setCullMode(const shared_ptr<gs::CullModeRenderState>& cm);
		const shared_ptr<gs::CullModeRenderState>& getCullMode() const;

		void setEffect(const shared_ptr<gs::Effect>& effect);
		const shared_ptr<gs::Effect>& getEffect() const;
		void addFlag(const std::string& name, const unsigned int value);

		void setTechnique(const std::string& name);
		const std::string& getTechnique() const;
	
		void set();
	};
};

#include <Darkstar/Resource System/Material/material.inl>

#endif