checkpoint(new_editor): native d3d12 ui path

Key node 1: move main-window UI presentation onto the D3D12 render loop with native UI renderer, text system, and texture host.

Key node 2: wire frame timing/FPS display, window runtime, swapchain presentation, and native screenshot capture around the new path.

Key node 3: carry editor shell/workspace/viewport/panel interaction updates needed by the new renderer and detached window flow.

Key node 4: pump async resource loads and scene bridge follow-up needed for scene content visibility in new_editor.
This commit is contained in:
2026-04-21 20:49:18 +08:00
parent a779b04dba
commit 6e9265e92e
53 changed files with 5330 additions and 858 deletions

View File

@@ -144,25 +144,16 @@ const UIEditorWorkspaceViewportComposeFrame* FindUIEditorWorkspaceViewportPresen
}
UIEditorWorkspaceComposeRequest ResolveUIEditorWorkspaceComposeRequest(
const ::XCEngine::UI::UIRect& bounds,
const Widgets::UIEditorDockHostLayout& dockHostLayout,
const UIEditorPanelRegistry& panelRegistry,
const UIEditorWorkspaceModel& workspace,
const UIEditorWorkspaceSession& session,
const std::vector<UIEditorWorkspacePanelPresentationModel>& presentations,
const Widgets::UIEditorDockHostState& dockHostState,
const Widgets::UIEditorDockHostMetrics& dockHostMetrics,
const Widgets::UIEditorViewportSlotMetrics& viewportMetrics) {
UIEditorWorkspaceComposeRequest request = {};
request.dockHostLayout = BuildUIEditorDockHostLayout(
bounds,
panelRegistry,
workspace,
session,
dockHostState,
dockHostMetrics);
request.dockHostLayout = dockHostLayout;
request.contentHostRequest = ResolveUIEditorPanelContentHostRequest(
request.dockHostLayout,
panelRegistry);
request.viewportRequests.reserve(request.contentHostRequest.mountRequests.size());
for (const UIEditorPanelContentHostMountRequest& mountRequest :
request.contentHostRequest.mountRequests) {
@@ -190,6 +181,82 @@ UIEditorWorkspaceComposeRequest ResolveUIEditorWorkspaceComposeRequest(
return request;
}
UIEditorWorkspaceComposeRequest ResolveUIEditorWorkspaceComposeRequest(
const ::XCEngine::UI::UIRect& bounds,
const UIEditorPanelRegistry& panelRegistry,
const UIEditorWorkspaceModel& workspace,
const UIEditorWorkspaceSession& session,
const std::vector<UIEditorWorkspacePanelPresentationModel>& presentations,
const Widgets::UIEditorDockHostState& dockHostState,
const Widgets::UIEditorDockHostMetrics& dockHostMetrics,
const Widgets::UIEditorViewportSlotMetrics& viewportMetrics) {
const Widgets::UIEditorDockHostLayout dockHostLayout = BuildUIEditorDockHostLayout(
bounds,
panelRegistry,
workspace,
session,
dockHostState,
dockHostMetrics);
return ResolveUIEditorWorkspaceComposeRequest(
dockHostLayout,
panelRegistry,
presentations,
viewportMetrics);
}
UIEditorWorkspaceComposeFrame UpdateUIEditorWorkspaceCompose(
UIEditorWorkspaceComposeState& state,
const UIEditorWorkspaceComposeRequest& request,
const UIEditorPanelRegistry& panelRegistry,
const std::vector<UIEditorWorkspacePanelPresentationModel>& presentations,
const std::vector<::XCEngine::UI::UIInputEvent>& inputEvents,
const UIEditorWorkspaceInputOwner* inputOwner) {
UIEditorWorkspaceComposeFrame frame = {};
frame.dockHostLayout = request.dockHostLayout;
frame.contentHostFrame = UpdateUIEditorPanelContentHost(
state.contentHostState,
request.contentHostRequest,
panelRegistry);
TrimObsoleteViewportPresentationStates(state, panelRegistry, presentations);
frame.viewportFrames.reserve(request.viewportRequests.size());
for (const UIEditorWorkspacePanelPresentationModel& presentation : presentations) {
if (!SupportsExternalViewportPresentation(panelRegistry, presentation)) {
continue;
}
const UIEditorWorkspaceViewportComposeRequest* viewportRequest =
FindUIEditorWorkspaceViewportPresentationRequest(request, presentation.panelId);
if (viewportRequest == nullptr) {
ResetHiddenViewportPresentationState(state, presentation.panelId);
continue;
}
UIEditorWorkspacePanelPresentationState& panelState =
EnsurePanelState(state, presentation.panelId);
UIEditorWorkspaceViewportComposeFrame viewportFrame = {};
viewportFrame.panelId = presentation.panelId;
viewportFrame.bounds = viewportRequest->bounds;
viewportFrame.viewportShellModel = presentation.viewportShellModel;
UIEditorViewportInputBridgeRequest inputRequest = {};
if (inputOwner != nullptr) {
inputRequest.focusMode = UIEditorViewportInputBridgeFocusMode::External;
inputRequest.focused =
IsUIEditorWorkspaceViewportInputOwner(*inputOwner, presentation.panelId);
}
viewportFrame.viewportShellFrame = UpdateUIEditorViewportShell(
panelState.viewportShellState,
viewportRequest->viewportShellRequest,
presentation.viewportShellModel,
inputEvents,
inputRequest);
frame.viewportFrames.push_back(std::move(viewportFrame));
}
return frame;
}
UIEditorWorkspaceComposeFrame UpdateUIEditorWorkspaceCompose(
UIEditorWorkspaceComposeState& state,
const ::XCEngine::UI::UIRect& bounds,
@@ -202,60 +269,22 @@ UIEditorWorkspaceComposeFrame UpdateUIEditorWorkspaceCompose(
const Widgets::UIEditorDockHostMetrics& dockHostMetrics,
const Widgets::UIEditorViewportSlotMetrics& viewportMetrics,
const UIEditorWorkspaceInputOwner* inputOwner) {
UIEditorWorkspaceComposeFrame frame = {};
frame.dockHostLayout = BuildUIEditorDockHostLayout(
const UIEditorWorkspaceComposeRequest request = ResolveUIEditorWorkspaceComposeRequest(
bounds,
panelRegistry,
workspace,
session,
presentations,
dockHostState,
dockHostMetrics);
const UIEditorPanelContentHostRequest contentHostRequest =
ResolveUIEditorPanelContentHostRequest(
frame.dockHostLayout,
panelRegistry);
frame.contentHostFrame = UpdateUIEditorPanelContentHost(
state.contentHostState,
contentHostRequest,
panelRegistry);
TrimObsoleteViewportPresentationStates(state, panelRegistry, presentations);
for (const UIEditorWorkspacePanelPresentationModel& presentation : presentations) {
if (!SupportsExternalViewportPresentation(panelRegistry, presentation)) {
continue;
}
const UIEditorPanelContentHostPanelState* contentHostPanelState =
FindUIEditorPanelContentHostPanelState(frame.contentHostFrame, presentation.panelId);
if (contentHostPanelState == nullptr || !contentHostPanelState->mounted) {
ResetHiddenViewportPresentationState(state, presentation.panelId);
continue;
}
UIEditorWorkspacePanelPresentationState& panelState =
EnsurePanelState(state, presentation.panelId);
UIEditorWorkspaceViewportComposeFrame viewportFrame = {};
viewportFrame.panelId = presentation.panelId;
viewportFrame.bounds = contentHostPanelState->bounds;
viewportFrame.viewportShellModel = presentation.viewportShellModel;
UIEditorViewportInputBridgeRequest inputRequest = {};
if (inputOwner != nullptr) {
inputRequest.focusMode = UIEditorViewportInputBridgeFocusMode::External;
inputRequest.focused =
IsUIEditorWorkspaceViewportInputOwner(*inputOwner, presentation.panelId);
}
viewportFrame.viewportShellFrame = UpdateUIEditorViewportShell(
panelState.viewportShellState,
contentHostPanelState->bounds,
presentation.viewportShellModel,
inputEvents,
viewportMetrics,
inputRequest);
frame.viewportFrames.push_back(std::move(viewportFrame));
}
return frame;
dockHostMetrics,
viewportMetrics);
return UpdateUIEditorWorkspaceCompose(
state,
request,
panelRegistry,
presentations,
inputEvents,
inputOwner);
}
std::vector<std::string> CollectUIEditorWorkspaceComposeExternalBodyPanelIds(
@@ -295,7 +324,10 @@ void AppendUIEditorWorkspaceCompose(
viewportFrame.viewportShellModel.spec.statusSegments,
viewportFrame.viewportShellFrame.slotState,
viewportPalette,
viewportMetrics);
viewportMetrics,
Widgets::UIEditorViewportSlotForegroundAppendOptions{
options.includeViewportTextures
});
}
UIEditorDockHostForegroundOptions foregroundOptions = {};
@@ -322,4 +354,17 @@ void AppendUIEditorWorkspaceComposeOverlay(
dockHostMetrics);
}
void AppendUIEditorWorkspaceComposeViewportTextures(
::XCEngine::UI::UIDrawList& drawList,
const UIEditorWorkspaceComposeFrame& frame,
const Widgets::UIEditorViewportSlotPalette& viewportPalette) {
for (const UIEditorWorkspaceViewportComposeFrame& viewportFrame : frame.viewportFrames) {
Widgets::AppendUIEditorViewportSlotSurfaceTexture(
drawList,
viewportFrame.viewportShellFrame.slotLayout,
viewportFrame.viewportShellModel.frame,
viewportPalette);
}
}
} // namespace XCEngine::UI::Editor