Browse Source

restore player pause and step

JimMarlowe 9 years ago
parent
commit
8652f38125
2 changed files with 74 additions and 3 deletions
  1. 49 3
      Source/Atomic/Engine/Engine.cpp
  2. 25 0
      Source/Atomic/Engine/Engine.h

+ 49 - 3
Source/Atomic/Engine/Engine.cpp

@@ -111,7 +111,11 @@ Engine::Engine(Context* context) :
     initialized_(false),
     initialized_(false),
     exiting_(false),
     exiting_(false),
     headless_(false),
     headless_(false),
-    audioPaused_(false)
+    audioPaused_(false),
+    // ATOMIC BEGIN    
+    paused_(false),
+    runNextPausedFrame_(false)
+    // ATOMIC END
 {
 {
     // Register self as a subsystem
     // Register self as a subsystem
     context_->RegisterSubsystem(this);
     context_->RegisterSubsystem(this);
@@ -150,6 +154,10 @@ Engine::Engine(Context* context) :
 #endif
 #endif
 
 
     SubscribeToEvent(E_EXITREQUESTED, ATOMIC_HANDLER(Engine, HandleExitRequested));
     SubscribeToEvent(E_EXITREQUESTED, ATOMIC_HANDLER(Engine, HandleExitRequested));
+    // ATOMIC BEGIN    
+    SubscribeToEvent(E_PAUSERESUMEREQUESTED, ATOMIC_HANDLER(Engine, HandlePauseResumeRequested));
+    SubscribeToEvent(E_PAUSESTEPREQUESTED, ATOMIC_HANDLER(Engine, HandlePauseStepRequested));
+    // ATOMIC END
 }
 }
 
 
 Engine::~Engine()
 Engine::~Engine()
@@ -469,8 +477,10 @@ void Engine::RunFrame()
 
 
     time->BeginFrame(timeStep_);
     time->BeginFrame(timeStep_);
 
 
-    // If pause when minimized -mode is in use, stop updates and audio as necessary
-    if (pauseMinimized_ && input->IsMinimized())
+// ATOMIC BEGIN
+    // If paused, or pause when minimized -mode is in use, stop updates and audio as necessary
+    if ((paused_ && !runNextPausedFrame_) ||
+        (pauseMinimized_ && input->IsMinimized()))
     {
     {
         if (audio->IsPlaying())
         if (audio->IsPlaying())
         {
         {
@@ -486,9 +496,15 @@ void Engine::RunFrame()
             audio->Play();
             audio->Play();
             audioPaused_ = false;
             audioPaused_ = false;
         }
         }
+        
+        // Only run one frame when stepping
+        runNextPausedFrame_ = false;
 
 
         Update();
         Update();
+
     }
     }
+// ATOMIC END
+
 
 
     Render();
     Render();
     ApplyFrameLimit();
     ApplyFrameLimit();
@@ -982,6 +998,36 @@ void Engine::DoExit()
 
 
 // ATOMIC BEGIN
 // ATOMIC BEGIN
 
 
+void Engine::SetPaused(bool paused)
+{
+    paused_ = paused;
+
+    using namespace UpdatesPaused;
+
+    // Updates paused event
+    VariantMap& eventData = GetEventDataMap();
+    eventData[P_PAUSED] = paused_;
+    SendEvent(E_UPDATESPAUSEDRESUMED, eventData);
+}
+
+void Engine::SetRunNextPausedFrame(bool run)
+{
+    runNextPausedFrame_ = run;
+}
+
+void Engine::HandlePauseResumeRequested(StringHash eventType, VariantMap& eventData)
+{
+    SetPaused(!IsPaused());
+}
+
+void Engine::HandlePauseStepRequested(StringHash eventType, VariantMap& eventData)
+{
+    if (IsPaused())
+    {
+        SetRunNextPausedFrame(true);
+    }
+}
+
 bool Engine::GetDebugBuild() const
 bool Engine::GetDebugBuild() const
 {
 {
 #ifdef ATOMIC_DEBUG
 #ifdef ATOMIC_DEBUG

+ 25 - 0
Source/Atomic/Engine/Engine.h

@@ -120,12 +120,29 @@ public:
 
 
 
 
     // ATOMIC BEGIN
     // ATOMIC BEGIN
+    /// Set whether the engine is paused.
+    void SetPaused(bool paused);
+    /// Set whether to run the next frame even if paused (for stepping frame by frame)
+    void SetRunNextPausedFrame(bool run);
+     /// Return whether the engine is paused.
+    bool IsPaused() const { return paused_; }
+    /// Return whether to run the next frame even if paused (for stepping frame by frame)
+    bool GetRunNextPausedFrame() const { return runNextPausedFrame_; }
+   
+    
     bool GetDebugBuild() const;
     bool GetDebugBuild() const;
     // ATOMIC END
     // ATOMIC END
 
 
 private:
 private:
     /// Handle exit requested event. Auto-exit if enabled.
     /// Handle exit requested event. Auto-exit if enabled.
     void HandleExitRequested(StringHash eventType, VariantMap& eventData);
     void HandleExitRequested(StringHash eventType, VariantMap& eventData);
+    // ATOMIC BEGIN
+    /// Handle Pause or Resume requested event.
+    void HandlePauseResumeRequested(StringHash eventType, VariantMap& eventData);
+    /// Handle Single Step requested event.
+    void HandlePauseStepRequested(StringHash eventType, VariantMap& eventData);
+    // ATOMIC END
+
     /// Actually perform the exit actions.
     /// Actually perform the exit actions.
     void DoExit();
     void DoExit();
 
 
@@ -159,6 +176,14 @@ private:
     bool headless_;
     bool headless_;
     /// Audio paused flag.
     /// Audio paused flag.
     bool audioPaused_;
     bool audioPaused_;
+    
+    // ATOMIC BEGIN
+    /// Engine paused flag
+    bool paused_;
+    /// Whether to run the next frame even if paused (for stepping frame by frame)
+    bool runNextPausedFrame_;
+    // ATOMIC END
+   
 };
 };
 
 
 }
 }