]> git.mxchange.org Git - flightgear.git/commitdiff
Merge branch 'next' of gitorious.org:fg/flightgear into next
authorCurtis L. Olson <curt0001@flightgear.org>
Mon, 16 May 2011 14:05:52 +0000 (09:05 -0500)
committerCurtis L. Olson <curt0001@flightgear.org>
Mon, 16 May 2011 14:05:52 +0000 (09:05 -0500)
src/Aircraft/replay.cxx
src/Aircraft/replay.hxx
src/FDM/JSBSim/JSBSim.cxx
src/Main/fg_commands.cxx

index d5deeecd2b267652ac335c324804755c29af09bb..2baf32855739aa928f55908d0ebaf617a85a8b85 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,28 @@ 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
+                double current_time = replay_time->getDoubleValue();
+                if (current_time<0.0)
+                {
+                    // initialize start time
+                    fgSetDouble( "/sim/replay/start-time", get_start_time() );
+                    fgSetDouble( "/sim/replay/end-time", get_end_time() );
+                    double duration = fgGetDouble( "/sim/replay/duration" );
+                    if( duration && duration < (get_end_time() - get_start_time()) ) {
+                        current_time = get_end_time() - duration;
+                    } else {
+                        current_time = get_start_time();
+                    }
+                }
+                bool IsFinished = replay( replay_time->getDoubleValue() );
+                if ((IsFinished)&&(replay_looped->getBoolValue()))
+                    current_time = -1;
+                else
+                    current_time += dt * fgGetInt("/sim/speed-up");
+                replay_time->setDoubleValue(current_time);
+            }
             return; // don't record the replay session 
         case 2:
             // replay paused, no-op
@@ -279,7 +298,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 +577,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 +591,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 +646,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;
 };
 
 
index 4c6ad3f04357ddc5b50733654ae7b7bfae4ac0ef..806401cf9654f80587ff61cb2c28222b47a21a6e 100644 (file)
@@ -729,7 +729,7 @@ bool FGJSBsim::copy_to_JSBsim()
             // turbulence_gain normalized: 0: none, 1/3: light, 2/3: moderate, 3/3: severe
             double tmp = turbulence_gain->getDoubleValue();
             Atmosphere->SetProbabilityOfExceedence(
-              round(TurbulenceSeverityTable.GetValue( tmp ) )
+              SGMiscd::roundToInt(TurbulenceSeverityTable.GetValue( tmp ) )
             );
             Atmosphere->SetWindspeed20ft(ground_wind->getDoubleValue());
             break;
index 8f7a1c18cab9ebb2ca620b7188244e0c520152fe..45d4b901b5a14f39974ef458547e57763b21f3b8 100644 (file)
@@ -1247,17 +1247,7 @@ do_replay (const SGPropertyNode * arg)
     fgSetInt( "/sim/freeze/replay-state", 1 );
     fgSetBool("/sim/freeze/master", 0 );
     fgSetBool("/sim/freeze/clock", 0 );
-
-    FGReplay *r = (FGReplay *)(globals->get_subsystem( "replay" ));
-
-    fgSetDouble( "/sim/replay/start-time", r->get_start_time() );
-    fgSetDouble( "/sim/replay/end-time", r->get_end_time() );
-    double duration = fgGetDouble( "/sim/replay/duration" );
-    if( duration && duration < (r->get_end_time() - r->get_start_time()) ) {
-        fgSetDouble( "/sim/replay/time", r->get_end_time() - duration );
-    } else {
-        fgSetDouble( "/sim/replay/time", r->get_start_time() );
-    }
+    fgSetDouble( "/sim/replay/time", -1 );
 
     // cout << "start = " << r->get_start_time()
     //      << "  end = " << r->get_end_time() << endl;