PIE: viewport-embedded playback with UE-style main toolbar
Play no longer switches to fullscreen direct rendering: PIE now keeps the editor UI alive and renders the primary camera into the Viewport panel (new SceneRenderer::SetGameView flag; kDisplayDirect stays a manual fullscreen preview for later release form). Editor camera stops being driven during PIE, and viewport click-pick is gated off while playing (clicks are game input now). The Play/Stop buttons move out of the menu bar into a dedicated main toolbar row below it (centered, UE Main Toolbar semantics): green Play when idle; Pause (yellow, highlighted while paused) + Stop (orange) while playing. Ctrl+P hotkey kept. Stats "Pause Simulation" merged into the toolbar Pause; viewport overlay shows PAUSED accordingly.
This commit is contained in:
@@ -69,12 +69,14 @@ namespace
|
||||
|
||||
// 视图相机分派(必须与 SceneRenderer::BuildFrame 渲染源同一规则,
|
||||
// 否则 Gizmo 杆与画面错位):编辑器形态 = EditorCamera(Scene view
|
||||
// 专用,与相机实体无关);游戏形态 = primary 相机实体。
|
||||
// 专用,与相机实体无关);游戏形态(kDisplayDirect 全屏预览或 PIE
|
||||
// 内嵌播放)= primary 相机实体。
|
||||
// 返回 nullptr = 游戏形态且无 primary 相机(本帧无 Gizmo)
|
||||
Engine::Camera* ViewCamera(const EditorContext& ctx,
|
||||
ECS::TransformComponent*& outT)
|
||||
{
|
||||
if (ctx.renderer->GetDisplayMode() == kDisplayViewport)
|
||||
const bool playing = ctx.playState && *ctx.playState;
|
||||
if (!playing && ctx.renderer->GetDisplayMode() == kDisplayViewport)
|
||||
{
|
||||
outT = &ctx.editorCamera->GetTransform();
|
||||
return &ctx.editorCamera->GetController();
|
||||
@@ -281,12 +283,14 @@ std::optional<entt::entity> ViewportPanel::Draw(const EditorContext &ctx,
|
||||
}
|
||||
|
||||
// Gizmo 状态提示(左上角 drawlist 叠加,原因同下:不占布局行)
|
||||
// PIE 运行态 = 黄色 PLAYING 提示替代编辑状态
|
||||
// PIE 运行态 = 黄色 PLAYING/PAUSED 提示替代编辑状态
|
||||
{
|
||||
char tip[64];
|
||||
if (playing) {
|
||||
const bool paused = ctx.pausedState && *ctx.pausedState;
|
||||
std::snprintf(tip, sizeof(tip),
|
||||
"PLAYING - Ctrl+P to stop");
|
||||
paused ? "PAUSED - Ctrl+P to stop"
|
||||
: "PLAYING - Ctrl+P to stop");
|
||||
} else {
|
||||
std::snprintf(tip, sizeof(tip),
|
||||
"Space: %s [T] Snap: Ctrl",
|
||||
@@ -335,8 +339,9 @@ std::optional<entt::entity> ViewportPanel::Draw(const EditorContext &ctx,
|
||||
|
||||
// 点击拾取:单击 Image 且未命中 UI 遮挡(IsItemHovered 已含)。
|
||||
// 抓杆时不出 pick(IsOver 悬停杆/IsUsing 拖拽中)——否则按在
|
||||
// 操纵杆上的点击会穿透发拾取请求
|
||||
if (ImGui::IsItemHovered() && ImGui::IsMouseClicked(0) &&
|
||||
// 操纵杆上的点击会穿透发拾取请求。PIE 运行态不出拾取:
|
||||
// 点击 = 游戏输入(UE Play 语义,编辑操作冻结)
|
||||
if (!playing && ImGui::IsItemHovered() && ImGui::IsMouseClicked(0) &&
|
||||
!ImGuizmo::IsOver() && !ImGuizmo::IsUsing()) {
|
||||
RequestPickAt(ctx, size);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user