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

namespace rs
{
	inline BaseMaterialParameter::BaseMaterialParameter()
	{
		name = "";
		type = BASE_TYPE;
	};

	inline BaseMaterialParameter::~BaseMaterialParameter() 
	{

	};

	inline void BaseMaterialParameter::setName(const std::string& name)
	{
		this->name = name;
	};

	inline const std::string& BaseMaterialParameter::getName() const
	{
		return name;
	};

	inline const MATERIAL_PARAMETER_TYPE& BaseMaterialParameter::getType() const
	{
		return type;
	};


	inline TextureMaterialParameter::TextureMaterialParameter() : BaseMaterialParameter()
	{
		type = TEXTURE_TYPE;
		texture.reset();
	};

	inline void TextureMaterialParameter::setTexture(const shared_ptr<BaseTexture>& texture)
	{
		this->texture = texture;
	};

	inline const shared_ptr<BaseTexture>& TextureMaterialParameter::getTexture() const
	{
		return texture;
	};

	inline void TextureMaterialParameter::set(const shared_ptr<gs::Effect>& effect)
	{
		effect->setTexture(name, texture);
	};


	inline FloatArrayMaterialParameter::FloatArrayMaterialParameter() : BaseMaterialParameter()
	{
		type = FLOAT_ARRAY_TYPE;
		float_number = 0;
		values.reset();
	};

	inline void FloatArrayMaterialParameter::setValues(const unsigned int f_n, const shared_array<float>& val)
	{
		float_number = f_n;
		values = val;
	};

	inline unsigned int FloatArrayMaterialParameter::getFloatNumber() const
	{
		return float_number;
	};

	inline const shared_array<float>& FloatArrayMaterialParameter::getValues() const
	{
		return values;
	};

	inline void FloatArrayMaterialParameter::set(const shared_ptr<gs::Effect>& effect)
	{
		effect->setFloatArray(name, values.get(), float_number);
	};

	inline Vect2MaterialParameter::Vect2MaterialParameter() : BaseMaterialParameter()
	{
		type = VECT2_TYPE;
		value = math::vect2_zero;
	};

	inline void Vect2MaterialParameter::setValue(const math::Vect2& new_value)
	{
		value = new_value;
	};

	inline const math::Vect2& Vect2MaterialParameter::getValue() const
	{
		return value;
	};

	inline void Vect2MaterialParameter::set(const shared_ptr<gs::Effect>& effect)
	{
		effect->setVect2(name, &value);
	};

	inline Vect3MaterialParameter::Vect3MaterialParameter() : BaseMaterialParameter()
	{
		type = VECT3_TYPE;
		value = math::vect3_zero;
	};

	inline void Vect3MaterialParameter::setValue(const math::Vect3& new_value)
	{
		value = new_value;
	};

	inline const math::Vect3& Vect3MaterialParameter::getValue() const
	{
		return value;
	};

	inline void Vect3MaterialParameter::set(const shared_ptr<gs::Effect>& effect)
	{
		effect->setVect3(name, &value);
	};

	inline Vect4MaterialParameter::Vect4MaterialParameter() : BaseMaterialParameter()
	{
		type = VECT4_TYPE;
		value = math::vect4_zero;
	};

	inline void Vect4MaterialParameter::setValue(const math::Vect4& new_value)
	{
		value = new_value;
	};

	inline const math::Vect4& Vect4MaterialParameter::getValue() const
	{
		return value;
	};

	inline void Vect4MaterialParameter::set(const shared_ptr<gs::Effect>& effect)
	{
		effect->setVect4(name, &value);
	};
};