]> git.mxchange.org Git - simgear.git/blobdiff - simgear/props/PropertyInterpolationMgr.cxx
canvas::Layout: support for contents margins.
[simgear.git] / simgear / props / PropertyInterpolationMgr.cxx
index 60ff32244597712f7340ee9ec1d8235535737591..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 )
@@ -48,7 +51,7 @@ namespace simgear
       for(double unused_time = dt;;)
       {
         PropertyInterpolatorRef interp = it->second;
-        unused_time = interp->update(it->first, unused_time);
+        unused_time = interp->update(*it->first, unused_time);
 
         if( unused_time <= 0.0 )
           // No time left for next animation
@@ -86,9 +89,9 @@ namespace simgear
   };
 
   //----------------------------------------------------------------------------
-  PropertyInterpolatorRef
+  PropertyInterpolator*
   PropertyInterpolationMgr::createInterpolator( const std::string& type,
-                                                const SGPropertyNode* target,
+                                                const SGPropertyNode& target,
                                                 double duration,
                                                 const std::string& easing )
   {
@@ -117,7 +120,7 @@ namespace simgear
       return 0;
     }
 
-    PropertyInterpolatorRef interp;
+    PropertyInterpolator* interp;
     interp = (*interpolator_factory->second)();
     interp->reset(target);
     interp->_type = type;
@@ -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,6 +164,52 @@ namespace simgear
     }
     else
       _interpolators.push_front( std::make_pair(prop, interp) );
+
+    return true;
+  }
+
+  //----------------------------------------------------------------------------
+  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,
+                                              const std::string& easing )
+  {
+    if( values.size() != deltas.size() )
+      SG_LOG(SG_GENERAL, SG_WARN, "interpolate: sizes do not match");
+
+    size_t num_values = std::min(values.size(), deltas.size());
+    PropertyInterpolatorRef first_interp, cur_interp;
+    for(size_t i = 0; i < num_values; ++i)
+    {
+      assert(values[i]);
+
+      PropertyInterpolator* interp =
+        createInterpolator(type, *values[i], deltas[i], easing);
+
+      if( !first_interp )
+        first_interp = interp;
+      else
+        cur_interp->_next = interp;
+
+      cur_interp = interp;
+    }
+
+    return interpolate(prop, first_interp);
   }
 
   //----------------------------------------------------------------------------
@@ -186,4 +246,10 @@ namespace simgear
     _easing_functions[type] = func;
   }
 
+  //----------------------------------------------------------------------------
+  void PropertyInterpolationMgr::setRealtimeProperty(SGPropertyNode* node)
+  {
+    _rt_prop = node;
+  }
+
 } // namespace simgear