Files
XCEngine/docs/api/XCEngine/Editor/panels/GameViewPanel/Render.md

2.8 KiB

GameViewPanel::Render

命名空间: XCEngine::Editor

类型: method

源文件: editor/src/panels/GameViewPanel.h

签名

void Render() override;

作用

绘制 Game 视口面板,并把当前帧 Game View 可见输入状态发布为 GameViewInputFrameEvent

当前实现行为

1. 建立面板外壳

  • 先把 ImGuiStyleVar_WindowBorderSize 压成 0.0f
  • 打开 UI::PanelWindowScope("Game")

这一步只负责建立 Game 面板窗口本身,不包含工具栏或额外控制区。

2. 面板关闭时主动发布空事件

如果 panel.IsOpen() == false,当前实现不会静默返回,而是先执行:

PublishGameViewInputFrame(m_context, GameViewInputFrameEvent{});

然后再返回。

这条路径的意义是:

  • 明确告诉下游“这一帧没有有效 Game View 输入”
  • PlaySessionController 在下一帧桥接时释放之前保持的运行时按键和鼠标按钮状态

3. 请求 Game 视口内容

当面板打开时,会调用:

RenderViewportPanelContent(*m_context, EditorViewportKind::Game);

得到 ViewportPanelContentResult,其中包含:

  • 视口区域是否存在
  • hovered
  • focused
  • 视口内容矩形范围

这些信息随后会被用来构造 GameViewInputFrameEvent

4. 构造输入快照

BuildGameViewInputFrame(content) 当前会按真实源码执行以下规则:

  • content.hasViewportArea == false 时,直接返回空事件
  • mousePosition 使用 io.MousePos - content.itemMin,也就是 Game View 局部坐标
  • mouseDelta 直接取 io.MouseDelta
  • mouseWheel 只有在 content.hovered == true 时才保留,否则强制写 0.0f
  • 只有在 hovered || focused 时,才填充:
    • 键盘映射表覆盖到的 keyDown
    • Left / Right / Middle 三个鼠标按钮的 mouseButtonDown

5. 发布事件并继续动作观察

构造完成后会立即:

  1. context->GetEventBus().Publish(event)
  2. Actions::ObserveInactiveActionRoute(*m_context)

这说明 Render() 不是只负责画图,它同时还是当前 Game View 输入桥的事件源头。

当前实现边界

  • 当前不绘制 play / pause / step 工具条。
  • 当前发布的是状态快照,不是字符输入或原始平台消息。
  • 当前键盘采样只覆盖 GameViewPanel.cpp 里维护的那张固定映射表,不是任意 ImGuiKey 都会桥接。

相关文档