Refactor editor rendering contracts
This commit is contained in:
@@ -4,40 +4,57 @@
|
||||
#include <XCEditor/Shell/UIEditorShellCapturePolicy.h>
|
||||
#include <XCEngine/Rendering/RenderContext.h>
|
||||
|
||||
#include <cassert>
|
||||
#include <utility>
|
||||
|
||||
namespace XCEngine::UI::Editor::App {
|
||||
|
||||
EditorShellRuntime::EditorShellRuntime(EditorWorkspacePanelRuntimeSet workspacePanels)
|
||||
: m_workspacePanels(std::move(workspacePanels)) {}
|
||||
EditorShellRuntime::EditorShellRuntime(
|
||||
EditorWorkspacePanelRuntimeSet workspacePanels,
|
||||
std::unique_ptr<EditorIconService> iconService,
|
||||
std::unique_ptr<EditorViewportRuntimeServices> viewportRuntimeServices)
|
||||
: m_iconService(std::move(iconService))
|
||||
, m_viewportRuntimeServices(std::move(viewportRuntimeServices))
|
||||
, m_workspacePanels(std::move(workspacePanels)) {}
|
||||
|
||||
void EditorShellRuntime::Initialize(
|
||||
const std::filesystem::path& repoRoot,
|
||||
Rendering::Host::UiTextureHost& textureHost,
|
||||
Host::EditorHostResourceService& resourceService,
|
||||
UIEditorTextMeasurer& textMeasurer) {
|
||||
m_textureHost = &textureHost;
|
||||
m_builtInIcons.Initialize(textureHost, resourceService);
|
||||
assert(m_iconService != nullptr);
|
||||
assert(m_viewportRuntimeServices != nullptr);
|
||||
if (m_iconService == nullptr || m_viewportRuntimeServices == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_iconService->Initialize(textureHost, resourceService);
|
||||
m_viewportRuntimeServices->Initialize(repoRoot);
|
||||
m_workspacePanels.Initialize(
|
||||
EditorWorkspacePanelInitializationContext{
|
||||
.repoRoot = repoRoot,
|
||||
.textureHost = textureHost,
|
||||
.textMeasurer = textMeasurer,
|
||||
.builtInIcons = m_builtInIcons,
|
||||
.viewportHostService = m_viewportHostService,
|
||||
.iconService = *m_iconService,
|
||||
.sceneViewportRuntime = &m_viewportRuntimeServices->GetSceneViewportRuntime(),
|
||||
});
|
||||
}
|
||||
|
||||
void EditorShellRuntime::AttachViewportWindowRenderer(Rendering::Host::ViewportRenderHost& renderer) {
|
||||
m_viewportHostService.AttachWindowRenderer(renderer);
|
||||
if (m_viewportRuntimeServices != nullptr) {
|
||||
m_viewportRuntimeServices->AttachWindowRenderer(renderer);
|
||||
}
|
||||
}
|
||||
|
||||
void EditorShellRuntime::DetachViewportWindowRenderer() {
|
||||
m_viewportHostService.DetachWindowRenderer();
|
||||
if (m_viewportRuntimeServices != nullptr) {
|
||||
m_viewportRuntimeServices->DetachWindowRenderer();
|
||||
}
|
||||
}
|
||||
|
||||
void EditorShellRuntime::SetViewportSurfacePresentationEnabled(bool enabled) {
|
||||
m_viewportHostService.SetSurfacePresentationEnabled(enabled);
|
||||
if (m_viewportRuntimeServices != nullptr) {
|
||||
m_viewportRuntimeServices->SetSurfacePresentationEnabled(enabled);
|
||||
}
|
||||
}
|
||||
|
||||
void EditorShellRuntime::Shutdown() {
|
||||
@@ -45,20 +62,14 @@ void EditorShellRuntime::Shutdown() {
|
||||
m_shellInteractionState = {};
|
||||
m_splitterDragCorrectionState = {};
|
||||
m_traceEntries.clear();
|
||||
if (m_textureHost != nullptr) {
|
||||
m_workspacePanels.Shutdown(
|
||||
EditorWorkspacePanelShutdownContext{
|
||||
.textureHost = *m_textureHost,
|
||||
.viewportHostService = m_viewportHostService,
|
||||
});
|
||||
m_workspacePanels = {};
|
||||
m_builtInIcons.Shutdown();
|
||||
m_textureHost = nullptr;
|
||||
} else {
|
||||
m_workspacePanels = {};
|
||||
m_builtInIcons.Shutdown();
|
||||
m_workspacePanels.Shutdown(EditorWorkspacePanelShutdownContext{});
|
||||
m_workspacePanels = {};
|
||||
if (m_iconService != nullptr) {
|
||||
m_iconService->Shutdown();
|
||||
}
|
||||
if (m_viewportRuntimeServices != nullptr) {
|
||||
m_viewportRuntimeServices->Shutdown();
|
||||
}
|
||||
m_viewportHostService.Shutdown();
|
||||
}
|
||||
|
||||
void EditorShellRuntime::ResetInteractionState() {
|
||||
@@ -82,7 +93,8 @@ const std::vector<WorkspaceTraceEntry>& EditorShellRuntime::GetTraceEntries() co
|
||||
}
|
||||
|
||||
const std::string& EditorShellRuntime::GetBuiltInIconError() const {
|
||||
return m_builtInIcons.GetLastError();
|
||||
static const std::string kEmptyError = {};
|
||||
return m_iconService != nullptr ? m_iconService->GetLastError() : kEmptyError;
|
||||
}
|
||||
|
||||
void EditorShellRuntime::SetExternalDockHostDropPreview(
|
||||
@@ -144,8 +156,13 @@ bool EditorShellRuntime::HasInteractiveCapture() const {
|
||||
}
|
||||
|
||||
std::unique_ptr<EditorWorkspaceShellRuntime> CreateEditorWorkspaceShellRuntime(
|
||||
EditorWorkspacePanelRuntimeSet workspacePanels) {
|
||||
return std::make_unique<EditorShellRuntime>(std::move(workspacePanels));
|
||||
EditorWorkspacePanelRuntimeSet workspacePanels,
|
||||
std::unique_ptr<EditorIconService> iconService,
|
||||
std::unique_ptr<EditorViewportRuntimeServices> viewportRuntimeServices) {
|
||||
return std::make_unique<EditorShellRuntime>(
|
||||
std::move(workspacePanels),
|
||||
std::move(iconService),
|
||||
std::move(viewportRuntimeServices));
|
||||
}
|
||||
|
||||
} // namespace XCEngine::UI::Editor::App
|
||||
@@ -154,15 +171,21 @@ namespace XCEngine::UI::Editor::App {
|
||||
|
||||
void EditorShellRuntime::RenderRequestedViewports(
|
||||
const ::XCEngine::Rendering::RenderContext& renderContext) {
|
||||
m_viewportHostService.RenderRequestedViewports(renderContext);
|
||||
if (m_viewportRuntimeServices != nullptr) {
|
||||
m_viewportRuntimeServices->RenderRequestedViewports(renderContext);
|
||||
}
|
||||
}
|
||||
|
||||
void EditorShellRuntime::Append(::XCEngine::UI::UIDrawData& drawData) const {
|
||||
if (m_iconService == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_drawComposer.Append(
|
||||
EditorShellDrawComposerContext{
|
||||
.shellFrame = m_shellFrame,
|
||||
.shellInteractionState = m_shellInteractionState,
|
||||
.builtInIcons = m_builtInIcons,
|
||||
.iconService = *m_iconService,
|
||||
.workspacePanels = m_workspacePanels,
|
||||
},
|
||||
drawData);
|
||||
@@ -182,6 +205,10 @@ void EditorShellRuntime::Update(
|
||||
bool useDetachedTitleBarTabStrip,
|
||||
float detachedTitleBarTabHeight,
|
||||
float detachedWindowChromeHeight) {
|
||||
if (m_viewportRuntimeServices == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto buildDefinition = [&]() {
|
||||
return m_sessionCoordinator.PrepareShellDefinition(
|
||||
EditorShellSessionCoordinatorContext{
|
||||
@@ -206,7 +233,7 @@ void EditorShellRuntime::Update(
|
||||
.useDetachedTitleBarTabStrip = useDetachedTitleBarTabStrip,
|
||||
.detachedTitleBarTabHeight = detachedTitleBarTabHeight,
|
||||
.detachedWindowChromeHeight = detachedWindowChromeHeight,
|
||||
.viewportHostService = m_viewportHostService,
|
||||
.viewportRuntimeServices = *m_viewportRuntimeServices,
|
||||
});
|
||||
m_sessionCoordinator.FinalizeFrame(frameServices, workspaceController, m_shellFrame.result);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user