#include "CParticleSwooshShaders.hpp" #include "Particle/CParticleSwoosh.hpp" #include "Particle/CSwooshDescription.hpp" #include "hecl/Pipeline.hpp" namespace urde { std::array, 2> CParticleSwooshShaders::m_texZWrite; std::array, 2> CParticleSwooshShaders::m_texNoZWrite; std::array, 2> CParticleSwooshShaders::m_texAdditiveZWrite; std::array, 2> CParticleSwooshShaders::m_texAdditiveNoZWrite; std::array, 2> CParticleSwooshShaders::m_noTexZWrite; std::array, 2> CParticleSwooshShaders::m_noTexNoZWrite; std::array, 2> CParticleSwooshShaders::m_noTexAdditiveZWrite; std::array, 2> CParticleSwooshShaders::m_noTexAdditiveNoZWrite; static boo::ObjToken s_Pipeline; void CParticleSwooshShaders::Initialize() { m_texZWrite = {hecl::conv->convert(Shader_CParticleSwooshShaderTexZWrite{}), hecl::conv->convert(Shader_CParticleSwooshShaderTexZWriteAWrite{})}; m_texNoZWrite = {hecl::conv->convert(Shader_CParticleSwooshShaderTexNoZWrite{}), hecl::conv->convert(Shader_CParticleSwooshShaderTexNoZWriteAWrite{})}; m_texAdditiveZWrite = {hecl::conv->convert(Shader_CParticleSwooshShaderTexAdditiveZWrite{}), hecl::conv->convert(Shader_CParticleSwooshShaderTexAdditiveZWriteAWrite{})}; m_texAdditiveNoZWrite = {hecl::conv->convert(Shader_CParticleSwooshShaderTexAdditiveNoZWrite{}), hecl::conv->convert(Shader_CParticleSwooshShaderTexAdditiveNoZWriteAWrite{})}; m_noTexZWrite = {hecl::conv->convert(Shader_CParticleSwooshShaderNoTexZWrite{}), hecl::conv->convert(Shader_CParticleSwooshShaderNoTexZWriteAWrite{})}; m_noTexNoZWrite = {hecl::conv->convert(Shader_CParticleSwooshShaderNoTexNoZWrite{}), hecl::conv->convert(Shader_CParticleSwooshShaderNoTexNoZWriteAWrite{})}; m_noTexAdditiveZWrite = {hecl::conv->convert(Shader_CParticleSwooshShaderNoTexAdditiveZWrite{}), hecl::conv->convert(Shader_CParticleSwooshShaderNoTexAdditiveZWriteAWrite{})}; m_noTexAdditiveNoZWrite = {hecl::conv->convert(Shader_CParticleSwooshShaderNoTexAdditiveNoZWrite{}), hecl::conv->convert(Shader_CParticleSwooshShaderNoTexAdditiveNoZWriteAWrite{})}; } void CParticleSwooshShaders::Shutdown() { for (auto& s : m_texZWrite) s.reset(); for (auto& s : m_texNoZWrite) s.reset(); for (auto& s : m_texAdditiveZWrite) s.reset(); for (auto& s : m_texAdditiveNoZWrite) s.reset(); for (auto& s : m_noTexZWrite) s.reset(); for (auto& s : m_noTexNoZWrite) s.reset(); for (auto& s : m_noTexAdditiveZWrite) s.reset(); for (auto& s : m_noTexAdditiveNoZWrite) s.reset(); } CParticleSwooshShaders::EShaderClass CParticleSwooshShaders::GetShaderClass(CParticleSwoosh& gen) { CSwooshDescription* desc = gen.GetDesc(); if (desc->x3c_TEXR) return EShaderClass::Tex; else return EShaderClass::NoTex; } void CParticleSwooshShaders::BuildShaderDataBinding(boo::IGraphicsDataFactory::Context& ctx, CParticleSwoosh& gen) { CSwooshDescription* desc = gen.GetDesc(); std::array, 2>* pipeline = nullptr; if (desc->x3c_TEXR) { if (desc->x44_31_AALP) { if (desc->x45_24_ZBUF) pipeline = &m_texAdditiveZWrite; else pipeline = &m_texAdditiveNoZWrite; } else { if (desc->x45_24_ZBUF) pipeline = &m_texZWrite; else pipeline = &m_texNoZWrite; } } else { if (desc->x44_31_AALP) { if (desc->x45_24_ZBUF) pipeline = &m_noTexAdditiveZWrite; else pipeline = &m_noTexAdditiveNoZWrite; } else { if (desc->x45_24_ZBUF) pipeline = &m_noTexZWrite; else pipeline = &m_noTexNoZWrite; } } CUVElement* texr = desc->x3c_TEXR.get(); boo::ObjToken textures[] = {texr ? texr->GetValueTexture(0).GetObj()->GetBooTexture() : nullptr}; boo::ObjToken uniforms[] = {gen.m_uniformBuf.get()}; for (int i = 0; i < 2; ++i) gen.m_dataBind[i] = ctx.newShaderDataBinding((*pipeline)[i], gen.m_vertBuf.get(), nullptr, nullptr, 1, uniforms, nullptr, texr ? 1 : 0, textures, nullptr, nullptr); } } // namespace urde