2.8 KiB
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,其中包含:
- 视口区域是否存在
hoveredfocused- 视口内容矩形范围
这些信息随后会被用来构造 GameViewInputFrameEvent。
4. 构造输入快照
BuildGameViewInputFrame(content) 当前会按真实源码执行以下规则:
content.hasViewportArea == false时,直接返回空事件mousePosition使用io.MousePos - content.itemMin,也就是 Game View 局部坐标mouseDelta直接取io.MouseDeltamouseWheel只有在content.hovered == true时才保留,否则强制写0.0f- 只有在
hovered || focused时,才填充:- 键盘映射表覆盖到的
keyDown - Left / Right / Middle 三个鼠标按钮的
mouseButtonDown
- 键盘映射表覆盖到的
5. 发布事件并继续动作观察
构造完成后会立即:
context->GetEventBus().Publish(event)Actions::ObserveInactiveActionRoute(*m_context)
这说明 Render() 不是只负责画图,它同时还是当前 Game View 输入桥的事件源头。
当前实现边界
- 当前不绘制 play / pause / step 工具条。
- 当前发布的是状态快照,不是字符输入或原始平台消息。
- 当前键盘采样只覆盖
GameViewPanel.cpp里维护的那张固定映射表,不是任意ImGuiKey都会桥接。