#include "stdafx.h" #include "IShader.h" #include "BasisParameterCollection.h" BasisShaderParameterCollection::BasisShaderParameterCollection() { } BasisShaderParameterCollection::~BasisShaderParameterCollection() { this->RemoveAllShaderParameters(); } void BasisShaderParameterCollection::UseParametersOnShader(IShader& argShader) { if (m_ParameterMap.empty()) return; tk_ShaderToShaderParameter::iterator shaderPos = m_ShaderToParameterMap.find(argShader.get_InternalShader()); if (shaderPos == m_ShaderToParameterMap.end()) { tk_ShaderParameterPairs newSet; // (re)create shader entries tk_StringToShaderParameter::iterator iter = m_ParameterMap.begin(); for (; iter != m_ParameterMap.end(); ++iter) { if (iter->second != NULL) { ID3D10EffectVariable* var = NULL; if (iter->second->get_ParameterNameType() == ParameterBindType::BindByVariable) var = argShader.get_InternalShader()->get_DX10Effect()->GetVariableByName(iter->first.c_str()); else if (iter->second->get_ParameterNameType() == ParameterBindType::BindBySemantic) var = argShader.get_InternalShader()->get_DX10Effect()->GetVariableBySemantic(iter->first.c_str()); if (var != NULL) newSet.push_back(ShaderParameterPair(*iter->second, var)); } } if (newSet.empty()) return; m_ShaderToParameterMap[argShader.get_InternalShader()] = newSet; } tk_ShaderParameterPairs& set = m_ShaderToParameterMap[argShader.get_InternalShader()]; for (uint32 i = 0; i < set.size(); ++i) set[i].Parameter->ApplyValue(*set[i].TargetVariable); } void BasisShaderParameterCollection::SetShaderParameter(const string8& argParameterName, IShaderParameter& argParameter) { this->RemoveShaderParameter(argParameterName); m_ParameterMap[argParameterName] = &argParameter; } void BasisShaderParameterCollection::RemoveShaderParameter(const string8& argParameterName) { m_ShaderToParameterMap.clear(); tk_StringToShaderParameter::iterator found = m_ParameterMap.find(argParameterName); if (found != m_ParameterMap.end()) m_ParameterMap.erase(found); } void BasisShaderParameterCollection::RemoveAllShaderParameters() { while (!m_ParameterMap.empty()) { delete m_ParameterMap.begin()->second; m_ParameterMap.erase(m_ParameterMap.begin()); } }