From 8d92f68cc6d943fbfe993718a60f05f06faa70e8 Mon Sep 17 00:00:00 2001 From: antopilo Date: Sun, 2 Feb 2025 10:47:29 -0500 Subject: [PATCH] Added a mapping of viewport -> scene renderer --- .../Nuake/Rendering/Vulkan/VulkanRenderer.cpp | 41 +++++++++---------- .../Nuake/Rendering/Vulkan/VulkanRenderer.h | 4 +- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/Nuake/Source/Nuake/Rendering/Vulkan/VulkanRenderer.cpp b/Nuake/Source/Nuake/Rendering/Vulkan/VulkanRenderer.cpp index 576f29a3..c95cf009 100644 --- a/Nuake/Source/Nuake/Rendering/Vulkan/VulkanRenderer.cpp +++ b/Nuake/Source/Nuake/Rendering/Vulkan/VulkanRenderer.cpp @@ -433,15 +433,25 @@ void VkRenderer::RemoveViewport(const UUID& viewportId) for (auto& [scene, views] : SceneViewports) { auto it = std::find(views.begin(), views.end(), viewportId); - if (it != views.end()) + if (it == std::end(views)) { - views.erase(it); + continue; + } - if (SceneViewports[scene].empty()) - { - SceneViewports.erase(scene); - return; - } + views.erase(it); + + // Erase scene renderer associated with scene viewport + if (auto sceneRendererIt = SceneRenderers.find(viewportId); + sceneRendererIt != std::end(SceneRenderers)) + { + SceneRenderers.erase(sceneRendererIt); + } + + // Erase link between scene and viewport + if (SceneViewports[scene].empty()) + { + SceneViewports.erase(scene); + return; } } } @@ -455,22 +465,9 @@ void VkRenderer::RegisterSceneViewport(const Ref& scene, const UUID& view } SceneViewports[scene].push_back(viewportId); -} -void VkRenderer::UnRegisterSceneViewport(const Ref& scene, const UUID& viewportId) -{ - if (SceneViewports.find(scene) == SceneViewports.end()) - { - Logger::Log("Failed to unregister scene viewport: scene not found", "vulkan", CRITICAL); - return; - } - - auto& viewports = SceneViewports[scene]; - auto it = std::find(viewports.begin(), viewports.end(), viewportId); - if (it != viewports.end()) - { - viewports.erase(it); - } + // Each viewport has its own scene renderer + SceneRenderers[viewportId] = CreateRef(); } void DrawSceneViewport(const Ref& scene, const UUID& viewportId) diff --git a/Nuake/Source/Nuake/Rendering/Vulkan/VulkanRenderer.h b/Nuake/Source/Nuake/Rendering/Vulkan/VulkanRenderer.h index 5bbb79c7..11a5d988 100644 --- a/Nuake/Source/Nuake/Rendering/Vulkan/VulkanRenderer.h +++ b/Nuake/Source/Nuake/Rendering/Vulkan/VulkanRenderer.h @@ -174,6 +174,7 @@ namespace Nuake VkCommandBuffer ImguiCommandBuffer; VkCommandPool ImguiCommandPool; + std::map> SceneRenderers; Ref SceneRenderer; public: @@ -217,11 +218,8 @@ namespace Nuake Ref CreateViewport(const UUID& viewId, const Vector2& size); void RemoveViewport(const UUID& viewportId); - void RegisterSceneViewport(const Ref& scene, const UUID& viewportId); - void UnRegisterSceneViewport(const Ref& scene, const UUID& viewportId); - // Actual rendering public: void PrepareSceneData(RenderContext ctx); void DrawScenes();