#pragma once #include "Viewport/EditorViewportRuntimeServices.h" #include "HostFwd.h" #include "Viewport/SceneViewportRenderService.h" #include "Viewport/ViewportContentRenderer.h" #include "ViewportRenderTargets.h" #include #include #include #include #include #include #include namespace XCEngine::UI::Editor::App { class ViewportHostService final : public EditorViewportRuntimeServices { public: ViewportHostService(); ~ViewportHostService(); void Initialize(const std::filesystem::path& repoRoot) override; void Shutdown() override; void AttachWindowRenderer(Rendering::Host::ViewportRenderHost& windowRenderer) override; void DetachWindowRenderer() override; void SetSurfacePresentationEnabled(bool enabled) override; void SetContentRenderer( std::string_view viewportId, IViewportContentRenderer* renderer, const EditorViewportResourceRequirements& requirements = {}); void BeginFrame() override; EditorViewportFrame RequestViewport( std::string_view viewportId, const ::XCEngine::UI::UISize& requestedSize) override; void RenderRequestedViewports( const ::XCEngine::Rendering::RenderContext& renderContext) override; EditorSceneViewportRuntime& GetSceneViewportRuntime() override; private: struct ViewportEntry { IViewportContentRenderer* renderer = nullptr; EditorViewportResourceRequirements 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); EditorViewportFrame 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 = {}; SceneViewportRenderService m_sceneViewportRuntime = {}; }; } // namespace XCEngine::UI::Editor::App