]> git.mxchange.org Git - flightgear.git/commitdiff
Looped replay feature
authorThorstenB <brehmt@gmail.com>
Sat, 14 May 2011 07:17:51 +0000 (09:17 +0200)
committerThorstenB <brehmt@gmail.com>
Sat, 14 May 2011 07:17:51 +0000 (09:17 +0200)
New option for continuously repeated replay
(LinuxTag FlightGear demo mode :) )

src/Aircraft/replay.cxx
src/Aircraft/replay.hxx

index d5deeecd2b267652ac335c324804755c29af09bb..890931a08b593dee4aba51877ec45ba0e44db96f 100644 (file)
@@ -100,6 +100,7 @@ void FGReplay::init()
     disable_replay = fgGetNode( "/sim/replay/disable", true );
     replay_master = fgGetNode( "/sim/freeze/replay-state", true );
     replay_time = fgGetNode( "/sim/replay/time", true);
+    replay_looped = fgGetNode( "/sim/replay/looped", true);
     reinit();
 }
 
@@ -194,10 +195,15 @@ void FGReplay::update( double dt )
             // replay inactive, keep recording
             break;
         case 1:
-            // replay active
-            replay( replay_time->getDoubleValue() );
-            replay_time->setDoubleValue( replay_time->getDoubleValue()
-                                         + ( dt * fgGetInt("/sim/speed-up") ) );
+            {
+                // replay active
+                bool IsFinished = replay( replay_time->getDoubleValue() );
+                if ((IsFinished)&&(replay_looped->getBoolValue()))
+                    replay_time->setDoubleValue(0.0);
+                else
+                    replay_time->setDoubleValue( replay_time->getDoubleValue()
+                                                 + ( dt * fgGetInt("/sim/speed-up") ) );
+            }
             return; // don't record the replay session 
         case 2:
             // replay paused, no-op
@@ -279,7 +285,7 @@ void FGReplay::update( double dt )
 
                     FGReplayData *lt_front = long_term.front();
                     if ( sim_time - lt_front->sim_time > lt_list_time ) {
-                       //stamp("point_10");
+                        //stamp("point_10");
                         while ( sim_time - lt_front->sim_time > lt_list_time ) {
                             lt_front = long_term.front();
                             recycler.push_back(lt_front);
@@ -558,9 +564,10 @@ static void interpolate( double time, const replay_list_type &list ) {
 /** 
  *  Replay a saved frame based on time, interpolate from the two
  *  nearest saved frames.
+ *  Returns true when replay sequence has finished, false otherwise.
  */
 
-void FGReplay::replay( double time ) {
+bool FGReplay::replay( double time ) {
     // cout << "replay: " << time << " ";
     // find the two frames to interpolate between
     double t1, t2;
@@ -571,6 +578,8 @@ void FGReplay::replay( double time ) {
         if ( time > t1 ) {
             // replay the most recent frame
             update_fdm( (*short_term.back()) );
+            // replay is finished now
+            return true;
             // cout << "first frame" << endl;
         } else if ( time <= t1 && time >= t2 ) {
             interpolate( time, short_term );
@@ -624,7 +633,9 @@ void FGReplay::replay( double time ) {
         }
     } else {
         // nothing to replay
+        return true;
     }
+    return false;
 }
 
 
index 3ad3aed0c69bdf3c69e72317c50fb2bf394cd8ba..0d48ff4ef2ac4c97f924a0c44c0e619b49fd5f17 100644 (file)
@@ -74,7 +74,7 @@ public:
     virtual void unbind();
     virtual void update( double dt );
 
-    void replay( double time );
+    bool replay( double time );
     double get_start_time();
     double get_end_time();
     
@@ -101,6 +101,7 @@ private:
     SGPropertyNode_ptr disable_replay;
     SGPropertyNode_ptr replay_master;
     SGPropertyNode_ptr replay_time;
+    SGPropertyNode_ptr replay_looped;
 };