From 039447c1279550889e2b8fd6c381eb052cd19f95 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 11 Aug 2016 01:07:46 +0200 Subject: [PATCH] SDK/GraphicsComponent: Makes component watch over renderable destruction Allows to use persistent (not using the internal counter) InstancedRenderable Former-commit-id: c0963eb7902dedad3c5eb139ac23a25a57a15487 [formerly 0ec3ca3b783c1c9fac45ff0c015bbc254ce4b375] [formerly f86b41d43bf8f77c2b0e8a91b0e4cd0cdc1a9a54 [formerly 2d454f93ced586e04f7d040bda2986fe631d64e4]] Former-commit-id: 58c52cff93c0461f31b65346a4af90b135a7fed3 [formerly 5e20488509bc66e245fa85c478b32e6251bf3a0f] Former-commit-id: 84fe715cc064885caa8a1c885bc2ef458bc08337 --- SDK/include/NDK/Components/GraphicsComponent.hpp | 9 +++++++++ SDK/include/NDK/Components/GraphicsComponent.inl | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/SDK/include/NDK/Components/GraphicsComponent.hpp b/SDK/include/NDK/Components/GraphicsComponent.hpp index 6e0e78604..ec16ba593 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.hpp +++ b/SDK/include/NDK/Components/GraphicsComponent.hpp @@ -77,20 +77,29 @@ namespace Ndk renderable(std::move(renderable.renderable)), dataUpdated(renderable.dataUpdated), renderableInvalidationSlot(std::move(renderable.renderableInvalidationSlot)), + renderableReleaseSlot(std::move(renderable.renderableReleaseSlot)) { } + ~Renderable() + { + // Disconnect release slot before releasing instanced renderable reference + renderableReleaseSlot.Disconnect(); + } + Renderable& operator=(Renderable&& r) noexcept { data = std::move(r.data); dataUpdated = r.dataUpdated; renderable = std::move(r.renderable); renderableInvalidationSlot = std::move(r.renderableInvalidationSlot); + renderableReleaseSlot = std::move(r.renderableReleaseSlot); return *this; } NazaraSlot(Nz::InstancedRenderable, OnInstancedRenderableInvalidateData, renderableInvalidationSlot); + NazaraSlot(Nz::InstancedRenderable, OnInstancedRenderableRelease, renderableReleaseSlot); mutable Nz::InstancedRenderable::InstanceData data; Nz::InstancedRenderableRef renderable; diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index a835c845d..0d9cb7af4 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -42,7 +42,8 @@ namespace Ndk Renderable& r = m_renderables.back(); r.data.renderOrder = renderOrder; r.renderable = std::move(renderable); - r.renderableInvalidationSlot.Connect(r.renderable->OnInstancedRenderableInvalidateData, std::bind(&GraphicsComponent::InvalidateRenderableData, this, std::placeholders::_1, std::placeholders::_2, m_renderables.size()-1)); + r.renderableInvalidationSlot.Connect(r.renderable->OnInstancedRenderableInvalidateData, std::bind(&GraphicsComponent::InvalidateRenderableData, this, std::placeholders::_1, std::placeholders::_2, m_renderables.size() - 1)); + r.renderableReleaseSlot.Connect(r.renderable->OnInstancedRenderableRelease, this, &GraphicsComponent::Detach); InvalidateBoundingVolume(); }