diff --git a/include/Nazara/Graphics/Systems/RenderSystem.hpp b/include/Nazara/Graphics/Systems/RenderSystem.hpp index 28469256e..3cba72337 100644 --- a/include/Nazara/Graphics/Systems/RenderSystem.hpp +++ b/include/Nazara/Graphics/Systems/RenderSystem.hpp @@ -41,8 +41,13 @@ namespace Nz RenderSystem(RenderSystem&&) = delete; ~RenderSystem(); + inline void AttachExternalSwapchain(WindowSwapchain& swapchain); + WindowSwapchain& CreateSwapchain(Window& window, const SwapchainParameters& parameters = SwapchainParameters{}); + void DestroySwapchain(WindowSwapchain& swapchain); + inline void DetachExternalSwapchain(WindowSwapchain& swapchain); + inline FramePipeline& GetFramePipeline(); inline const FramePipeline& GetFramePipeline() const; @@ -136,6 +141,7 @@ namespace Nz std::unordered_map m_graphicsEntities; std::unordered_map m_lightEntities; std::unordered_map m_sharedSkeletonInstances; + std::vector> m_externalSwapchains; std::vector> m_windowSwapchains; ElementRendererRegistry m_elementRegistry; MemoryPool m_cameraEntityPool; diff --git a/include/Nazara/Graphics/Systems/RenderSystem.inl b/include/Nazara/Graphics/Systems/RenderSystem.inl index b016038b2..9b34d8140 100644 --- a/include/Nazara/Graphics/Systems/RenderSystem.inl +++ b/include/Nazara/Graphics/Systems/RenderSystem.inl @@ -2,11 +2,23 @@ // This file is part of the "Nazara Engine - Graphics module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #include namespace Nz { + inline void RenderSystem::AttachExternalSwapchain(WindowSwapchain& swapchain) + { + m_windowSwapchains.emplace_back(&swapchain); + } + + inline void RenderSystem::DetachExternalSwapchain(WindowSwapchain& swapchain) + { + auto it = std::find_if(m_externalSwapchains.begin(), m_externalSwapchains.end(), [&](WindowSwapchain& externalSwapchain) { return &externalSwapchain == &swapchain; }); + NazaraAssert(it != m_externalSwapchains.end(), "external swapchain is not part of this render system"); + m_externalSwapchains.erase(it); + } + inline FramePipeline& RenderSystem::GetFramePipeline() { return *m_pipeline; @@ -19,3 +31,4 @@ namespace Nz } #include + diff --git a/src/Nazara/Graphics/Systems/RenderSystem.cpp b/src/Nazara/Graphics/Systems/RenderSystem.cpp index 412fdb53e..54e521725 100644 --- a/src/Nazara/Graphics/Systems/RenderSystem.cpp +++ b/src/Nazara/Graphics/Systems/RenderSystem.cpp @@ -55,22 +55,36 @@ namespace Nz return *m_windowSwapchains.emplace_back(std::make_unique(Graphics::Instance()->GetRenderDevice(), window, parameters)); } + void RenderSystem::DestroySwapchain(WindowSwapchain& swapchain) + { + auto it = std::find_if(m_windowSwapchains.begin(), m_windowSwapchains.end(), [&](const auto& ptr) { return ptr.get() == &swapchain; }); + NazaraAssert(it != m_windowSwapchains.end(), "invalid swapchain"); + + m_windowSwapchains.erase(it); + } + void RenderSystem::Update(Time /*elapsedTime*/) { UpdateObservers(); UpdateInstances(); - for (auto& swapchainPtr : m_windowSwapchains) + auto HandleSwapchain = [&](WindowSwapchain& swapchain) { - RenderFrame frame = swapchainPtr->AcquireFrame(); + RenderFrame frame = swapchain.AcquireFrame(); if (!frame) - continue; + return; if (!m_cameraEntities.empty()) m_pipeline->Render(frame); frame.Present(); - } + }; + + for (auto& swapchainPtr : m_windowSwapchains) + HandleSwapchain(*swapchainPtr); + + for (WindowSwapchain& swapchain : m_externalSwapchains) + HandleSwapchain(swapchain); } void RenderSystem::OnCameraDestroy([[maybe_unused]] entt::registry& registry, entt::entity entity)