#pragma once #include "MetaEditor/IEditorShell.h" #include #include #include namespace metacore::editor { class DearImGuiEditorShell final : public IEditorShell { public: bool initialize() override; void shutdown() override; void consume_snapshot(const EditorFrameSnapshot& snapshot) override; [[nodiscard]] bool initialized() const override; [[nodiscard]] const EditorFrameSnapshot& last_snapshot() const override; [[nodiscard]] std::string summarize_snapshot() const override; [[nodiscard]] std::string describe_workspace() const override; [[nodiscard]] std::string shell_name() const override; [[nodiscard]] PendingShellEdits consume_pending_edits() override; [[nodiscard]] metacore::engine::render::UiDrawFrame consume_render_frame() override; void configure_platform_window(std::uintptr_t native_window_handle, int width, int height); void refresh_platform_window_metrics(int width, int height); void set_debug_export_path(std::filesystem::path path); private: friend LRESULT CALLBACK metacore_imgui_shell_wnd_proc(HWND hwnd, UINT message, WPARAM w_param, LPARAM l_param); void initialize_imgui_context(); void shutdown_imgui_context(); void enqueue_headless_gizmo_state_edit(const EditorFrameSnapshot& snapshot); void enqueue_headless_transform_edit(const EditorFrameSnapshot& snapshot); void render_imgui_frame(const EditorFrameSnapshot& snapshot); void render_dockspace_frame(const EditorFrameSnapshot& snapshot); void ensure_default_dock_layout(const EditorFrameSnapshot& snapshot, unsigned int dockspace_id); void render_toolbar(const EditorFrameSnapshot& snapshot); void render_panel(const metacore::engine::editor_core::DockPanel& panel, const EditorFrameSnapshot& snapshot); void render_hierarchy_panel(const EditorFrameSnapshot& snapshot); void render_project_panel(const EditorFrameSnapshot& snapshot); void render_viewport_panel(const EditorFrameSnapshot& snapshot); void render_inspector_panel(const EditorFrameSnapshot& snapshot); void render_console_panel(const EditorFrameSnapshot& snapshot); void render_runtime_preview_panel(const EditorFrameSnapshot& snapshot); void export_debug_snapshot() const; void export_viewport_snapshot(std::ostringstream& stream) const; void capture_render_frame(); void fulfill_texture_requests(); bool initialized_ = false; EditorFrameSnapshot last_snapshot_{}; std::filesystem::path debug_export_path_{}; int last_draw_command_count_ = 0; int last_vertex_count_ = 0; int last_index_count_ = 0; int last_window_count_ = 0; bool headless_frame_enabled_ = false; bool dock_layout_initialized_ = false; bool headless_gizmo_override_consumed_ = false; bool headless_transform_override_consumed_ = false; bool imgui_context_owned_ = false; bool win32_backend_enabled_ = false; HWND native_window_handle_ = nullptr; int native_window_width_ = 0; int native_window_height_ = 0; WNDPROC previous_wnd_proc_ = nullptr; PendingShellEdits pending_edits_{}; metacore::engine::render::UiDrawFrame pending_render_frame_{}; std::uintptr_t next_mock_texture_id_ = 1; }; } // namespace metacore::editor