Files
bluflame/aiwaz/Aiwaz/Resources/ShaderParameterCollection/BasisParameterCollection.cpp
2026-04-18 22:31:51 +02:00

80 lines
2.2 KiB
C++

#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());
}
}