MetaCore/MetaEditor/DearImGuiEditorShell.h
2026-03-19 18:01:50 +08:00

76 lines
3.2 KiB
C++

#pragma once
#include "MetaEditor/IEditorShell.h"
#include <filesystem>
#include <cstdint>
#include <windows.h>
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