port from perforce
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user