#include <simgear/scene/sky/sky.hxx>
#include <Time/light.hxx>
#include <Include/general.hxx>
+#include <Aircraft/replay.hxx>
#include <Cockpit/cockpit.hxx>
#include <Cockpit/hud.hxx>
#include <Model/panelnode.hxx>
#include <Sound/beacon.hxx>
#include <Sound/morse.hxx>
#include <FDM/flight.hxx>
-#include <FDM/UIUCModel/uiuc_aircraftdir.h>
// #include <FDM/ADA.hxx>
#include <ATC/ATCdisplay.hxx>
#include <ATC/ATCmgr.hxx>
#include <ATC/AIMgr.hxx>
-#include <Replay/replay.hxx>
#include <Time/tmp.hxx>
#include <Time/fg_timer.hxx>
#include <Environment/environment_mgr.hxx>
#include <GUI/new_gui.hxx>
#ifdef FG_MPLAYER_AS
-#include <MultiPlayer/multiplaytxmgr.hxx>
-#include <MultiPlayer/multiplayrxmgr.hxx>
+#include <MultiPlayer/multiplaymgr.hxx>
#endif
// cout << "cur_fdm_state->get_inited() = " << cur_fdm_state->get_inited()
// << " cur_elev = " << scenery.get_cur_elev() << endl;
- if ( !cur_fdm_state->get_inited() &&
- globals->get_scenery()->get_cur_elev() > -9990 )
- {
- SG_LOG(SG_FLIGHT,SG_INFO, "Finally initializing fdm");
+ if (!cur_fdm_state->get_inited()) {
+ // Check for scenery around the aircraft.
+ double lon = fgGetDouble("/sim/presets/longitude-deg");
+ double lat = fgGetDouble("/sim/presets/latitude-deg");
+ // We require just to have 50 meter scenery availabe around
+ // the aircraft.
+ double range = 50.0;
+ if (globals->get_tile_mgr()->scenery_available(lat, lon, range)) {
+ SG_LOG(SG_FLIGHT,SG_INFO, "Finally initializing fdm");
cur_fdm_state->init();
if ( cur_fdm_state->get_bound() ) {
cur_fdm_state->unbind();
}
cur_fdm_state->bind();
+ }
}
// conceptually, the following block could be done for each fdm
}
- if ( clock_freeze->getBoolValue() ) {
+ if (clock_freeze->getBoolValue() || !scenery_loaded) {
delta_time_sec = 0;
} else {
delta_time_sec = real_delta_time_sec;
#endif
// Run ATC subsystem
- if (fgGetBool("/sim/ATC/enabled"))
+ if (fgGetBool("/sim/atc/enabled"))
globals->get_ATC_mgr()->update(delta_time_sec);
// Run the AI subsystem
#ifdef FG_MPLAYER_AS
// Update any multiplayer models
- globals->get_multiplayer_rx_mgr()->Update();
+ globals->get_multiplayer_mgr()->Update();
#endif
// Run flight model
if ( global_multi_loop > 0) {
// first run the flight model each frame until it is intialized
// then continue running each frame only after initial scenery load is complete.
- if (!cur_fdm_state->get_inited() || scenery_loaded) {
- fgUpdateTimeDepCalcs();
- }
+ fgUpdateTimeDepCalcs();
} else {
SG_LOG( SG_ALL, SG_DEBUG,
"Elapsed time is zero ... we're zinging" );
globals->get_scenery()->set_next_center( cntr );
}
- // get the location data for the primary FDM (now hardcoded to ac model)...
- SGLocation *acmodel_loc = NULL;
- acmodel_loc = (SGLocation *)globals->
- get_aircraft_model()->get3DModel()->getSGLocation();
-
- // update tile manager for FDM...
- // ...only if location is different than the current-view location
- // (to avoid duplicating effort)
- if( !fgGetBool("/sim/current-view/config/from-model") ) {
- if( acmodel_loc != NULL ) {
- globals->get_tile_mgr()->prep_ssg_nodes( acmodel_loc,
- visibility_meters );
- globals->get_tile_mgr()->
- update( acmodel_loc, visibility_meters,
- acmodel_loc->
- get_absolute_view_pos(globals->
- get_scenery()->get_center()) );
- globals->get_scenery()->set_center( cntr );
-
- // save results of update in SGLocation for fdm...
- if ( globals->get_scenery()->get_cur_elev() > -9990 ) {
- acmodel_loc->
- set_cur_elev_m( globals->get_scenery()->get_cur_elev() );
- fgSetDouble("/position/ground-elev-m",
- globals->get_scenery()->get_cur_elev());
- }
- acmodel_loc->
- set_tile_center( globals->get_scenery()->get_next_center() );
- }
- }
-
globals->get_tile_mgr()->prep_ssg_nodes( current_view->getSGLocation(),
visibility_meters );
// update tile manager for view...
- // IMPORTANT!!! the tilemgr update for view location _must_ be
- // done last after the FDM's until all of Flight Gear code
- // references the viewer's location for elevation instead of the
- // "scenery's" current elevation.
SGLocation *view_location = globals->get_current_view()->getSGLocation();
- globals->get_tile_mgr()->update( view_location, visibility_meters,
- current_view->get_absolute_view_pos() );
+ globals->get_tile_mgr()->update( view_location, visibility_meters );
globals->get_scenery()->set_center( cntr );
- // save results of update in SGLocation for fdm...
- if ( globals->get_scenery()->get_cur_elev() > -9990 ) {
- current_view->getSGLocation()->
- set_cur_elev_m( globals->get_scenery()->get_cur_elev() );
+ {
+ double lon = view_location->getLongitude_deg();
+ double lat = view_location->getLatitude_deg();
+ double alt = view_location->getAltitudeASL_ft() * SG_FEET_TO_METER;
+
+ // check if we can reuse the groundcache for that purpose.
+ double ref_time, pt[3], r;
+ bool valid = cur_fdm_state->is_valid_m(&ref_time, pt, &r);
+ if (valid &&
+ cntr.distance3Dsquared(Point3D(pt[0], pt[1], pt[2])) < r*r) {
+ // Reuse the cache ...
+ double lev
+ = cur_fdm_state->get_groundlevel_m(lat*SGD_DEGREES_TO_RADIANS,
+ lon*SGD_DEGREES_TO_RADIANS,
+ alt + 2.0);
+ view_location->set_cur_elev_m( lev );
+ } else {
+ // Do full intersection test.
+ double lev;
+ if (globals->get_scenery()->get_elevation_m(lat, lon, alt+2, lev))
+ view_location->set_cur_elev_m( lev );
+ else
+ view_location->set_cur_elev_m( -9999.0 );
+ }
}
- current_view->getSGLocation()->
- set_tile_center( globals->get_scenery()->get_next_center() );
#ifdef ENABLE_AUDIO_SUPPORT
// Right now we make a simplifying assumption that the primary
static sgVec3 last_pos_offset;
+ // get the location data for the primary FDM (now hardcoded to ac model)...
+ SGLocation *acmodel_loc = NULL;
+ acmodel_loc = (SGLocation *)globals->
+ get_aircraft_model()->get3DModel()->getSGLocation();
+
// set positional offset for sources
- sgVec3 source_pos_offset;
- sgSubVec3( source_pos_offset,
- view_location->get_view_pos(), acmodel_loc->get_view_pos() );
+ sgdVec3 dsource_pos_offset;
+ sgdSubVec3( dsource_pos_offset,
+ view_location->get_absolute_view_pos(),
+ acmodel_loc->get_absolute_view_pos() );
// cout << "pos all = " << source_pos_offset[0] << " " << source_pos_offset[1] << " " << source_pos_offset[2] << endl;
+ sgVec3 source_pos_offset;
+ sgSetVec3(source_pos_offset, dsource_pos_offset);
globals->get_soundmgr()->set_source_pos_all( source_pos_offset );
// set the velocity
globals->get_soundmgr()->set_listener_pos( listener_pos );
#endif
- // If fdm location is same as viewer's then we didn't do the
- // update for fdm location above so we need to save the viewer
- // results in the fdm SGLocation as well...
- if( fgGetBool("/sim/current-view/config/from-model") ) {
- if( acmodel_loc != 0 ) {
- if ( globals->get_scenery()->get_cur_elev() > -9990 ) {
- acmodel_loc->set_cur_elev_m( globals->get_scenery()->
- get_cur_elev() );
- fgSetDouble("/position/ground-elev-m",
- globals->get_scenery()->get_cur_elev());
- }
- acmodel_loc->set_tile_center( globals->get_scenery()->
- get_next_center() );
- }
- }
-
// END Tile Manager udpates
if (!scenery_loaded && globals->get_tile_mgr()->all_queues_empty() && cur_fdm_state->get_inited()) {
// then on.
static void fgIdleFunction ( void ) {
- // printf("idle state == %d\n", idle_state);
-
if ( idle_state == 0 ) {
idle_state++;
+ fgSplashProgress("setting up scenegraph & user interface");
+
+ } else if ( idle_state == 1 ) {
+ idle_state++;
// This seems to be the absolute earliest in the init sequence
// that these calls will return valid info. Too bad it's after
// we've already created and sized out window. :-(
// passing off control to the OS main loop and before
// fgInitGeneral to get our fonts !!!
guiInit();
+ fgSplashProgress("reading aircraft list");
- } else if ( idle_state == 1 ) {
+ } else if ( idle_state == 2 ) {
idle_state++;
// Read the list of available aircrafts
fgReadAircraft();
} else
glPointParameterIsSupported = false;
}
+ fgSplashProgress("reading airport & navigation data");
- } else if ( idle_state == 2 ) {
+ } else if ( idle_state == 3 ) {
idle_state++;
fgInitNav();
+ fgSplashProgress("setting up scenery");
- } else if ( idle_state == 3 ) {
+ } else if ( idle_state == 4 ) {
idle_state++;
// based on the requested presets, calculate the true starting
// lon, lat
globals->set_model_mgr(new FGModelMgr);
globals->get_model_mgr()->init();
globals->get_model_mgr()->bind();
+ fgSplashProgress("loading aircraft");
- } else if ( idle_state == 4 ) {
+ } else if ( idle_state == 5 ) {
idle_state++;
////////////////////////////////////////////////////////////////////
// Initialize the 3D aircraft model subsystem (has a dependency on
globals->set_viewmgr( viewmgr );
viewmgr->init();
viewmgr->bind();
+ fgSplashProgress("generating sky elements");
- } else if ( idle_state == 5 ) {
+ } else if ( idle_state == 6 ) {
idle_state++;
// Initialize the sky
SGPath ephem_data_path( globals->get_fg_root() );
// build our custom render states
globals->get_renderer()->build_states();
+ fgSplashProgress("initializing subsystems");
- } else if ( idle_state == 6 ) {
+ } else if ( idle_state == 7 ) {
idle_state++;
// Initialize audio support
#ifdef ENABLE_AUDIO_SUPPORT
"Subsystem initializations failed ..." );
exit(-1);
}
+ fgSplashProgress("setting up time & renderer");
- } else if ( idle_state == 7 ) {
- idle_state++;
+ } else if ( idle_state == 8 ) {
+ idle_state = 1000;
// Initialize the time offset (warp) after fgInitSubsystem
// (which initializes the lighting interpolation tables.)
fgInitTimeOffset();
// setup OpenGL view parameters
globals->get_renderer()->init();
- // Read the list of available aircrafts
- fgReadAircraft();
-
-
- } else if ( idle_state == 8 ) {
- idle_state = 1000;
-
SG_LOG( SG_GENERAL, SG_INFO, "Panel visible = " << fgPanelVisible() );
globals->get_renderer()->resize( fgGetInt("/sim/startup/xsize"),
fgGetInt("/sim/startup/ysize") );
+ fgSplashProgress("loading scenery objects");
}
- if ( idle_state < 1000 ) {
- fgSplashUpdate( 1.0 );
-
- } else {
+ if ( idle_state == 1000 ) {
// We've finished all our initialization steps, from now on we
// run the main loop.
- fgSetBool("sim/sceneryloaded",false);
+ fgSetBool("sim/sceneryloaded", false);
fgRegisterIdleHandler( fgMainLoop );
}
}
fgInitFGRoot(argc, argv);
// Check for the correct base package version
- static char required_version[] = "0.9.8";
+ static char required_version[] = "0.9.9-pre3";
string base_version = fgBasePackageVersion();
if ( !(base_version == required_version) ) {
// tell the operator how to use this application
sgUseDisplayList = fgGetBool( "/sim/rendering/use-display-list", true );
- // Initialize the Aircraft directory to "" (UIUC)
- aircraft_dir = "";
-
// Load the configuration parameters. (Command line options
// overrides config file options. Config file options override
// defaults.)
fgOSOpenWindow( fgGetInt("/sim/startup/xsize"),
fgGetInt("/sim/startup/ysize"),
fgGetInt("/sim/rendering/bits-per-pixel"),
- fgGetBool("/sim/rendering/clouds3d"),
+ fgGetBool("/sim/rendering/clouds3d-enable"),
get_stencil_buffer,
fgGetBool("/sim/startup/fullscreen") );
// Initialize the splash screen right away
+ fntInit();
fgSplashInit(fgGetString("/sim/startup/splash-texture"));
// pass control off to the master event handler