83 lines
3.2 KiB
C++
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
|