xml::XMLElement* RenderMaterial::loadXMLSettings(xml::XMLElement* elem){

	IResource::loadFromXML(elem);

	xml::XMLElement*e=elem->getSubElement(mT("Technique"));
	while(e)
	{
		core::string name=e->getValueString("Name");
		video::RenderTechnique* t= GetTechniqueByName(name);
		bool loaded=false;
		if(!t)
			t=new RenderTechnique(this);
		else loaded=true;
		t->loadXMLSettings(e);
		if(!loaded)
			AddTechnique(t);
		e=e->nextSiblingElement(mT("Technique"));
	}
	m_activeTechnique=0;
	for(int i=0;i<m_techniques.size();++i)
	{
		if(m_techniques[i]->IsSupported())
		{
			m_activeTechnique=m_techniques[i];
			break;
		}
	}
	return elem;
}
bool RenderMaterial::SetActiveTechniqueByName(const core::string& name)
{
	RenderTechnique* t=GetTechniqueByName(name);
	if(!t)
		return false;
	m_activeTechnique=t;
	return true;
}
bool EffectTechniqueGroup::RemoveTechnique( StringRef name )
{
	EffectTechnique* result=GetTechniqueByName(name);
	if (result!=nullptr)
	{
		mTechniques.Remove(result);
		mTechniqueDict.RemoveKey(name);
		result->SetGroup(nullptr);
		if (result==mCurrentTechnique)
		{
			mCurrentTechnique=nullptr;
		}
		SAFE_DELETE(result);
		return true;
	}
	return false;
}
EffectTechnique* EffectTechniqueGroup::CreateTechnique( StringRef name ,bool setCurrent/*=true*/)
{
	EffectTechnique* result=GetTechniqueByName(name);
	if (result!=nullptr)
	{
		return result;
	}

	result=new EffectTechnique(name);
	mTechniqueDict.Add(name,result);
	mTechniques.Add(result);
	result->SetGroup(this);

	if (setCurrent)
	{
		mCurrentTechnique=result;
	}

	return result;
}
void EffectTechniqueGroup::SetCurrentTechnique( StringRef name )
{
	mCurrentTechnique=GetTechniqueByName(name);
}