1999-06-18 03:42:54 +00:00
|
|
|
// main.cxx -- top level sim routines
|
1998-04-21 17:02:27 +00:00
|
|
|
//
|
2002-04-05 00:38:55 +00:00
|
|
|
// Written by Curtis Olson, started May 1997.
|
1998-04-21 17:02:27 +00:00
|
|
|
//
|
2004-11-19 22:10:41 +00:00
|
|
|
// Copyright (C) 1997 - 2002 Curtis L. Olson - http://www.flightgear.org/~curt
|
1998-04-21 17:02:27 +00:00
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
2006-02-21 01:16:04 +00:00
|
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
1998-04-21 17:02:27 +00:00
|
|
|
//
|
|
|
|
// $Id$
|
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2003-08-17 09:54:41 +00:00
|
|
|
#include <simgear/compiler.h>
|
|
|
|
|
2001-12-22 23:16:43 +00:00
|
|
|
#if defined(__linux__) && defined(__i386__)
|
2001-12-22 19:10:37 +00:00
|
|
|
# include <fpu_control.h>
|
2002-01-04 20:56:28 +00:00
|
|
|
# include <signal.h>
|
2001-12-22 19:10:37 +00:00
|
|
|
#endif
|
|
|
|
|
2008-08-14 18:13:39 +00:00
|
|
|
#include <iostream>
|
|
|
|
|
2003-08-25 12:41:40 +00:00
|
|
|
#include <plib/netSocket.h>
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2008-08-01 15:57:29 +00:00
|
|
|
#include <osg/Camera>
|
|
|
|
#include <osg/GraphicsContext>
|
2008-03-22 09:31:06 +00:00
|
|
|
#include <osgDB/Registry>
|
|
|
|
|
2005-03-09 21:56:00 +00:00
|
|
|
// Class references
|
2004-09-20 13:21:51 +00:00
|
|
|
#include <simgear/ephemeris/ephemeris.hxx>
|
2003-05-15 21:35:51 +00:00
|
|
|
#include <simgear/scene/model/modellib.hxx>
|
2004-09-20 13:21:51 +00:00
|
|
|
#include <simgear/scene/material/matlib.hxx>
|
|
|
|
#include <simgear/scene/model/animation.hxx>
|
|
|
|
#include <simgear/scene/sky/sky.hxx>
|
2008-07-31 12:04:32 +00:00
|
|
|
#include <simgear/structure/event_mgr.hxx>
|
|
|
|
#include <simgear/props/props.hxx>
|
|
|
|
#include <simgear/timing/sg_time.hxx>
|
|
|
|
#include <simgear/math/sg_random.h>
|
|
|
|
|
2004-09-20 13:21:51 +00:00
|
|
|
#include <Time/light.hxx>
|
1999-01-07 20:24:43 +00:00
|
|
|
#include <Include/general.hxx>
|
2005-11-01 13:41:49 +00:00
|
|
|
#include <Aircraft/replay.hxx>
|
2003-08-17 09:54:41 +00:00
|
|
|
#include <Cockpit/cockpit.hxx>
|
|
|
|
#include <Cockpit/hud.hxx>
|
|
|
|
#include <Model/panelnode.hxx>
|
|
|
|
#include <Model/modelmgr.hxx>
|
|
|
|
#include <Model/acmodel.hxx>
|
|
|
|
#include <Scenery/scenery.hxx>
|
|
|
|
#include <Scenery/tilemgr.hxx>
|
2004-12-03 21:21:16 +00:00
|
|
|
#include <Sound/beacon.hxx>
|
|
|
|
#include <Sound/morse.hxx>
|
2003-08-17 09:54:41 +00:00
|
|
|
#include <FDM/flight.hxx>
|
2008-05-12 10:38:04 +00:00
|
|
|
#include <ATCDCL/ATCmgr.hxx>
|
|
|
|
#include <ATCDCL/AIMgr.hxx>
|
2003-08-17 09:54:41 +00:00
|
|
|
#include <Time/tmp.hxx>
|
|
|
|
#include <Environment/environment_mgr.hxx>
|
2004-07-22 16:42:14 +00:00
|
|
|
#include <GUI/new_gui.hxx>
|
2005-11-01 13:41:49 +00:00
|
|
|
#include <MultiPlayer/multiplaymgr.hxx>
|
2004-09-20 13:21:51 +00:00
|
|
|
|
2008-08-01 15:57:29 +00:00
|
|
|
#include "CameraGroup.hxx"
|
Andy Ross:
The biggest and coolest patch adds mouse sensitivity to the 3D
cockpits, so we can finally work the radios. This ended up requiring
significant modifications outside of the 3D cockpit code. Stuff folks
will want to look at:
+ The list of all "3D" cockpits is stored statically in the
panelnode.cxx file. This is clumsy, and won't migrate well to a
multiple-aircraft feature. Really, there should be a per-model list
of 3D panels, but I couldn't find a clean place to put this. The
only handle you get back after parsing a model is a generic ssg
node, to which I obviously can't add panel-specific methods.
+ The aircraft model is parsed *very* early in the initialization
order. Earlier, in fact, than the static list of allowable command
bindings is built in fgInitCommands(). This is bad, as it means
that mouse bindings on the instruments can't work yet. I moved the
call to fgInitCommands, but someone should look carefully to see
that I picked the right place. There's a lot of initialization
code, and I got a little lost in there... :)
+ I added yet another "update" hook to the fgRenderFrame routine to
hook the updates for the 3D panels. This is only required for
"mouse press delay", and it's a fairly clumsy mechanism based on
frame rate instead of real time. There appears to be delay handling
already in place in the Input stuff, and there's a discussion going
on about different mouse behavior right now. Maybe this is a good
time to unify these two (now three) approaches?
2002-10-29 19:44:03 +00:00
|
|
|
#include "fg_commands.hxx"
|
2003-08-17 09:54:41 +00:00
|
|
|
#include "fg_io.hxx"
|
2004-09-20 13:21:51 +00:00
|
|
|
#include "renderer.hxx"
|
|
|
|
#include "splash.hxx"
|
2003-08-29 16:46:21 +00:00
|
|
|
#include "main.hxx"
|
2008-07-11 16:36:54 +00:00
|
|
|
#include "util.hxx"
|
2008-07-29 08:27:48 +00:00
|
|
|
#include "fg_init.hxx"
|
2008-08-01 15:57:29 +00:00
|
|
|
#include "WindowSystemAdapter.hxx"
|
|
|
|
|
2002-05-11 16:28:50 +00:00
|
|
|
|
2004-09-20 13:21:51 +00:00
|
|
|
static double real_delta_time_sec = 0.0;
|
|
|
|
double delta_time_sec = 0.0;
|
2004-12-16 13:19:01 +00:00
|
|
|
extern float init_volume;
|
2003-08-29 16:46:21 +00:00
|
|
|
|
2008-08-01 15:57:29 +00:00
|
|
|
using namespace flightgear;
|
|
|
|
|
2008-08-14 18:13:39 +00:00
|
|
|
using std::cerr;
|
|
|
|
|
1999-01-07 20:24:43 +00:00
|
|
|
// This is a record containing a bit of global housekeeping information
|
|
|
|
FGGeneral general;
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
// Specify our current idle function state. This is used to run all
|
2004-03-31 21:10:32 +00:00
|
|
|
// our initializations out of the idle callback so that we can get a
|
1998-07-06 02:42:02 +00:00
|
|
|
// splash screen up and running right away.
|
2004-09-20 13:21:51 +00:00
|
|
|
int idle_state = 0;
|
|
|
|
long global_multi_loop;
|
2000-03-02 13:51:31 +00:00
|
|
|
|
2002-04-20 14:52:43 +00:00
|
|
|
SGTimeStamp last_time_stamp;
|
2002-03-12 16:30:27 +00:00
|
|
|
SGTimeStamp current_time_stamp;
|
|
|
|
|
2006-08-07 15:16:46 +00:00
|
|
|
// The atexit() function handler should know when the graphical subsystem
|
2004-08-24 08:40:41 +00:00
|
|
|
// is initialized.
|
|
|
|
extern int _bootstrap_OSInit;
|
|
|
|
|
2003-03-22 10:38:15 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
// Update internal time dependent calculations (i.e. flight model)
|
2002-05-11 21:10:11 +00:00
|
|
|
// FIXME: this distinction is obsolete; all subsystems now get delta
|
|
|
|
// time on update.
|
2001-01-17 02:37:12 +00:00
|
|
|
void fgUpdateTimeDepCalcs() {
|
2001-01-17 23:30:35 +00:00
|
|
|
static bool inited = false;
|
|
|
|
|
2005-01-05 05:45:38 +00:00
|
|
|
static const SGPropertyNode *replay_state
|
|
|
|
= fgGetNode( "/sim/freeze/replay-state", true );
|
2003-07-17 18:24:17 +00:00
|
|
|
static SGPropertyNode *replay_time
|
|
|
|
= fgGetNode( "/sim/replay/time", true );
|
2004-04-01 15:27:53 +00:00
|
|
|
// static const SGPropertyNode *replay_end_time
|
|
|
|
// = fgGetNode( "/sim/replay/end-time", true );
|
2003-07-17 18:24:17 +00:00
|
|
|
|
2002-02-17 21:05:27 +00:00
|
|
|
//SG_LOG(SG_FLIGHT,SG_INFO, "Updating time dep calcs()");
|
2001-10-28 16:16:30 +00:00
|
|
|
|
|
|
|
// Initialize the FDM here if it hasn't been and if we have a
|
|
|
|
// scenery elevation hit.
|
|
|
|
|
|
|
|
// cout << "cur_fdm_state->get_inited() = " << cur_fdm_state->get_inited()
|
|
|
|
// << " cur_elev = " << scenery.get_cur_elev() << endl;
|
|
|
|
|
2005-08-14 12:57:12 +00:00
|
|
|
if (!cur_fdm_state->get_inited()) {
|
2006-08-07 15:16:46 +00:00
|
|
|
// 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.
|
2008-03-22 09:31:06 +00:00
|
|
|
double range = 1000.0;
|
2009-03-12 06:21:35 +00:00
|
|
|
SGGeod geod = SGGeod::fromDeg(lon, lat);
|
|
|
|
if (globals->get_scenery()->scenery_available(geod, range)) {
|
2008-05-18 21:13:25 +00:00
|
|
|
//SG_LOG(SG_FLIGHT, SG_INFO, "Finally initializing fdm");
|
2006-08-07 15:16:46 +00:00
|
|
|
cur_fdm_state->init();
|
|
|
|
if ( cur_fdm_state->get_bound() ) {
|
|
|
|
cur_fdm_state->unbind();
|
|
|
|
}
|
|
|
|
cur_fdm_state->bind();
|
2003-04-15 14:10:47 +00:00
|
|
|
}
|
2001-10-28 16:16:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// conceptually, the following block could be done for each fdm
|
|
|
|
// instance ...
|
2003-07-18 01:51:45 +00:00
|
|
|
if ( cur_fdm_state->get_inited() ) {
|
2003-04-15 14:10:47 +00:00
|
|
|
// we have been inited, and we are good to go ...
|
2001-01-17 23:30:35 +00:00
|
|
|
|
2005-01-05 05:45:38 +00:00
|
|
|
if ( replay_state->getIntValue() == 0 ) {
|
2006-08-07 15:16:46 +00:00
|
|
|
// replay off, run fdm
|
2003-07-25 20:09:30 +00:00
|
|
|
cur_fdm_state->update( delta_time_sec );
|
2003-07-17 18:24:17 +00:00
|
|
|
} else {
|
|
|
|
FGReplay *r = (FGReplay *)(globals->get_subsystem( "replay" ));
|
|
|
|
r->replay( replay_time->getDoubleValue() );
|
2006-08-07 15:16:46 +00:00
|
|
|
if ( replay_state->getIntValue() == 1 ) {
|
2005-01-05 05:45:38 +00:00
|
|
|
// normal playback
|
|
|
|
replay_time->setDoubleValue( replay_time->getDoubleValue()
|
|
|
|
+ ( delta_time_sec
|
|
|
|
* fgGetInt("/sim/speed-up") ) );
|
2006-08-07 15:16:46 +00:00
|
|
|
} else if ( replay_state->getIntValue() == 2 ) {
|
|
|
|
// paused playback (don't advance replay time)
|
|
|
|
}
|
|
|
|
}
|
2007-10-16 07:55:43 +00:00
|
|
|
|
|
|
|
if ( !inited ) {
|
|
|
|
inited = true;
|
|
|
|
fgSetBool("/sim/signals/fdm-initialized", true);
|
|
|
|
}
|
|
|
|
|
2003-07-18 01:51:45 +00:00
|
|
|
} else {
|
|
|
|
// do nothing, fdm isn't inited yet
|
1999-09-09 00:16:28 +00:00
|
|
|
}
|
|
|
|
|
2004-02-27 16:48:27 +00:00
|
|
|
globals->get_aircraft_model()->update(delta_time_sec);
|
|
|
|
|
2000-03-02 13:51:31 +00:00
|
|
|
// Update solar system
|
2000-07-08 05:09:24 +00:00
|
|
|
globals->get_ephem()->update( globals->get_time_params()->getMjd(),
|
2003-09-15 22:55:39 +00:00
|
|
|
globals->get_time_params()->getLst(),
|
|
|
|
cur_fdm_state->get_Latitude() );
|
2000-04-25 03:09:26 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// What should we do when we have nothing else to do? Let's get ready
|
|
|
|
// for the next move and update the display?
|
1998-04-21 17:02:27 +00:00
|
|
|
static void fgMainLoop( void ) {
|
2003-07-05 09:59:03 +00:00
|
|
|
int model_hz = fgGetInt("/sim/model-hz");
|
2002-05-11 16:28:50 +00:00
|
|
|
|
2007-10-16 15:01:19 +00:00
|
|
|
static SGConstPropertyNode_ptr longitude
|
2003-04-15 14:10:47 +00:00
|
|
|
= fgGetNode("/position/longitude-deg");
|
2007-10-16 15:01:19 +00:00
|
|
|
static SGConstPropertyNode_ptr latitude
|
2003-04-15 14:10:47 +00:00
|
|
|
= fgGetNode("/position/latitude-deg");
|
2007-10-16 15:01:19 +00:00
|
|
|
static SGConstPropertyNode_ptr altitude
|
2003-04-15 14:10:47 +00:00
|
|
|
= fgGetNode("/position/altitude-ft");
|
2008-11-10 15:59:14 +00:00
|
|
|
static SGConstPropertyNode_ptr vn_fps
|
|
|
|
= fgGetNode("/velocities/speed-north-fps");
|
|
|
|
static SGConstPropertyNode_ptr ve_fps
|
|
|
|
= fgGetNode("/velocities/speed-east-fps");
|
|
|
|
static SGConstPropertyNode_ptr vd_fps
|
|
|
|
= fgGetNode("/velocities/speed-down-fps");
|
2007-10-16 15:01:19 +00:00
|
|
|
static SGConstPropertyNode_ptr clock_freeze
|
2003-04-15 14:10:47 +00:00
|
|
|
= fgGetNode("/sim/freeze/clock", true);
|
2007-10-16 15:01:19 +00:00
|
|
|
static SGConstPropertyNode_ptr cur_time_override
|
2003-04-15 14:10:47 +00:00
|
|
|
= fgGetNode("/sim/time/cur-time-override", true);
|
2007-10-16 15:01:19 +00:00
|
|
|
static SGConstPropertyNode_ptr max_simtime_per_frame
|
2006-01-30 10:50:28 +00:00
|
|
|
= fgGetNode("/sim/max-simtime-per-frame", true);
|
2007-10-16 15:01:19 +00:00
|
|
|
static SGPropertyNode_ptr frame_signal
|
|
|
|
= fgGetNode("/sim/signals/frame", true);
|
2001-10-28 16:16:30 +00:00
|
|
|
|
2008-05-18 21:13:25 +00:00
|
|
|
frame_signal->fireValueChanged();
|
2004-10-20 08:18:29 +00:00
|
|
|
SGCloudLayer::enable_bump_mapping = fgGetBool("/sim/rendering/bump-mapping");
|
2004-05-20 13:27:40 +00:00
|
|
|
|
2007-06-19 10:18:14 +00:00
|
|
|
bool scenery_loaded = fgGetBool("sim/sceneryloaded");
|
|
|
|
bool wait_for_scenery = !(scenery_loaded || fgGetBool("sim/sceneryloaded-override"));
|
2005-03-09 15:12:01 +00:00
|
|
|
|
2002-09-27 22:02:48 +00:00
|
|
|
// Update the elapsed time.
|
|
|
|
static bool first_time = true;
|
|
|
|
if ( first_time ) {
|
|
|
|
last_time_stamp.stamp();
|
|
|
|
first_time = false;
|
|
|
|
}
|
2003-06-02 16:35:36 +00:00
|
|
|
|
|
|
|
double throttle_hz = fgGetDouble("/sim/frame-rate-throttle-hz", 0.0);
|
2007-06-19 10:18:14 +00:00
|
|
|
if ( throttle_hz > 0.0 && !wait_for_scenery ) {
|
2006-08-07 15:16:46 +00:00
|
|
|
// optionally throttle the frame rate (to get consistent frame
|
2005-03-09 21:56:00 +00:00
|
|
|
// rates or reduce cpu usage.
|
|
|
|
|
|
|
|
double frame_us = 1000000.0 / throttle_hz;
|
|
|
|
|
|
|
|
#define FG_SLEEP_BASED_TIMING 1
|
|
|
|
#if defined(FG_SLEEP_BASED_TIMING)
|
|
|
|
// sleep based timing loop.
|
|
|
|
//
|
|
|
|
// Calling sleep, even usleep() on linux is less accurate than
|
|
|
|
// we like, but it does free up the cpu for other tasks during
|
2006-08-07 15:16:46 +00:00
|
|
|
// the sleep so it is desirable. Because of the way sleep()
|
|
|
|
// is implemented in consumer operating systems like windows
|
2005-03-09 21:56:00 +00:00
|
|
|
// and linux, you almost always sleep a little longer than the
|
|
|
|
// requested amount.
|
2006-08-07 15:16:46 +00:00
|
|
|
//
|
|
|
|
// To combat the problem of sleeping too long, we calculate the
|
2005-03-09 21:56:00 +00:00
|
|
|
// desired wait time and shorten it by 2000us (2ms) to avoid
|
|
|
|
// [hopefully] over-sleep'ing. The 2ms value was arrived at
|
|
|
|
// via experimentation. We follow this up at the end with a
|
|
|
|
// simple busy-wait loop to get the final pause timing exactly
|
|
|
|
// right.
|
2006-08-07 15:16:46 +00:00
|
|
|
//
|
2005-03-09 21:56:00 +00:00
|
|
|
// Assuming we don't oversleep by more than 2000us, this
|
|
|
|
// should be a reasonable compromise between sleep based
|
|
|
|
// waiting, and busy waiting.
|
|
|
|
|
|
|
|
// sleep() will always overshoot by a bit so undersleep by
|
|
|
|
// 2000us in the hopes of never oversleeping.
|
|
|
|
frame_us -= 2000.0;
|
|
|
|
if ( frame_us < 0.0 ) {
|
|
|
|
frame_us = 0.0;
|
|
|
|
}
|
2003-06-02 16:35:36 +00:00
|
|
|
current_time_stamp.stamp();
|
2005-03-09 21:56:00 +00:00
|
|
|
/* Convert to ms */
|
2009-03-12 18:34:57 +00:00
|
|
|
double elapsed_us = (current_time_stamp - last_time_stamp).toUSecs();
|
2005-03-09 21:56:00 +00:00
|
|
|
if ( elapsed_us < frame_us ) {
|
|
|
|
double requested_us = frame_us - elapsed_us;
|
|
|
|
ulMilliSecondSleep ( (int)(requested_us / 1000.0) ) ;
|
2003-06-02 16:35:36 +00:00
|
|
|
}
|
2005-03-09 21:56:00 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// busy wait timing loop.
|
2006-08-07 15:16:46 +00:00
|
|
|
//
|
2005-03-09 21:56:00 +00:00
|
|
|
// This yields the most accurate timing. If the previous
|
2006-08-07 15:16:46 +00:00
|
|
|
// ulMilliSecondSleep() call is omitted this will peg the cpu
|
2005-03-09 21:56:00 +00:00
|
|
|
// (which is just fine if FG is the only app you care about.)
|
2005-03-09 15:12:01 +00:00
|
|
|
current_time_stamp.stamp();
|
2009-03-12 18:34:57 +00:00
|
|
|
SGTimeStamp next_time_stamp = last_time_stamp;
|
|
|
|
next_time_stamp += SGTimeStamp::fromSec(1e-6*frame_us);
|
|
|
|
while ( current_time_stamp < next_time_stamp ) {
|
2005-03-09 21:56:00 +00:00
|
|
|
current_time_stamp.stamp();
|
|
|
|
}
|
2003-06-02 16:35:36 +00:00
|
|
|
} else {
|
|
|
|
// run as fast as the app will go
|
|
|
|
current_time_stamp.stamp();
|
|
|
|
}
|
|
|
|
|
2009-03-12 18:34:57 +00:00
|
|
|
real_delta_time_sec = (current_time_stamp - last_time_stamp).toSecs();
|
2006-01-30 10:50:28 +00:00
|
|
|
|
|
|
|
// Limit the time we need to spend in simulation loops
|
|
|
|
// That means, if the /sim/max-simtime-per-frame value is strictly positive
|
|
|
|
// you can limit the maximum amount of time you will do simulations for
|
2006-08-07 15:16:46 +00:00
|
|
|
// one frame to display. The cpu time spent in simulations code is roughly
|
2006-01-30 10:50:28 +00:00
|
|
|
// at least O(real_delta_time_sec). If this is (due to running debug
|
|
|
|
// builds or valgrind or something different blowing up execution times)
|
2006-08-07 15:16:46 +00:00
|
|
|
// larger than the real time you will no longer get any response
|
2006-01-30 10:50:28 +00:00
|
|
|
// from flightgear. This limits that effect. Just set to property from
|
|
|
|
// your .fgfsrc or commandline ...
|
|
|
|
double dtMax = max_simtime_per_frame->getDoubleValue();
|
|
|
|
if (0 < dtMax && dtMax < real_delta_time_sec)
|
2006-08-07 15:16:46 +00:00
|
|
|
real_delta_time_sec = dtMax;
|
2006-01-30 10:50:28 +00:00
|
|
|
|
2004-11-20 12:44:42 +00:00
|
|
|
// round the real time down to a multiple of 1/model-hz.
|
|
|
|
// this way all systems are updated the _same_ amount of dt.
|
2009-03-17 06:51:48 +00:00
|
|
|
static double reminder = 0.0;
|
|
|
|
real_delta_time_sec += reminder;
|
|
|
|
global_multi_loop = long(floor(real_delta_time_sec*model_hz));
|
|
|
|
global_multi_loop = SGMisc<long>::max(0, global_multi_loop);
|
|
|
|
reminder = real_delta_time_sec - double(global_multi_loop)/double(model_hz);
|
|
|
|
real_delta_time_sec = double(global_multi_loop)/double(model_hz);
|
2004-11-20 12:44:42 +00:00
|
|
|
|
2007-06-19 10:18:14 +00:00
|
|
|
if (clock_freeze->getBoolValue() || wait_for_scenery) {
|
2002-09-27 22:02:48 +00:00
|
|
|
delta_time_sec = 0;
|
2003-11-21 23:35:25 +00:00
|
|
|
} else {
|
|
|
|
delta_time_sec = real_delta_time_sec;
|
|
|
|
}
|
2002-09-27 22:02:48 +00:00
|
|
|
last_time_stamp = current_time_stamp;
|
|
|
|
globals->inc_sim_time_sec( delta_time_sec );
|
|
|
|
|
2003-12-19 02:42:32 +00:00
|
|
|
// These are useful, especially for Nasal scripts.
|
|
|
|
fgSetDouble("/sim/time/delta-realtime-sec", real_delta_time_sec);
|
|
|
|
fgSetDouble("/sim/time/delta-sec", delta_time_sec);
|
|
|
|
|
1999-05-06 21:14:06 +00:00
|
|
|
#ifdef FANCY_FRAME_COUNTER
|
|
|
|
int i;
|
|
|
|
double accum;
|
|
|
|
#else
|
1998-12-18 23:40:55 +00:00
|
|
|
static time_t last_time = 0;
|
|
|
|
static int frames = 0;
|
1999-05-06 21:14:06 +00:00
|
|
|
#endif // FANCY_FRAME_COUNTER
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-07-07 20:28:51 +00:00
|
|
|
SGTime *t = globals->get_time_params();
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_ALL, SG_DEBUG, "Running Main Loop");
|
|
|
|
SG_LOG( SG_ALL, SG_DEBUG, "======= ==== ====");
|
1998-05-06 03:16:23 +00:00
|
|
|
|
1998-07-12 03:14:42 +00:00
|
|
|
// Fix elevation. I'm just sticking this here for now, it should
|
|
|
|
// probably move eventually
|
|
|
|
|
1998-12-06 14:52:54 +00:00
|
|
|
/* printf("Before - ground = %.2f runway = %.2f alt = %.2f\n",
|
2003-04-15 14:10:47 +00:00
|
|
|
scenery.get_cur_elev(),
|
|
|
|
cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER,
|
|
|
|
cur_fdm_state->get_Altitude() * SG_FEET_TO_METER); */
|
1998-07-12 03:14:42 +00:00
|
|
|
|
1998-12-06 14:52:54 +00:00
|
|
|
/* printf("Adjustment - ground = %.2f runway = %.2f alt = %.2f\n",
|
2003-04-15 14:10:47 +00:00
|
|
|
scenery.get_cur_elev(),
|
|
|
|
cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER,
|
|
|
|
cur_fdm_state->get_Altitude() * SG_FEET_TO_METER); */
|
1998-07-12 03:14:42 +00:00
|
|
|
|
2001-07-02 16:44:02 +00:00
|
|
|
// cout << "Warp = " << globals->get_warp() << endl;
|
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// update "time"
|
2002-02-13 02:37:44 +00:00
|
|
|
static bool last_clock_freeze = false;
|
|
|
|
|
|
|
|
if ( clock_freeze->getBoolValue() ) {
|
2003-04-15 14:10:47 +00:00
|
|
|
// clock freeze requested
|
|
|
|
if ( cur_time_override->getLongValue() == 0 ) {
|
|
|
|
fgSetLong( "/sim/time/cur-time-override", t->get_cur_time() );
|
|
|
|
globals->set_warp( 0 );
|
|
|
|
}
|
2002-02-13 02:37:44 +00:00
|
|
|
} else {
|
2003-04-15 14:10:47 +00:00
|
|
|
// no clock freeze requested
|
|
|
|
if ( last_clock_freeze == true ) {
|
|
|
|
// clock just unfroze, let's set warp as the difference
|
|
|
|
// between frozen time and current time so we don't get a
|
|
|
|
// time jump (and corresponding sky object and lighting
|
|
|
|
// jump.)
|
|
|
|
globals->set_warp( cur_time_override->getLongValue() - time(NULL) );
|
|
|
|
fgSetLong( "/sim/time/cur-time-override", 0 );
|
|
|
|
}
|
|
|
|
if ( globals->get_warp_delta() != 0 ) {
|
|
|
|
globals->inc_warp( globals->get_warp_delta() );
|
|
|
|
}
|
2000-07-07 17:27:37 +00:00
|
|
|
}
|
|
|
|
|
2002-02-13 02:37:44 +00:00
|
|
|
last_clock_freeze = clock_freeze->getBoolValue();
|
|
|
|
|
2001-10-28 16:16:30 +00:00
|
|
|
t->update( longitude->getDoubleValue() * SGD_DEGREES_TO_RADIANS,
|
2003-04-15 14:10:47 +00:00
|
|
|
latitude->getDoubleValue() * SGD_DEGREES_TO_RADIANS,
|
|
|
|
cur_time_override->getLongValue(),
|
|
|
|
globals->get_warp() );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2003-09-20 11:05:12 +00:00
|
|
|
if (globals->get_warp_delta() != 0) {
|
2006-08-07 15:16:46 +00:00
|
|
|
FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
|
|
|
|
l->update( 0.5 );
|
2003-09-20 11:05:12 +00:00
|
|
|
}
|
|
|
|
|
2000-07-05 02:39:30 +00:00
|
|
|
// update magvar model
|
2001-10-28 16:16:30 +00:00
|
|
|
globals->get_mag()->update( longitude->getDoubleValue()
|
2006-08-07 15:16:46 +00:00
|
|
|
* SGD_DEGREES_TO_RADIANS,
|
|
|
|
latitude->getDoubleValue()
|
|
|
|
* SGD_DEGREES_TO_RADIANS,
|
|
|
|
altitude->getDoubleValue() * SG_FEET_TO_METER,
|
|
|
|
globals->get_time_params()->getJD() );
|
2000-07-05 02:39:30 +00:00
|
|
|
|
1998-05-06 03:16:23 +00:00
|
|
|
// Calculate frame rate average
|
1999-05-06 21:14:06 +00:00
|
|
|
#ifdef FANCY_FRAME_COUNTER
|
|
|
|
/* old fps calculation */
|
|
|
|
if ( elapsed > 0 ) {
|
|
|
|
double tmp;
|
|
|
|
accum = 0.0;
|
|
|
|
for ( i = FG_FRAME_RATE_HISTORY - 2; i >= 0; i-- ) {
|
|
|
|
tmp = general.get_frame(i);
|
|
|
|
accum += tmp;
|
|
|
|
// printf("frame[%d] = %.2f\n", i, g->frames[i]);
|
|
|
|
general.set_frame(i+1,tmp);
|
|
|
|
}
|
|
|
|
tmp = 1000000.0 / (float)elapsed;
|
|
|
|
general.set_frame(0,tmp);
|
|
|
|
// printf("frame[0] = %.2f\n", general.frames[0]);
|
|
|
|
accum += tmp;
|
|
|
|
general.set_frame_rate(accum / (float)FG_FRAME_RATE_HISTORY);
|
|
|
|
// printf("ave = %.2f\n", general.frame_rate);
|
|
|
|
}
|
|
|
|
#else
|
1999-04-08 19:53:46 +00:00
|
|
|
if ( (t->get_cur_time() != last_time) && (last_time > 0) ) {
|
2003-04-15 14:10:47 +00:00
|
|
|
general.set_frame_rate( frames );
|
2003-03-29 03:21:48 +00:00
|
|
|
fgSetInt("/sim/frame-rate", frames);
|
2006-08-07 15:16:46 +00:00
|
|
|
SG_LOG( SG_ALL, SG_DEBUG,
|
2003-04-15 14:10:47 +00:00
|
|
|
"--> Frame rate is = " << general.get_frame_rate() );
|
|
|
|
frames = 0;
|
1998-12-18 23:40:55 +00:00
|
|
|
}
|
1999-04-08 19:53:46 +00:00
|
|
|
last_time = t->get_cur_time();
|
1998-12-18 23:40:55 +00:00
|
|
|
++frames;
|
1999-05-06 21:14:06 +00:00
|
|
|
#endif
|
1998-07-12 03:14:42 +00:00
|
|
|
|
2006-02-17 09:43:33 +00:00
|
|
|
// Update any multiplayer's network queues, the AIMultiplayer
|
|
|
|
// implementation is an AI model and depends on that
|
|
|
|
globals->get_multiplayer_mgr()->Update();
|
|
|
|
|
2002-03-01 17:39:52 +00:00
|
|
|
// Run ATC subsystem
|
2005-05-10 09:44:13 +00:00
|
|
|
if (fgGetBool("/sim/atc/enabled"))
|
2003-04-01 13:42:10 +00:00
|
|
|
globals->get_ATC_mgr()->update(delta_time_sec);
|
2002-04-03 23:54:44 +00:00
|
|
|
|
|
|
|
// Run the AI subsystem
|
2006-08-07 15:16:46 +00:00
|
|
|
// FIXME: run that also if we have multiplaying enabled since the
|
2006-02-17 09:43:33 +00:00
|
|
|
// multiplayer information is interpreted by an AI model
|
2002-10-02 15:25:58 +00:00
|
|
|
if (fgGetBool("/sim/ai-traffic/enabled"))
|
|
|
|
globals->get_AI_mgr()->update(delta_time_sec);
|
2002-03-01 17:39:52 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// Run flight model
|
2009-03-17 06:51:48 +00:00
|
|
|
if (0 < global_multi_loop) {
|
2006-08-07 15:16:46 +00:00
|
|
|
// first run the flight model each frame until it is initialized
|
2009-03-17 06:51:48 +00:00
|
|
|
// then continue running each frame only after initial scenery
|
|
|
|
// load is complete.
|
2005-07-13 12:25:16 +00:00
|
|
|
fgUpdateTimeDepCalcs();
|
2001-01-16 21:41:28 +00:00
|
|
|
} else {
|
2006-08-07 15:16:46 +00:00
|
|
|
SG_LOG( SG_ALL, SG_DEBUG,
|
2003-04-15 14:10:47 +00:00
|
|
|
"Elapsed time is zero ... we're zinging" );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
2008-09-05 19:46:21 +00:00
|
|
|
// Run audio scheduler
|
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
|
|
|
if ( globals->get_soundmgr()->is_working() ) {
|
|
|
|
globals->get_soundmgr()->update( delta_time_sec );
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2002-10-03 21:20:56 +00:00
|
|
|
globals->get_subsystem_mgr()->update(delta_time_sec);
|
2002-09-23 19:55:10 +00:00
|
|
|
|
From: "Jim Wilson" <jimw@kelcomaine.com>
This is a new improved patch for the previous tile manager fixes.
Rather than building dependencies between FGlocation or the viewer or fdm with
tilemgr what I ended up doing was linking the pieces together in the Mainloop
in main.cxx. You'll see what I mean...it's been commented fairly well. More
than likely we should move that chunk somewhere...just not sure where yet.
The changes seem clean now. As I get more ideas there could be some further
improvement in organizing the update in tilemgr. You'll note that I left an
override in there for the tilemgr::update() function to preserve earlier
functionality if someone needs it (e.g. usage independent of an fdm or
viewer), not to mention there are a few places in flightgear that call it
directly that have not been changed to the new interface (and may not need to be).
The code has been optimized to avoid duplicate traversals and seems to run
generally quite well. Note that there can be a short delay reloading tiles
that have been dropped from static views. We could call the tile scheduler on
a view switch, but it's not a big deal and at the moment I'd like to get this
in so people can try it and comment on it as it is.
Everything has been resycned with CVS tonight and I've included the
description submitted earlier (below).
Best,
Jim
Changes synced with CVS approx 20:30EDT 2002-05-09 (after this evenings updates).
Files:
http://www.spiderbark.com/fgfs/viewer-update-20020516.tar.gz
or
http://www.spiderbark.com/fgfs/viewer-update-20020516.diffs.gz
Description:
In a nutshell, these patches begin to take what was one value for ground
elevation and calculate ground elevation values seperately for the FDM and the
viewer (eye position). Several outstanding view related bugs have been fixed.
With the introduction of the new viewer code a lot of that Flight Gear code
broke related to use of a global variable called "scenery.cur_elev".
Therefore the ground_elevation and other associated items (like the current
tile bucket) is maintained per FDM instance and per View. Each of these has a
"point" or location that can be identified. See changes to FGLocation class
and main.cxx.
Most of the problems related to the new viewer in terms of sky, ground and
runway lights, and tower views are fixed.
There are four minor problems remaining. 1) The sun/moon spins when you pan
the "lookat" tower view only (view #3). 2) Under stress (esp. magic carpet
full speed with max visibility), there is a memory leak in the tile caching
that was not introduced with these changes. 3) I have not tested these
changes or made corrections to the ADA or External FDM interfaces. 4) The
change view function doesn't call the time/light update (not a problem unless
a tower is very far away).
Details:
FDM/flight.cxx, flight.hxx - FGInterface ties to FGAircraftModel so that it's
location data can be accessed for runway (ground elevation under aircraft)
elevation.
FDM/larsim.cxx, larcsim.hxx - gets runway elevation from FGInterface now.
Commented out function that is causing a namespace conflict, hasn't been
called with recent code anyway.
FDM/JSBSim/JSBSim.cxx, YASim/YASim.cxx - gets runway elevation from
FGInterface now.
Scenery/newcache.cxx, newcache.hxx - changed caching scheme to time based
(oldest tiles discard).
Scenery/tileentry.cxx, tileentry.hxx - added place to record time, changed
rendering to reference viewer altitude in order to fix a problem with ground
and runway lights.
Scenery/tilemgr.cxx, tilemgr.hxx - Modified update() to accept values for
multiple locations. Refresh function added in order to periodically make
the tiles current for a non-moving view (like a tower).
Main/fg_init.cxx - register event for making tiles current in a non-moving
view (like a tower).
Main/location.hxx - added support for current ground elevation data.
Main/main.cxx - added second tilemgr call for fdm, fixed places where viewer
position data was required for correct sky rendering.
Main/options.cxx - fixed segfault reported by Curtis when using --view-offset
command line parameter.
Main/viewer.cxx, viewer.hxx - removed fudging of view position. Fixed numerous
bugs that were causing eye and target values to get mixed up.
2002-05-17 17:25:28 +00:00
|
|
|
//
|
|
|
|
// Tile Manager updates - see if we need to load any new scenery tiles.
|
|
|
|
// this code ties together the fdm, viewer and scenery classes...
|
2006-08-07 15:16:46 +00:00
|
|
|
// we may want to move this to its own class at some point
|
From: "Jim Wilson" <jimw@kelcomaine.com>
This is a new improved patch for the previous tile manager fixes.
Rather than building dependencies between FGlocation or the viewer or fdm with
tilemgr what I ended up doing was linking the pieces together in the Mainloop
in main.cxx. You'll see what I mean...it's been commented fairly well. More
than likely we should move that chunk somewhere...just not sure where yet.
The changes seem clean now. As I get more ideas there could be some further
improvement in organizing the update in tilemgr. You'll note that I left an
override in there for the tilemgr::update() function to preserve earlier
functionality if someone needs it (e.g. usage independent of an fdm or
viewer), not to mention there are a few places in flightgear that call it
directly that have not been changed to the new interface (and may not need to be).
The code has been optimized to avoid duplicate traversals and seems to run
generally quite well. Note that there can be a short delay reloading tiles
that have been dropped from static views. We could call the tile scheduler on
a view switch, but it's not a big deal and at the moment I'd like to get this
in so people can try it and comment on it as it is.
Everything has been resycned with CVS tonight and I've included the
description submitted earlier (below).
Best,
Jim
Changes synced with CVS approx 20:30EDT 2002-05-09 (after this evenings updates).
Files:
http://www.spiderbark.com/fgfs/viewer-update-20020516.tar.gz
or
http://www.spiderbark.com/fgfs/viewer-update-20020516.diffs.gz
Description:
In a nutshell, these patches begin to take what was one value for ground
elevation and calculate ground elevation values seperately for the FDM and the
viewer (eye position). Several outstanding view related bugs have been fixed.
With the introduction of the new viewer code a lot of that Flight Gear code
broke related to use of a global variable called "scenery.cur_elev".
Therefore the ground_elevation and other associated items (like the current
tile bucket) is maintained per FDM instance and per View. Each of these has a
"point" or location that can be identified. See changes to FGLocation class
and main.cxx.
Most of the problems related to the new viewer in terms of sky, ground and
runway lights, and tower views are fixed.
There are four minor problems remaining. 1) The sun/moon spins when you pan
the "lookat" tower view only (view #3). 2) Under stress (esp. magic carpet
full speed with max visibility), there is a memory leak in the tile caching
that was not introduced with these changes. 3) I have not tested these
changes or made corrections to the ADA or External FDM interfaces. 4) The
change view function doesn't call the time/light update (not a problem unless
a tower is very far away).
Details:
FDM/flight.cxx, flight.hxx - FGInterface ties to FGAircraftModel so that it's
location data can be accessed for runway (ground elevation under aircraft)
elevation.
FDM/larsim.cxx, larcsim.hxx - gets runway elevation from FGInterface now.
Commented out function that is causing a namespace conflict, hasn't been
called with recent code anyway.
FDM/JSBSim/JSBSim.cxx, YASim/YASim.cxx - gets runway elevation from
FGInterface now.
Scenery/newcache.cxx, newcache.hxx - changed caching scheme to time based
(oldest tiles discard).
Scenery/tileentry.cxx, tileentry.hxx - added place to record time, changed
rendering to reference viewer altitude in order to fix a problem with ground
and runway lights.
Scenery/tilemgr.cxx, tilemgr.hxx - Modified update() to accept values for
multiple locations. Refresh function added in order to periodically make
the tiles current for a non-moving view (like a tower).
Main/fg_init.cxx - register event for making tiles current in a non-moving
view (like a tower).
Main/location.hxx - added support for current ground elevation data.
Main/main.cxx - added second tilemgr call for fdm, fixed places where viewer
position data was required for correct sky rendering.
Main/options.cxx - fixed segfault reported by Curtis when using --view-offset
command line parameter.
Main/viewer.cxx, viewer.hxx - removed fudging of view position. Fixed numerous
bugs that were causing eye and target values to get mixed up.
2002-05-17 17:25:28 +00:00
|
|
|
//
|
2002-04-19 00:25:25 +00:00
|
|
|
double visibility_meters = fgGetDouble("/environment/visibility-m");
|
2008-09-05 19:46:21 +00:00
|
|
|
FGViewer *current_view = globals->get_current_view();
|
From: "Jim Wilson" <jimw@kelcomaine.com>
This is a new improved patch for the previous tile manager fixes.
Rather than building dependencies between FGlocation or the viewer or fdm with
tilemgr what I ended up doing was linking the pieces together in the Mainloop
in main.cxx. You'll see what I mean...it's been commented fairly well. More
than likely we should move that chunk somewhere...just not sure where yet.
The changes seem clean now. As I get more ideas there could be some further
improvement in organizing the update in tilemgr. You'll note that I left an
override in there for the tilemgr::update() function to preserve earlier
functionality if someone needs it (e.g. usage independent of an fdm or
viewer), not to mention there are a few places in flightgear that call it
directly that have not been changed to the new interface (and may not need to be).
The code has been optimized to avoid duplicate traversals and seems to run
generally quite well. Note that there can be a short delay reloading tiles
that have been dropped from static views. We could call the tile scheduler on
a view switch, but it's not a big deal and at the moment I'd like to get this
in so people can try it and comment on it as it is.
Everything has been resycned with CVS tonight and I've included the
description submitted earlier (below).
Best,
Jim
Changes synced with CVS approx 20:30EDT 2002-05-09 (after this evenings updates).
Files:
http://www.spiderbark.com/fgfs/viewer-update-20020516.tar.gz
or
http://www.spiderbark.com/fgfs/viewer-update-20020516.diffs.gz
Description:
In a nutshell, these patches begin to take what was one value for ground
elevation and calculate ground elevation values seperately for the FDM and the
viewer (eye position). Several outstanding view related bugs have been fixed.
With the introduction of the new viewer code a lot of that Flight Gear code
broke related to use of a global variable called "scenery.cur_elev".
Therefore the ground_elevation and other associated items (like the current
tile bucket) is maintained per FDM instance and per View. Each of these has a
"point" or location that can be identified. See changes to FGLocation class
and main.cxx.
Most of the problems related to the new viewer in terms of sky, ground and
runway lights, and tower views are fixed.
There are four minor problems remaining. 1) The sun/moon spins when you pan
the "lookat" tower view only (view #3). 2) Under stress (esp. magic carpet
full speed with max visibility), there is a memory leak in the tile caching
that was not introduced with these changes. 3) I have not tested these
changes or made corrections to the ADA or External FDM interfaces. 4) The
change view function doesn't call the time/light update (not a problem unless
a tower is very far away).
Details:
FDM/flight.cxx, flight.hxx - FGInterface ties to FGAircraftModel so that it's
location data can be accessed for runway (ground elevation under aircraft)
elevation.
FDM/larsim.cxx, larcsim.hxx - gets runway elevation from FGInterface now.
Commented out function that is causing a namespace conflict, hasn't been
called with recent code anyway.
FDM/JSBSim/JSBSim.cxx, YASim/YASim.cxx - gets runway elevation from
FGInterface now.
Scenery/newcache.cxx, newcache.hxx - changed caching scheme to time based
(oldest tiles discard).
Scenery/tileentry.cxx, tileentry.hxx - added place to record time, changed
rendering to reference viewer altitude in order to fix a problem with ground
and runway lights.
Scenery/tilemgr.cxx, tilemgr.hxx - Modified update() to accept values for
multiple locations. Refresh function added in order to periodically make
the tiles current for a non-moving view (like a tower).
Main/fg_init.cxx - register event for making tiles current in a non-moving
view (like a tower).
Main/location.hxx - added support for current ground elevation data.
Main/main.cxx - added second tilemgr call for fdm, fixed places where viewer
position data was required for correct sky rendering.
Main/options.cxx - fixed segfault reported by Curtis when using --view-offset
command line parameter.
Main/viewer.cxx, viewer.hxx - removed fudging of view position. Fixed numerous
bugs that were causing eye and target values to get mixed up.
2002-05-17 17:25:28 +00:00
|
|
|
|
2007-05-08 06:12:26 +00:00
|
|
|
globals->get_tile_mgr()->prep_ssg_nodes( visibility_meters );
|
From: "Jim Wilson" <jimw@kelcomaine.com>
This is a new improved patch for the previous tile manager fixes.
Rather than building dependencies between FGlocation or the viewer or fdm with
tilemgr what I ended up doing was linking the pieces together in the Mainloop
in main.cxx. You'll see what I mean...it's been commented fairly well. More
than likely we should move that chunk somewhere...just not sure where yet.
The changes seem clean now. As I get more ideas there could be some further
improvement in organizing the update in tilemgr. You'll note that I left an
override in there for the tilemgr::update() function to preserve earlier
functionality if someone needs it (e.g. usage independent of an fdm or
viewer), not to mention there are a few places in flightgear that call it
directly that have not been changed to the new interface (and may not need to be).
The code has been optimized to avoid duplicate traversals and seems to run
generally quite well. Note that there can be a short delay reloading tiles
that have been dropped from static views. We could call the tile scheduler on
a view switch, but it's not a big deal and at the moment I'd like to get this
in so people can try it and comment on it as it is.
Everything has been resycned with CVS tonight and I've included the
description submitted earlier (below).
Best,
Jim
Changes synced with CVS approx 20:30EDT 2002-05-09 (after this evenings updates).
Files:
http://www.spiderbark.com/fgfs/viewer-update-20020516.tar.gz
or
http://www.spiderbark.com/fgfs/viewer-update-20020516.diffs.gz
Description:
In a nutshell, these patches begin to take what was one value for ground
elevation and calculate ground elevation values seperately for the FDM and the
viewer (eye position). Several outstanding view related bugs have been fixed.
With the introduction of the new viewer code a lot of that Flight Gear code
broke related to use of a global variable called "scenery.cur_elev".
Therefore the ground_elevation and other associated items (like the current
tile bucket) is maintained per FDM instance and per View. Each of these has a
"point" or location that can be identified. See changes to FGLocation class
and main.cxx.
Most of the problems related to the new viewer in terms of sky, ground and
runway lights, and tower views are fixed.
There are four minor problems remaining. 1) The sun/moon spins when you pan
the "lookat" tower view only (view #3). 2) Under stress (esp. magic carpet
full speed with max visibility), there is a memory leak in the tile caching
that was not introduced with these changes. 3) I have not tested these
changes or made corrections to the ADA or External FDM interfaces. 4) The
change view function doesn't call the time/light update (not a problem unless
a tower is very far away).
Details:
FDM/flight.cxx, flight.hxx - FGInterface ties to FGAircraftModel so that it's
location data can be accessed for runway (ground elevation under aircraft)
elevation.
FDM/larsim.cxx, larcsim.hxx - gets runway elevation from FGInterface now.
Commented out function that is causing a namespace conflict, hasn't been
called with recent code anyway.
FDM/JSBSim/JSBSim.cxx, YASim/YASim.cxx - gets runway elevation from
FGInterface now.
Scenery/newcache.cxx, newcache.hxx - changed caching scheme to time based
(oldest tiles discard).
Scenery/tileentry.cxx, tileentry.hxx - added place to record time, changed
rendering to reference viewer altitude in order to fix a problem with ground
and runway lights.
Scenery/tilemgr.cxx, tilemgr.hxx - Modified update() to accept values for
multiple locations. Refresh function added in order to periodically make
the tiles current for a non-moving view (like a tower).
Main/fg_init.cxx - register event for making tiles current in a non-moving
view (like a tower).
Main/location.hxx - added support for current ground elevation data.
Main/main.cxx - added second tilemgr call for fdm, fixed places where viewer
position data was required for correct sky rendering.
Main/options.cxx - fixed segfault reported by Curtis when using --view-offset
command line parameter.
Main/viewer.cxx, viewer.hxx - removed fudging of view position. Fixed numerous
bugs that were causing eye and target values to get mixed up.
2002-05-17 17:25:28 +00:00
|
|
|
// update tile manager for view...
|
2009-03-07 15:02:20 +00:00
|
|
|
SGVec3d viewPos = globals->get_current_view()->get_view_pos();
|
|
|
|
SGGeod geodViewPos = SGGeod::fromCart(viewPos);
|
2009-03-07 11:44:39 +00:00
|
|
|
globals->get_tile_mgr()->update(geodViewPos, visibility_meters);
|
2005-08-14 12:57:12 +00:00
|
|
|
|
2008-02-25 12:59:24 +00:00
|
|
|
// run Nasal's settimer() loops right before the view manager
|
|
|
|
globals->get_event_mgr()->update(delta_time_sec);
|
|
|
|
|
2008-11-19 07:46:10 +00:00
|
|
|
// pick up model coordidnates that Nasal code may have set relative to the
|
|
|
|
// aircraft's
|
|
|
|
globals->get_model_mgr()->update(delta_time_sec);
|
|
|
|
|
2008-02-25 12:59:24 +00:00
|
|
|
// update the view angle as late as possible, but before sound calculations
|
|
|
|
globals->get_viewmgr()->update(delta_time_sec);
|
|
|
|
|
|
|
|
// Do any I/O channel work that might need to be done (must come after viewmgr)
|
|
|
|
globals->get_io()->update(real_delta_time_sec);
|
|
|
|
|
2008-09-05 19:46:21 +00:00
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
|
|
|
// Right now we make a simplifying assumption that the primary
|
|
|
|
// aircraft is the source of all sounds and that all sounds are
|
|
|
|
// positioned in the aircraft base
|
|
|
|
|
2008-11-10 15:59:14 +00:00
|
|
|
static sgdVec3 last_listener_pos = {0, 0, 0};
|
2008-09-05 19:46:21 +00:00
|
|
|
static sgdVec3 last_model_pos = {0, 0, 0};
|
|
|
|
|
|
|
|
// get the orientation
|
|
|
|
const SGQuatd view_or = current_view->getViewOrientation();
|
|
|
|
SGQuatd surf_or = SGQuatd::fromLonLatDeg(
|
|
|
|
current_view->getLongitude_deg(), current_view->getLatitude_deg());
|
|
|
|
SGQuatd model_or = SGQuatd::fromYawPitchRollDeg(
|
|
|
|
globals->get_aircraft_model()->get3DModel()->getHeadingDeg(),
|
|
|
|
globals->get_aircraft_model()->get3DModel()->getPitchDeg(),
|
|
|
|
globals->get_aircraft_model()->get3DModel()->getRollDeg());
|
|
|
|
|
|
|
|
// get the up and at vector in the aircraft base
|
|
|
|
// (ok, the up vector is a down vector, but the coordinates
|
|
|
|
// are finally calculated in a left hand system and openal
|
|
|
|
// lives in a right hand system. Therefore we need to pass
|
|
|
|
// the down vector to get correct stereo sound.)
|
|
|
|
SGVec3d sgv_up = model_or.rotateBack(
|
|
|
|
surf_or.rotateBack(view_or.rotate(SGVec3d(0, 1, 0))));
|
|
|
|
sgVec3 up;
|
|
|
|
sgSetVec3(up, sgv_up[0], sgv_up[1], sgv_up[2]);
|
|
|
|
SGVec3d sgv_at = model_or.rotateBack(
|
|
|
|
surf_or.rotateBack(view_or.rotate(SGVec3d(0, 0, 1))));
|
|
|
|
sgVec3 at;
|
|
|
|
sgSetVec3(at, sgv_at[0], sgv_at[1], sgv_at[2]);
|
|
|
|
|
|
|
|
// get the location data for the primary FDM (now hardcoded to ac model)...
|
2009-03-07 11:44:39 +00:00
|
|
|
SGGeod geodPos = globals->get_aircraft_model()->get3DModel()->getPosition();
|
|
|
|
SGVec3d model_pos = SGVec3d::fromGeod(geodPos);
|
2008-09-05 19:46:21 +00:00
|
|
|
|
2008-11-10 15:59:14 +00:00
|
|
|
// Calculate speed of listener and model. This code assumes the
|
|
|
|
// listener is either tracking the model at the same speed or
|
|
|
|
// stationary.
|
|
|
|
|
2008-09-05 19:46:21 +00:00
|
|
|
sgVec3 listener_vel, model_vel;
|
|
|
|
SGVec3d SGV3d_help;
|
|
|
|
sgdVec3 sgdv3_help;
|
|
|
|
sgdVec3 sgdv3_null = {0, 0, 0};
|
|
|
|
|
2008-11-10 15:59:14 +00:00
|
|
|
// the aircraft velocity as reported by the fdm (this will not
|
|
|
|
// vary or be affected by frame rates or timing jitter.)
|
|
|
|
sgVec3 fdm_vel_vec;
|
|
|
|
sgSetVec3( fdm_vel_vec,
|
|
|
|
vn_fps->getDoubleValue() * SG_FEET_TO_METER,
|
|
|
|
ve_fps->getDoubleValue() * SG_FEET_TO_METER,
|
|
|
|
vd_fps->getDoubleValue() * SG_FEET_TO_METER );
|
|
|
|
double fdm_vel = sgLengthVec3(fdm_vel_vec);
|
|
|
|
|
|
|
|
// compute the aircraft velocity vector and scale it to the length
|
|
|
|
// of the fdm velocity vector. This gives us a vector in the
|
|
|
|
// proper coordinate system, but also with the proper time
|
|
|
|
// invariant magnitude.
|
2008-09-05 19:46:21 +00:00
|
|
|
sgdSubVec3( sgdv3_help,
|
2009-03-07 11:44:39 +00:00
|
|
|
last_model_pos, model_pos.sg());
|
|
|
|
sgdAddVec3( last_model_pos, sgdv3_null, model_pos.sg());
|
2008-09-05 19:46:21 +00:00
|
|
|
SGV3d_help = model_or.rotateBack(
|
|
|
|
surf_or.rotateBack(SGVec3d(sgdv3_help[0],
|
|
|
|
sgdv3_help[1], sgdv3_help[2])));
|
|
|
|
sgSetVec3( model_vel, SGV3d_help[0], SGV3d_help[1], SGV3d_help[2]);
|
|
|
|
|
2008-11-10 15:59:14 +00:00
|
|
|
float vel = sgLengthVec3(model_vel);
|
|
|
|
if ( fabs(vel) > 0.0001 ) {
|
|
|
|
if ( fabs(fdm_vel / vel) > 0.0001 ) {
|
|
|
|
sgScaleVec3( model_vel, fdm_vel / vel );
|
|
|
|
}
|
2008-09-05 19:46:21 +00:00
|
|
|
}
|
|
|
|
|
2008-11-10 15:59:14 +00:00
|
|
|
// check for moving or stationary listener (view position)
|
|
|
|
sgdSubVec3( sgdv3_help,
|
2009-03-11 05:36:29 +00:00
|
|
|
last_listener_pos, current_view->get_view_pos().sg());
|
2008-11-10 15:59:14 +00:00
|
|
|
sgdAddVec3( last_listener_pos,
|
2009-03-11 05:36:29 +00:00
|
|
|
sgdv3_null, current_view->get_view_pos().sg());
|
2008-11-10 15:59:14 +00:00
|
|
|
|
2008-12-01 16:13:12 +00:00
|
|
|
if ( sgdLengthVec3(sgdv3_help) > 0.2 ) {
|
2008-11-10 15:59:14 +00:00
|
|
|
sgCopyVec3( listener_vel, model_vel );
|
|
|
|
} else {
|
|
|
|
sgSetVec3( listener_vel, 0.0, 0.0, 0.0 );
|
2008-09-05 19:46:21 +00:00
|
|
|
}
|
2008-11-10 15:59:14 +00:00
|
|
|
|
|
|
|
globals->get_soundmgr()->set_listener_vel( listener_vel );
|
2008-09-05 19:46:21 +00:00
|
|
|
|
|
|
|
// set positional offset for sources
|
|
|
|
sgdVec3 dsource_pos_offset;
|
|
|
|
sgdSubVec3( dsource_pos_offset,
|
2009-03-11 05:36:29 +00:00
|
|
|
current_view->get_view_pos().sg(),
|
2009-03-07 11:44:39 +00:00
|
|
|
model_pos.sg() );
|
2008-09-05 19:46:21 +00:00
|
|
|
SGVec3d sgv_dsource_pos_offset = model_or.rotateBack(
|
|
|
|
surf_or.rotateBack(SGVec3d(dsource_pos_offset[0],
|
|
|
|
dsource_pos_offset[1], dsource_pos_offset[2])));
|
|
|
|
|
|
|
|
sgVec3 source_pos_offset;
|
|
|
|
sgSetVec3(source_pos_offset, sgv_dsource_pos_offset[0],
|
|
|
|
sgv_dsource_pos_offset[1], sgv_dsource_pos_offset[2]);
|
|
|
|
|
|
|
|
globals->get_soundmgr()->set_source_pos_all( source_pos_offset );
|
|
|
|
|
|
|
|
float orient[6];
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
orient[i] = sgv_at[i];
|
|
|
|
orient[i + 3] = sgv_up[i];
|
|
|
|
}
|
|
|
|
globals->get_soundmgr()->set_listener_orientation( orient );
|
|
|
|
|
|
|
|
// set the velocity
|
|
|
|
// all sources are defined to be in the model
|
|
|
|
globals->get_soundmgr()->set_source_vel_all( model_vel );
|
|
|
|
|
|
|
|
// The listener is always positioned at the origin.
|
|
|
|
sgVec3 listener_pos;
|
|
|
|
sgSetVec3( listener_pos, 0.0, 0.0, 0.0 );
|
|
|
|
globals->get_soundmgr()->set_listener_pos( listener_pos );
|
|
|
|
#endif
|
|
|
|
|
From: "Jim Wilson" <jimw@kelcomaine.com>
This is a new improved patch for the previous tile manager fixes.
Rather than building dependencies between FGlocation or the viewer or fdm with
tilemgr what I ended up doing was linking the pieces together in the Mainloop
in main.cxx. You'll see what I mean...it's been commented fairly well. More
than likely we should move that chunk somewhere...just not sure where yet.
The changes seem clean now. As I get more ideas there could be some further
improvement in organizing the update in tilemgr. You'll note that I left an
override in there for the tilemgr::update() function to preserve earlier
functionality if someone needs it (e.g. usage independent of an fdm or
viewer), not to mention there are a few places in flightgear that call it
directly that have not been changed to the new interface (and may not need to be).
The code has been optimized to avoid duplicate traversals and seems to run
generally quite well. Note that there can be a short delay reloading tiles
that have been dropped from static views. We could call the tile scheduler on
a view switch, but it's not a big deal and at the moment I'd like to get this
in so people can try it and comment on it as it is.
Everything has been resycned with CVS tonight and I've included the
description submitted earlier (below).
Best,
Jim
Changes synced with CVS approx 20:30EDT 2002-05-09 (after this evenings updates).
Files:
http://www.spiderbark.com/fgfs/viewer-update-20020516.tar.gz
or
http://www.spiderbark.com/fgfs/viewer-update-20020516.diffs.gz
Description:
In a nutshell, these patches begin to take what was one value for ground
elevation and calculate ground elevation values seperately for the FDM and the
viewer (eye position). Several outstanding view related bugs have been fixed.
With the introduction of the new viewer code a lot of that Flight Gear code
broke related to use of a global variable called "scenery.cur_elev".
Therefore the ground_elevation and other associated items (like the current
tile bucket) is maintained per FDM instance and per View. Each of these has a
"point" or location that can be identified. See changes to FGLocation class
and main.cxx.
Most of the problems related to the new viewer in terms of sky, ground and
runway lights, and tower views are fixed.
There are four minor problems remaining. 1) The sun/moon spins when you pan
the "lookat" tower view only (view #3). 2) Under stress (esp. magic carpet
full speed with max visibility), there is a memory leak in the tile caching
that was not introduced with these changes. 3) I have not tested these
changes or made corrections to the ADA or External FDM interfaces. 4) The
change view function doesn't call the time/light update (not a problem unless
a tower is very far away).
Details:
FDM/flight.cxx, flight.hxx - FGInterface ties to FGAircraftModel so that it's
location data can be accessed for runway (ground elevation under aircraft)
elevation.
FDM/larsim.cxx, larcsim.hxx - gets runway elevation from FGInterface now.
Commented out function that is causing a namespace conflict, hasn't been
called with recent code anyway.
FDM/JSBSim/JSBSim.cxx, YASim/YASim.cxx - gets runway elevation from
FGInterface now.
Scenery/newcache.cxx, newcache.hxx - changed caching scheme to time based
(oldest tiles discard).
Scenery/tileentry.cxx, tileentry.hxx - added place to record time, changed
rendering to reference viewer altitude in order to fix a problem with ground
and runway lights.
Scenery/tilemgr.cxx, tilemgr.hxx - Modified update() to accept values for
multiple locations. Refresh function added in order to periodically make
the tiles current for a non-moving view (like a tower).
Main/fg_init.cxx - register event for making tiles current in a non-moving
view (like a tower).
Main/location.hxx - added support for current ground elevation data.
Main/main.cxx - added second tilemgr call for fdm, fixed places where viewer
position data was required for correct sky rendering.
Main/options.cxx - fixed segfault reported by Curtis when using --view-offset
command line parameter.
Main/viewer.cxx, viewer.hxx - removed fudging of view position. Fixed numerous
bugs that were causing eye and target values to get mixed up.
2002-05-17 17:25:28 +00:00
|
|
|
// END Tile Manager udpates
|
|
|
|
|
2007-12-14 22:51:56 +00:00
|
|
|
if (!scenery_loaded && globals->get_tile_mgr()->isSceneryLoaded()
|
|
|
|
&& cur_fdm_state->get_inited()) {
|
2004-07-22 16:42:14 +00:00
|
|
|
fgSetBool("sim/sceneryloaded",true);
|
2004-12-16 13:19:01 +00:00
|
|
|
fgSetFloat("/sim/sound/volume", init_volume);
|
|
|
|
globals->get_soundmgr()->set_volume(init_volume);
|
2004-07-22 16:42:14 +00:00
|
|
|
}
|
|
|
|
|
2004-03-31 21:10:32 +00:00
|
|
|
fgRequestRedraw();
|
2002-04-19 00:25:25 +00:00
|
|
|
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_ALL, SG_DEBUG, "" );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
2008-08-01 15:57:29 +00:00
|
|
|
// Operation for querying OpenGL parameters. This must be done in a
|
|
|
|
// valid OpenGL context, potentially in another thread.
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
struct GeneralInitOperation : public GraphicsContextOperation
|
|
|
|
{
|
|
|
|
GeneralInitOperation()
|
|
|
|
: GraphicsContextOperation(std::string("General init"))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
void run(osg::GraphicsContext* gc)
|
|
|
|
{
|
2005-05-04 21:28:42 +00:00
|
|
|
general.set_glVendor( (char *)glGetString ( GL_VENDOR ) );
|
|
|
|
general.set_glRenderer( (char *)glGetString ( GL_RENDERER ) );
|
|
|
|
general.set_glVersion( (char *)glGetString ( GL_VERSION ) );
|
|
|
|
SG_LOG( SG_GENERAL, SG_INFO, general.get_glRenderer() );
|
|
|
|
|
|
|
|
GLint tmp;
|
|
|
|
glGetIntegerv( GL_MAX_TEXTURE_SIZE, &tmp );
|
|
|
|
general.set_glMaxTexSize( tmp );
|
|
|
|
SG_LOG ( SG_GENERAL, SG_INFO, "Max texture size = " << tmp );
|
|
|
|
|
|
|
|
glGetIntegerv( GL_DEPTH_BITS, &tmp );
|
|
|
|
general.set_glDepthBits( tmp );
|
|
|
|
SG_LOG ( SG_GENERAL, SG_INFO, "Depth buffer bits = " << tmp );
|
2008-08-01 15:57:29 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
2005-05-04 21:28:42 +00:00
|
|
|
|
2008-08-01 15:57:29 +00:00
|
|
|
// This is the top level master main function that is registered as
|
|
|
|
// our idle funciton
|
2007-04-29 09:58:37 +00:00
|
|
|
|
2008-08-01 15:57:29 +00:00
|
|
|
// The first few passes take care of initialization things (a couple
|
|
|
|
// per pass) and once everything has been initialized fgMainLoop from
|
|
|
|
// then on.
|
2007-04-29 09:58:37 +00:00
|
|
|
|
2008-08-01 15:57:29 +00:00
|
|
|
static void fgIdleFunction ( void ) {
|
|
|
|
static osg::ref_ptr<GeneralInitOperation> genOp;
|
|
|
|
if ( idle_state == 0 ) {
|
|
|
|
idle_state++;
|
|
|
|
// Pick some window on which to do queries.
|
|
|
|
// XXX Perhaps all this graphics initialization code should be
|
|
|
|
// moved to renderer.cxx?
|
|
|
|
genOp = new GeneralInitOperation;
|
|
|
|
osg::Camera* guiCamera = getGUICamera(CameraGroup::getDefault());
|
|
|
|
WindowSystemAdapter* wsa = WindowSystemAdapter::getWSA();
|
|
|
|
osg::GraphicsContext* gc = 0;
|
|
|
|
if (guiCamera)
|
|
|
|
gc = guiCamera->getGraphicsContext();
|
|
|
|
if (gc) {
|
|
|
|
gc->add(genOp.get());
|
|
|
|
} else {
|
|
|
|
wsa->windows[0]->gc->add(genOp.get());
|
|
|
|
}
|
|
|
|
guiStartInit(gc);
|
2007-04-29 09:58:37 +00:00
|
|
|
} else if ( idle_state == 1 ) {
|
2008-08-01 15:57:29 +00:00
|
|
|
if (genOp.valid()) {
|
|
|
|
if (!genOp->isFinished())
|
|
|
|
return;
|
|
|
|
genOp = 0;
|
|
|
|
}
|
2008-05-19 21:21:03 +00:00
|
|
|
if (!guiFinishInit())
|
|
|
|
return;
|
2007-04-29 09:58:37 +00:00
|
|
|
idle_state++;
|
2005-05-06 09:08:44 +00:00
|
|
|
fgSplashProgress("reading aircraft list");
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
|
2005-05-06 09:08:44 +00:00
|
|
|
} else if ( idle_state == 2 ) {
|
2005-05-04 21:28:42 +00:00
|
|
|
idle_state++;
|
2006-08-07 15:16:46 +00:00
|
|
|
// Read the list of available aircraft
|
2005-05-04 21:28:42 +00:00
|
|
|
fgReadAircraft();
|
2005-05-06 09:47:46 +00:00
|
|
|
fgSplashProgress("reading airport & navigation data");
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
|
2005-05-06 09:08:44 +00:00
|
|
|
} else if ( idle_state == 3 ) {
|
2005-05-04 21:28:42 +00:00
|
|
|
idle_state++;
|
|
|
|
fgInitNav();
|
2005-05-06 09:08:44 +00:00
|
|
|
fgSplashProgress("setting up scenery");
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
|
2005-05-06 09:08:44 +00:00
|
|
|
} else if ( idle_state == 4 ) {
|
2005-05-04 21:28:42 +00:00
|
|
|
idle_state++;
|
|
|
|
// based on the requested presets, calculate the true starting
|
|
|
|
// lon, lat
|
|
|
|
fgInitPosition();
|
2007-04-04 19:05:59 +00:00
|
|
|
fgInitTowerLocationListener();
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
SGTime *t = fgInitTime();
|
|
|
|
globals->set_time_params( t );
|
|
|
|
|
|
|
|
// Do some quick general initializations
|
|
|
|
if( !fgInitGeneral()) {
|
2006-08-07 15:16:46 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT,
|
|
|
|
"General initialization failed ..." );
|
2005-05-04 21:28:42 +00:00
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the property-based built-in commands
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
fgInitCommands();
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the material manager
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
globals->set_matlib( new SGMaterialLib );
|
2008-03-22 09:31:06 +00:00
|
|
|
simgear::SGModelLib::init(globals->get_fg_root());
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the TG scenery subsystem.
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
globals->set_scenery( new FGScenery );
|
|
|
|
globals->get_scenery()->init();
|
|
|
|
globals->get_scenery()->bind();
|
|
|
|
globals->set_tile_mgr( new FGTileMgr );
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the general model subsystem.
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
globals->set_model_mgr(new FGModelMgr);
|
|
|
|
globals->get_model_mgr()->init();
|
|
|
|
globals->get_model_mgr()->bind();
|
2005-05-06 09:08:44 +00:00
|
|
|
fgSplashProgress("loading aircraft");
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
|
2005-05-06 09:08:44 +00:00
|
|
|
} else if ( idle_state == 5 ) {
|
2005-05-04 21:28:42 +00:00
|
|
|
idle_state++;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the 3D aircraft model subsystem (has a dependency on
|
|
|
|
// the scenery subsystem.)
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
globals->set_aircraft_model(new FGAircraftModel);
|
|
|
|
globals->get_aircraft_model()->init();
|
|
|
|
globals->get_aircraft_model()->bind();
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the view manager subsystem.
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
FGViewMgr *viewmgr = new FGViewMgr;
|
|
|
|
globals->set_viewmgr( viewmgr );
|
|
|
|
viewmgr->init();
|
|
|
|
viewmgr->bind();
|
2005-05-06 09:08:44 +00:00
|
|
|
fgSplashProgress("generating sky elements");
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
|
2005-05-06 09:08:44 +00:00
|
|
|
} else if ( idle_state == 6 ) {
|
2005-05-04 21:28:42 +00:00
|
|
|
idle_state++;
|
|
|
|
// Initialize the sky
|
|
|
|
SGPath ephem_data_path( globals->get_fg_root() );
|
|
|
|
ephem_data_path.append( "Astro" );
|
|
|
|
SGEphemeris *ephem = new SGEphemeris( ephem_data_path.c_str() );
|
|
|
|
ephem->update( globals->get_time_params()->getMjd(),
|
|
|
|
globals->get_time_params()->getLst(),
|
|
|
|
0.0 );
|
|
|
|
globals->set_ephem( ephem );
|
|
|
|
|
|
|
|
// TODO: move to environment mgr
|
|
|
|
thesky = new SGSky;
|
|
|
|
SGPath texture_path(globals->get_fg_root());
|
|
|
|
texture_path.append("Textures");
|
|
|
|
texture_path.append("Sky");
|
|
|
|
for (int i = 0; i < FGEnvironmentMgr::MAX_CLOUD_LAYERS; i++) {
|
|
|
|
SGCloudLayer * layer = new SGCloudLayer(texture_path.str());
|
|
|
|
thesky->add_cloud_layer(layer);
|
|
|
|
}
|
|
|
|
|
|
|
|
SGPath sky_tex_path( globals->get_fg_root() );
|
|
|
|
sky_tex_path.append( "Textures" );
|
|
|
|
sky_tex_path.append( "Sky" );
|
|
|
|
thesky->texture_path( sky_tex_path.str() );
|
|
|
|
|
|
|
|
// The sun and moon diameters are scaled down numbers of the
|
2006-08-07 15:16:46 +00:00
|
|
|
// actual diameters. This was needed to fit both the sun and the
|
2005-05-04 21:28:42 +00:00
|
|
|
// moon within the distance to the far clip plane.
|
|
|
|
// Moon diameter: 3,476 kilometers
|
|
|
|
// Sun diameter: 1,390,000 kilometers
|
|
|
|
thesky->build( 80000.0, 80000.0,
|
|
|
|
463.3, 361.8,
|
2006-08-07 15:16:46 +00:00
|
|
|
globals->get_ephem()->getNumPlanets(),
|
2005-05-04 21:28:42 +00:00
|
|
|
globals->get_ephem()->getPlanets(),
|
|
|
|
globals->get_ephem()->getNumStars(),
|
2006-07-27 05:16:06 +00:00
|
|
|
globals->get_ephem()->getStars(),
|
2006-08-07 15:16:46 +00:00
|
|
|
fgGetNode("/environment", true));
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
// Initialize MagVar model
|
|
|
|
SGMagVar *magvar = new SGMagVar();
|
|
|
|
globals->set_mag( magvar );
|
|
|
|
|
|
|
|
|
|
|
|
// kludge to initialize mag compass
|
|
|
|
// (should only be done for in-flight
|
|
|
|
// startup)
|
|
|
|
// update magvar model
|
|
|
|
globals->get_mag()->update( fgGetDouble("/position/longitude-deg")
|
|
|
|
* SGD_DEGREES_TO_RADIANS,
|
|
|
|
fgGetDouble("/position/latitude-deg")
|
|
|
|
* SGD_DEGREES_TO_RADIANS,
|
|
|
|
fgGetDouble("/position/altitude-ft")
|
|
|
|
* SG_FEET_TO_METER,
|
|
|
|
globals->get_time_params()->getJD() );
|
|
|
|
double var = globals->get_mag()->get_magvar() * SGD_RADIANS_TO_DEGREES;
|
|
|
|
fgSetDouble("/instrumentation/heading-indicator/offset-deg", -var);
|
2006-06-24 03:42:30 +00:00
|
|
|
fgSetDouble("/instrumentation/heading-indicator-fg/offset-deg", -var);
|
|
|
|
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
// airport = new ssgBranch;
|
|
|
|
// airport->setName( "Airport Lighting" );
|
|
|
|
// lighting->addKid( airport );
|
|
|
|
|
|
|
|
// build our custom render states
|
2005-05-06 09:08:44 +00:00
|
|
|
fgSplashProgress("initializing subsystems");
|
2005-05-04 21:28:42 +00:00
|
|
|
|
|
|
|
|
2005-05-06 09:08:44 +00:00
|
|
|
} else if ( idle_state == 7 ) {
|
2005-05-04 21:28:42 +00:00
|
|
|
idle_state++;
|
2003-04-15 14:10:47 +00:00
|
|
|
// Initialize audio support
|
2001-07-11 06:01:55 +00:00
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
|
|
|
|
2003-04-15 14:10:47 +00:00
|
|
|
// Start the intro music
|
|
|
|
if ( fgGetBool("/sim/startup/intro-music") ) {
|
|
|
|
SGPath mp3file( globals->get_fg_root() );
|
|
|
|
mp3file.append( "Sounds/intro.mp3" );
|
1999-04-27 19:27:45 +00:00
|
|
|
|
2006-08-07 15:16:46 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO,
|
2003-04-15 14:10:47 +00:00
|
|
|
"Starting intro music: " << mp3file.str() );
|
2001-07-11 06:01:55 +00:00
|
|
|
|
2002-02-05 05:04:02 +00:00
|
|
|
#if defined( __CYGWIN__ )
|
2003-04-15 14:10:47 +00:00
|
|
|
string command = "start /m `cygpath -w " + mp3file.str() + "`";
|
2002-02-05 05:04:02 +00:00
|
|
|
#elif defined( WIN32 )
|
2003-04-15 14:10:47 +00:00
|
|
|
string command = "start /m " + mp3file.str();
|
2002-02-05 05:04:02 +00:00
|
|
|
#else
|
2003-04-15 14:10:47 +00:00
|
|
|
string command = "mpg123 " + mp3file.str() + "> /dev/null 2>&1";
|
2002-02-05 05:04:02 +00:00
|
|
|
#endif
|
|
|
|
|
2003-04-15 14:10:47 +00:00
|
|
|
system ( command.c_str() );
|
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
#endif
|
2003-04-15 14:10:47 +00:00
|
|
|
// This is the top level init routine which calls all the
|
|
|
|
// other subsystem initialization routines. If you are adding
|
2006-08-07 15:16:46 +00:00
|
|
|
// a subsystem to flightgear, its initialization call should be
|
2003-04-15 14:10:47 +00:00
|
|
|
// located in this routine.
|
|
|
|
if( !fgInitSubsystems()) {
|
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT,
|
2006-08-07 15:16:46 +00:00
|
|
|
"Subsystem initialization failed ..." );
|
2003-04-15 14:10:47 +00:00
|
|
|
exit(-1);
|
|
|
|
}
|
2005-05-06 09:16:30 +00:00
|
|
|
fgSplashProgress("setting up time & renderer");
|
2003-04-15 14:10:47 +00:00
|
|
|
|
2005-05-04 21:28:42 +00:00
|
|
|
|
2005-05-06 09:08:44 +00:00
|
|
|
} else if ( idle_state == 8 ) {
|
|
|
|
idle_state = 1000;
|
2003-09-15 22:55:39 +00:00
|
|
|
// Initialize the time offset (warp) after fgInitSubsystem
|
|
|
|
// (which initializes the lighting interpolation tables.)
|
|
|
|
fgInitTimeOffset();
|
|
|
|
|
2003-04-15 14:10:47 +00:00
|
|
|
// setup OpenGL view parameters
|
2004-09-20 13:21:51 +00:00
|
|
|
globals->get_renderer()->init();
|
1998-07-06 02:42:02 +00:00
|
|
|
|
2003-04-15 14:10:47 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO, "Panel visible = " << fgPanelVisible() );
|
2004-09-20 13:21:51 +00:00
|
|
|
globals->get_renderer()->resize( fgGetInt("/sim/startup/xsize"),
|
|
|
|
fgGetInt("/sim/startup/ysize") );
|
2003-09-17 10:02:36 +00:00
|
|
|
|
2005-05-06 09:08:44 +00:00
|
|
|
fgSplashProgress("loading scenery objects");
|
1998-07-06 02:42:02 +00:00
|
|
|
|
2005-05-04 21:28:42 +00:00
|
|
|
}
|
|
|
|
|
2005-05-06 09:08:44 +00:00
|
|
|
if ( idle_state == 1000 ) {
|
2003-04-15 14:10:47 +00:00
|
|
|
// We've finished all our initialization steps, from now on we
|
|
|
|
// run the main loop.
|
2005-05-06 09:08:44 +00:00
|
|
|
fgSetBool("sim/sceneryloaded", false);
|
2005-05-04 21:28:42 +00:00
|
|
|
fgRegisterIdleHandler( fgMainLoop );
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-04-25 02:06:55 +00:00
|
|
|
|
2006-03-10 11:46:03 +00:00
|
|
|
static void upper_case_property(const char *name)
|
|
|
|
{
|
|
|
|
SGPropertyNode *p = fgGetNode(name, false);
|
|
|
|
if (!p) {
|
|
|
|
p = fgGetNode(name, true);
|
|
|
|
p->setStringValue("");
|
|
|
|
} else {
|
|
|
|
SGPropertyNode::Type t = p->getType();
|
|
|
|
if (t == SGPropertyNode::NONE || t == SGPropertyNode::UNSPECIFIED)
|
|
|
|
p->setStringValue("");
|
|
|
|
else
|
|
|
|
assert(t == SGPropertyNode::STRING);
|
|
|
|
}
|
|
|
|
p->addChangeListener(new FGMakeUpperCase);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-11-16 20:17:11 +00:00
|
|
|
// Main top level initialization
|
2003-08-17 09:54:41 +00:00
|
|
|
bool fgMainInit( int argc, char **argv ) {
|
2001-10-29 04:39:54 +00:00
|
|
|
|
1998-11-16 13:59:58 +00:00
|
|
|
// set default log levels
|
2003-11-24 17:46:38 +00:00
|
|
|
sglog().setLogLevels( SG_ALL, SG_ALERT );
|
1998-11-16 13:59:58 +00:00
|
|
|
|
2001-01-11 05:04:17 +00:00
|
|
|
string version;
|
|
|
|
#ifdef FLIGHTGEAR_VERSION
|
|
|
|
version = FLIGHTGEAR_VERSION;
|
|
|
|
#else
|
|
|
|
version = "unknown version";
|
|
|
|
#endif
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO, "FlightGear: Version "
|
2003-04-15 14:10:47 +00:00
|
|
|
<< version );
|
2002-05-17 16:41:27 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO, "Built with " << SG_COMPILER_STR << endl );
|
1998-11-20 01:02:35 +00:00
|
|
|
|
2000-10-19 23:09:33 +00:00
|
|
|
// Allocate global data structures. This needs to happen before
|
|
|
|
// we parse command line options
|
2001-01-12 15:37:40 +00:00
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
globals = new FGGlobals;
|
|
|
|
|
2006-08-07 15:16:46 +00:00
|
|
|
// seed the random number generator
|
2001-01-13 22:06:39 +00:00
|
|
|
sg_srandom_time();
|
|
|
|
|
2001-07-22 19:51:16 +00:00
|
|
|
FGControls *controls = new FGControls;
|
|
|
|
globals->set_controls( controls );
|
|
|
|
|
2001-01-26 00:21:36 +00:00
|
|
|
string_list *col = new string_list;
|
|
|
|
globals->set_channel_options_list( col );
|
|
|
|
|
2008-07-11 16:36:54 +00:00
|
|
|
fgValidatePath("", false); // initialize static variables
|
2006-03-10 11:46:03 +00:00
|
|
|
upper_case_property("/sim/presets/airport-id");
|
|
|
|
upper_case_property("/sim/presets/runway");
|
|
|
|
upper_case_property("/sim/tower/airport-id");
|
2008-06-06 07:49:41 +00:00
|
|
|
upper_case_property("/autopilot/route-manager/input");
|
2006-03-10 11:46:03 +00:00
|
|
|
|
2000-10-04 22:52:34 +00:00
|
|
|
// Scan the config file(s) and command line options to see if
|
|
|
|
// fg_root was specified (ignore all other options for now)
|
|
|
|
fgInitFGRoot(argc, argv);
|
2000-09-25 21:41:50 +00:00
|
|
|
|
2001-07-16 19:17:58 +00:00
|
|
|
// Check for the correct base package version
|
2008-12-19 20:41:57 +00:00
|
|
|
static char required_version[] = "1.9.0";
|
2001-07-16 19:17:58 +00:00
|
|
|
string base_version = fgBasePackageVersion();
|
2002-06-07 23:26:07 +00:00
|
|
|
if ( !(base_version == required_version) ) {
|
2002-02-04 22:06:37 +00:00
|
|
|
// tell the operator how to use this application
|
|
|
|
|
2004-04-03 09:27:38 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "" ); // To popup the console on windows
|
|
|
|
cerr << endl << "Base package check failed ... " \
|
2003-04-15 14:10:47 +00:00
|
|
|
<< "Found version " << base_version << " at: " \
|
2004-04-03 09:27:38 +00:00
|
|
|
<< globals->get_fg_root() << endl;
|
|
|
|
cerr << "Please upgrade to version: " << required_version << endl;
|
2004-03-30 09:05:05 +00:00
|
|
|
#ifdef _MSC_VER
|
2004-04-03 09:27:38 +00:00
|
|
|
cerr << "Hit a key to continue..." << endl;
|
2004-03-30 09:05:05 +00:00
|
|
|
cin.get();
|
|
|
|
#endif
|
2003-04-15 14:10:47 +00:00
|
|
|
exit(-1);
|
2001-07-16 19:17:58 +00:00
|
|
|
}
|
|
|
|
|
2002-11-16 20:17:11 +00:00
|
|
|
// Load the configuration parameters. (Command line options
|
2006-08-07 15:16:46 +00:00
|
|
|
// override config file options. Config file options override
|
2002-11-16 20:17:11 +00:00
|
|
|
// defaults.)
|
1999-06-18 03:42:54 +00:00
|
|
|
if ( !fgInitConfig(argc, argv) ) {
|
2003-04-15 14:10:47 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Config option parsing failed ..." );
|
|
|
|
exit(-1);
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
1999-06-18 03:42:54 +00:00
|
|
|
|
1998-08-20 15:10:33 +00:00
|
|
|
// Initialize the Window/Graphics environment.
|
2004-03-31 21:10:32 +00:00
|
|
|
fgOSInit(&argc, argv);
|
2004-08-24 08:40:41 +00:00
|
|
|
_bootstrap_OSInit++;
|
1998-08-20 15:10:33 +00:00
|
|
|
|
2004-12-20 08:36:56 +00:00
|
|
|
fgRegisterWindowResizeHandler( &FGRenderer::resize );
|
|
|
|
fgRegisterIdleHandler( &fgIdleFunction );
|
|
|
|
fgRegisterDrawHandler( &FGRenderer::update );
|
2004-03-31 21:10:32 +00:00
|
|
|
|
2004-04-02 14:40:54 +00:00
|
|
|
#ifdef FG_ENABLE_MULTIPASS_CLOUDS
|
|
|
|
bool get_stencil_buffer = true;
|
|
|
|
#else
|
|
|
|
bool get_stencil_buffer = false;
|
|
|
|
#endif
|
|
|
|
|
2005-05-04 21:28:42 +00:00
|
|
|
// Initialize plib net interface
|
|
|
|
netInit( &argc, argv );
|
|
|
|
|
2004-03-31 21:10:32 +00:00
|
|
|
// Clouds3D requires an alpha channel
|
2004-04-03 09:27:38 +00:00
|
|
|
// clouds may require stencil buffer
|
2008-05-19 21:21:03 +00:00
|
|
|
fgOSOpenWindow(get_stencil_buffer);
|
2004-03-31 21:10:32 +00:00
|
|
|
|
2005-05-04 21:28:42 +00:00
|
|
|
// Initialize the splash screen right away
|
2005-05-08 14:32:56 +00:00
|
|
|
fntInit();
|
2007-05-03 18:12:29 +00:00
|
|
|
fgSplashInit();
|
2004-05-20 13:27:40 +00:00
|
|
|
|
2004-10-17 17:29:34 +00:00
|
|
|
// pass control off to the master event handler
|
|
|
|
fgOSMainLoop();
|
1998-04-24 00:49:17 +00:00
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// we never actually get here ... but to avoid compiler warnings,
|
|
|
|
// etc.
|
2002-11-16 20:17:11 +00:00
|
|
|
return false;
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
|
|
|
|
|