#pragma once #include #include #include #include "DataSpec/DNAMP1/CMDLMaterials.hpp" #include "Runtime/Graphics/CGraphics.hpp" #include #include #include #define URDE_MAX_LIGHTS 8 namespace hecl::Backend { class ShaderTag; } namespace metaforce { class CLight; enum class EExtendedShader : uint8_t { Flat, Lighting, ThermalModel, ThermalModelNoZTestNoZWrite, ThermalStatic, ThermalStaticNoZWrite, ForcedAlpha, ForcedAdditive, SolidColor, SolidColorAdditive, SolidColorFrontfaceCullLEqualAlphaOnly, SolidColorFrontfaceCullAlwaysAlphaOnly, // No Z-write or test SolidColorBackfaceCullLEqualAlphaOnly, SolidColorBackfaceCullGreaterAlphaOnly, // No Z-write MorphBallShadow, WorldShadow, ForcedAlphaNoCull, ForcedAdditiveNoCull, ForcedAlphaNoZWrite, ForcedAdditiveNoZWrite, ForcedAlphaNoCullNoZWrite, ForcedAdditiveNoCullNoZWrite, DepthGEqualNoZWrite, Disintegrate, ForcedAdditiveNoZWriteDepthGreater, ThermalCold, LightingAlphaWrite, LightingAlphaWriteNoZTestNoZWrite, LightingCubeReflection, LightingCubeReflectionWorldShadow, MAX }; class CModelShaders { friend class CModel; public: struct Light { zeus::CVector3f pos; zeus::CVector3f dir; zeus::CColor color = zeus::skClear; std::array linAtt{1.f, 0.f, 0.f}; std::array angAtt{1.f, 0.f, 0.f}; }; struct LightingUniform { std::array lights; zeus::CColor ambient; std::array colorRegs; zeus::CColor mulColor; zeus::CColor addColor; CGraphics::CFogState fog; void ActivateLights(const std::vector& lts); }; struct ThermalUniform { zeus::CColor mulColor; zeus::CColor addColor; }; struct SolidUniform { zeus::CColor solidColor; }; struct MBShadowUniform { zeus::CVector4f shadowUp; float shadowId; }; struct OneTextureUniform { zeus::CColor addColor; CGraphics::CFogState fog; }; static void Initialize(); static void Shutdown(); using ShaderPipelinesData = std::array, size_t(EExtendedShader::MAX)>; using ShaderPipelines = std::shared_ptr; using Material = DataSpec::DNAMP1::HMDLMaterialSet::Material; static ShaderPipelines BuildExtendedShader(const hecl::Backend::ShaderTag& tag, const Material& material); private: static std::unordered_map g_ShaderPipelines; }; } // namespace metaforce