#pragma once #include "Rendering/Host/HostFwd.h" #include "Rendering/Viewport/ViewportContentRenderer.h" #include "ViewportRenderTargets.h" #include #include #include #include #include #include #include namespace XCEngine::UI::Editor::App { class ViewportHostService { public: ViewportHostService(); ~ViewportHostService(); void AttachWindowRenderer(Rendering::Host::ViewportRenderHost& windowRenderer); void DetachWindowRenderer(); void SetSurfacePresentationEnabled(bool enabled); void SetContentRenderer( std::string_view viewportId, IViewportContentRenderer* renderer, const ViewportResourceRequirements& requirements = {}); void Shutdown(); void BeginFrame(); ViewportFrame RequestViewport( std::string_view viewportId, const ::XCEngine::UI::UISize& requestedSize); void RenderRequestedViewports( const ::XCEngine::Rendering::RenderContext& renderContext); private: struct ViewportEntry { IViewportContentRenderer* renderer = nullptr; ViewportResourceRequirements requirements = {}; std::uint32_t requestedWidth = 0; std::uint32_t requestedHeight = 0; bool requestedThisFrame = false; bool renderedThisFrame = false; ViewportRenderTargets renderTargets = {}; std::string statusText = {}; }; void ReleaseWindowResources(); ViewportEntry& GetOrCreateEntry(std::string_view viewportId); void DestroyViewportEntry(ViewportEntry& entry); void DestroyRetiredTargets(); void ReclaimRetiredTargetsForCurrentSlot(); void RetireViewportTargets(ViewportRenderTargets& targets); bool EnsureViewportResources(ViewportEntry& entry); void ApplyViewportFallback( ViewportEntry& entry, const ::XCEngine::Rendering::RenderContext& renderContext, const ViewportRenderResult& renderResult); void ClearViewport( ViewportEntry& entry, const ::XCEngine::Rendering::RenderContext& renderContext, float r, float g, float b, float a); ViewportFrame BuildFrame( const ViewportEntry& entry, const ::XCEngine::UI::UISize& requestedSize) const; Rendering::Host::ViewportRenderHost* m_windowRenderer = nullptr; ::XCEngine::RHI::RHIDevice* m_device = nullptr; ViewportRenderTargetManager m_renderTargetManager = {}; bool m_surfacePresentationEnabled = false; std::unordered_map m_entries = {}; std::vector> m_retiredTargetsBySlot = {}; }; } // namespace XCEngine::UI::Editor::App