Expressions (or SGExpressions) are a feature of the SimGear library and provide a nice way of implementing complex math formulas using XML syntax. They are supported in many systems within the FlightGear code. Caution: Expressions do not check if your math creates floating point exceptions (like division by zero conditions, taking the square root of a negative number, etc.). This can cause undefined behavior and may result in NaNs or even Cascading NaNs. Usage Expressions are supported in * Autopilot configuration files * Particle system configuration files * Animations (translate, rotate, scale, range, blend) * The shader technique Sample Expressions This is a sample expression for the euation c = sqrt(a*a + b^2). Children/arguments are parsed in the order they appear in in the file (or the order in which they are set via property methods). <expression> <sqrt> <sum> <product> <property>/value/a</property> <property>/value/a</property> </product> <pow> <property>/value/b</property> <value>2</value> </pow> </sum> </sqrt> </expression> Supported elements NOTE: #c in the table below is the number of child nodes required. +-------------------+----+--------------------------------------------------+ | Function | #c | Notes | +-------------------+----+--------------------------------------------------+ | <abs> <fabs> | 1 | | | <acos> | 1 | | | <asin> | 1 | | | <atan2> | 2 | | | <atan> | 1 | | | <ceil> | 1 | | | <clip> | 3 | clipMin, clipMax, expression | | <cos> | 1 | | | <cosh> | 1 | | | <deg2rad> | 1 | | | <difference> <dif>| 1+ | | | <div> | 2 | | | <exp> | 1 | | | <floor> | 1 | | | <log10> | 1 | | | <log> | 1 | | | <max> | 1+ | | | <min> | 1+ | | | <mod> | 2 | | | <pow> | 2 | | | <product> <prod> | 1+ | | | <property> | 0 | Property name e.g.<property>node/value</property>| | <rad2deg> | 1 | | | <sin> | 1 | | | <sinh> | 1 | | | <sqr> | 1 | | | <sqrt> | 1 | | | <sum> | 1+ | | | <table> | 2+ | <entry><ind> 0.0 </ind><dep> 10 </dep></entry> | | <tan> | 1 | | | <tanh> | 1 | | | <value> | 0 | Constant Value e.g. <value>0</value> | +-------------------+----+--------------------------------------------------+ Hints and tips -------------- 1. There is no function for rounding, hwoever "Round half up" can be achieved as follows <expression> <floor> <sum> <property>your/property/here</property> <value>0.5</value> </sum> </floor> </expression> 2. Interpolation tables can be useful when a formula cannot be found, In the example below <ind> is the indepdendant variable and <dep> is the dependant variable. What this table does is as follows - values below 0.2 will be 10 - values above 0.2 and between 1.0 will be interpolated between 10 and 0 - values above 1.0 will be 0 <table> <entry><ind> 0.0 </ind><dep> 10 </dep></entry> <entry><ind> 0.2 </ind><dep> 10 </dep></entry> <entry><ind> 1.0 </ind><dep> 0 </dep></entry> </table>