Files
XCEngine/new_editor/app/Composition/EditorShellRuntimeViewport.cpp

83 lines
3.2 KiB
C++

#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<UIEditorWorkspacePanelPresentationModel>& 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<UIEditorWorkspaceViewportComposeFrame>& 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