]> git.mxchange.org Git - simgear.git/blobdiff - simgear/props/PropertyInterpolationMgr.cxx
cppbind: automatic conversion of SGReferenced derived pointers.
[simgear.git] / simgear / props / PropertyInterpolationMgr.cxx
index e0591e609cbbaca3fdeb5262d88e5edfa85bdb01..ad8060e2f59f8d3bb0413cd23e5ba4dad5cc5d34 100644 (file)
@@ -41,6 +41,9 @@ namespace simgear
   //----------------------------------------------------------------------------
   void PropertyInterpolationMgr::update(double dt)
   {
+    if( _rt_prop )
+      dt = _rt_prop->getDoubleValue();
+
     for( InterpolatorList::iterator it = _interpolators.begin();
                                     it != _interpolators.end();
                                   ++it )
@@ -128,9 +131,12 @@ namespace simgear
   }
 
   //----------------------------------------------------------------------------
-  void PropertyInterpolationMgr::interpolate( SGPropertyNode* prop,
+  bool PropertyInterpolationMgr::interpolate( SGPropertyNode* prop,
                                               PropertyInterpolatorRef interp )
   {
+    if( !prop )
+      return false;
+
     // Search for active interpolator on given property
     InterpolatorList::iterator it = std::find_if
     (
@@ -139,6 +145,14 @@ namespace simgear
       PredicateIsSameProp(prop)
     );
 
+    if( !interp )
+    {
+      // Without new interpolator just remove old one
+      if( it != _interpolators.end() )
+        _interpolators.erase(it);
+      return true;
+    }
+
     if( it != _interpolators.end() )
     {
       // Ensure no circular reference is left
@@ -150,10 +164,26 @@ namespace simgear
     }
     else
       _interpolators.push_front( std::make_pair(prop, interp) );
+
+    return true;
   }
 
   //----------------------------------------------------------------------------
-  void PropertyInterpolationMgr::interpolate( SGPropertyNode* prop,
+  bool PropertyInterpolationMgr::interpolate( SGPropertyNode* prop,
+                                              const std::string& type,
+                                              const SGPropertyNode& target,
+                                              double duration,
+                                              const std::string& easing )
+  {
+    return interpolate
+    (
+      prop,
+      createInterpolator(type, target, duration, easing)
+    );
+  }
+
+  //----------------------------------------------------------------------------
+  bool PropertyInterpolationMgr::interpolate( SGPropertyNode* prop,
                                               const std::string& type,
                                               const PropertyList& values,
                                               const double_list& deltas,
@@ -163,12 +193,6 @@ namespace simgear
       SG_LOG(SG_GENERAL, SG_WARN, "interpolate: sizes do not match");
 
     size_t num_values = std::min(values.size(), deltas.size());
-    if( !num_values )
-    {
-      SG_LOG(SG_GENERAL, SG_WARN, "interpolate: no values");
-      return;
-    }
-
     PropertyInterpolatorRef first_interp, cur_interp;
     for(size_t i = 0; i < num_values; ++i)
     {
@@ -185,7 +209,7 @@ namespace simgear
       cur_interp = interp;
     }
 
-    interpolate(prop, first_interp);
+    return interpolate(prop, first_interp);
   }
 
   //----------------------------------------------------------------------------
@@ -222,4 +246,10 @@ namespace simgear
     _easing_functions[type] = func;
   }
 
+  //----------------------------------------------------------------------------
+  void PropertyInterpolationMgr::setRealtimeProperty(SGPropertyNode* node)
+  {
+    _rt_prop = node;
+  }
+
 } // namespace simgear