]> git.mxchange.org Git - flightgear.git/blobdiff - src/Cockpit/cockpit.cxx
Set the key SGModelLib callback to make aircraft-dir OSG loading work.
[flightgear.git] / src / Cockpit / cockpit.cxx
index 76de6c0dededc9091549fdbb2798ec679b92e2f6..54ccd2a232706f45fe8f8fa8d7a25a1e86f718f2 100644 (file)
@@ -16,7 +16,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 //
 // $Id$
 
 #  include <config.h>
 #endif
 
-#ifdef HAVE_WINDOWS_H          
-#  include <windows.h>
-#endif
-
-#include <GL/glut.h>
-// #include <simgear/xgl/xgl.h>
+#include <simgear/compiler.h>
 
 #include <stdlib.h>
 #include <stdio.h>
 
 #include <simgear/constants.h>
 #include <simgear/debug/logstream.hxx>
-#include <simgear/math/polar3d.hxx>
+#include <simgear/props/props.hxx>
+#include <simgear/timing/sg_time.hxx>
 
-#include <Aircraft/aircraft.hxx>
 #include <Include/general.hxx>
-#include <FDM/ADA.hxx>
+
 #include <Main/globals.hxx>
+#include <Main/fg_props.hxx>
+#include <Main/viewmgr.hxx>
+#include <Main/viewer.hxx>
 #include <Scenery/scenery.hxx>
-#include <Time/fg_timer.hxx>
 #include <GUI/gui.h>
 
 #include "cockpit.hxx"
+#include "hud.hxx"
 
-
-// This is a structure that contains all data related to
-// cockpit/panel/hud system
-
-static pCockpit ac_cockpit;
 // The following routines obtain information concerntin the aircraft's
 // current state and return it to calling instrument display routines.
 // They should eventually be member functions of the aircraft.
@@ -62,37 +55,27 @@ static pCockpit ac_cockpit;
 
 float get_latitude( void )
 {
-    double lat;
-
-    lat = current_aircraft.fdm_state->get_Latitude() * RAD_TO_DEG;
-
-    float flat = lat;
-    return(flat);
-
+    return fgGetDouble("/position/latitude-deg");
 }
 
 float get_lat_min( void )
 {
-    double      a, d;
+    double a, d;
 
-    a = current_aircraft.fdm_state->get_Latitude() * RAD_TO_DEG;    
+    a = fgGetDouble("/position/latitude-deg");
     if (a < 0.0) {
         a = -a;
     }
     d = (double) ( (int) a);
     float lat_min = (a - d) * 60.0;
-    return(lat_min );
+
+    return lat_min;
 }
 
 
 float get_longitude( void )
 {
-    double lon;
-
-    lon = current_aircraft.fdm_state->get_Longitude() * RAD_TO_DEG;
-
-    float flon = lon;
-    return(flon);
+    return fgGetDouble("/position/longitude-deg");
 }
 
 
@@ -101,9 +84,10 @@ get_formated_gmt_time( void )
 {
     static char buf[32];
     const struct tm *p = globals->get_time_params()->getGmt();
-    sprintf( buf, "%d/%d/%4d %d:%02d:%02d", 
+    sprintf( buf, "%d/%d/%4d %d:%02d:%02d",
          p->tm_mon+1, p->tm_mday, 1900 + p->tm_year,
          p->tm_hour, p->tm_min, p->tm_sec);
+
     return buf;
 }
 
@@ -111,131 +95,114 @@ get_formated_gmt_time( void )
 float get_long_min( void )
 {
     double  a, d;
-    a = current_aircraft.fdm_state->get_Longitude() * RAD_TO_DEG;   
+    a = fgGetDouble("/position/longitude-deg");
     if (a < 0.0) {
         a = -a;
     }
     d = (double) ( (int) a);
-    float lon_min = (a - d) * 60.0; 
-    return(lon_min);
+    float lon_min = (a - d) * 60.0;
+
+    return lon_min;
 }
 
 float get_throttleval( void )
 {
-    float throttle = controls.get_throttle( 0 );
-    return (throttle);     // Hack limiting to one engine
+    // Hack limiting to one engine
+    return globals->get_controls()->get_throttle( 0 );
 }
 
 float get_aileronval( void )
 {
-    float aileronval = controls.get_aileron();
-    return (aileronval);
+    return globals->get_controls()->get_aileron();
 }
 
 float get_elevatorval( void )
 {
-    float elevator_val = (float)controls.get_elevator();
-    return elevator_val;
+    return globals->get_controls()->get_elevator();
 }
 
 float get_elev_trimval( void )
 {
-    float elevatorval = controls.get_elevator_trim();
-    return (elevatorval);
+    return globals->get_controls()->get_elevator_trim();
 }
 
 float get_rudderval( void )
 {
-    float rudderval = controls.get_rudder();
-    return (rudderval);
+    return globals->get_controls()->get_rudder();
 }
 
 float get_speed( void )
 {
-    // Make an explicit function call.
-    float speed = current_aircraft.fdm_state->get_V_calibrated_kts()
-       * globals->get_options()->get_speed_up();
-    return( speed );
+    static const SGPropertyNode * speedup_node = fgGetNode("/sim/speed-up");
+
+    float speed = fgGetDouble("/velocities/airspeed-kt")
+        * speedup_node->getIntValue();
+
+    return speed;
 }
 
 float get_mach(void)
 {
-       float mach=current_aircraft.fdm_state->get_Mach_number();
-       return mach;
-}      
+    return fgGetDouble("/velocities/mach");
+}
 
 float get_aoa( void )
 {
-    float aoa = current_aircraft.fdm_state->get_Alpha() * RAD_TO_DEG;
-    return( aoa );
+    return fgGetDouble("/orientation/alpha-deg");
 }
 
 float get_roll( void )
 {
-    float roll = current_aircraft.fdm_state->get_Phi();
-    return( roll );
+    return fgGetDouble("/orientation/roll-deg") * SG_DEGREES_TO_RADIANS;
 }
 
 float get_pitch( void )
 {
-    float pitch = current_aircraft.fdm_state->get_Theta();
-    return( pitch );
+    return fgGetDouble("/orientation/pitch-deg") * SG_DEGREES_TO_RADIANS;
 }
 
 float get_heading( void )
 {
-    float heading = (current_aircraft.fdm_state->get_Psi() * RAD_TO_DEG);
-    return( heading );
+    return fgGetDouble("/orientation/heading-deg");
 }
 
 float get_altitude( void )
 {
-//  FGState *f;
-    // double rough_elev;
+    static const SGPropertyNode *startup_units_node
+        = fgGetNode("/sim/startup/units");
 
-//  current_aircraft.fdm_state
-    // rough_elev = mesh_altitude(f->get_Longitude() * RAD_TO_ARCSEC,
-    //                         f->get_Latitude()  * RAD_TO_ARCSEC);
-    float altitude;
-
-    if ( globals->get_options()->get_units() == FGOptions::FG_UNITS_FEET ) {
-        altitude = current_aircraft.fdm_state->get_Altitude();
+    if ( !strcmp(startup_units_node->getStringValue(), "feet") ) {
+        return fgGetDouble("/position/altitude-ft");
     } else {
-        altitude = (current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER);
+        return fgGetDouble("/position/altitude-ft") * SG_FEET_TO_METER;
     }
-    return altitude;
 }
 
 float get_agl( void )
 {
-    float agl;
+    static const SGPropertyNode *startup_units_node
+        = fgGetNode("/sim/startup/units");
 
-    if ( globals->get_options()->get_units() == FGOptions::FG_UNITS_FEET ) {
-        agl = (current_aircraft.fdm_state->get_Altitude()
-               - scenery.cur_elev * METER_TO_FEET);
+    if ( !strcmp(startup_units_node->getStringValue(), "feet") ) {
+        return fgGetDouble("/position/altitude-agl-ft");
     } else {
-        agl = (current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER
-               - scenery.cur_elev);
+        return fgGetDouble("/position/altitude-agl-ft") * SG_FEET_TO_METER;
     }
-    return agl;
 }
 
 float get_sideslip( void )
 {
-    float sideslip = current_aircraft.fdm_state->get_Beta();
-    return( sideslip );
+    return fgGetDouble("/orientation/side-slip-rad");
 }
 
 float get_frame_rate( void )
 {
-    float frame_rate = general.get_frame_rate();
-    return (frame_rate); 
+    return general.get_frame_rate();
 }
 
 float get_fov( void )
 {
-    float fov = globals->get_current_view()->get_fov(); 
-    return (fov);
+    return globals->get_current_view()->get_fov();
 }
 
 float get_vfc_ratio( void )
@@ -261,498 +228,238 @@ float get_vfc_tris_culled   ( void )
 
 float get_climb_rate( void )
 {
-    float climb_rate;
-    if ( globals->get_options()->get_units() == FGOptions::FG_UNITS_FEET ) {
-        climb_rate = current_aircraft.fdm_state->get_Climb_Rate() * 60.0;
+    static const SGPropertyNode *startup_units_node
+        = fgGetNode("/sim/startup/units");
+
+    float climb_rate = fgGetDouble("/velocities/vertical-speed-fps", 0.0);
+    if ( !strcmp(startup_units_node->getStringValue(), "feet") ) {
+        climb_rate *= 60.0;
     } else {
-        climb_rate = current_aircraft.fdm_state->get_Climb_Rate() * FEET_TO_METER * 60.0;
+        climb_rate *= SG_FEET_TO_METER * 60.0;
     }
-    return (climb_rate);
+
+    return climb_rate;
 }
 
 
 float get_view_direction( void )
 {
-    double view_off = FG_2PI - globals->get_current_view()->get_view_offset();
-    double view = ( current_aircraft.fdm_state->get_Psi() + view_off)
-       * RAD_TO_DEG;
-    
-    if(view > 360.)
-        view -= 360.;
-    else if(view<0.)
-        view += 360.;
-    
+    double view_off = 360.0 - globals->get_current_view()->getHeadingOffset_deg();
+    double view = SGMiscd::normalizeAngle(fgGetDouble("/orientation/heading-deg") + view_off);
     return view;
 }
 
-// $$$ begin - added, VS Renganathan 13 Oct 2K
-// #ifdef FIGHTER_HUD
-float get_Vx   ( void )
-{
-    // CLO - 5 Jan 2000 - something needs to get addressed here
-    // float Vxx = current_aircraft.fdm_state->get_V_north_rel_ground();
-    float Vxx = 0;
-    return (Vxx);
-}
-
-float get_Vy   ( void )
+// Added by Markus Hof on 5. Jan 2004
+float get_dme( void )
 {
-    // CLO - 5 Jan 2000 - something needs to get addressed here
-    // float Vyy = current_aircraft.fdm_state->get_V_east_rel_ground();
-    float Vyy = 0;
-    return (Vyy);
-}
+    static const SGPropertyNode * dme_node =
+        fgGetNode("/instrumentation/dme/indicated-distance-nm");
 
-float get_Vz   ( void )
-{
-    // CLO - 5 Jan 2000 - something needs to get addressed here
-    // float Vzz = current_aircraft.fdm_state->get_V_down_rel_ground();
-    float Vzz = 0;
-    return (Vzz);
+    return dme_node->getFloatValue();
 }
 
 float get_Ax   ( void )
 {
-    float Ax = current_aircraft.fdm_state->get_V_dot_north();
-    return (Ax);
-}
-
-float get_Ay   ( void )
-{
-    float Ay = current_aircraft.fdm_state->get_V_dot_east();
-    return (Ay);
-}
-
-float get_Az   ( void )
-{
-    float Az = current_aircraft.fdm_state->get_V_dot_down();
-    return (Az);
+    return fgGetDouble("/accelerations/ned/north-accel-fps_sec", 0.0);
 }
 
 float get_anzg   ( void )
 {
-    float anzg = current_aircraft.fdm_state->get_N_Z_cg();
-    return (anzg);
-}
-
-int get_iaux1 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux1();
-}
-
-int get_iaux2 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux2();
-}
-
-int get_iaux3 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux3();
-}
-
-int get_iaux4 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux4();
-}
-
-int get_iaux5 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux5();
-}
-
-int get_iaux6 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux6();
-}
-
-int get_iaux7 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux7();
-}
-
-int get_iaux8 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux8();
-}
-
-int get_iaux9 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux9();
-}
-
-int get_iaux10 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux10();
-}
-
-int get_iaux11 (void)
-{
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_iaux11();
-}
-
-int get_iaux12 (void)
-{
-     FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-     return fdm->get_iaux12();
+    return fgGetDouble("/accelerations/n-z-cg-fps_sec", 0.0);
 }
 
+#ifdef ENABLE_SP_FDM
 float get_aux1 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux1();
+    return fgGetDouble("/fdm-ada/ship-lat", 0.0);
 }
 
 float get_aux2 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux2();
+    return fgGetDouble("/fdm-ada/ship-lon", 0.0);
 }
 
 float get_aux3 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux3();
+    return fgGetDouble("/fdm-ada/ship-alt", 0.0);
 }
 
 float get_aux4 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux4();
+    return fgGetDouble("/fdm-ada/skijump-dist", 0.0);
 }
 
 float get_aux5 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux5();
+    return fgGetDouble("/fdm-ada/aux5", 0.0);
 }
 
 float get_aux6 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux6();
+    return fgGetDouble("/fdm-ada/aux6", 0.0);
 }
 
 float get_aux7 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux7();
+    return fgGetDouble("/fdm-ada/aux7", 0.0);
 }
 
 float get_aux8 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux8();
-}
+    return fgGetDouble("/fdm-ada/aux8", 0.0);}
 
 float get_aux9 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux9();
-}
+    return fgGetDouble("/fdm-ada/aux9", 0.0);}
 
 float get_aux10 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux10();
+    return fgGetDouble("/fdm-ada/aux10", 0.0);
 }
 
 float get_aux11 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux11();
+    return fgGetDouble("/fdm-ada/aux11", 0.0);
 }
 
 float get_aux12 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux12();
+    return fgGetDouble("/fdm-ada/aux12", 0.0);
 }
 
 float get_aux13 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux13();
+    return fgGetDouble("/fdm-ada/aux13", 0.0);
 }
 
 float get_aux14 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux14();
+    return fgGetDouble("/fdm-ada/aux14", 0.0);
 }
 
 float get_aux15 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux15();
+    return fgGetDouble("/fdm-ada/aux15", 0.0);
 }
 
 float get_aux16 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux16();
+    return fgGetDouble("/fdm-ada/aux16", 0.0);
 }
 
 float get_aux17 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux17();
+    return fgGetDouble("/fdm-ada/aux17", 0.0);
 }
 
 float get_aux18 (void)
 {
-    FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
-    return fdm->get_aux18();
-}
-// #endif
-// $$$ end - added, VS Renganathan 13 Oct 2K
-
-
-#ifdef NOT_USED
-/****************************************************************************/
-/* Convert degrees to dd mm'ss.s" (DMS-Format)                              */
-/****************************************************************************/
-char *dmshh_format(double degrees)
-{
-    static char buf[16];    
-    int deg_part;
-    int min_part;
-    double sec_part;
-    
-    if (degrees < 0)
-      degrees = -degrees;
-
-    deg_part = degrees;
-    min_part = 60.0 * (degrees - deg_part);
-    sec_part = 3600.0 * (degrees - deg_part - min_part / 60.0);
-
-    /* Round off hundredths */
-    if (sec_part + 0.005 >= 60.0)
-      sec_part -= 60.0, min_part += 1;
-    if (min_part >= 60)
-      min_part -= 60, deg_part += 1;
-
-    sprintf(buf,"%02d*%02d %05.2f",deg_part,min_part,sec_part);
-
-    return buf;
-}
-#endif // 0
-
-
-/************************************************************************
- Convert degrees to dd mm.mmm' (DMM-Format)
- Description: Converts using a round-off factor tailored to the required
- precision of the minutes field (three decimal places).  Round-off
- prevents function from returning a minutes value of 60.
-
- Input arguments: Coordinate value in decimal degrees
-
-************************************************************************/
-static char *toDM(float dd)
-{
-    static char  dm[16];
-    double tempdd;
-    double mn;
-    double sign = 1;
-    int deg;
-
-    if (dd < 0) {
-       sign = -1;
-    }
-    /* round for minutes expressed to three decimal places */
-    tempdd = fabs(dd) + (5.0E-4 / 60.0);
-    deg = (int)tempdd;
-    mn = fabs( (tempdd - (double)(deg)) * 60.0 - 4.999E-4 );
-    deg *= (int)sign;
-    sprintf(dm, "%d*%06.3f", deg, mn);
-    return dm;
-}
-
-
-/************************************************************************
- Convert degrees to dd mm'ss.s'' (DMS-Format)
- Description: Converts using a round-off factor tailored to the required
- precision of the seconds field (one decimal place).  Round-off
- prevents function from returning a seconds value of 60.
-
- Input arguments: Coordinate value in decimal degrees
-
-************************************************************************/
-static char *toDMS(float dd)
-{
-    static char  dms[16];
-    double tempdd, tempmin;
-    int deg;
-    int mn;
-    double sec;
-    double sign = 1;
-
-    if(dd < 0) {
-       sign = -1;
-    }
-    /* round up for seconds expressed to one decimal place */
-    tempdd = fabs(dd) + (0.05 / 3600.0);
-    deg = (int)tempdd;
-    tempmin =  (tempdd - (double)(deg)) * 60.0;
-    mn = (int)tempmin;
-    sec = fabs( (tempmin - (double)(mn)) * 60.0 - 0.049 );
-    deg *= (int)sign;
-    sprintf(dms, "%d*%02d %04.1f", deg, mn, sec);
-    return dms;
-}
-
-
-// Have to set the LatLon display type
-//static char *(*fgLatLonFormat)(float) = toDM;
-static char *(*fgLatLonFormat)(float);
-
-char *coord_format_lat(float latitude)
-{
-    static char buf[16];
-
-    sprintf(buf,"%s%c",
-//      dmshh_format(latitude),
-//      toDMS(latitude),
-//      toDM(latitude),
-        fgLatLonFormat(latitude),           
-        latitude > 0 ? 'N' : 'S');
-    return buf;
-}
-
-char *coord_format_lon(float longitude)
-{
-    static char buf[80];
-
-    sprintf(buf,"%s%c",
-//      dmshh_format(longitude),
-//      toDMS(longitude),
-//      toDM(longitude),
-        fgLatLonFormat(longitude),
-        longitude > 0 ? 'E' : 'W');
-    return buf;
-}
-
-void fgLatLonFormatToggle( puObject *)
-{
-    static int toggle = 0;
-
-    if ( toggle ) 
-        fgLatLonFormat = toDM;
-    else
-        fgLatLonFormat = toDMS;
-    
-    toggle = ~toggle;
-}
-
-#ifdef NOT_USED
-char *coord_format_latlon(double latitude, double longitude)
-{
-    static char buf[1024];
-
-    sprintf(buf,"%s%c %s%c",
-        dmshh_format(latitude),
-        latitude > 0 ? 'N' : 'S',
-        dmshh_format(longitude),
-        longitude > 0 ? 'E' : 'W');
-    return buf;
+    return fgGetDouble("/fdm-ada/aux18", 0.0);
 }
 #endif
 
 
-bool fgCockpitInit( fgAIRCRAFT *cur_aircraft )
+bool fgCockpitInit()
 {
-    FG_LOG( FG_COCKPIT, FG_INFO, "Initializing cockpit subsystem" );
+    SG_LOG( SG_COCKPIT, SG_INFO, "Initializing cockpit subsystem" );
 
     //  cockpit->code = 1;  /* It will be aircraft dependent */
     //  cockpit->status = 0;
 
     // If aircraft has HUD specified we will get the specs from its def
     // file. For now we will depend upon hard coding in hud?
-    
+
     // We must insure that the existing instrument link is purged.
     // This is done by deleting the links in the list.
-    
+
     // HI_Head is now a null pointer so we can generate a new list from the
     // current aircraft.
 
-    fgHUDInit( cur_aircraft );
-    ac_cockpit = new fg_Cockpit();
-    
-    // Have to set the LatLon display type
-    fgLatLonFormat = toDM;
-    
-    FG_LOG( FG_COCKPIT, FG_INFO,
-        "  Code " << ac_cockpit->code() << " Status " 
-        << ac_cockpit->status() );
+    fgHUDInit();
 
-       return true;
+    return true;
 }
 
-void fgCockpitUpdate( void ) {
+void fgCockpitUpdate( osg::State* state ) {
 
-    FG_LOG( FG_COCKPIT, FG_DEBUG,
-        "Cockpit: code " << ac_cockpit->code() << " status " 
-        << ac_cockpit->status() );
+    static const SGPropertyNode * xsize_node = fgGetNode("/sim/startup/xsize");
+    static const SGPropertyNode * ysize_node = fgGetNode("/sim/startup/ysize");
+    static const SGPropertyNode * hud_visibility_node
+        = fgGetNode("/sim/hud/visibility");
 
-       int iwidth   = globals->get_options()->get_xsize();
-       int iheight  = globals->get_options()->get_ysize();
-       float width  = iwidth;
-       float height = iheight;
+    int iwidth   = xsize_node->getIntValue();
+    int iheight  = ysize_node->getIntValue();
 
-    if ( globals->get_options()->get_hud_status() ) {
+                                // FIXME: inefficient
+    if ( hud_visibility_node->getBoolValue() ) {
         // This will check the global hud linked list pointer.
-        // If these is anything to draw it will.
-        fgUpdateHUD();
-    }
-#define DISPLAY_COUNTER
-#ifdef DISPLAY_COUNTER
-    else
-    {
-        char buf[64];
-        float fps    =       get_frame_rate();
-//      float tris   = fps * get_vfc_tris_drawn();
-//      float culled = fps * get_vfc_tris_culled();
-//      sprintf(buf,"%-4.1f  %7.0f  %7.0f", fps, tris, culled);
-        sprintf(buf,"%-5.1f", fps);
-
-        glMatrixMode( GL_PROJECTION );
-        glPushMatrix();
-        glLoadIdentity();
-        gluOrtho2D( 0, globals->get_options()->get_xsize(),
-                   0, globals->get_options()->get_ysize() );
-        glMatrixMode( GL_MODELVIEW );
-        glPushMatrix();
-        glLoadIdentity();
-
-        glDisable( GL_DEPTH_TEST );
-        glDisable( GL_LIGHTING );
-        
-        glColor3f( 0.9, 0.4, 0.2 );
-
-        guiFnt.drawString( buf,
-                          int(width - guiFnt.getStringWidth(buf) - 10),
-                           10 );
-        glEnable( GL_DEPTH_TEST );
-        glEnable( GL_LIGHTING );
-        glMatrixMode( GL_PROJECTION );
-        glPopMatrix();
-        glMatrixMode( GL_MODELVIEW );
-        glPopMatrix();
+        // If there is anything to draw it will.
+        fgUpdateHUD( state );
     }
-#endif // #ifdef DISPLAY_COUNTER
-    
-    glViewport( 0, 0, 
-               globals->get_options()->get_xsize(),
-               globals->get_options()->get_ysize() );
 
+    glViewport( 0, 0, iwidth, iheight );
+}
+
+
+
+
+
+struct FuncTable {
+    const char *name;
+    FLTFNPTR func;
+} fn_table[] = {
+    { "agl", get_agl },
+    { "aileronval", get_aileronval },
+    { "altitude", get_altitude },
+    { "anzg", get_anzg },
+    { "aoa", get_aoa },
+    { "ax", get_Ax },
+    { "climb", get_climb_rate },
+    { "elevatortrimval", get_elev_trimval },
+    { "elevatorval", get_elevatorval },
+    { "fov", get_fov },
+    { "framerate", get_frame_rate },
+    { "heading", get_heading },
+    { "latitude", get_latitude },
+    { "longitude", get_longitude },
+    { "mach", get_mach },
+    { "rudderval", get_rudderval },
+    { "speed", get_speed },
+    { "throttleval", get_throttleval },
+    { "view_direction", get_view_direction },
+    { "vfc_tris_culled", get_vfc_tris_culled },
+    { "vfc_tris_drawn", get_vfc_tris_drawn },
+#ifdef ENABLE_SP_FDM
+    { "aux1", get_aux1 },
+    { "aux2", get_aux2 },
+    { "aux3", get_aux3 },
+    { "aux4", get_aux4 },
+    { "aux5", get_aux5 },
+    { "aux6", get_aux6 },
+    { "aux7", get_aux7 },
+    { "aux8", get_aux8 },
+    { "aux9", get_aux9 },
+    { "aux10", get_aux10 },
+    { "aux11", get_aux11 },
+    { "aux12", get_aux12 },
+    { "aux13", get_aux13 },
+    { "aux14", get_aux14 },
+    { "aux15", get_aux15 },
+    { "aux16", get_aux16 },
+    { "aux17", get_aux17 },
+    { "aux18", get_aux18 },
+#endif
+    { 0, 0 },
+};
+
+
+FLTFNPTR get_func(const char *name)
+{
+    for (int i = 0; fn_table[i].name; i++)
+        if (!strcmp(fn_table[i].name, name))
+            return fn_table[i].func;
+
+    return 0;
 }
+
+