From cc0fc53bd3b0a035d2c20a83735a56a2885a5e13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 21 Feb 2022 20:44:54 +0100 Subject: [PATCH] Graphics: Move scissor box from InstancedRenderable to GraphicsComponent --- .../Graphics/Components/GraphicsComponent.hpp | 4 ++++ .../Graphics/Components/GraphicsComponent.inl | 15 +++++++++++++++ include/Nazara/Graphics/FramePipelinePass.hpp | 2 ++ include/Nazara/Graphics/InstancedRenderable.hpp | 5 +---- include/Nazara/Graphics/InstancedRenderable.inl | 15 --------------- include/Nazara/Graphics/Model.hpp | 2 +- include/Nazara/Graphics/SlicedSprite.hpp | 2 +- include/Nazara/Graphics/Sprite.hpp | 2 +- include/Nazara/Graphics/TextSprite.hpp | 2 +- src/Nazara/Graphics/DepthPipelinePass.cpp | 2 +- src/Nazara/Graphics/ForwardPipelinePass.cpp | 2 +- src/Nazara/Graphics/Model.cpp | 4 ++-- src/Nazara/Graphics/SlicedSprite.cpp | 4 ++-- src/Nazara/Graphics/Sprite.cpp | 4 ++-- src/Nazara/Graphics/TextSprite.cpp | 4 ++-- src/Nazara/Widgets/BaseWidget.cpp | 7 ++----- 16 files changed, 38 insertions(+), 38 deletions(-) diff --git a/include/Nazara/Graphics/Components/GraphicsComponent.hpp b/include/Nazara/Graphics/Components/GraphicsComponent.hpp index 8002b7ae9..a9072592b 100644 --- a/include/Nazara/Graphics/Components/GraphicsComponent.hpp +++ b/include/Nazara/Graphics/Components/GraphicsComponent.hpp @@ -33,6 +33,7 @@ namespace Nz inline void DetachRenderable(const std::shared_ptr& renderable); inline const std::vector& GetRenderables() const; + inline const Recti& GetScissorBox() const; inline const WorldInstancePtr& GetWorldInstance() const; inline void Hide(); @@ -41,6 +42,8 @@ namespace Nz inline void Show(bool show = true); + inline void UpdateScissorBox(const Recti& scissorBox); + GraphicsComponent& operator=(const GraphicsComponent&) = default; GraphicsComponent& operator=(GraphicsComponent&&) = default; @@ -56,6 +59,7 @@ namespace Nz private: std::vector m_renderables; + Recti m_scissorBox; WorldInstancePtr m_worldInstance; bool m_isVisible; }; diff --git a/include/Nazara/Graphics/Components/GraphicsComponent.inl b/include/Nazara/Graphics/Components/GraphicsComponent.inl index c862fa49f..e0c1d9a79 100644 --- a/include/Nazara/Graphics/Components/GraphicsComponent.inl +++ b/include/Nazara/Graphics/Components/GraphicsComponent.inl @@ -8,6 +8,7 @@ namespace Nz { inline GraphicsComponent::GraphicsComponent(bool initialyVisible) : + m_scissorBox(-1, -1, -1, -1), m_isVisible(initialyVisible) { m_worldInstance = std::make_shared(); //< FIXME: Use pools @@ -46,6 +47,11 @@ namespace Nz return m_renderables; } + inline const Recti& GraphicsComponent::GetScissorBox() const + { + return m_scissorBox; + } + inline const WorldInstancePtr& GraphicsComponent::GetWorldInstance() const { return m_worldInstance; @@ -69,6 +75,15 @@ namespace Nz m_isVisible = show; } } + + inline void GraphicsComponent::UpdateScissorBox(const Recti& scissorBox) + { + if (m_scissorBox != scissorBox) + { + OnScissorBoxUpdate(this, scissorBox); + m_scissorBox = scissorBox; + } + } } #include diff --git a/include/Nazara/Graphics/FramePipelinePass.hpp b/include/Nazara/Graphics/FramePipelinePass.hpp index 1e5654b84..7d68e14f6 100644 --- a/include/Nazara/Graphics/FramePipelinePass.hpp +++ b/include/Nazara/Graphics/FramePipelinePass.hpp @@ -9,6 +9,7 @@ #include #include +#include namespace Nz { @@ -30,6 +31,7 @@ namespace Nz { const InstancedRenderable* instancedRenderable; const WorldInstance* worldInstance; + Recti scissorBox; }; }; } diff --git a/include/Nazara/Graphics/InstancedRenderable.hpp b/include/Nazara/Graphics/InstancedRenderable.hpp index 46f74c852..5887ce40f 100644 --- a/include/Nazara/Graphics/InstancedRenderable.hpp +++ b/include/Nazara/Graphics/InstancedRenderable.hpp @@ -28,16 +28,14 @@ namespace Nz InstancedRenderable(InstancedRenderable&&) noexcept = default; ~InstancedRenderable(); - virtual void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements) const = 0; + virtual void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements, const Recti& scissorBox) const = 0; inline const Boxf& GetAABB() const; virtual const std::shared_ptr& GetMaterial(std::size_t i) const = 0; virtual std::size_t GetMaterialCount() const = 0; inline int GetRenderLayer() const; - inline const Recti& GetScissorBox() const; inline void UpdateRenderLayer(int renderLayer); - inline void UpdateScissorBox(const Recti& scissorBox); InstancedRenderable& operator=(const InstancedRenderable&) = delete; InstancedRenderable& operator=(InstancedRenderable&&) noexcept = default; @@ -51,7 +49,6 @@ namespace Nz private: Boxf m_aabb; - Recti m_scissorBox; int m_renderLayer; }; } diff --git a/include/Nazara/Graphics/InstancedRenderable.inl b/include/Nazara/Graphics/InstancedRenderable.inl index 224b9e51a..da5423e67 100644 --- a/include/Nazara/Graphics/InstancedRenderable.inl +++ b/include/Nazara/Graphics/InstancedRenderable.inl @@ -9,7 +9,6 @@ namespace Nz { inline InstancedRenderable::InstancedRenderable() : m_aabb(Boxf::Zero()), - m_scissorBox(-1, -1, -1, -1), m_renderLayer(0) { } @@ -24,11 +23,6 @@ namespace Nz return m_renderLayer; } - inline const Recti& InstancedRenderable::GetScissorBox() const - { - return m_scissorBox; - } - inline void InstancedRenderable::UpdateRenderLayer(int renderLayer) { if (m_renderLayer != renderLayer) @@ -38,15 +32,6 @@ namespace Nz } } - inline void InstancedRenderable::UpdateScissorBox(const Recti& scissorBox) - { - if (m_scissorBox != scissorBox) - { - m_scissorBox = scissorBox; - OnElementInvalidated(this); - } - } - inline void InstancedRenderable::UpdateAABB(Boxf aabb) { OnAABBUpdate(this, aabb); diff --git a/include/Nazara/Graphics/Model.hpp b/include/Nazara/Graphics/Model.hpp index 4ecea7b80..b35f6f5c2 100644 --- a/include/Nazara/Graphics/Model.hpp +++ b/include/Nazara/Graphics/Model.hpp @@ -28,7 +28,7 @@ namespace Nz Model(Model&&) noexcept = default; ~Model() = default; - void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements) const override; + void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements, const Recti& scissorBox) const override; const std::shared_ptr& GetIndexBuffer(std::size_t subMeshIndex) const; std::size_t GetIndexCount(std::size_t subMeshIndex) const; diff --git a/include/Nazara/Graphics/SlicedSprite.hpp b/include/Nazara/Graphics/SlicedSprite.hpp index 96b4c5fd7..f39f29683 100644 --- a/include/Nazara/Graphics/SlicedSprite.hpp +++ b/include/Nazara/Graphics/SlicedSprite.hpp @@ -27,7 +27,7 @@ namespace Nz SlicedSprite(SlicedSprite&&) noexcept = default; ~SlicedSprite() = default; - void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements) const override; + void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements, const Recti& scissorBox) const override; inline const Color& GetColor() const; inline const Corner& GetBottomRightCorner() const; diff --git a/include/Nazara/Graphics/Sprite.hpp b/include/Nazara/Graphics/Sprite.hpp index b35da6fcd..f29661d92 100644 --- a/include/Nazara/Graphics/Sprite.hpp +++ b/include/Nazara/Graphics/Sprite.hpp @@ -25,7 +25,7 @@ namespace Nz Sprite(Sprite&&) noexcept = default; ~Sprite() = default; - void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements) const override; + void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements, const Recti& scissorBox) const override; inline const Color& GetColor() const; inline const Color& GetCornerColor(RectCorner corner) const; diff --git a/include/Nazara/Graphics/TextSprite.hpp b/include/Nazara/Graphics/TextSprite.hpp index 430f0d7b9..0781498dc 100644 --- a/include/Nazara/Graphics/TextSprite.hpp +++ b/include/Nazara/Graphics/TextSprite.hpp @@ -28,7 +28,7 @@ namespace Nz TextSprite(TextSprite&&) noexcept = default; ~TextSprite() = default; - void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements) const override; + void BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements, const Recti& scissorBox) const override; inline void Clear(); diff --git a/src/Nazara/Graphics/DepthPipelinePass.cpp b/src/Nazara/Graphics/DepthPipelinePass.cpp index e9256fceb..e127f7b8f 100644 --- a/src/Nazara/Graphics/DepthPipelinePass.cpp +++ b/src/Nazara/Graphics/DepthPipelinePass.cpp @@ -39,7 +39,7 @@ namespace Nz m_renderElements.clear(); for (const auto& renderableData : visibleRenderables) - renderableData.instancedRenderable->BuildElement(m_depthPassIndex, *renderableData.worldInstance, m_renderElements); + renderableData.instancedRenderable->BuildElement(m_depthPassIndex, *renderableData.worldInstance, m_renderElements, renderableData.scissorBox); m_renderQueueRegistry.Clear(); m_renderQueue.Clear(); diff --git a/src/Nazara/Graphics/ForwardPipelinePass.cpp b/src/Nazara/Graphics/ForwardPipelinePass.cpp index f8714accf..3fa5aaf60 100644 --- a/src/Nazara/Graphics/ForwardPipelinePass.cpp +++ b/src/Nazara/Graphics/ForwardPipelinePass.cpp @@ -148,7 +148,7 @@ namespace Nz lightUboView = it->second; std::size_t previousCount = m_renderElements.size(); - renderableData.instancedRenderable->BuildElement(m_forwardPassIndex, *renderableData.worldInstance, m_renderElements); + renderableData.instancedRenderable->BuildElement(m_forwardPassIndex, *renderableData.worldInstance, m_renderElements, renderableData.scissorBox); for (std::size_t i = previousCount; i < m_renderElements.size(); ++i) { const RenderElement* element = m_renderElements[i].get(); diff --git a/src/Nazara/Graphics/Model.cpp b/src/Nazara/Graphics/Model.cpp index fe24f2863..fe2be425c 100644 --- a/src/Nazara/Graphics/Model.cpp +++ b/src/Nazara/Graphics/Model.cpp @@ -32,7 +32,7 @@ namespace Nz UpdateAABB(aabb); } - void Model::BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements) const + void Model::BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements, const Recti& scissorBox) const { for (std::size_t i = 0; i < m_submeshes.size(); ++i) { @@ -46,7 +46,7 @@ namespace Nz const auto& vertexBuffer = m_graphicalMesh->GetVertexBuffer(i); const auto& renderPipeline = materialPass->GetPipeline()->GetRenderPipeline(submeshData.vertexBufferData); - elements.emplace_back(std::make_unique(GetRenderLayer(), materialPass, renderPipeline, worldInstance, m_graphicalMesh->GetIndexCount(i), indexBuffer, vertexBuffer, GetScissorBox())); + elements.emplace_back(std::make_unique(GetRenderLayer(), materialPass, renderPipeline, worldInstance, m_graphicalMesh->GetIndexCount(i), indexBuffer, vertexBuffer, scissorBox)); } } diff --git a/src/Nazara/Graphics/SlicedSprite.cpp b/src/Nazara/Graphics/SlicedSprite.cpp index 5bb84cc6c..67a3e1d02 100644 --- a/src/Nazara/Graphics/SlicedSprite.cpp +++ b/src/Nazara/Graphics/SlicedSprite.cpp @@ -19,7 +19,7 @@ namespace Nz UpdateVertices(); } - void SlicedSprite::BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements) const + void SlicedSprite::BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements, const Recti& scissorBox) const { const auto& materialPass = m_material->GetPass(passIndex); if (!materialPass) @@ -39,7 +39,7 @@ namespace Nz const auto& whiteTexture = Graphics::Instance()->GetDefaultTextures().whiteTextures[UnderlyingCast(ImageType::E2D)]; - elements.emplace_back(std::make_unique(GetRenderLayer(), materialPass, renderPipeline, worldInstance, vertexDeclaration, whiteTexture, m_spriteCount, m_vertices.data(), GetScissorBox())); + elements.emplace_back(std::make_unique(GetRenderLayer(), materialPass, renderPipeline, worldInstance, vertexDeclaration, whiteTexture, m_spriteCount, m_vertices.data(), scissorBox)); } const std::shared_ptr& SlicedSprite::GetMaterial(std::size_t i) const diff --git a/src/Nazara/Graphics/Sprite.cpp b/src/Nazara/Graphics/Sprite.cpp index fb56e3c35..e1572af39 100644 --- a/src/Nazara/Graphics/Sprite.cpp +++ b/src/Nazara/Graphics/Sprite.cpp @@ -23,7 +23,7 @@ namespace Nz UpdateVertices(); } - void Sprite::BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements) const + void Sprite::BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements, const Recti& scissorBox) const { const auto& materialPass = m_material->GetPass(passIndex); if (!materialPass) @@ -43,7 +43,7 @@ namespace Nz const auto& whiteTexture = Graphics::Instance()->GetDefaultTextures().whiteTextures[UnderlyingCast(ImageType::E2D)]; - elements.emplace_back(std::make_unique(GetRenderLayer(), materialPass, renderPipeline, worldInstance, vertexDeclaration, whiteTexture, 1, m_vertices.data(), GetScissorBox())); + elements.emplace_back(std::make_unique(GetRenderLayer(), materialPass, renderPipeline, worldInstance, vertexDeclaration, whiteTexture, 1, m_vertices.data(), scissorBox)); } const std::shared_ptr& Sprite::GetMaterial(std::size_t i) const diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index 163e2044b..89e8cbb28 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -18,7 +18,7 @@ namespace Nz { } - void TextSprite::BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements) const + void TextSprite::BuildElement(std::size_t passIndex, const WorldInstance& worldInstance, std::vector>& elements, const Recti& scissorBox) const { const auto& materialPass = m_material->GetPass(passIndex); if (!materialPass) @@ -42,7 +42,7 @@ namespace Nz RenderIndices& indices = pair.second; if (indices.count > 0) - elements.emplace_back(std::make_unique(GetRenderLayer(), materialPass, renderPipeline, worldInstance, vertexDeclaration, key.texture->shared_from_this(), indices.count, &m_vertices[indices.first * 4], GetScissorBox())); + elements.emplace_back(std::make_unique(GetRenderLayer(), materialPass, renderPipeline, worldInstance, vertexDeclaration, key.texture->shared_from_this(), indices.count, &m_vertices[indices.first * 4], scissorBox)); } } diff --git a/src/Nazara/Widgets/BaseWidget.cpp b/src/Nazara/Widgets/BaseWidget.cpp index 0aceeece4..f7f869f11 100644 --- a/src/Nazara/Widgets/BaseWidget.cpp +++ b/src/Nazara/Widgets/BaseWidget.cpp @@ -271,7 +271,7 @@ namespace Nz { } - bool BaseWidget::OnKeyPressed(const WindowEvent::KeyEvent& key) + bool BaseWidget::OnKeyPressed(const WindowEvent::KeyEvent& /*key*/) { return false; } @@ -390,10 +390,7 @@ namespace Nz for (WidgetEntity& widgetEntity : m_entities) { if (GraphicsComponent* gfx = registry.try_get(widgetEntity.handle)) - { - for (const auto& renderable : gfx->GetRenderables()) - renderable.renderable->UpdateScissorBox(fullBounds); - } + gfx->UpdateScissorBox(fullBounds); } } }