diff --git a/include/Nazara/Graphics/ForwardFramePipeline.hpp b/include/Nazara/Graphics/ForwardFramePipeline.hpp index 8f2639483..cfa628df6 100644 --- a/include/Nazara/Graphics/ForwardFramePipeline.hpp +++ b/include/Nazara/Graphics/ForwardFramePipeline.hpp @@ -68,6 +68,7 @@ namespace Nz { UInt32 renderMask = 0; + NazaraSlot(InstancedRenderable, OnElementInvalidated, onElementInvalidated); NazaraSlot(InstancedRenderable, OnMaterialInvalidated, onMaterialInvalidated); }; diff --git a/include/Nazara/Graphics/InstancedRenderable.hpp b/include/Nazara/Graphics/InstancedRenderable.hpp index 72c7a4022..ab9ff80d1 100644 --- a/include/Nazara/Graphics/InstancedRenderable.hpp +++ b/include/Nazara/Graphics/InstancedRenderable.hpp @@ -38,6 +38,7 @@ namespace Nz InstancedRenderable& operator=(InstancedRenderable&&) noexcept = default; NazaraSignal(OnAABBUpdate, InstancedRenderable* /*instancedRenderable*/, const Boxf& /*aabb*/); + NazaraSignal(OnElementInvalidated, InstancedRenderable* /*instancedRenderable*/); NazaraSignal(OnMaterialInvalidated, InstancedRenderable* /*instancedRenderable*/, std::size_t /*materialIndex*/, const std::shared_ptr& /*newMaterial*/); protected: diff --git a/include/Nazara/Graphics/Sprite.inl b/include/Nazara/Graphics/Sprite.inl index bfda4f66b..4300067d3 100644 --- a/include/Nazara/Graphics/Sprite.inl +++ b/include/Nazara/Graphics/Sprite.inl @@ -56,19 +56,20 @@ namespace Nz vertices++; vertices->color = m_color * m_cornerColor[UnderlyingCast(RectCorner::LeftBottom)]; - vertices->position = m_size.y * Vector3f::Down() - origin; + vertices->position = m_size.y * Vector3f::Up() - origin; vertices->uv = m_textureCoords.GetCorner(RectCorner::LeftBottom); aabb.ExtendTo(vertices->position); vertices++; vertices->color = m_color * m_cornerColor[UnderlyingCast(RectCorner::RightBottom)]; - vertices->position = m_size.x * Vector3f::Right() + m_size.y * Vector3f::Down() - origin; + vertices->position = m_size.x * Vector3f::Right() + m_size.y * Vector3f::Up() - origin; vertices->uv = m_textureCoords.GetCorner(RectCorner::RightBottom); aabb.ExtendTo(vertices->position); UpdateAABB(aabb); + OnElementInvalidated(this); } } diff --git a/include/Nazara/Graphics/TextSprite.inl b/include/Nazara/Graphics/TextSprite.inl index cc10b8583..d9224b200 100644 --- a/include/Nazara/Graphics/TextSprite.inl +++ b/include/Nazara/Graphics/TextSprite.inl @@ -12,6 +12,7 @@ namespace Nz { m_atlases.clear(); m_vertices.clear(); + OnElementInvalidated(this); } inline void TextSprite::SetMaterial(std::shared_ptr material) diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index 9721fba36..7f8fc5ddc 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -59,6 +59,17 @@ namespace Nz auto& renderableData = renderableMap.emplace(instancedRenderable, RenderableData{}).first->second; renderableData.renderMask = renderMask; + renderableData.onElementInvalidated.Connect(instancedRenderable->OnElementInvalidated, [this](InstancedRenderable* instancedRenderable) + { + // TODO: Invalidate only relevant viewers + for (auto&& [viewer, viewerData] : m_viewers) + { + viewerData.rebuildDepthPrepass = true; + viewerData.rebuildForwardPass = true; + viewerData.prepare = true; + } + }); + renderableData.onMaterialInvalidated.Connect(instancedRenderable->OnMaterialInvalidated, [this](InstancedRenderable* instancedRenderable, std::size_t materialIndex, const std::shared_ptr& newMaterial) { if (newMaterial) @@ -80,6 +91,7 @@ namespace Nz UnregisterMaterialPass(pass.get()); } + // TODO: Invalidate only relevant viewers for (auto&& [viewer, viewerData] : m_viewers) { viewerData.rebuildDepthPrepass = true; diff --git a/src/Nazara/Graphics/TextSprite.cpp b/src/Nazara/Graphics/TextSprite.cpp index b40194437..952aeaa2f 100644 --- a/src/Nazara/Graphics/TextSprite.cpp +++ b/src/Nazara/Graphics/TextSprite.cpp @@ -209,6 +209,7 @@ namespace Nz } UpdateAABB(bounds); + OnElementInvalidated(this); clearOnFail.Reset(); }