]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/fg_commands.cxx
Sink position-init code into its own file.
[flightgear.git] / src / Main / fg_commands.cxx
index 9c11836aebff2b2802505bf3983ac710fb2d77a6..f9efa5b4794b83b039dbdafe4541f80ab5ceb5b1 100644 (file)
@@ -49,6 +49,7 @@
 #include "logger.hxx"
 #include "util.hxx"
 #include "main.hxx"
+#include "positioninit.hxx"
 
 #include <boost/scoped_array.hpp>
 
@@ -531,6 +532,30 @@ do_tile_cache_reload (const SGPropertyNode * arg)
     return true;
 }
 
+/**
+ * Reload the materials definition
+ */
+ static bool
+ do_materials_reload (const SGPropertyNode * arg)
+ {
+   SG_LOG(SG_INPUT, SG_INFO, "Reloading Materials");
+   SGMaterialLib* new_matlib =  new SGMaterialLib;
+   SGPath mpath( globals->get_fg_root() );
+   mpath.append( fgGetString("/sim/rendering/materials-file") );
+   bool loaded = new_matlib->load(globals->get_fg_root(), 
+                                  mpath.str(), 
+                                  globals->get_props());
+   
+   if ( ! loaded ) {
+       SG_LOG( SG_GENERAL, SG_ALERT,
+               "Error loading materials file " << mpath.str() );
+       return false;
+   }  
+   
+   globals->set_matlib(new_matlib);    
+   return true;   
+ }
+
 
 #if 0
 These do_set_(some-environment-parameters) are deprecated and no longer 
@@ -899,14 +924,18 @@ do_property_randomize (const SGPropertyNode * arg)
 /**
  * Built-in command: interpolate a property value over time
  *
- * property: the name of the property value to interpolate.
- * value[0..n] any number of constant values to interpolate
- * time[0..n]  time between each value, number of time elements must
- *          match those of value elements
+ * property:        the name of the property value to interpolate.
+ * value[0..n]      any number of constant values to interpolate
+ * time/rate[0..n]  time between each value, number of time elements must
+ *                  match those of value elements. Instead of time also rate can
+ *                  be used which automatically calculates the time to change
+ *                  the property value at the given speed.
  * -or-
- * property[1..n] any number of target values taken from named properties
- * time[0..n]     time between each value, number of time elements must
- *                match those of property elements minus one
+ * property[1..n]   any number of target values taken from named properties
+ * time/rate[0..n]  time between each value, number of time elements must
+ *                  match those of value elements. Instead of time also rate can
+ *                  be used which automatically calculates the time to change
+ *                  the property value at the given speed.
  */
 static bool
 do_property_interpolate (const SGPropertyNode * arg)
@@ -915,13 +944,22 @@ do_property_interpolate (const SGPropertyNode * arg)
 
     simgear::PropertyList valueNodes = arg->getChildren( "value" );
     simgear::PropertyList timeNodes = arg->getChildren( "time" );
+    simgear::PropertyList rateNodes = arg->getChildren( "rate" );
+
+    if( !timeNodes.empty() && !rateNodes.empty() )
+      // mustn't specify time and rate
+      return false;
+
+    simgear::PropertyList::size_type num_times = timeNodes.empty()
+                                               ? rateNodes.size()
+                                               : timeNodes.size();
 
     boost::scoped_array<double> value;
     boost::scoped_array<double> time;
 
     if( valueNodes.size() > 0 ) {
         // must match
-        if( timeNodes.size() != valueNodes.size() )
+        if( num_times != valueNodes.size() )
             return false;
 
         value.reset( new double[valueNodes.size()] );
@@ -931,7 +969,7 @@ do_property_interpolate (const SGPropertyNode * arg)
     } else {
         valueNodes = arg->getChildren("property");
         // must have one more property node
-        if( valueNodes.size() - 1 != timeNodes.size() )
+        if( valueNodes.size() - 1 != num_times )
           return false;
 
         value.reset( new double[valueNodes.size()-1] );
@@ -941,14 +979,22 @@ do_property_interpolate (const SGPropertyNode * arg)
 
     }
 
-    time.reset( new double[timeNodes.size()] );
-    for( simgear::PropertyList::size_type n = 0; n < timeNodes.size(); n++ ) {
-        time[n] = timeNodes[n]->getDoubleValue();
+    time.reset( new double[num_times] );
+    if( !timeNodes.empty() ) {
+        for( simgear::PropertyList::size_type n = 0; n < num_times; n++ ) {
+            time[n] = timeNodes[n]->getDoubleValue();
+        }
+    } else {
+        for( simgear::PropertyList::size_type n = 0; n < num_times; n++ ) {
+            double delta = value[n]
+                         - (n > 0 ? value[n - 1] : prop->getDoubleValue());
+            time[n] = fabs(delta / rateNodes[n]->getDoubleValue());
+        }
     }
 
     ((SGInterpolator*)globals->get_subsystem_mgr()
       ->get_group(SGSubsystemMgr::INIT)->get_subsystem("interpolator"))
-      ->interpolate(prop, timeNodes.size(), value.get(), time.get() );
+      ->interpolate(prop, num_times, value.get(), time.get() );
 
     return true;
 }
@@ -1183,7 +1229,7 @@ do_presets_commit (const SGPropertyNode * arg)
       // Nasal can trigger this during initial init, which confuses
       // the logic in ReInitSubsystems, since initial state has not been
       // saved at that time. Short-circuit everything here.
-      fgInitPosition();
+      flightgear::initPosition();
     }
     
     return true;
@@ -1531,6 +1577,7 @@ static struct {
     { "dump-terrainbranch", do_dump_terrain_branch },
     { "print-visible-scene", do_print_visible_scene_info },
     { "reload-shaders", do_reload_shaders },
+    { "reload-materials", do_materials_reload },
 
     { 0, 0 }                   // zero-terminated
 };