diff --git a/include/Nazara/Graphics/MaterialPipeline.hpp b/include/Nazara/Graphics/MaterialPipeline.hpp index d6674d237..fe1e395c5 100644 --- a/include/Nazara/Graphics/MaterialPipeline.hpp +++ b/include/Nazara/Graphics/MaterialPipeline.hpp @@ -22,12 +22,19 @@ namespace Nz struct MaterialPipelineInfo : RenderStates { + struct Option + { + UInt32 hash; + ShaderAst::ConstantValue value; + }; + struct Shader { - std::array optionValues; std::shared_ptr uberShader; }; + std::array optionValues; + std::size_t optionCount = 0; std::vector shaders; std::shared_ptr settings; }; diff --git a/include/Nazara/Graphics/MaterialPipeline.inl b/include/Nazara/Graphics/MaterialPipeline.inl index 3b7289164..35f6176c2 100644 --- a/include/Nazara/Graphics/MaterialPipeline.inl +++ b/include/Nazara/Graphics/MaterialPipeline.inl @@ -32,13 +32,20 @@ namespace Nz #define NazaraPipelineMember(field) if (lhs.field != rhs.field) return false NazaraPipelineMember(settings); + NazaraPipelineMember(optionCount); for (std::size_t i = 0; i < lhs.shaders.size(); ++i) { - if (lhs.shaders[i].optionValues != rhs.shaders[i].optionValues) + if (lhs.shaders[i].uberShader != rhs.shaders[i].uberShader) + return false; + } + + for (std::size_t i = 0; i < lhs.optionCount; ++i) + { + if (lhs.optionValues[i].hash != rhs.optionValues[i].hash) return false; - if (lhs.shaders[i].uberShader != rhs.shaders[i].uberShader) + if (lhs.optionValues[i].value != rhs.optionValues[i].value) return false; } @@ -72,14 +79,15 @@ namespace std NazaraPipelineMember(settings.get()); //< Hash pointer - for (const auto& shader : pipelineInfo.shaders) + for (std::size_t i = 0; i < pipelineInfo.optionCount; ++i) { - for (const auto& value : shader.optionValues) - Nz::HashCombine(seed, value); - - Nz::HashCombine(seed, shader.uberShader.get()); + Nz::HashCombine(seed, pipelineInfo.optionValues[i].hash); + Nz::HashCombine(seed, pipelineInfo.optionValues[i].value); } + for (const auto& shader : pipelineInfo.shaders) + Nz::HashCombine(seed, shader.uberShader.get()); + NazaraUnused(parameterIndex); #undef NazaraPipelineMember diff --git a/include/Nazara/Graphics/MaterialSettings.hpp b/include/Nazara/Graphics/MaterialSettings.hpp index 33d9cb207..5b5f434cb 100644 --- a/include/Nazara/Graphics/MaterialSettings.hpp +++ b/include/Nazara/Graphics/MaterialSettings.hpp @@ -57,7 +57,7 @@ namespace Nz static constexpr std::size_t InvalidIndex = std::numeric_limits::max(); - static inline void BuildOption(std::vector