#pragma once #include "EditorRuntimeMode.h" #include "SceneSnapshot.h" #include "Core/EditorEvents.h" #include #include #include namespace XCEngine { namespace Editor { class IEditorContext; class PlaySessionController { public: void Attach(IEditorContext& context); void Detach(IEditorContext& context); void Update(IEditorContext& context, float deltaTime); bool StartPlay(IEditorContext& context); bool StopPlay(IEditorContext& context); bool PausePlay(IEditorContext& context); bool ResumePlay(IEditorContext& context); bool StepPlay(IEditorContext& context); ::XCEngine::Components::Scene* GetRuntimeScene() const { return m_runtimeLoop.GetScene(); } private: void ResetRuntimeInputBridge(); void ApplyGameViewInputFrame(float deltaTime); void EnsureRuntimeSceneSyncSubscription(IEditorContext& context); void ClearRuntimeSceneSyncSubscription(IEditorContext& context); void SyncRuntimeSceneIfNeeded(IEditorContext& context); uint64_t m_playStartRequestedHandlerId = 0; uint64_t m_playStopRequestedHandlerId = 0; uint64_t m_playPauseRequestedHandlerId = 0; uint64_t m_playResumeRequestedHandlerId = 0; uint64_t m_playStepRequestedHandlerId = 0; uint64_t m_gameViewInputFrameHandlerId = 0; uint64_t m_runtimeSceneChangedHandlerId = 0; SceneSnapshot m_editorSnapshot = {}; GameViewInputFrameEvent m_pendingGameViewInput = {}; GameViewInputFrameEvent m_appliedGameViewInput = {}; bool m_hasPendingGameViewInput = false; XCEngine::Components::RuntimeLoop m_runtimeLoop; }; } // namespace Editor } // namespace XCEngine