#include "Composition/EditorShellRuntimeSupport.h" namespace XCEngine::UI::Editor::App::RuntimeSupport { namespace { bool IsViewportPanel(std::string_view panelId) { return panelId == "scene" || panelId == "game"; } ViewportKind ResolveViewportKind(std::string_view panelId) { return panelId == "game" ? ViewportKind::Game : ViewportKind::Scene; } void ApplyViewportFrameToPresentation( const ViewportFrame& viewportFrame, UIEditorWorkspacePanelPresentationModel& presentation) { presentation.viewportShellModel.frame.texture = viewportFrame.texture; presentation.viewportShellModel.frame.requestedSize = viewportFrame.requestedSize; presentation.viewportShellModel.frame.presentedSize = viewportFrame.renderSize; presentation.viewportShellModel.frame.hasTexture = viewportFrame.hasTexture; presentation.viewportShellModel.frame.statusText = viewportFrame.statusText; } void ApplyViewportFrameToShellModel( const ViewportFrame& viewportFrame, UIEditorViewportShellModel& shellModel) { shellModel.frame.texture = viewportFrame.texture; shellModel.frame.requestedSize = viewportFrame.requestedSize; shellModel.frame.presentedSize = viewportFrame.renderSize; shellModel.frame.hasTexture = viewportFrame.hasTexture; shellModel.frame.statusText = viewportFrame.statusText; } UIEditorWorkspacePanelPresentationModel* FindMutableWorkspacePresentation( std::vector& presentations, std::string_view panelId) { for (UIEditorWorkspacePanelPresentationModel& presentation : presentations) { if (presentation.panelId == panelId) { return &presentation; } } return nullptr; } } // namespace void ApplyViewportFramesToShellFrame( UIEditorShellInteractionFrame& shellFrame, ViewportHostService& viewportHostService) { auto applyToViewportFrames = [&](std::vector& viewportFrames) { for (UIEditorWorkspaceViewportComposeFrame& viewportComposeFrame : viewportFrames) { if (!IsViewportPanel(viewportComposeFrame.panelId)) { continue; } const ViewportFrame viewportFrame = viewportHostService.RequestViewport( ResolveViewportKind(viewportComposeFrame.panelId), viewportComposeFrame.viewportShellFrame.requestedViewportSize); ApplyViewportFrameToShellModel( viewportFrame, viewportComposeFrame.viewportShellModel); if (UIEditorWorkspacePanelPresentationModel* presentation = FindMutableWorkspacePresentation( shellFrame.model.workspacePresentations, viewportComposeFrame.panelId); presentation != nullptr) { ApplyViewportFrameToPresentation(viewportFrame, *presentation); } } }; applyToViewportFrames(shellFrame.workspaceInteractionFrame.composeFrame.viewportFrames); applyToViewportFrames(shellFrame.shellFrame.workspaceFrame.viewportFrames); } } // namespace XCEngine::UI::Editor::App::RuntimeSupport