diff --git a/include/Nazara/Graphics/MaterialPipeline.hpp b/include/Nazara/Graphics/MaterialPipeline.hpp index c225c2a08..419385208 100644 --- a/include/Nazara/Graphics/MaterialPipeline.hpp +++ b/include/Nazara/Graphics/MaterialPipeline.hpp @@ -59,7 +59,7 @@ namespace Nz MaterialPipeline& operator=(MaterialPipeline&&) = delete; inline const MaterialPipelineInfo& GetInfo() const; - const std::shared_ptr& GetRenderPipeline(const std::vector& vertexBuffers) const; + const std::shared_ptr& GetRenderPipeline(const RenderPipelineInfo::VertexBufferData* vertexBuffers, std::size_t vertexBufferCount) const; static const std::shared_ptr& Get(const MaterialPipelineInfo& pipelineInfo); diff --git a/src/Nazara/Graphics/LinearSlicedSprite.cpp b/src/Nazara/Graphics/LinearSlicedSprite.cpp index d3977e1c9..65ffb7cf9 100644 --- a/src/Nazara/Graphics/LinearSlicedSprite.cpp +++ b/src/Nazara/Graphics/LinearSlicedSprite.cpp @@ -31,15 +31,11 @@ namespace Nz const std::shared_ptr& vertexDeclaration = VertexDeclaration::Get(VertexLayout::XYZ_Color_UV); - std::vector vertexBufferData = { - { - { - 0, - vertexDeclaration - } - } + RenderPipelineInfo::VertexBufferData vertexBufferData = { + 0, + vertexDeclaration }; - const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(vertexBufferData); + const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(&vertexBufferData, 1); const auto& whiteTexture = Graphics::Instance()->GetDefaultTextures().whiteTextures[UnderlyingCast(ImageType::E2D)]; diff --git a/src/Nazara/Graphics/MaterialPipeline.cpp b/src/Nazara/Graphics/MaterialPipeline.cpp index 9705c9189..b5e04bb3a 100644 --- a/src/Nazara/Graphics/MaterialPipeline.cpp +++ b/src/Nazara/Graphics/MaterialPipeline.cpp @@ -30,13 +30,15 @@ namespace Nz * * \return Pipeline instance */ - const std::shared_ptr& MaterialPipeline::GetRenderPipeline(const std::vector& vertexBuffers) const + const std::shared_ptr& MaterialPipeline::GetRenderPipeline(const RenderPipelineInfo::VertexBufferData* vertexBuffers, std::size_t vertexBufferCount) const { for (const auto& pipeline : m_renderPipelines) { const auto& pipelineInfo = pipeline->GetPipelineInfo(); + if (pipelineInfo.vertexBuffers.size() != vertexBufferCount) + continue; - bool isEqual = std::equal(pipelineInfo.vertexBuffers.begin(), pipelineInfo.vertexBuffers.end(), vertexBuffers.begin(), [](const auto& v1, const auto& v2) + bool isEqual = std::equal(pipelineInfo.vertexBuffers.begin(), pipelineInfo.vertexBuffers.end(), vertexBuffers, [](const auto& v1, const auto& v2) { return v1.binding == v2.binding && v1.declaration == v2.declaration; }); @@ -58,19 +60,19 @@ namespace Nz optionValues[option.hash] = option.value; } + renderPipelineInfo.vertexBuffers.assign(vertexBuffers, vertexBuffers + vertexBufferCount); + for (const auto& shader : m_pipelineInfo.shaders) { if (shader.uberShader) { UberShader::Config config{ optionValues }; - shader.uberShader->UpdateConfig(config, vertexBuffers); + shader.uberShader->UpdateConfig(config, renderPipelineInfo.vertexBuffers); renderPipelineInfo.shaderModules.push_back(shader.uberShader->Get(config)); } } - renderPipelineInfo.vertexBuffers = vertexBuffers; - return m_renderPipelines.emplace_back(Graphics::Instance()->GetRenderDevice()->InstantiateRenderPipeline(std::move(renderPipelineInfo))); } diff --git a/src/Nazara/Graphics/Model.cpp b/src/Nazara/Graphics/Model.cpp index 721367a2a..37da9f024 100644 --- a/src/Nazara/Graphics/Model.cpp +++ b/src/Nazara/Graphics/Model.cpp @@ -50,7 +50,7 @@ namespace Nz const auto& indexBuffer = m_graphicalMesh->GetIndexBuffer(i); const auto& vertexBuffer = m_graphicalMesh->GetVertexBuffer(i); - const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(submeshData.vertexBufferData); + const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(submeshData.vertexBufferData.data(), submeshData.vertexBufferData.size()); std::size_t indexCount = m_graphicalMesh->GetIndexCount(i); IndexType indexType = m_graphicalMesh->GetIndexType(i); diff --git a/src/Nazara/Graphics/SlicedSprite.cpp b/src/Nazara/Graphics/SlicedSprite.cpp index dbffe6c94..7bada148c 100644 --- a/src/Nazara/Graphics/SlicedSprite.cpp +++ b/src/Nazara/Graphics/SlicedSprite.cpp @@ -28,15 +28,11 @@ namespace Nz const std::shared_ptr& vertexDeclaration = VertexDeclaration::Get(VertexLayout::XYZ_Color_UV); - std::vector vertexBufferData = { - { - { - 0, - vertexDeclaration - } - } + RenderPipelineInfo::VertexBufferData vertexBufferData = { + 0, + vertexDeclaration }; - const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(vertexBufferData); + const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(&vertexBufferData, 1); const auto& whiteTexture = Graphics::Instance()->GetDefaultTextures().whiteTextures[UnderlyingCast(ImageType::E2D)]; diff --git a/src/Nazara/Graphics/Sprite.cpp b/src/Nazara/Graphics/Sprite.cpp index 5e1f2ef8b..f974087a4 100644 --- a/src/Nazara/Graphics/Sprite.cpp +++ b/src/Nazara/Graphics/Sprite.cpp @@ -32,15 +32,11 @@ namespace Nz const std::shared_ptr& vertexDeclaration = VertexDeclaration::Get(VertexLayout::XYZ_Color_UV); - std::vector vertexBufferData = { - { - { - 0, - vertexDeclaration - } - } + RenderPipelineInfo::VertexBufferData vertexBufferData = { + 0, + vertexDeclaration }; - const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(vertexBufferData); + const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(&vertexBufferData, 1); const auto& whiteTexture = Graphics::Instance()->GetDefaultTextures().whiteTextures[UnderlyingCast(ImageType::E2D)]; diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index cb28c1442..b16ae46b0 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -27,15 +27,11 @@ namespace Nz const std::shared_ptr& vertexDeclaration = VertexDeclaration::Get(VertexLayout::XYZ_Color_UV); - std::vector vertexBufferData = { - { - { - 0, - vertexDeclaration - } - } + RenderPipelineInfo::VertexBufferData vertexBufferData = { + 0, + vertexDeclaration }; - const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(vertexBufferData); + const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(&vertexBufferData, 1); for (auto& pair : m_renderInfos) {