#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(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& commands = argCurrentBuffer.get_BufferedCommands(); for (uint32 i = argCurrentPositon + 1; i < commands.size(); ++i) { IShader* shader = dynamic_cast(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); }