From: Torsten Dreyer Date: Thu, 2 Feb 2012 21:17:34 +0000 (+0100) Subject: new command: property-interpolate X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=62dfa8cc6452de22a10802789850218ba85a9ae0;p=flightgear.git new command: property-interpolate exposes the SGInterpolator to formerly only accessible via Nasal --- diff --git a/src/Main/fg_commands.cxx b/src/Main/fg_commands.cxx index 2c8c4ed20..0e158d599 100644 --- a/src/Main/fg_commands.cxx +++ b/src/Main/fg_commands.cxx @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -52,6 +53,8 @@ #include
#include +#include + using std::string; using std::ifstream; using std::ofstream; @@ -930,6 +933,62 @@ do_property_randomize (const SGPropertyNode * arg) return true; } +/** + * 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 + * -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 + */ +static bool +do_property_interpolate (const SGPropertyNode * arg) +{ + SGPropertyNode * prop = get_prop(arg); + + simgear::PropertyList valueNodes = arg->getChildren( "value" ); + simgear::PropertyList timeNodes = arg->getChildren( "time" ); + + boost::scoped_array value; + boost::scoped_array time; + + if( valueNodes.size() > 0 ) { + // must match + if( timeNodes.size() != valueNodes.size() ) + return false; + + value.reset( new double[valueNodes.size()] ); + for( simgear::PropertyList::size_type n = 0; n < valueNodes.size(); n++ ) { + value[n] = valueNodes[n]->getDoubleValue(); + } + } else { + valueNodes = arg->getChildren("property"); + // must have one more property node + if( valueNodes.size() - 1 != timeNodes.size() ) + return false; + + value.reset( new double[valueNodes.size()-1] ); + for( simgear::PropertyList::size_type n = 0; n < valueNodes.size()-1; n++ ) { + value[n] = fgGetNode(valueNodes[n+1]->getStringValue(), "/null")->getDoubleValue(); + } + + } + + time.reset( new double[timeNodes.size()] ); + for( simgear::PropertyList::size_type n = 0; n < timeNodes.size(); n++ ) { + time[n] = timeNodes[n]->getDoubleValue(); + } + + ((SGInterpolator*)globals->get_subsystem_mgr() + ->get_group(SGSubsystemMgr::INIT)->get_subsystem("interpolator")) + ->interpolate(prop, timeNodes.size(), value.get(), time.get() ); + + return true; +} /** * Built-in command: reinit the data logging system based on the @@ -1452,6 +1511,7 @@ static struct { { "property-scale", do_property_scale }, { "property-cycle", do_property_cycle }, { "property-randomize", do_property_randomize }, + { "property-interpolate", do_property_interpolate }, { "data-logging-commit", do_data_logging_commit }, { "dialog-new", do_dialog_new }, { "dialog-show", do_dialog_show },