resources: formalize internal shader ir
This commit is contained in:
@@ -3,7 +3,8 @@
|
||||
#include <XCEditor/Core/UIEditorMenuModel.h>
|
||||
#include <XCEditor/Core/UIEditorMenuSession.h>
|
||||
#include <XCEditor/Core/UIEditorShellCompose.h>
|
||||
#include <XCEditor/Core/UIEditorWorkspaceCompose.h>
|
||||
#include <XCEditor/Core/UIEditorWorkspaceController.h>
|
||||
#include <XCEditor/Core/UIEditorWorkspaceInteraction.h>
|
||||
#include <XCEditor/Widgets/UIEditorMenuPopup.h>
|
||||
|
||||
#include <XCEngine/UI/DrawData.h>
|
||||
@@ -22,6 +23,7 @@ struct UIEditorShellInteractionModel {
|
||||
struct UIEditorShellInteractionState {
|
||||
UIEditorShellComposeState composeState = {};
|
||||
UIEditorMenuSession menuSession = {};
|
||||
UIEditorWorkspaceInteractionState workspaceInteractionState = {};
|
||||
::XCEngine::UI::UIPoint pointerPosition = {};
|
||||
bool focused = false;
|
||||
bool hasPointerPosition = false;
|
||||
@@ -82,12 +84,18 @@ struct UIEditorShellInteractionRequest {
|
||||
|
||||
struct UIEditorShellInteractionResult {
|
||||
bool consumed = false;
|
||||
bool requestPointerCapture = false;
|
||||
bool releasePointerCapture = false;
|
||||
bool viewportInteractionChanged = false;
|
||||
bool commandTriggered = false;
|
||||
std::string menuId = {};
|
||||
std::string popupId = {};
|
||||
std::string itemId = {};
|
||||
std::string commandId = {};
|
||||
std::string viewportPanelId = {};
|
||||
UIEditorViewportInputBridgeFrame viewportInputFrame = {};
|
||||
UIEditorMenuSessionMutationResult menuMutation = {};
|
||||
UIEditorWorkspaceInteractionResult workspaceResult = {};
|
||||
};
|
||||
|
||||
struct UIEditorShellInteractionPopupFrame {
|
||||
@@ -98,6 +106,7 @@ struct UIEditorShellInteractionPopupFrame {
|
||||
struct UIEditorShellInteractionFrame {
|
||||
UIEditorShellInteractionRequest request = {};
|
||||
UIEditorShellComposeFrame shellFrame = {};
|
||||
UIEditorWorkspaceInteractionFrame workspaceInteractionFrame = {};
|
||||
std::vector<UIEditorShellInteractionPopupFrame> popupFrames = {};
|
||||
UIEditorShellInteractionResult result = {};
|
||||
std::string openRootMenuId = {};
|
||||
@@ -109,23 +118,17 @@ struct UIEditorShellInteractionFrame {
|
||||
|
||||
UIEditorShellInteractionRequest ResolveUIEditorShellInteractionRequest(
|
||||
const ::XCEngine::UI::UIRect& bounds,
|
||||
const UIEditorPanelRegistry& panelRegistry,
|
||||
const UIEditorWorkspaceModel& workspace,
|
||||
const UIEditorWorkspaceSession& session,
|
||||
const UIEditorWorkspaceController& controller,
|
||||
const UIEditorShellInteractionModel& model,
|
||||
const Widgets::UIEditorDockHostState& dockHostState = {},
|
||||
const UIEditorShellInteractionState& state = {},
|
||||
const UIEditorShellInteractionMetrics& metrics = {});
|
||||
|
||||
UIEditorShellInteractionFrame UpdateUIEditorShellInteraction(
|
||||
UIEditorShellInteractionState& state,
|
||||
UIEditorWorkspaceController& controller,
|
||||
const ::XCEngine::UI::UIRect& bounds,
|
||||
const UIEditorPanelRegistry& panelRegistry,
|
||||
const UIEditorWorkspaceModel& workspace,
|
||||
const UIEditorWorkspaceSession& session,
|
||||
const UIEditorShellInteractionModel& model,
|
||||
const std::vector<::XCEngine::UI::UIInputEvent>& inputEvents,
|
||||
const Widgets::UIEditorDockHostState& dockHostState = {},
|
||||
const UIEditorShellInteractionMetrics& metrics = {});
|
||||
|
||||
void AppendUIEditorShellInteraction(
|
||||
|
||||
@@ -217,8 +217,11 @@ std::size_t FindPopupItemIndex(
|
||||
bool HasMeaningfulInteractionResult(
|
||||
const UIEditorShellInteractionResult& result) {
|
||||
return result.consumed ||
|
||||
result.requestPointerCapture ||
|
||||
result.releasePointerCapture ||
|
||||
result.commandTriggered ||
|
||||
result.menuMutation.changed ||
|
||||
result.workspaceResult.consumed ||
|
||||
!result.menuId.empty() ||
|
||||
!result.popupId.empty() ||
|
||||
!result.itemId.empty() ||
|
||||
@@ -227,11 +230,8 @@ bool HasMeaningfulInteractionResult(
|
||||
|
||||
BuildRequestOutput BuildRequest(
|
||||
const UIRect& bounds,
|
||||
const UIEditorPanelRegistry& panelRegistry,
|
||||
const UIEditorWorkspaceModel& workspace,
|
||||
const UIEditorWorkspaceSession& session,
|
||||
const UIEditorWorkspaceController& controller,
|
||||
const UIEditorShellInteractionModel& model,
|
||||
const Widgets::UIEditorDockHostState& dockHostState,
|
||||
const UIEditorShellInteractionState& state,
|
||||
const UIEditorShellInteractionMetrics& metrics) {
|
||||
BuildRequestOutput output = {};
|
||||
@@ -242,11 +242,11 @@ BuildRequestOutput BuildRequest(
|
||||
BuildShellComposeModel(model, request.menuBarItems);
|
||||
request.shellRequest = ResolveUIEditorShellComposeRequest(
|
||||
bounds,
|
||||
panelRegistry,
|
||||
workspace,
|
||||
session,
|
||||
controller.GetPanelRegistry(),
|
||||
controller.GetWorkspace(),
|
||||
controller.GetSession(),
|
||||
shellModel,
|
||||
dockHostState,
|
||||
state.workspaceInteractionState.dockHostInteractionState.dockHostState,
|
||||
state.composeState,
|
||||
metrics.shellMetrics);
|
||||
|
||||
@@ -444,7 +444,7 @@ bool ShouldUsePointerPosition(const UIInputEvent& event) {
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<UIInputEvent> FilterComposeInputEvents(
|
||||
std::vector<UIInputEvent> FilterWorkspaceInputEvents(
|
||||
const std::vector<UIInputEvent>& inputEvents,
|
||||
bool menuModalDuringFrame) {
|
||||
if (!menuModalDuringFrame) {
|
||||
@@ -466,44 +466,32 @@ std::vector<UIInputEvent> FilterComposeInputEvents(
|
||||
|
||||
UIEditorShellInteractionRequest ResolveUIEditorShellInteractionRequest(
|
||||
const UIRect& bounds,
|
||||
const UIEditorPanelRegistry& panelRegistry,
|
||||
const UIEditorWorkspaceModel& workspace,
|
||||
const UIEditorWorkspaceSession& session,
|
||||
const UIEditorWorkspaceController& controller,
|
||||
const UIEditorShellInteractionModel& model,
|
||||
const Widgets::UIEditorDockHostState& dockHostState,
|
||||
const UIEditorShellInteractionState& state,
|
||||
const UIEditorShellInteractionMetrics& metrics) {
|
||||
return BuildRequest(
|
||||
bounds,
|
||||
panelRegistry,
|
||||
workspace,
|
||||
session,
|
||||
controller,
|
||||
model,
|
||||
dockHostState,
|
||||
state,
|
||||
metrics).request;
|
||||
}
|
||||
|
||||
UIEditorShellInteractionFrame UpdateUIEditorShellInteraction(
|
||||
UIEditorShellInteractionState& state,
|
||||
UIEditorWorkspaceController& controller,
|
||||
const UIRect& bounds,
|
||||
const UIEditorPanelRegistry& panelRegistry,
|
||||
const UIEditorWorkspaceModel& workspace,
|
||||
const UIEditorWorkspaceSession& session,
|
||||
const UIEditorShellInteractionModel& model,
|
||||
const std::vector<UIInputEvent>& inputEvents,
|
||||
const Widgets::UIEditorDockHostState& dockHostState,
|
||||
const UIEditorShellInteractionMetrics& metrics) {
|
||||
UIEditorShellInteractionResult interactionResult = {};
|
||||
bool menuModalDuringFrame = state.menuSession.HasOpenMenu();
|
||||
|
||||
BuildRequestOutput requestBuild = BuildRequest(
|
||||
bounds,
|
||||
panelRegistry,
|
||||
workspace,
|
||||
session,
|
||||
controller,
|
||||
model,
|
||||
dockHostState,
|
||||
state,
|
||||
metrics);
|
||||
UIEditorShellInteractionRequest request = std::move(requestBuild.request);
|
||||
@@ -516,11 +504,8 @@ UIEditorShellInteractionFrame UpdateUIEditorShellInteraction(
|
||||
|
||||
requestBuild = BuildRequest(
|
||||
bounds,
|
||||
panelRegistry,
|
||||
workspace,
|
||||
session,
|
||||
controller,
|
||||
model,
|
||||
dockHostState,
|
||||
state,
|
||||
metrics);
|
||||
request = std::move(requestBuild.request);
|
||||
@@ -664,43 +649,48 @@ UIEditorShellInteractionFrame UpdateUIEditorShellInteraction(
|
||||
menuModalDuringFrame = true;
|
||||
request = BuildRequest(
|
||||
bounds,
|
||||
panelRegistry,
|
||||
workspace,
|
||||
session,
|
||||
controller,
|
||||
model,
|
||||
dockHostState,
|
||||
state,
|
||||
metrics).request;
|
||||
}
|
||||
}
|
||||
|
||||
const std::vector<UIInputEvent> workspaceInputEvents =
|
||||
FilterWorkspaceInputEvents(inputEvents, menuModalDuringFrame);
|
||||
UIEditorWorkspaceInteractionModel workspaceModel = {};
|
||||
workspaceModel.workspacePresentations = model.workspacePresentations;
|
||||
UIEditorWorkspaceInteractionFrame workspaceInteractionFrame =
|
||||
UpdateUIEditorWorkspaceInteraction(
|
||||
state.workspaceInteractionState,
|
||||
controller,
|
||||
request.shellRequest.layout.workspaceRect,
|
||||
workspaceModel,
|
||||
workspaceInputEvents,
|
||||
metrics.shellMetrics.dockHostMetrics);
|
||||
state.composeState.workspaceState = state.workspaceInteractionState.composeState;
|
||||
|
||||
request = BuildRequest(
|
||||
bounds,
|
||||
controller,
|
||||
model,
|
||||
state,
|
||||
metrics).request;
|
||||
|
||||
const RequestHit finalHit =
|
||||
HitTestRequest(request, state.pointerPosition, state.hasPointerPosition);
|
||||
UpdateMenuBarVisualState(state, request, finalHit);
|
||||
|
||||
const UIEditorShellComposeModel shellModel =
|
||||
BuildShellComposeModel(model, request.menuBarItems);
|
||||
const std::vector<UIInputEvent> composeInputEvents =
|
||||
FilterComposeInputEvents(inputEvents, menuModalDuringFrame);
|
||||
|
||||
UIEditorShellInteractionFrame frame = {};
|
||||
frame.request = request;
|
||||
frame.shellFrame = UpdateUIEditorShellCompose(
|
||||
state.composeState,
|
||||
bounds,
|
||||
panelRegistry,
|
||||
workspace,
|
||||
session,
|
||||
shellModel,
|
||||
composeInputEvents,
|
||||
dockHostState,
|
||||
metrics.shellMetrics);
|
||||
frame.shellFrame.layout = request.shellRequest.layout;
|
||||
frame.shellFrame.workspaceFrame = workspaceInteractionFrame.composeFrame;
|
||||
frame.workspaceInteractionFrame = std::move(workspaceInteractionFrame);
|
||||
frame.popupFrames = BuildPopupFrames(
|
||||
frame.request,
|
||||
state,
|
||||
finalHit.popupRequest != nullptr ? finalHit.popupRequest->popupId : std::string_view(),
|
||||
finalHit.popupItem != nullptr ? finalHit.popupItem->itemId : std::string_view());
|
||||
frame.result = interactionResult;
|
||||
frame.openRootMenuId = std::string(state.menuSession.GetOpenRootMenuId());
|
||||
frame.hoveredMenuId =
|
||||
finalHit.menuButton != nullptr ? finalHit.menuButton->menuId : std::string();
|
||||
@@ -709,6 +699,20 @@ UIEditorShellInteractionFrame UpdateUIEditorShellInteraction(
|
||||
frame.hoveredItemId =
|
||||
finalHit.popupItem != nullptr ? finalHit.popupItem->itemId : std::string();
|
||||
frame.focused = state.focused || state.menuSession.HasOpenMenu();
|
||||
interactionResult.workspaceResult = frame.workspaceInteractionFrame.result;
|
||||
interactionResult.requestPointerCapture =
|
||||
interactionResult.workspaceResult.requestPointerCapture;
|
||||
interactionResult.releasePointerCapture =
|
||||
interactionResult.workspaceResult.releasePointerCapture;
|
||||
interactionResult.viewportInteractionChanged =
|
||||
interactionResult.workspaceResult.viewportInteractionChanged;
|
||||
interactionResult.viewportPanelId =
|
||||
interactionResult.workspaceResult.viewportPanelId;
|
||||
interactionResult.viewportInputFrame =
|
||||
interactionResult.workspaceResult.viewportInputFrame;
|
||||
interactionResult.consumed =
|
||||
interactionResult.consumed || interactionResult.workspaceResult.consumed;
|
||||
frame.result = std::move(interactionResult);
|
||||
return frame;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user