#pragma once #include "Platform/D3D12WindowRenderer.h" #include "UI/ImGuiBackendBridge.h" #include "UI/ImGuiSession.h" #include "Viewport/ViewportHostService.h" #include #include #include #include #include namespace XCEngine { namespace RHI { class RHIDevice; class RHISwapChain; } // namespace RHI namespace Editor { class EditorLayer; class IEditorContext; class Application { public: static Application& Get(); bool Initialize(HWND hwnd); void Shutdown(); void Render(); void OnResize(int width, int height); bool SwitchProject(const std::string& projectPath); void SaveProjectState(); Rendering::RenderContext GetMainRenderContext() const { return m_windowRenderer.GetRenderContext(); } RHI::RHIDevice* GetMainRHIDevice() const { return m_windowRenderer.GetRHIDevice(); } RHI::RHISwapChain* GetMainSwapChain() const { return m_windowRenderer.GetSwapChain(); } IViewportHostService& GetViewportHostService() { return m_viewportHostService; } bool IsRenderReady() const { return m_renderReady; } HWND GetWindowHandle() const { return m_hwnd; } IEditorContext& GetEditorContext() const { return *m_editorContext; } private: Application() = default; ~Application() = default; bool InitializeWindowRenderer(HWND hwnd); void InitializeEditorContext(const std::string& projectPath); void InitializeImGui(HWND hwnd); void AttachEditorLayer(); void DetachEditorLayer(); void ShutdownEditorContext(); void RenderEditorFrame(); void UpdateWindowTitle(); HWND m_hwnd = nullptr; Core::LayerStack m_layerStack; EditorLayer* m_editorLayer = nullptr; std::shared_ptr m_editorContext; Platform::D3D12WindowRenderer m_windowRenderer; UI::ImGuiBackendBridge m_imguiBackend; UI::ImGuiSession m_imguiSession; ViewportHostService m_viewportHostService; uint64_t m_exitRequestedHandlerId = 0; std::wstring m_lastWindowTitle; bool m_renderReady = false; }; } }