diff --git a/include/Nazara/Graphics/ForwardFramePipeline.hpp b/include/Nazara/Graphics/ForwardFramePipeline.hpp index 749db55fd..8f21f4ea4 100644 --- a/include/Nazara/Graphics/ForwardFramePipeline.hpp +++ b/include/Nazara/Graphics/ForwardFramePipeline.hpp @@ -71,6 +71,7 @@ namespace Nz void UpdateLightRenderMask(std::size_t lightIndex, UInt32 renderMask) override; void UpdateRenderableRenderMask(std::size_t renderableIndex, UInt32 renderMask) override; void UpdateRenderableScissorBox(std::size_t renderableIndex, const Recti& scissorBox) override; + void UpdateRenderableSkeletonInstance(std::size_t renderableIndex, std::size_t skeletonIndex) override; void UpdateViewerRenderMask(std::size_t viewerIndex, Int32 renderOrder) override; ForwardFramePipeline& operator=(const ForwardFramePipeline&) = delete; diff --git a/include/Nazara/Graphics/FramePipeline.hpp b/include/Nazara/Graphics/FramePipeline.hpp index 026fc1da0..f882d6e8a 100644 --- a/include/Nazara/Graphics/FramePipeline.hpp +++ b/include/Nazara/Graphics/FramePipeline.hpp @@ -63,6 +63,7 @@ namespace Nz virtual void UpdateLightRenderMask(std::size_t lightIndex, UInt32 renderMask) = 0; virtual void UpdateRenderableRenderMask(std::size_t renderableIndex, UInt32 renderMask) = 0; virtual void UpdateRenderableScissorBox(std::size_t renderableIndex, const Recti& scissorBox) = 0; + virtual void UpdateRenderableSkeletonInstance(std::size_t renderableIndex, std::size_t skeletonIndex) = 0; virtual void UpdateViewerRenderMask(std::size_t viewerIndex, Int32 renderOrder) = 0; FramePipeline& operator=(const FramePipeline&) = delete; diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index 52109687f..ee49218d3 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -559,6 +559,26 @@ namespace Nz } } + void ForwardFramePipeline::UpdateRenderableSkeletonInstance(std::size_t renderableIndex, std::size_t skeletonIndex) + { + RenderableData* renderableData = m_renderablePool.RetrieveFromIndex(renderableIndex); + renderableData->skeletonInstanceIndex = skeletonIndex; + + // TODO: Invalidate only relevant viewers and passes + for (auto& viewerData : m_viewerPool) + { + UInt32 viewerRenderMask = viewerData.viewer->GetRenderMask(); + + if (viewerRenderMask & renderableData->renderMask) + { + if (viewerData.depthPrepass) + viewerData.depthPrepass->InvalidateElements(); + + viewerData.forwardPass->InvalidateElements(); + } + } + } + void ForwardFramePipeline::UpdateViewerRenderMask(std::size_t viewerIndex, Int32 renderOrder) { ViewerData* viewerData = m_viewerPool.RetrieveFromIndex(viewerIndex); diff --git a/src/Nazara/Graphics/Systems/RenderSystem.cpp b/src/Nazara/Graphics/Systems/RenderSystem.cpp index c0f121c52..d64f8c6b6 100644 --- a/src/Nazara/Graphics/Systems/RenderSystem.cpp +++ b/src/Nazara/Graphics/Systems/RenderSystem.cpp @@ -351,7 +351,7 @@ namespace Nz GraphicsEntity* graphicsEntity = m_graphicsEntityPool.Allocate(poolIndex); graphicsEntity->entity = entity; graphicsEntity->poolIndex = poolIndex; - graphicsEntity->renderableIndices.fill(std::numeric_limits::max()); + graphicsEntity->renderableIndices.fill(NoInstance); graphicsEntity->skeletonInstanceIndex = NoInstance; //< will be set in skeleton observer graphicsEntity->worldInstanceIndex = m_pipeline->RegisterWorldInstance(entityGfx.GetWorldInstance()); graphicsEntity->onNodeInvalidation.Connect(entityNode.OnNodeInvalidation, [this, graphicsEntity](const Node* /*node*/) @@ -374,6 +374,7 @@ namespace Nz return; m_pipeline->UnregisterRenderable(graphicsEntity->renderableIndices[renderableIndex]); + graphicsEntity->renderableIndices[renderableIndex] = NoInstance; }); graphicsEntity->onScissorBoxUpdate.Connect(entityGfx.OnScissorBoxUpdate, [this, graphicsEntity](GraphicsComponent* gfx, const Recti& scissorBox) @@ -474,6 +475,12 @@ namespace Nz it->second.useCount++; graphicsEntity->skeletonInstanceIndex = it->second.skeletonInstanceIndex; } + + for (std::size_t renderableIndex : graphicsEntity->renderableIndices) + { + if (renderableIndex != NoInstance) + m_pipeline->UpdateRenderableSkeletonInstance(renderableIndex, graphicsEntity->skeletonInstanceIndex); + } }); m_skeletonConstructObserver.each([&](entt::entity entity) @@ -484,6 +491,12 @@ namespace Nz const std::shared_ptr& skeleton = skeletonComponent.GetSkeleton(); graphicsEntity->skeletonInstanceIndex = m_pipeline->RegisterSkeleton(std::make_shared(skeleton)); + + for (std::size_t renderableIndex : graphicsEntity->renderableIndices) + { + if (renderableIndex != NoInstance) + m_pipeline->UpdateRenderableSkeletonInstance(renderableIndex, graphicsEntity->skeletonInstanceIndex); + } }); } }