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

#include <Darkstar/Resource System/Material/material.hpp>
#include <Darkstar/Graphic System/Direct3D/graphicDriver.hpp>
#include <Darkstar/Kernel/logh.hpp>

using rs::Material;
using rs::MATERIAL_PARAMETER_TYPE;
using rs::BaseTexture;
using math::Vect3;
using gs::Effect;
using gs::GraphicDriver;
using gs::BlendRenderState;
using gs::CullModeRenderState;
using ker::Log;

Material::Material()
{
	blend_state.reset(new BlendRenderState);
	cull_mode.reset(new CullModeRenderState);

	effect.reset();
	technique_name = "";
};

Material::~Material()
{

};

void Material::set()
{
	if(!effect)
	{
		lwar << "Effect in material is not correct";
		return;
	};
	blend_state->set();
	cull_mode->set();
	std::map<std::string, shared_ptr<BaseMaterialParameter> >::iterator it;
	if(technique_name != "")
		effect->setCurTechnique(technique_name);
	std::map<std::string, unsigned int>::iterator flags_it;
	for(flags_it = flags.begin(); flags_it != flags.end(); ++flags_it)
		effect->setMacro(flags_it->first, flags_it->second);
	for(it = params.begin(); it != params.end(); ++it)
		it->second->set(effect);
	effect->setSamplers();
};