#pragma once #include "hecl/PipelineBase.hpp" #include "hecl/hecl.hpp" #include "DataSpec/DNAMP1/CMDLMaterials.hpp" struct SModelShadersInfo { uint64_t m_hash; using Material = DataSpec::DNAMP1::HMDLMaterialSet::Material; const Material& m_material; const hecl::Backend::ShaderTag& m_tag; const hecl::Backend::ExtensionSlot& m_extension; std::vector m_vtxFmtData; boo::VertexFormatInfo m_vtxFmt; boo::AdditionalPipelineInfo m_additionalInfo; explicit SModelShadersInfo(const Material& material, const hecl::Backend::ShaderTag& tag, const hecl::Backend::ExtensionSlot& extension) : m_material(material), m_tag(tag), m_extension(extension) { m_hash = m_tag.val64(); hecl::hash_combine_impl(m_hash, std::hash()(m_extension.hash())); m_vtxFmtData = tag.vertexFormat(); m_vtxFmt = boo::VertexFormatInfo(m_vtxFmtData.size(), m_vtxFmtData.data()); m_additionalInfo = m_tag.additionalInfo(extension, material.blendFactors()); } static constexpr bool HasHash = true; uint64_t Hash() const { return m_hash; } }; class Shader_CModelShaders : public hecl::GeneralShader { const SModelShadersInfo& m_info; uint64_t m_vertHash, m_fragHash; static uint64_t BuildVertHash(const SModelShadersInfo& in); static uint64_t BuildFragHash(const SModelShadersInfo& in); public: Shader_CModelShaders(const SModelShadersInfo& in) : m_info(in) , m_vertHash(BuildVertHash(in)) , m_fragHash(BuildFragHash(in)) , VtxFmt(in.m_vtxFmt) , PipelineInfo(in.m_additionalInfo) {} const boo::VertexFormatInfo VtxFmt; const boo::AdditionalPipelineInfo PipelineInfo; static constexpr bool HasHash = true; uint64_t Hash() const { return m_info.m_hash; } static constexpr bool HasStageHash = true; template uint64_t StageHash() const; const SModelShadersInfo& info() const { return m_info; } }; template <> inline uint64_t Shader_CModelShaders::StageHash() const { return m_vertHash; } template <> inline uint64_t Shader_CModelShaders::StageHash() const { return m_fragHash; } template class StageObject_CModelShaders : public hecl::StageBinary { static std::string BuildShader(const SModelShadersInfo& in); public: StageObject_CModelShaders(hecl::StageConverter& conv, hecl::FactoryCtx& ctx, const Shader_CModelShaders& in) : hecl::StageBinary(conv, ctx, hecl::StageSourceText(BuildShader(in.info()))) {} }; #define UNIVERSAL_PIPELINES_shader_CModelShaders ::Shader_CModelShaders #define STAGES_shader_CModelShaders(P, S) ::StageObject_CModelShaders,