// // Editor:docking 编辑器骨架。 // // 职责: // - 顶栏菜单(File/View)+ 全屏 DockSpace + 首帧默认布局(DockBuilder) // - 实体选中状态(entt::entity,Hierarchy 写 / Inspector 读) // - 退出确认模态框(窗口关闭 → RequestQuit → Yes 时 Close) // // 面板窗口名(Hierarchy/Inspector/Viewport/Stats)即 docking 身份, // imgui.ini 持久化布局;默认布局只在 dock node 为空时构建一次。 // #ifndef HELLOVULKAN_EDITOR_H #define HELLOVULKAN_EDITOR_H #include "EditorContext.h" #include "ViewportPanel.h" // ViewportInputState(成员按值持有) #include // u32(SelectEntity 位模式转换) #include #include class HierarchyPanel; class InspectorPanel; class ViewportPanel; class StatsPanel; class Editor { public: Editor(); ~Editor(); Editor(const Editor&) = delete; Editor& operator=(const Editor&) = delete; // 注入上下文(OnInit 阶段,指针必须全部有效) void Init(const EditorContext& ctx); // 每帧 UI 构建(OnImGuiRender 唯一入口) void Draw(); // ---- 输入归属判定(Window 层输入捕获谓词;UE/Unity 的 // "viewport 持焦才拥有输入" 语义,ImGui 侧经自身后端 // 链式回调永远正常收输入)---- // 键盘:编辑器形态 = Viewport 持焦且不在文本输入中;游戏形态 // (Fullscreen)只在文本输入中让位(打字不触发快捷键) bool BlockingKeyboard() const; // 鼠标:编辑器形态 = 悬停 Viewport 才放行;Gizmo 拖拽中一律拦截 // (抓杆时相机不能吃鼠标);游戏形态沿用 WantCaptureMouse bool BlockingMouse() const; // 请求退出(弹确认框;窗口关闭事件走这里) void RequestQuit() { m_ShowQuitConfirm = true; } // ---- 选中状态 ---- // 同步描边:Renderer 落帧后 SelectionMask/Outline 只画选中实体 //(bits = 实体位模式,0 = 清选中) void SelectEntity(entt::entity e) { m_Selected = e; if (m_Ctx.renderer) { m_Ctx.renderer->SetSelectedEntity( e == entt::null ? 0u : static_cast(entt::to_integral(e))); } } entt::entity GetSelected() const { return m_Selected; } private: void DrawMenuBar(); // host 窗口内顶栏 void DrawDockSpace(); // 全屏 host + dockspace + 默认布局 void DrawQuitModal(); // 退出确认模态框 EditorContext m_Ctx{}; ViewportInputState m_VpInput{}; // Viewport 面板 hover/focus(每帧刷新) GizmoState m_Gizmo{}; // 视口操纵杆状态(op/拖拽中) std::unique_ptr m_Hierarchy; std::unique_ptr m_Inspector; std::unique_ptr m_Viewport; std::unique_ptr m_Stats; entt::entity m_Selected{entt::null}; // 面板显隐(View 菜单) bool m_ShowHierarchy = true; bool m_ShowInspector = true; bool m_ShowViewport = true; bool m_ShowStats = true; // 默认布局只建一次(imgui.ini 已有布局则跳过) bool m_LayoutBuilt = false; // 退出确认链 bool m_ShowQuitConfirm = false; bool m_QuitConfirmed = false; }; #endif //HELLOVULKAN_EDITOR_H