163 lines
5.6 KiB
C++
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);
|
|
}
|