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

#ifndef DSE_RS_MATERIAL_MATERIAL_PARAMS_HPP
#define DSE_RS_MATERIAL_MATERIAL_PARAMS_HPP

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

namespace rs
{
	enum MATERIAL_PARAMETER_TYPE
	{
		BASE_TYPE = -1,
		TEXTURE_TYPE = 0,
		FLOAT_ARRAY_TYPE = 1,
		VECT2_TYPE = 2,
		VECT3_TYPE = 3,
		VECT4_TYPE = 4,
	};

	class BaseMaterialParameter
	{
	protected:
		MATERIAL_PARAMETER_TYPE type;
		std::string name;
	public:
		BaseMaterialParameter();
		virtual ~BaseMaterialParameter();

		const std::string& getName() const;
		void setName(const std::string& name);

		virtual void set(const shared_ptr<gs::Effect>& effect)=0;

		const MATERIAL_PARAMETER_TYPE& getType() const;
	};

	class TextureMaterialParameter : public BaseMaterialParameter
	{
	private:
		shared_ptr<BaseTexture> texture;
	public:
		TextureMaterialParameter();

		void setTexture(const shared_ptr<BaseTexture>& texture);
		const shared_ptr<BaseTexture>& getTexture() const;

		void set(const shared_ptr<gs::Effect>& effect);
	};

	class FloatArrayMaterialParameter : public BaseMaterialParameter
	{
	private:
		unsigned int float_number;
		shared_array<float> values;
	public:
		FloatArrayMaterialParameter();

		void setValues(const unsigned int f_n, const shared_array<float>& val);
		unsigned int getFloatNumber() const;
		const shared_array<float>& getValues() const;

		void set(const shared_ptr<gs::Effect>& effect);
	};

	class Vect2MaterialParameter : public BaseMaterialParameter
	{
	private:
		math::Vect2 value;
	public:
		Vect2MaterialParameter();

		void setValue(const math::Vect2& new_value);
		const math::Vect2& getValue() const;

		void set(const shared_ptr<gs::Effect>& effect);
	};

	class Vect3MaterialParameter : public BaseMaterialParameter
	{
	private:
		math::Vect3 value;
	public:
		Vect3MaterialParameter();

		void setValue(const math::Vect3& new_value);
		const math::Vect3& getValue() const;

		void set(const shared_ptr<gs::Effect>& effect);
	};

	class Vect4MaterialParameter : public BaseMaterialParameter
	{
	private:
		math::Vect4 value;
	public:
		Vect4MaterialParameter();

		void setValue(const math::Vect4& new_value);
		const math::Vect4& getValue() const;

		void set(const shared_ptr<gs::Effect>& effect);
	};
};

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

#endif

