#pragma once #ifndef NOMINMAX #define NOMINMAX #endif #include #include "Product/Core/Environment/EditorRuntimePaths.h" #include #include namespace XCEngine::UI::Editor { namespace Host { class D3D12EditorWindowRenderRuntimeFactory; class EditorHostResourceService; } namespace System { class SystemInteractionService; } class EditorWindowSystem; namespace App { class EngineEditorComposition; class EditorProductRuntime; class EditorWindowManager; class EditorWindowHostRuntime; struct EditorCompositionRootInitializeParams { HINSTANCE hInstance = nullptr; int showCommand = SW_SHOWNORMAL; const wchar_t* windowClassName = nullptr; DWORD windowStyle = 0; const wchar_t* primaryWindowTitle = nullptr; void* windowUserData = nullptr; EditorRuntimePaths runtimePaths = {}; std::unique_ptr resourceService = {}; }; class EditorCompositionRoot final { public: EditorCompositionRoot(); ~EditorCompositionRoot(); EditorCompositionRoot(const EditorCompositionRoot&) = delete; EditorCompositionRoot& operator=(const EditorCompositionRoot&) = delete; EditorCompositionRoot(EditorCompositionRoot&&) = delete; EditorCompositionRoot& operator=(EditorCompositionRoot&&) = delete; bool Initialize(EditorCompositionRootInitializeParams params); void Shutdown(); const std::string& GetValidationMessage() const; void HandlePendingNativeWindowCreated(HWND hwnd); bool TryDispatchWindowMessage( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT& outResult); bool TickFrame(); bool RequestPrimaryWindowClose(); private: std::unique_ptr m_productRuntime = {}; std::unique_ptr m_engineComposition = {}; std::unique_ptr m_windowSystem = {}; std::unique_ptr m_windowHostRuntime = {}; std::unique_ptr m_renderRuntimeFactory = {}; std::unique_ptr m_resourceService = {}; std::unique_ptr m_systemInteractionHost = {}; std::unique_ptr m_windowManager = {}; std::string m_validationMessage = {}; }; } // namespace App } // namespace XCEngine::UI::Editor