Files
XCEngine/editor/app/Rendering/Viewport/ViewportHostService.h
2026-04-25 16:46:01 +08:00

85 lines
2.7 KiB
C++

#pragma once
#include "Rendering/Host/HostFwd.h"
#include "Rendering/Viewport/ViewportContentRenderer.h"
#include "ViewportRenderTargets.h"
#include <XCEngine/Rendering/RenderContext.h>
#include <XCEngine/UI/Types.h>
#include <cstdint>
#include <string>
#include <string_view>
#include <unordered_map>
#include <vector>
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<std::string, ViewportEntry> m_entries = {};
std::vector<std::vector<ViewportRenderTargets>> m_retiredTargetsBySlot = {};
};
} // namespace XCEngine::UI::Editor::App