Graphics/InstancedRenderable: Add signal to tell some renderables need to be rebuild

This commit is contained in:
Jérôme Leclercq 2021-11-21 19:06:10 +01:00
parent d040cc6767
commit 8f1cc79dc2
6 changed files with 19 additions and 2 deletions

View File

@ -68,6 +68,7 @@ namespace Nz
{ {
UInt32 renderMask = 0; UInt32 renderMask = 0;
NazaraSlot(InstancedRenderable, OnElementInvalidated, onElementInvalidated);
NazaraSlot(InstancedRenderable, OnMaterialInvalidated, onMaterialInvalidated); NazaraSlot(InstancedRenderable, OnMaterialInvalidated, onMaterialInvalidated);
}; };

View File

@ -38,6 +38,7 @@ namespace Nz
InstancedRenderable& operator=(InstancedRenderable&&) noexcept = default; InstancedRenderable& operator=(InstancedRenderable&&) noexcept = default;
NazaraSignal(OnAABBUpdate, InstancedRenderable* /*instancedRenderable*/, const Boxf& /*aabb*/); NazaraSignal(OnAABBUpdate, InstancedRenderable* /*instancedRenderable*/, const Boxf& /*aabb*/);
NazaraSignal(OnElementInvalidated, InstancedRenderable* /*instancedRenderable*/);
NazaraSignal(OnMaterialInvalidated, InstancedRenderable* /*instancedRenderable*/, std::size_t /*materialIndex*/, const std::shared_ptr<Material>& /*newMaterial*/); NazaraSignal(OnMaterialInvalidated, InstancedRenderable* /*instancedRenderable*/, std::size_t /*materialIndex*/, const std::shared_ptr<Material>& /*newMaterial*/);
protected: protected:

View File

@ -56,19 +56,20 @@ namespace Nz
vertices++; vertices++;
vertices->color = m_color * m_cornerColor[UnderlyingCast(RectCorner::LeftBottom)]; 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); vertices->uv = m_textureCoords.GetCorner(RectCorner::LeftBottom);
aabb.ExtendTo(vertices->position); aabb.ExtendTo(vertices->position);
vertices++; vertices++;
vertices->color = m_color * m_cornerColor[UnderlyingCast(RectCorner::RightBottom)]; 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); vertices->uv = m_textureCoords.GetCorner(RectCorner::RightBottom);
aabb.ExtendTo(vertices->position); aabb.ExtendTo(vertices->position);
UpdateAABB(aabb); UpdateAABB(aabb);
OnElementInvalidated(this);
} }
} }

View File

@ -12,6 +12,7 @@ namespace Nz
{ {
m_atlases.clear(); m_atlases.clear();
m_vertices.clear(); m_vertices.clear();
OnElementInvalidated(this);
} }
inline void TextSprite::SetMaterial(std::shared_ptr<Material> material) inline void TextSprite::SetMaterial(std::shared_ptr<Material> material)

View File

@ -59,6 +59,17 @@ namespace Nz
auto& renderableData = renderableMap.emplace(instancedRenderable, RenderableData{}).first->second; auto& renderableData = renderableMap.emplace(instancedRenderable, RenderableData{}).first->second;
renderableData.renderMask = renderMask; 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<Material>& newMaterial) renderableData.onMaterialInvalidated.Connect(instancedRenderable->OnMaterialInvalidated, [this](InstancedRenderable* instancedRenderable, std::size_t materialIndex, const std::shared_ptr<Material>& newMaterial)
{ {
if (newMaterial) if (newMaterial)
@ -80,6 +91,7 @@ namespace Nz
UnregisterMaterialPass(pass.get()); UnregisterMaterialPass(pass.get());
} }
// TODO: Invalidate only relevant viewers
for (auto&& [viewer, viewerData] : m_viewers) for (auto&& [viewer, viewerData] : m_viewers)
{ {
viewerData.rebuildDepthPrepass = true; viewerData.rebuildDepthPrepass = true;

View File

@ -209,6 +209,7 @@ namespace Nz
} }
UpdateAABB(bounds); UpdateAABB(bounds);
OnElementInvalidated(this);
clearOnFail.Reset(); clearOnFail.Reset();
} }