Graphics/InstancedRenderable: Add signal to tell some renderables need to be rebuild
This commit is contained in:
parent
d040cc6767
commit
8f1cc79dc2
|
|
@ -68,6 +68,7 @@ namespace Nz
|
||||||
{
|
{
|
||||||
UInt32 renderMask = 0;
|
UInt32 renderMask = 0;
|
||||||
|
|
||||||
|
NazaraSlot(InstancedRenderable, OnElementInvalidated, onElementInvalidated);
|
||||||
NazaraSlot(InstancedRenderable, OnMaterialInvalidated, onMaterialInvalidated);
|
NazaraSlot(InstancedRenderable, OnMaterialInvalidated, onMaterialInvalidated);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,7 @@ namespace Nz
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateAABB(bounds);
|
UpdateAABB(bounds);
|
||||||
|
OnElementInvalidated(this);
|
||||||
|
|
||||||
clearOnFail.Reset();
|
clearOnFail.Reset();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue