resources: formalize internal shader ir

This commit is contained in:
2026-04-07 11:31:13 +08:00
parent 1c87650fb3
commit 864438c508
11 changed files with 431 additions and 259 deletions

View File

@@ -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(

View File

@@ -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;
}