]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/main.cxx
Mac portability changes.
[flightgear.git] / src / Main / main.cxx
index 8fb1805f7ed8b620ecd7caf012cf3f8d6fe62197..3199f0db13da85168ac8c90a80f15ba14aee762d 100644 (file)
@@ -1,8 +1,8 @@
-// GLUTmain.cxx -- top level sim routines
+// main.cxx -- top level sim routines
 //
 // Written by Curtis Olson for OpenGL, started May 1997.
 //
-// Copyright (C) 1997  Curtis L. Olson  - curt@me.umn.edu
+// Copyright (C) 1997 - 1999  Curtis L. Olson  - curt@flightgear.org
 //
 // This program is free software; you can redistribute it and/or
 // modify it under the terms of the GNU General Public License as
 //
 // $Id$
 
+
 #define MICHAEL_JOHNSON_EXPERIMENTAL_ENGINE_AUDIO
 
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
 #  include <unistd.h>    /* for stat() */
 #endif
 
+#include <pu.h>                        // plib include
+#include <ssg.h>               // plib include
+
+#ifdef ENABLE_AUDIO_SUPPORT
+#  include <sl.h>              // plib include
+#  include <sm.h>              // plib include
+#endif
+
 #include <Include/fg_constants.h>  // for VERSION
 #include <Include/general.hxx>
 
 #include <Astro/stars.hxx>
 #include <Astro/solarsystem.hxx>
 
-#ifdef ENABLE_AUDIO_SUPPORT
-#  include <plib/sl.h>
-#  include <plib/sm.h>
-#endif
-
 #include <Autopilot/autopilot.hxx>
 #include <Cockpit/cockpit.hxx>
 #include <GUI/gui.h>
 #include <Math/polar3d.hxx>
 #include <Math/fg_random.h>
 #include <Misc/fgpath.hxx>
-#include <plib/pu.h>
+#ifdef FG_NETWORK_OLK
+#include <Network/network.h>
+#endif
+#include <Objects/materialmgr.hxx>
 #include <Scenery/scenery.hxx>
 #include <Scenery/tilemgr.hxx>
 #include <Time/event.hxx>
@@ -85,8 +93,8 @@
 #include <Time/sunpos.hxx>
 #include <Weather/weather.hxx>
 
-#include "GLUTkey.hxx"
 #include "fg_init.hxx"
+#include "keyboard.hxx"
 #include "options.hxx"
 #include "splash.hxx"
 #include "views.hxx"
@@ -124,6 +132,13 @@ slSample *s2;
 #endif
 
 
+// ssg variables
+ssgRoot *scene = NULL;
+ssgBranch *terrain = NULL;
+ssgSelector *penguin_sel = NULL;
+ssgTransform *penguin_pos = NULL;
+
+
 // The following defines flight gear options. Because glutlib will also
 // want to parse its own options, those options must not be included here
 // or they will get parsed by the main program option parser. Hence case
@@ -166,10 +181,12 @@ static void fgInitVisuals( void ) {
     xglEnable( GL_LIGHT0 );
     xglLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec );
 
+    sgVec3 sunpos;
+    sgSetVec3( sunpos, l->sun_vec[0], l->sun_vec[1], l->sun_vec[2] );
+    ssgGetLight( 0 ) -> setPosition( sunpos );
+
     // xglFogi (GL_FOG_MODE, GL_LINEAR);
     xglFogi (GL_FOG_MODE, GL_EXP2);
-    // Fog density is now set when the weather system is initialized
-    // xglFogf (GL_FOG_DENSITY, w->fog_density);
     if ( (current_options.get_fog() == 1) || 
         (current_options.get_shading() == 0) ) {
        // if fastest fog requested, or if flat shading force fastest
@@ -274,6 +291,10 @@ static void fgRenderFrame( void ) {
        // set the sun position
        xglLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec );
 
+       sgVec3 sunpos;
+       sgSetVec3( sunpos, l->sun_vec[0], l->sun_vec[1], l->sun_vec[2] );
+       ssgGetLight( 0 ) -> setPosition( sunpos );
+
        clear_mask = GL_DEPTH_BUFFER_BIT;
        if ( current_options.get_wireframe() ) {
            clear_mask |= GL_COLOR_BUFFER_BIT;
@@ -336,11 +357,12 @@ static void fgRenderFrame( void ) {
        xglEnable( GL_DEPTH_TEST );
        if ( current_options.get_fog() > 0 ) {
            xglEnable( GL_FOG );
-           xglFogfv (GL_FOG_COLOR, l->adj_fog_color);
+           xglFogi( GL_FOG_MODE, GL_EXP2 );
+           xglFogfv( GL_FOG_COLOR, l->adj_fog_color );
        }
        // set lighting parameters
-       xglLightfv(GL_LIGHT0, GL_AMBIENT, l->scene_ambient );
-       xglLightfv(GL_LIGHT0, GL_DIFFUSE, l->scene_diffuse );
+       xglLightfv( GL_LIGHT0, GL_AMBIENT, l->scene_ambient );
+       xglLightfv( GL_LIGHT0, GL_DIFFUSE, l->scene_diffuse );
        // xglLightfv(GL_LIGHT0, GL_SPECULAR, white );
        
        if ( current_options.get_textures() ) {
@@ -361,7 +383,84 @@ static void fgRenderFrame( void ) {
            // xglMaterialfv (GL_FRONT, GL_DIFFUSE, white);
        }
 
-       global_tile_mgr.render();
+       // global_tile_mgr.render();
+
+       // ssg test
+
+       xglMatrixMode( GL_PROJECTION );
+       xglLoadIdentity();
+       ssgSetFOV( current_options.get_fov(), 0.0f );
+
+       double agl = current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER
+           - scenery.cur_elev;
+
+       // FG_LOG( FG_ALL, FG_INFO, "visibility is " 
+       //         << current_weather.get_visibility() );
+           
+       if ( agl > 10.0 ) {
+           // ssgSetNearFar( 10.0f, current_weather.get_visibility() );
+           ssgSetNearFar( 10.0f, 100000.0f );
+       } else {
+           // ssgSetNearFar( 0.5f, current_weather.get_visibility() );
+           ssgSetNearFar( 0.5f, 100000.0f );
+       }
+
+       sgMat4 sgVIEW;
+
+       while ( current_view.follow.size() > 400 ) {
+           current_view.follow.pop_front();
+       }
+
+       if ( current_view.view_mode == FGView::FG_VIEW_FIRST_PERSON ) {
+           // select current view matrix
+           sgCopyMat4( sgVIEW, current_view.sgVIEW );
+
+           // disable TuX
+           penguin_sel->select(0);
+       } else if ( current_view.view_mode == FGView::FG_VIEW_FOLLOW ) {
+           // select view matrix from front of view matrix queue
+           FGMat4Wrapper tmp = current_view.follow.front();
+           sgCopyMat4( sgVIEW, tmp.m );
+
+           // enable TuX and set up his position and orientation
+           penguin_sel->select(1);
+
+           sgMat4 sgTRANS;
+           sgMakeTransMat4( sgTRANS, 
+                            current_view.view_pos.x(),
+                            current_view.view_pos.y(),
+                            current_view.view_pos.z() );
+
+           sgVec3 ownship_up;
+           sgSetVec3( ownship_up, 0.0, 0.0, 1.0);
+
+           sgMat4 sgROT;
+           sgMakeRotMat4( sgROT, -90.0, ownship_up );
+
+           sgMat4 sgTMP;
+           sgMat4 sgTUX;
+           sgMultMat4( sgTMP, sgROT, current_view.sgVIEW_ROT );
+           sgMultMat4( sgTUX, sgTMP, sgTRANS );
+       
+           sgCoord tuxpos;
+           sgSetCoord( &tuxpos, sgTUX );
+           penguin_pos->setTransform( &tuxpos );
+       }
+
+       ssgSetCamera( sgVIEW );
+
+       // position tile nodes and update range selectors
+       global_tile_mgr.prep_ssg_nodes();
+
+       // force the default state so ssg can get back on track if
+       // we've changed things elsewhere
+       FGMaterialSlot m_slot;
+       FGMaterialSlot *m_ptr = &m_slot;
+       if ( material_mgr.find( "Default", m_ptr ) );
+       m_ptr->get_state()->force();
+
+       // draw the ssg scene
+       ssgCullAndDraw( scene );
 
        xglDisable( GL_TEXTURE_2D );
        xglDisable( GL_FOG );
@@ -376,6 +475,7 @@ static void fgRenderFrame( void ) {
        puDisplay();
        xglDisable   ( GL_BLEND ) ;
        xglEnable( GL_FOG );
+
     }
 
     xglutSwapBuffers();
@@ -401,7 +501,7 @@ void fgUpdateTimeDepCalcs(int multi_loop, int remainder) {
 
        // printf("updating flight model x %d\n", multi_loop);
        fgFDMUpdate( current_options.get_flight_model(), 
-                    cur_fdm_state, multi_loop, remainder );
+                    cur_fdm_state, multi_loop * 1, remainder );
     } else {
        fgFDMUpdate( current_options.get_flight_model(), 
                     cur_fdm_state, 0, remainder );
@@ -817,23 +917,20 @@ static void fgIdleFunction ( void ) {
 // options.cxx needs to see this for toggle_panel()
 // Handle new window size or exposure
 void fgReshape( int width, int height ) {
-    // Do this so we can call fgReshape(0,0) ourselves without having
-    // to know what the values of width & height are.
-    if ( (height > 0) && (width > 0) ) {
-       if ( ! current_options.get_panel_status() ) {
-           current_view.set_win_ratio( (GLfloat) width / (GLfloat) height );
-       } else {
-           current_view.set_win_ratio( (GLfloat) width / 
-                                       ((GLfloat) (height)*0.4232) );
-       }
+    if ( ! current_options.get_panel_status() ) {
+       current_view.set_win_ratio( (GLfloat) width / (GLfloat) height );
+       xglViewport(0, 0 , (GLint)(width), (GLint)(height) );
+    } else {
+       current_view.set_win_ratio( (GLfloat) width / 
+                                   ((GLfloat) (height)*0.4232) );
+       xglViewport(0, (GLint)((height)*0.5768), (GLint)(width), 
+                   (GLint)((height)*0.4232) );
     }
 
     current_view.set_winWidth( width );
     current_view.set_winHeight( height );
     current_view.force_update_fov_math();
 
-    // Inform gl of our view window size (now handled elsewhere)
-    // xglViewport(0, 0, (GLint)width, (GLint)height);
     if ( idle_state == 1000 ) {
        // yes we've finished all our initializations and are running
        // the main loop, so this will now work without seg faulting
@@ -965,10 +1062,6 @@ int main( int argc, char **argv ) {
     argc = ccommand( &argv );
 #endif
 
-    FGInterface *f;
-
-    f = current_aircraft.fdm_state;
-
 #ifdef HAVE_BC5PLUS
     _control87(MCW_EM, MCW_EM);  /* defined in float.h */
 #endif
@@ -978,40 +1071,15 @@ int main( int argc, char **argv ) {
 
     FG_LOG( FG_GENERAL, FG_INFO, "Flight Gear:  Version " << VERSION << endl );
 
-    string root;
-
-    FG_LOG( FG_GENERAL, FG_INFO, "General Initialization" );
-    FG_LOG( FG_GENERAL, FG_INFO, "======= ==============" );
-
     // seed the random number generater
     fg_srandom();
 
-    // Attempt to locate and parse a config file
-    // First check fg_root
-    FGPath config( current_options.get_fg_root() );
-    config.append( "system.fgfsrc" );
-    current_options.parse_config_file( config.str() );
-
-    // Next check home directory
-    char* envp = ::getenv( "HOME" );
-    if ( envp != NULL ) {
-       config.set( envp );
-       config.append( ".fgfsrc" );
-       current_options.parse_config_file( config.str() );
-    }
-
-    // Parse remaining command line options
-    // These will override anything specified in a config file
-    if ( current_options.parse_command_line(argc, argv) !=
-        fgOPTIONS::FG_OPTIONS_OK )
-    {
-       // Something must have gone horribly wrong with the command
-       // line parsing or maybe the user just requested help ... :-)
-       current_options.usage();
-       FG_LOG( FG_GENERAL, FG_ALERT, "\nExiting ...");
+    // Load the configuration parameters
+    if ( !fgInitConfig(argc, argv) ) {
+       FG_LOG( FG_GENERAL, FG_ALERT, "Config option parsing failed ..." );
        exit(-1);
     }
-    
+
     // Initialize the Window/Graphics environment.
     if( !fgGlutInit(&argc, argv) ) {
        FG_LOG( FG_GENERAL, FG_ALERT, "GLUT initialization failed ..." );
@@ -1025,20 +1093,62 @@ int main( int argc, char **argv ) {
        exit(-1);
     }
 
-    // Init the user interface (we need to do this before passing off
-    // control to glut and before fgInitGeneral to get our fonts !!!
+    // Initialize ssg (from plib)
+    ssgInit();
+
+    // Initialize the user interface (we need to do this before
+    // passing off control to glut and before fgInitGeneral to get our
+    // fonts !!!
     guiInit();
 
-    // First do some quick general initializations
+    // Do some quick general initializations
     if( !fgInitGeneral()) {
        FG_LOG( FG_GENERAL, FG_ALERT, 
                "General initializations failed ..." );
        exit(-1);
     }
 
+    //
+    // some ssg test stuff (requires data from the plib source
+    // distribution) specifically from the ssg tux example
+    //
+
+    FGPath modelpath( current_options.get_fg_root() );
+    modelpath.append( "Models" );
+    modelpath.append( "Geometry" );
+  
+    FGPath texturepath( current_options.get_fg_root() );
+    texturepath.append( "Models" );
+    texturepath.append( "Textures" );
+  
+    ssgModelPath( (char *)modelpath.c_str() );
+    ssgTexturePath( (char *)texturepath.c_str() );
+
+    scene = new ssgRoot;
+    terrain = new ssgBranch;
+    terrain->setName( "Terrain" );
+    penguin_sel = new ssgSelector;
+    penguin_pos = new ssgTransform;
+
+    ssgEntity *tux_obj = ssgLoadAC( "glider.ac" );
+    // ssgEntity *tux_obj = ssgLoadAC( "Tower1x.ac" );
+    penguin_pos->addKid( tux_obj );
+    penguin_sel->addKid( penguin_pos );
+    ssgFlatten( tux_obj );
+    ssgStripify( penguin_sel );
+
+#ifdef FG_NETWORK_OLK
+    // Do the network intialization
+    printf("Multipilot mode %s\n", fg_net_init() );
+#endif
+
+    scene->addKid( terrain );
+    scene->addKid( penguin_sel );
+
     // pass control off to the master GLUT event handler
     glutMainLoop();
 
-    // we never actually get here ... but just in case ... :-)
-    return(0);
+    // we never actually get here ... but to avoid compiler warnings,
+    // etc.
+    return 0;
 }