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

163 lines
5.6 KiB
C++

#include "stdafx.h"
#include "ShaderParameterCollection.h"
#include "IEngine.h"
#include "IResourceFactory.h"
#include "Types/Types.h"
ShaderParameterCollection::ShaderParameterCollection(IEngine& argEngine, unsigned char argBasePriority)
: m_Engine(argEngine)
, m_BasePriority(argBasePriority)
{
this->set_IsPreconditionForFollowingShaders(false);
}
ShaderParameterCollection::~ShaderParameterCollection()
{
this->Uninitialize();
m_Engine.get_ResourceFactory().DeleteShaderParameterCollection(*const_cast<ShaderParameterCollection*>(this), true);
}
void ShaderParameterCollection::Uninitialize()
{
m_BasisShaderParameterCollection.RemoveAllShaderParameters();
}
bool ShaderParameterCollection::get_IsPreconditionForFollowingShaders() const
{
return m_IsPreconditionForFollowingShaders;
}
void ShaderParameterCollection::set_IsPreconditionForFollowingShaders(bool argValue)
{
if (!m_Commands.empty() && argValue == m_IsPreconditionForFollowingShaders)
return;
m_IsPreconditionForFollowingShaders = argValue;
while (!m_Commands.empty())
{
delete m_Commands[0];
m_Commands.erase(m_Commands.begin());
}
if (m_IsPreconditionForFollowingShaders)
m_Commands.push_back(new Command(this, CommandFlags::EndChain | CommandFlags::FlushChain, SetFollowingShaderParameterCollectionCommandType, 0));
else
m_Commands.push_back(new Command(this, CommandFlags::None, SetShaderParameterCollectionCommandType, m_BasePriority));
this->MarkCommandsAsDirty();
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, IShaderParameter* ar_Parameter_)
{
m_BasisShaderParameterCollection.SetShaderParameter(argParameterName, *ar_Parameter_);
//this->MarkCommandsAsDirty();
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, ITexture& argParameter, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new TextureShaderParameter(argParameter, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, float* af_Parameter_, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new FloatShaderParameter(af_Parameter_, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, float argParameter, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new FloatShaderParameter(argParameter, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, D3DXVECTOR4* ar_Parameter_, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new Float4ShaderParameter(ar_Parameter_, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, const D3DXVECTOR4& argParameter, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new Float4ShaderParameter(argParameter, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, D3DXVECTOR3* ar_Parameter_, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new Float3ShaderParameter(ar_Parameter_, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, const D3DXVECTOR3& argParameter, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new Float3ShaderParameter(argParameter, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, D3DXMATRIX* argParameter, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new Matrix4x4ShaderParameter(argParameter, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, const D3DXMATRIX& argParameter, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new Matrix4x4ShaderParameter(argParameter, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, bool* ab_Parameter_, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new BoolShaderParameter(ab_Parameter_, argParamNameType));
}
void ShaderParameterCollection::SetParameter(const string8& argParameterName, bool argParameter, ParameterBindType::Enumeration argParamNameType)
{
this->SetParameter(argParameterName, new BoolShaderParameter(argParameter, argParamNameType));
}
void ShaderParameterCollection::RemoveParameter(const string8& argParameterName)
{
m_BasisShaderParameterCollection.RemoveShaderParameter(argParameterName);
}
CommandExecuteResult::Enumeration ShaderParameterCollection::ExecuteCommand(unsigned char argCommandType, ICommandBuffer& argCurrentBuffer, uint32 argCurrentPositon)
{
if (argCommandType == SetShaderParameterCollectionCommandType)
{
if (m_Engine.get_EngineStates().LastShader == NULL)
std::wcout << std::red << "ShaderParameterCollection could not been used without a valid shader." << std::white << std::endl;
this->UseOnShader(*m_Engine.get_EngineStates().LastShader);
}
else if (argCommandType == SetFollowingShaderParameterCollectionCommandType)
{
const std::vector<Command*>& commands = argCurrentBuffer.get_BufferedCommands();
for (uint32 i = argCurrentPositon + 1; i < commands.size(); ++i)
{
IShader* shader = dynamic_cast<IShader*>(commands[i]->Owner);
if (shader != NULL && commands[i]->Type == 0)
this->UseOnShader(*shader);
}
}
return CommandExecuteResult::None;
}
void ShaderParameterCollection::UseOnShader(IShader& argShader)
{
m_BasisShaderParameterCollection.UseParametersOnShader(argShader);
}