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
|
|
|
//
|
2002-04-05 00:38:55 +00:00
|
|
|
// Copyright (C) 1997 - 2002 Curtis L. Olson - curt@flightgear.org
|
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
|
|
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
//
|
|
|
|
// $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
|
|
|
|
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
|
|
|
|
|
2001-07-12 17:55:44 +00:00
|
|
|
#include <simgear/compiler.h>
|
2002-04-04 17:51:40 +00:00
|
|
|
|
2002-04-05 00:38:55 +00:00
|
|
|
#include STL_IOSTREAM
|
2002-04-16 17:28:57 +00:00
|
|
|
#ifndef SG_HAVE_NATIVE_SGI_COMPILERS
|
2002-04-04 17:51:40 +00:00
|
|
|
SG_USING_STD(cerr);
|
|
|
|
SG_USING_STD(endl);
|
2002-04-16 17:28:57 +00:00
|
|
|
#endif
|
2002-04-04 17:51:40 +00:00
|
|
|
|
2001-07-19 04:54:53 +00:00
|
|
|
#include <simgear/misc/exception.hxx>
|
2002-03-16 00:18:38 +00:00
|
|
|
#include <simgear/ephemeris/ephemeris.hxx>
|
|
|
|
#include <simgear/route/route.hxx>
|
2001-07-12 17:55:44 +00:00
|
|
|
|
2001-03-23 22:42:49 +00:00
|
|
|
#ifdef SG_MATH_EXCEPTION_CLASH
|
1999-05-08 02:33:13 +00:00
|
|
|
# include <math.h>
|
|
|
|
#endif
|
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
#ifdef HAVE_WINDOWS_H
|
2001-03-19 13:56:19 +00:00
|
|
|
# include <windows.h>
|
|
|
|
# include <float.h>
|
1998-04-21 17:02:27 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <GL/glut.h>
|
2001-05-15 22:30:39 +00:00
|
|
|
#include <GL/gl.h>
|
2000-02-15 03:30:01 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
#include <stdio.h>
|
2002-03-20 22:15:22 +00:00
|
|
|
#include <string.h> // for strcmp()
|
1998-08-27 17:01:55 +00:00
|
|
|
#include <string>
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
#ifdef HAVE_STDLIB_H
|
|
|
|
# include <stdlib.h>
|
|
|
|
#endif
|
|
|
|
|
1999-01-19 20:57:00 +00:00
|
|
|
#ifdef HAVE_SYS_STAT_H
|
2000-11-01 02:30:10 +00:00
|
|
|
# include <sys/stat.h> // for stat()
|
1999-01-19 20:57:00 +00:00
|
|
|
#endif
|
1998-07-06 02:42:02 +00:00
|
|
|
|
|
|
|
#ifdef HAVE_UNISTD_H
|
2000-11-01 02:30:10 +00:00
|
|
|
# include <unistd.h> // for stat()
|
1998-07-06 02:42:02 +00:00
|
|
|
#endif
|
|
|
|
|
2001-08-21 21:13:55 +00:00
|
|
|
#include <plib/netChat.h>
|
2000-11-01 02:30:10 +00:00
|
|
|
#include <plib/pu.h>
|
2002-07-30 04:37:16 +00:00
|
|
|
#include <plib/sg.h>
|
2000-11-01 02:30:10 +00:00
|
|
|
#include <plib/ssg.h>
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
#include <simgear/constants.h> // for VERSION
|
2000-02-16 23:01:03 +00:00
|
|
|
#include <simgear/debug/logstream.hxx>
|
|
|
|
#include <simgear/math/polar3d.hxx>
|
2000-12-04 05:26:40 +00:00
|
|
|
#include <simgear/math/sg_random.h>
|
2001-03-25 14:20:12 +00:00
|
|
|
#include <simgear/misc/sg_path.hxx>
|
2002-09-15 04:32:49 +00:00
|
|
|
#include <simgear/sky/clouds3d/SkySceneLoader.hpp>
|
|
|
|
#include <simgear/sky/clouds3d/SkyUtil.hpp>
|
2000-07-03 20:09:56 +00:00
|
|
|
#include <simgear/sky/sky.hxx>
|
2000-07-06 22:13:24 +00:00
|
|
|
#include <simgear/timing/sg_time.hxx>
|
2000-02-15 03:30:01 +00:00
|
|
|
|
1999-01-07 20:24:43 +00:00
|
|
|
#include <Include/general.hxx>
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-10-17 01:33:52 +00:00
|
|
|
#include <Aircraft/aircraft.hxx>
|
1998-06-03 00:47:11 +00:00
|
|
|
|
2002-03-01 17:39:52 +00:00
|
|
|
#include <ATC/ATCmgr.hxx>
|
2001-11-07 17:55:28 +00:00
|
|
|
#include <ATC/ATCdisplay.hxx>
|
2002-10-02 15:25:58 +00:00
|
|
|
#include <ATC/AIMgr.hxx>
|
2002-08-25 20:56:16 +00:00
|
|
|
|
2002-04-03 23:54:44 +00:00
|
|
|
|
2000-04-30 06:51:49 +00:00
|
|
|
#include <Autopilot/newauto.hxx>
|
2001-11-07 17:55:28 +00:00
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
#include <Cockpit/cockpit.hxx>
|
2000-04-25 03:09:26 +00:00
|
|
|
#include <Cockpit/radiostack.hxx>
|
2000-03-21 20:51:03 +00:00
|
|
|
#include <Cockpit/steam.hxx>
|
2000-05-16 18:21:08 +00:00
|
|
|
|
2000-03-22 22:01:33 +00:00
|
|
|
#include <FDM/UIUCModel/uiuc_aircraftdir.h>
|
1998-06-12 14:27:25 +00:00
|
|
|
#include <GUI/gui.h>
|
2002-04-05 03:19:34 +00:00
|
|
|
#include <Model/acmodel.hxx>
|
2002-08-07 01:34:49 +00:00
|
|
|
#include <Model/loader.hxx>
|
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
|
|
|
#include <Model/model.hxx>
|
2002-08-07 01:34:49 +00:00
|
|
|
#include <Model/modelmgr.hxx>
|
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
|
|
|
#include <Main/location.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 <Model/panelnode.hxx>
|
1999-06-30 20:21:04 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
2000-01-12 18:09:35 +00:00
|
|
|
#include <NetworkOLK/network.h>
|
1999-06-30 20:21:04 +00:00
|
|
|
#endif
|
2001-05-15 00:01:04 +00:00
|
|
|
#include <Objects/matlib.hxx>
|
1998-04-30 12:34:17 +00:00
|
|
|
#include <Scenery/scenery.hxx>
|
1998-04-22 13:25:39 +00:00
|
|
|
#include <Scenery/tilemgr.hxx>
|
2001-03-05 22:54:20 +00:00
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
|
|
|
# include <Sound/soundmgr.hxx>
|
2001-10-29 04:39:54 +00:00
|
|
|
# include <Sound/fg_fx.hxx>
|
2001-03-05 22:54:20 +00:00
|
|
|
# include <Sound/morse.hxx>
|
|
|
|
#endif
|
2002-09-23 19:55:10 +00:00
|
|
|
#include <Systems/system_mgr.hxx>
|
2002-09-24 14:51:37 +00:00
|
|
|
#include <Instrumentation/instrument_mgr.hxx>
|
2002-04-05 20:03:49 +00:00
|
|
|
#include <Time/FGEventMgr.hxx>
|
1998-04-24 00:49:17 +00:00
|
|
|
#include <Time/fg_timer.hxx>
|
2000-10-25 22:59:02 +00:00
|
|
|
#include <Time/light.hxx>
|
1998-04-22 13:25:39 +00:00
|
|
|
#include <Time/sunpos.hxx>
|
2000-07-05 02:39:30 +00:00
|
|
|
#include <Time/tmp.hxx>
|
1999-08-12 17:13:44 +00:00
|
|
|
|
2001-09-19 22:58:29 +00:00
|
|
|
// ADA
|
2001-03-25 14:20:12 +00:00
|
|
|
#include <simgear/misc/sgstream.hxx>
|
2001-09-19 22:58:29 +00:00
|
|
|
#include <simgear/math/point3d.hxx>
|
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
|
|
|
#include <FDM/flight.hxx>
|
2000-12-08 20:05:43 +00:00
|
|
|
#include <FDM/ADA.hxx>
|
2001-09-19 22:58:29 +00:00
|
|
|
#include <Scenery/tileentry.hxx>
|
2002-02-05 20:54:08 +00:00
|
|
|
|
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"
|
2002-10-17 04:34:32 +00:00
|
|
|
|
|
|
|
// #define FG_EXPERIMENTAL_LIGHTING
|
2002-10-21 03:22:27 +00:00
|
|
|
#ifdef FG_EXPERIMENTAL_LIGHTING
|
|
|
|
# ifdef WIN32
|
2002-10-17 04:34:32 +00:00
|
|
|
typedef void (APIENTRY * PFNGLPOINTPARAMETERFEXTPROC)(GLenum pname,
|
|
|
|
GLfloat param);
|
|
|
|
typedef void (APIENTRY * PFNGLPOINTPARAMETERFVEXTPROC)(GLenum pname,
|
|
|
|
const GLfloat *params);
|
|
|
|
|
2002-10-16 03:44:44 +00:00
|
|
|
PFNGLPOINTPARAMETERFEXTPROC glPointParameterfEXT = 0;
|
|
|
|
PFNGLPOINTPARAMETERFVEXTPROC glPointParameterfvEXT = 0;
|
2002-10-21 03:22:27 +00:00
|
|
|
# elif linux
|
2002-10-17 04:34:32 +00:00
|
|
|
#include <GL/glx.h>
|
|
|
|
|
|
|
|
typedef void (* OpenGLFuncExt)(GLenum pname, GLfloat param);
|
|
|
|
typedef void (* OpenGLFuncExtv)(GLenum pname, const GLfloat *params);
|
|
|
|
|
|
|
|
OpenGLFuncExt glPointParameterfEXT = 0;
|
|
|
|
OpenGLFuncExtv glPointParameterfvEXT = 0;
|
2002-10-21 03:22:27 +00:00
|
|
|
# endif
|
2001-10-24 22:06:47 +00:00
|
|
|
#endif
|
2002-10-16 03:44:44 +00:00
|
|
|
|
2001-09-19 22:58:29 +00:00
|
|
|
float default_attenuation[3] = {1.0, 0.0, 0.0};
|
|
|
|
//Required for using GL_extensions
|
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
|
|
|
void fgLoadDCS (void);
|
|
|
|
void fgUpdateDCS (void);
|
2000-12-08 20:05:43 +00:00
|
|
|
ssgSelector *ship_sel=NULL;
|
|
|
|
// upto 32 instances of a same object can be loaded.
|
|
|
|
ssgTransform *ship_pos[32];
|
2001-09-19 22:58:29 +00:00
|
|
|
double obj_lat[32],obj_lon[32],obj_alt[32],obj_pitch[32],obj_roll[32];
|
2000-12-08 20:05:43 +00:00
|
|
|
int objc=0;
|
2001-09-19 22:58:29 +00:00
|
|
|
ssgSelector *lightpoints_brightness = new ssgSelector;
|
|
|
|
ssgTransform *lightpoints_transform = new ssgTransform;
|
|
|
|
FGTileEntry *dummy_tile;
|
|
|
|
sgVec3 rway_ols;
|
|
|
|
// ADA
|
2002-03-28 16:14:04 +00:00
|
|
|
// Clip plane settings...
|
|
|
|
float scene_nearplane = 0.5f;
|
|
|
|
float scene_farplane = 120000.0f;
|
|
|
|
|
2002-05-11 16:28:50 +00:00
|
|
|
static double delta_time_sec = 0;
|
|
|
|
|
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
|
|
|
|
2002-05-12 00:12:19 +00:00
|
|
|
#ifdef FG_WEATHERCM
|
1999-10-22 00:27:49 +00:00
|
|
|
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
|
|
|
#else
|
2002-02-22 22:51:34 +00:00
|
|
|
# include <Environment/environment_mgr.hxx>
|
1999-08-12 17:13:44 +00:00
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-10-10 20:31:20 +00:00
|
|
|
#include "version.h"
|
|
|
|
|
1998-04-22 13:25:39 +00:00
|
|
|
#include "fg_init.hxx"
|
1999-11-19 02:10:24 +00:00
|
|
|
#include "fg_io.hxx"
|
2001-06-05 22:12:28 +00:00
|
|
|
#include "fg_props.hxx"
|
2000-07-07 17:27:37 +00:00
|
|
|
#include "globals.hxx"
|
1998-07-06 02:42:02 +00:00
|
|
|
#include "splash.hxx"
|
2001-07-22 19:51:16 +00:00
|
|
|
#include "viewmgr.hxx"
|
2002-02-04 22:06:37 +00:00
|
|
|
#include "options.hxx"
|
2002-03-12 16:30:27 +00:00
|
|
|
#include "logger.hxx"
|
1998-04-22 13:25:39 +00:00
|
|
|
|
2000-09-10 00:04:50 +00:00
|
|
|
#ifdef macintosh
|
2000-12-13 23:02:02 +00:00
|
|
|
# include <console.h> // -dw- for command line dialog
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2002-04-05 20:03:49 +00:00
|
|
|
FGEventMgr global_events;
|
|
|
|
|
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
|
|
|
|
// our initializations out of the glutIdleLoop() so that we can get a
|
|
|
|
// splash screen up and running right away.
|
1998-09-15 02:09:24 +00:00
|
|
|
static int idle_state = 0;
|
2001-01-17 23:30:35 +00:00
|
|
|
static long global_multi_loop;
|
1998-07-06 02:42:02 +00:00
|
|
|
|
2000-10-19 23:09:33 +00:00
|
|
|
// forward declaration
|
|
|
|
void fgReshape( int width, int height );
|
|
|
|
|
2002-03-13 17:06:41 +00:00
|
|
|
// fog constants. I'm a little nervous about putting actual code out
|
|
|
|
// here but it seems to work (?)
|
|
|
|
static const double m_log01 = -log( 0.01 );
|
|
|
|
static const double sqrt_m_log01 = sqrt( m_log01 );
|
|
|
|
static GLfloat fog_exp_density;
|
|
|
|
static GLfloat fog_exp2_density;
|
2002-11-01 21:56:48 +00:00
|
|
|
static GLfloat rwy_exp2_punch_through;
|
|
|
|
static GLfloat taxi_exp2_punch_through;
|
2002-03-13 17:06:41 +00:00
|
|
|
|
2000-01-12 18:09:35 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
|
|
|
ssgSelector *fgd_sel = NULL;
|
|
|
|
ssgTransform *fgd_pos = NULL;
|
|
|
|
#endif
|
|
|
|
|
2000-03-02 13:51:31 +00:00
|
|
|
// Sky structures
|
2000-03-16 04:15:22 +00:00
|
|
|
SGSky *thesky;
|
2002-09-13 20:38:15 +00:00
|
|
|
SkySceneLoader *sgClouds3d;
|
|
|
|
bool _bcloud_orig = true;
|
2000-03-02 13:51:31 +00:00
|
|
|
|
1999-08-08 01:31:30 +00:00
|
|
|
// hack
|
|
|
|
sgMat4 copy_of_ssgOpenGLAxisSwapMatrix =
|
|
|
|
{
|
|
|
|
{ 1.0f, 0.0f, 0.0f, 0.0f },
|
|
|
|
{ 0.0f, 0.0f, -1.0f, 0.0f },
|
|
|
|
{ 0.0f, 1.0f, 0.0f, 0.0f },
|
|
|
|
{ 0.0f, 0.0f, 0.0f, 1.0f }
|
2002-02-05 20:54:08 +00:00
|
|
|
};
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2000-10-10 20:31:20 +00:00
|
|
|
// The following defines flightgear options. Because glutlib will also
|
1998-04-21 17:02:27 +00:00
|
|
|
// 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
|
|
|
|
// is significant for any option added that might be in conflict with
|
|
|
|
// glutlib's parser.
|
|
|
|
//
|
|
|
|
// glutlib parses for:
|
|
|
|
// -display
|
|
|
|
// -direct (invalid in Win32)
|
|
|
|
// -geometry
|
|
|
|
// -gldebug
|
|
|
|
// -iconized
|
|
|
|
// -indirect (invalid in Win32)
|
|
|
|
// -synce
|
|
|
|
//
|
|
|
|
// Note that glutlib depends upon strings while this program's
|
|
|
|
// option parser wants only initial characters followed by numbers
|
|
|
|
// or pathnames.
|
|
|
|
//
|
|
|
|
|
|
|
|
|
2002-09-19 01:27:49 +00:00
|
|
|
ssgSimpleState *cloud3d_imposter_state;
|
2000-03-02 03:03:16 +00:00
|
|
|
ssgSimpleState *default_state;
|
|
|
|
ssgSimpleState *hud_and_panel;
|
|
|
|
ssgSimpleState *menus;
|
|
|
|
|
2002-04-20 14:52:43 +00:00
|
|
|
SGTimeStamp last_time_stamp;
|
2002-03-12 16:30:27 +00:00
|
|
|
SGTimeStamp current_time_stamp;
|
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
void fgBuildRenderStates( void ) {
|
|
|
|
default_state = new ssgSimpleState;
|
2000-10-18 00:48:12 +00:00
|
|
|
default_state->ref();
|
2000-03-02 03:03:16 +00:00
|
|
|
default_state->disable( GL_TEXTURE_2D );
|
|
|
|
default_state->enable( GL_CULL_FACE );
|
2000-06-01 21:14:06 +00:00
|
|
|
default_state->enable( GL_COLOR_MATERIAL );
|
|
|
|
default_state->setColourMaterial( GL_AMBIENT_AND_DIFFUSE );
|
|
|
|
default_state->setMaterial( GL_EMISSION, 0, 0, 0, 1 );
|
|
|
|
default_state->setMaterial( GL_SPECULAR, 0, 0, 0, 1 );
|
2000-03-02 03:03:16 +00:00
|
|
|
default_state->disable( GL_BLEND );
|
|
|
|
default_state->disable( GL_ALPHA_TEST );
|
|
|
|
default_state->disable( GL_LIGHTING );
|
|
|
|
|
2002-09-19 01:27:49 +00:00
|
|
|
cloud3d_imposter_state = new ssgSimpleState;
|
|
|
|
cloud3d_imposter_state->ref();
|
|
|
|
cloud3d_imposter_state->enable( GL_TEXTURE_2D );
|
|
|
|
cloud3d_imposter_state->enable( GL_CULL_FACE );
|
|
|
|
cloud3d_imposter_state->enable( GL_COLOR_MATERIAL );
|
|
|
|
cloud3d_imposter_state->setColourMaterial( GL_AMBIENT_AND_DIFFUSE );
|
|
|
|
cloud3d_imposter_state->setMaterial( GL_DIFFUSE, 1, 1, 1, 1 );
|
|
|
|
cloud3d_imposter_state->setMaterial( GL_AMBIENT, 1, 1, 1, 1 );
|
|
|
|
cloud3d_imposter_state->setMaterial( GL_EMISSION, 0, 0, 0, 1 );
|
|
|
|
cloud3d_imposter_state->setMaterial( GL_SPECULAR, 0, 0, 0, 1 );
|
|
|
|
cloud3d_imposter_state->enable( GL_BLEND );
|
|
|
|
cloud3d_imposter_state->enable( GL_ALPHA_TEST );
|
2002-09-19 02:21:23 +00:00
|
|
|
cloud3d_imposter_state->disable( GL_LIGHTING );
|
2002-09-19 01:27:49 +00:00
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
hud_and_panel = new ssgSimpleState;
|
2000-10-18 00:48:12 +00:00
|
|
|
hud_and_panel->ref();
|
2000-03-02 03:03:16 +00:00
|
|
|
hud_and_panel->disable( GL_CULL_FACE );
|
|
|
|
hud_and_panel->disable( GL_TEXTURE_2D );
|
|
|
|
hud_and_panel->disable( GL_LIGHTING );
|
2000-05-30 20:51:47 +00:00
|
|
|
hud_and_panel->enable( GL_BLEND );
|
2000-03-02 03:03:16 +00:00
|
|
|
|
|
|
|
menus = new ssgSimpleState;
|
2000-10-18 00:48:12 +00:00
|
|
|
menus->ref();
|
2000-03-02 03:03:16 +00:00
|
|
|
menus->disable( GL_CULL_FACE );
|
|
|
|
menus->disable( GL_TEXTURE_2D );
|
|
|
|
menus->enable( GL_BLEND );
|
|
|
|
}
|
|
|
|
|
2002-04-05 00:38:55 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// fgInitVisuals() -- Initialize various GL/view parameters
|
1999-10-14 23:46:28 +00:00
|
|
|
void fgInitVisuals( void ) {
|
1998-04-26 05:10:00 +00:00
|
|
|
fgLIGHT *l;
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
l = &cur_light_params;
|
|
|
|
|
1999-04-27 19:27:45 +00:00
|
|
|
#ifndef GLUT_WRONG_VERSION
|
1998-05-03 00:47:31 +00:00
|
|
|
// Go full screen if requested ...
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/startup/fullscreen") ) {
|
1998-05-03 00:47:31 +00:00
|
|
|
glutFullScreen();
|
|
|
|
}
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
// If enabled, normal vectors specified with glNormal are scaled
|
2002-04-05 00:38:55 +00:00
|
|
|
// to unit length after transformation. Enabling this has
|
|
|
|
// performance implications. See the docs for glNormal.
|
2000-03-17 06:16:15 +00:00
|
|
|
// glEnable( GL_NORMALIZE );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
glEnable( GL_LIGHTING );
|
|
|
|
glEnable( GL_LIGHT0 );
|
2002-07-21 17:03:29 +00:00
|
|
|
// glLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec ); // done later with ssg
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
sgVec3 sunpos;
|
|
|
|
sgSetVec3( sunpos, l->sun_vec[0], l->sun_vec[1], l->sun_vec[2] );
|
|
|
|
ssgGetLight( 0 ) -> setPosition( sunpos );
|
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
glFogi (GL_FOG_MODE, GL_EXP2);
|
2002-03-26 02:38:11 +00:00
|
|
|
if ( (!strcmp(fgGetString("/sim/rendering/fog"), "disabled")) ||
|
2001-01-13 22:06:39 +00:00
|
|
|
(!fgGetBool("/sim/rendering/shading"))) {
|
1998-06-13 00:40:32 +00:00
|
|
|
// if fastest fog requested, or if flat shading force fastest
|
2000-03-17 06:16:15 +00:00
|
|
|
glHint ( GL_FOG_HINT, GL_FASTEST );
|
2002-03-26 02:38:11 +00:00
|
|
|
} else if ( !strcmp(fgGetString("/sim/rendering/fog"), "nicest") ) {
|
2000-03-17 06:16:15 +00:00
|
|
|
glHint ( GL_FOG_HINT, GL_NICEST );
|
1998-05-11 18:18:15 +00:00
|
|
|
}
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/rendering/wireframe") ) {
|
1998-04-30 12:34:17 +00:00
|
|
|
// draw wire frame
|
2000-03-17 06:16:15 +00:00
|
|
|
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
|
1998-04-30 12:34:17 +00:00
|
|
|
}
|
1998-05-20 20:51:33 +00:00
|
|
|
|
|
|
|
// This is the default anyways, but it can't hurt
|
2000-03-17 06:16:15 +00:00
|
|
|
glFrontFace ( GL_CCW );
|
1998-07-20 12:49:44 +00:00
|
|
|
|
|
|
|
// Just testing ...
|
2000-03-17 06:16:15 +00:00
|
|
|
// glEnable(GL_POINT_SMOOTH);
|
|
|
|
// glEnable(GL_LINE_SMOOTH);
|
|
|
|
// glEnable(GL_POLYGON_SMOOTH);
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-06-26 18:23:07 +00:00
|
|
|
// For HiRes screen Dumps using Brian Pauls TR Library
|
|
|
|
void trRenderFrame( void ) {
|
|
|
|
|
|
|
|
if ( fgPanelVisible() ) {
|
|
|
|
GLfloat height = fgGetInt("/sim/startup/ysize");
|
|
|
|
GLfloat view_h =
|
|
|
|
(current_panel->getViewHeight() - current_panel->getYOffset())
|
|
|
|
* (height / 768.0) + 1;
|
|
|
|
glTranslatef( 0.0, view_h, 0.0 );
|
|
|
|
}
|
|
|
|
|
|
|
|
static GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
|
|
|
|
static GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
|
|
|
|
|
|
|
|
fgLIGHT *l = &cur_light_params;
|
|
|
|
|
|
|
|
glClearColor(l->adj_fog_color[0], l->adj_fog_color[1],
|
|
|
|
l->adj_fog_color[2], l->adj_fog_color[3]);
|
|
|
|
|
|
|
|
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
|
|
|
|
|
|
|
// set the opengl state to known default values
|
|
|
|
default_state->force();
|
|
|
|
|
|
|
|
glEnable( GL_FOG );
|
|
|
|
glFogf ( GL_FOG_DENSITY, fog_exp2_density);
|
|
|
|
glFogi ( GL_FOG_MODE, GL_EXP2 );
|
|
|
|
glFogfv ( GL_FOG_COLOR, l->adj_fog_color );
|
|
|
|
|
|
|
|
// GL_LIGHT_MODEL_AMBIENT has a default non-zero value so if
|
|
|
|
// we only update GL_AMBIENT for our lights we will never get
|
|
|
|
// a completely dark scene. So, we set GL_LIGHT_MODEL_AMBIENT
|
|
|
|
// explicitely to black.
|
|
|
|
glLightModelfv( GL_LIGHT_MODEL_AMBIENT, black );
|
2002-09-13 20:38:15 +00:00
|
|
|
glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE );
|
2001-06-26 18:23:07 +00:00
|
|
|
|
|
|
|
ssgGetLight( 0 ) -> setColour( GL_AMBIENT, l->scene_ambient );
|
|
|
|
|
|
|
|
// texture parameters
|
|
|
|
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
|
|
|
|
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
|
|
|
|
|
|
|
|
// we need a white diffuse light for the phase of the moon
|
|
|
|
ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, white );
|
|
|
|
thesky->preDraw();
|
|
|
|
|
|
|
|
// draw the ssg scene
|
|
|
|
// return to the desired diffuse color
|
|
|
|
ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse );
|
|
|
|
glEnable( GL_DEPTH_TEST );
|
2002-03-28 16:14:04 +00:00
|
|
|
ssgSetNearFar( scene_nearplane, scene_farplane );
|
2002-05-14 05:49:47 +00:00
|
|
|
ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
|
2001-06-26 18:23:07 +00:00
|
|
|
|
|
|
|
// draw the lights
|
2002-11-01 21:56:48 +00:00
|
|
|
glFogf (GL_FOG_DENSITY, rwy_exp2_punch_through);
|
2002-03-28 16:14:04 +00:00
|
|
|
ssgSetNearFar( scene_nearplane, scene_farplane );
|
2002-10-06 03:53:19 +00:00
|
|
|
ssgCullAndDraw( globals->get_scenery()->get_rwy_lights_root() );
|
2001-06-26 18:23:07 +00:00
|
|
|
|
2002-11-01 21:56:48 +00:00
|
|
|
ssgCullAndDraw( globals->get_scenery()->get_gnd_lights_root() );
|
|
|
|
|
2002-05-17 19:04:20 +00:00
|
|
|
if (fgGetBool("/environment/clouds/status"))
|
|
|
|
thesky->postDraw( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER );
|
2001-06-26 18:23:07 +00:00
|
|
|
|
2002-04-12 12:45:49 +00:00
|
|
|
globals->get_model_mgr()->draw();
|
2002-04-11 04:26:07 +00:00
|
|
|
globals->get_aircraft_model()->draw();
|
2001-06-26 18:23:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// Update all Visuals (redraws anything graphics related)
|
2002-05-11 16:28:50 +00:00
|
|
|
void fgRenderFrame() {
|
2002-03-30 21:22:02 +00:00
|
|
|
|
2002-09-19 01:27:49 +00:00
|
|
|
GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
|
|
|
|
GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
|
|
|
|
|
2002-04-05 20:03:49 +00:00
|
|
|
// Process/manage pending events
|
2002-05-11 16:28:50 +00:00
|
|
|
global_events.update( delta_time_sec );
|
2002-04-05 20:03:49 +00:00
|
|
|
|
2001-10-28 16:16:30 +00:00
|
|
|
static const SGPropertyNode *longitude
|
|
|
|
= fgGetNode("/position/longitude-deg");
|
|
|
|
static const SGPropertyNode *latitude
|
|
|
|
= fgGetNode("/position/latitude-deg");
|
|
|
|
static const SGPropertyNode *altitude
|
|
|
|
= fgGetNode("/position/altitude-ft");
|
2002-04-18 16:51:47 +00:00
|
|
|
static const SGPropertyNode *groundlevel_nearplane
|
|
|
|
= fgGetNode("/sim/current-view/ground-level-nearplane-m");
|
2001-10-28 16:16:30 +00:00
|
|
|
|
2001-06-05 22:12:28 +00:00
|
|
|
// Update the default (kludged) properties.
|
|
|
|
fgUpdateProps();
|
2000-05-16 18:21:08 +00:00
|
|
|
|
2002-04-07 15:24:32 +00:00
|
|
|
FGViewer *current__view = globals->get_current_view();
|
|
|
|
|
1998-12-09 18:50:12 +00:00
|
|
|
fgLIGHT *l = &cur_light_params;
|
1999-10-22 00:27:49 +00:00
|
|
|
static double last_visibility = -9999;
|
2000-06-20 22:31:47 +00:00
|
|
|
|
2002-03-13 17:06:41 +00:00
|
|
|
// update fog params
|
2002-10-13 10:46:37 +00:00
|
|
|
double actual_visibility;
|
|
|
|
if (fgGetBool("/environment/clouds/status"))
|
|
|
|
actual_visibility = thesky->get_visibility();
|
|
|
|
else
|
|
|
|
actual_visibility = fgGetDouble("/environment/visibility-m");
|
2002-03-13 17:06:41 +00:00
|
|
|
if ( actual_visibility != last_visibility ) {
|
|
|
|
last_visibility = actual_visibility;
|
|
|
|
|
|
|
|
fog_exp_density = m_log01 / actual_visibility;
|
|
|
|
fog_exp2_density = sqrt_m_log01 / actual_visibility;
|
2002-11-01 21:56:48 +00:00
|
|
|
rwy_exp2_punch_through = sqrt_m_log01 / ( actual_visibility * 2.5 );
|
|
|
|
taxi_exp2_punch_through = sqrt_m_log01 / ( actual_visibility * 1.5 );
|
2002-03-13 17:06:41 +00:00
|
|
|
}
|
|
|
|
|
2000-10-25 15:27:55 +00:00
|
|
|
// double angle;
|
1998-07-22 21:40:43 +00:00
|
|
|
// GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
|
1999-10-22 00:27:49 +00:00
|
|
|
// GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
|
|
|
|
// GLfloat terrain_color[4] = { 0.54, 0.44, 0.29, 1.0 };
|
1999-05-13 02:10:52 +00:00
|
|
|
// GLfloat mat_shininess[] = { 10.0 };
|
1998-07-13 15:32:37 +00:00
|
|
|
GLbitfield clear_mask;
|
1999-10-22 00:27:49 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
if ( idle_state != 1000 ) {
|
|
|
|
// still initializing, draw the splash screen
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/startup/splash-screen") ) {
|
1998-07-06 21:34:17 +00:00
|
|
|
fgSplashUpdate(0.0);
|
|
|
|
}
|
2002-04-20 14:52:43 +00:00
|
|
|
// Keep resetting sim time while the sim is initializing
|
2002-05-11 16:28:50 +00:00
|
|
|
globals->set_sim_time_sec( 0.0 );
|
1998-04-30 12:34:17 +00:00
|
|
|
} else {
|
1998-07-06 02:42:02 +00:00
|
|
|
// idle_state is now 1000 meaning we've finished all our
|
|
|
|
// initializations and are running the main loop, so this will
|
|
|
|
// now work without seg faulting the system.
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-10-25 15:27:55 +00:00
|
|
|
// calculate our current position in cartesian space
|
2002-05-14 05:22:52 +00:00
|
|
|
globals->get_scenery()->set_center( globals->get_scenery()->get_next_center() );
|
2000-10-25 15:27:55 +00:00
|
|
|
|
2000-11-01 04:32:04 +00:00
|
|
|
// update view port
|
2001-01-13 22:06:39 +00:00
|
|
|
fgReshape( fgGetInt("/sim/startup/xsize"),
|
|
|
|
fgGetInt("/sim/startup/ysize") );
|
2000-11-01 23:27:32 +00:00
|
|
|
|
2002-09-23 22:05:36 +00:00
|
|
|
if ( fgGetBool("/sim/rendering/clouds3d") ) {
|
|
|
|
glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );
|
|
|
|
cloud3d_imposter_state->force();
|
|
|
|
glDisable( GL_FOG );
|
|
|
|
glColor4f( 1.0, 1.0, 1.0, 1.0 );
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ) ;
|
2002-10-04 15:19:07 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
glEnable( GL_TEXTURE_2D );
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
|
|
*/
|
|
|
|
|
2002-09-23 22:05:36 +00:00
|
|
|
if ( _bcloud_orig ) {
|
|
|
|
Point3D c = globals->get_scenery()->get_center();
|
|
|
|
sgClouds3d->Set_Cloud_Orig( &c );
|
|
|
|
_bcloud_orig = false;
|
|
|
|
}
|
|
|
|
sgClouds3d->Update( current__view->get_absolute_view_pos() );
|
|
|
|
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
}
|
1998-12-11 20:26:25 +00:00
|
|
|
|
1998-07-13 15:32:37 +00:00
|
|
|
clear_mask = GL_DEPTH_BUFFER_BIT;
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/rendering/wireframe") ) {
|
1998-07-13 15:32:37 +00:00
|
|
|
clear_mask |= GL_COLOR_BUFFER_BIT;
|
|
|
|
}
|
2000-07-05 02:39:30 +00:00
|
|
|
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/rendering/skyblend") ) {
|
|
|
|
if ( fgGetBool("/sim/rendering/textures") ) {
|
1998-07-20 12:49:44 +00:00
|
|
|
// glClearColor(black[0], black[1], black[2], black[3]);
|
1998-07-22 21:40:43 +00:00
|
|
|
glClearColor(l->adj_fog_color[0], l->adj_fog_color[1],
|
|
|
|
l->adj_fog_color[2], l->adj_fog_color[3]);
|
1999-05-12 01:11:17 +00:00
|
|
|
clear_mask |= GL_COLOR_BUFFER_BIT;
|
1998-07-20 12:49:44 +00:00
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
} else {
|
|
|
|
glClearColor(l->sky_color[0], l->sky_color[1],
|
|
|
|
l->sky_color[2], l->sky_color[3]);
|
1998-07-13 15:32:37 +00:00
|
|
|
clear_mask |= GL_COLOR_BUFFER_BIT;
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
2000-03-17 06:16:15 +00:00
|
|
|
glClear( clear_mask );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
// Tell GL we are switching to model view parameters
|
1999-08-08 01:31:30 +00:00
|
|
|
|
|
|
|
// I really should create a derived ssg node or use a call
|
|
|
|
// back or something so that I can draw the sky within the
|
2000-06-20 02:29:31 +00:00
|
|
|
// ssgCullAndDraw() function, but for now I just mimic what
|
1999-08-08 01:31:30 +00:00
|
|
|
// ssg does to set up the model view matrix
|
2000-03-17 06:16:15 +00:00
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
glLoadIdentity();
|
2002-04-07 15:24:32 +00:00
|
|
|
ssgSetCamera( (sgVec4 *)current__view->get_VIEW() );
|
2000-03-01 00:31:35 +00:00
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
// set the opengl state to known default values
|
|
|
|
default_state->force();
|
|
|
|
|
2000-06-20 22:31:47 +00:00
|
|
|
// update fog params if visibility has changed
|
2002-04-07 15:24:32 +00:00
|
|
|
double visibility_meters = fgGetDouble("/environment/visibility-m");
|
|
|
|
thesky->set_visibility(visibility_meters);
|
2000-06-20 22:31:47 +00:00
|
|
|
|
2001-03-24 04:56:46 +00:00
|
|
|
thesky->modify_vis( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
|
2002-02-06 23:31:33 +00:00
|
|
|
( global_multi_loop * fgGetInt("/sim/speed-up") )
|
|
|
|
/ (double)fgGetInt("/sim/model-hz") );
|
2000-06-20 22:31:47 +00:00
|
|
|
|
2000-12-04 05:26:40 +00:00
|
|
|
// Set correct opengl fog density
|
|
|
|
glFogf (GL_FOG_DENSITY, fog_exp2_density);
|
|
|
|
|
2000-06-20 22:31:47 +00:00
|
|
|
// update the sky dome
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/rendering/skyblend") ) {
|
2000-03-16 04:15:22 +00:00
|
|
|
/* cout << "thesky->repaint() sky_color = "
|
|
|
|
<< cur_light_params.sky_color[0] << " "
|
|
|
|
<< cur_light_params.sky_color[1] << " "
|
|
|
|
<< cur_light_params.sky_color[2] << " "
|
|
|
|
<< cur_light_params.sky_color[3] << endl;
|
|
|
|
cout << " fog = "
|
|
|
|
<< cur_light_params.fog_color[0] << " "
|
|
|
|
<< cur_light_params.fog_color[1] << " "
|
|
|
|
<< cur_light_params.fog_color[2] << " "
|
|
|
|
<< cur_light_params.fog_color[3] << endl;
|
|
|
|
cout << " sun_angle = " << cur_light_params.sun_angle
|
|
|
|
<< " moon_angle = " << cur_light_params.moon_angle
|
|
|
|
<< endl; */
|
|
|
|
thesky->repaint( cur_light_params.sky_color,
|
2000-03-17 06:16:15 +00:00
|
|
|
cur_light_params.adj_fog_color,
|
2000-03-16 04:15:22 +00:00
|
|
|
cur_light_params.sun_angle,
|
|
|
|
cur_light_params.moon_angle,
|
2000-07-08 05:09:24 +00:00
|
|
|
globals->get_ephem()->getNumPlanets(),
|
|
|
|
globals->get_ephem()->getPlanets(),
|
|
|
|
globals->get_ephem()->getNumStars(),
|
|
|
|
globals->get_ephem()->getStars() );
|
2000-03-16 23:01:57 +00:00
|
|
|
|
2000-03-16 04:15:22 +00:00
|
|
|
/* cout << "thesky->reposition( view_pos = " << view_pos[0] << " "
|
|
|
|
<< view_pos[1] << " " << view_pos[2] << endl;
|
|
|
|
cout << " zero_elev = " << zero_elev[0] << " "
|
|
|
|
<< zero_elev[1] << " " << zero_elev[2]
|
|
|
|
<< " lon = " << cur_fdm_state->get_Longitude()
|
|
|
|
<< " lat = " << cur_fdm_state->get_Latitude() << endl;
|
|
|
|
cout << " sun_rot = " << cur_light_params.sun_rotation
|
2000-07-06 22:13:24 +00:00
|
|
|
<< " gst = " << SGTime::cur_time_params->getGst() << endl;
|
2000-07-08 05:09:24 +00:00
|
|
|
cout << " sun ra = " << globals->get_ephem()->getSunRightAscension()
|
|
|
|
<< " sun dec = " << globals->get_ephem()->getSunDeclination()
|
|
|
|
<< " moon ra = " << globals->get_ephem()->getMoonRightAscension()
|
|
|
|
<< " moon dec = " << globals->get_ephem()->getMoonDeclination() << endl; */
|
2000-03-16 04:15:22 +00:00
|
|
|
|
2002-04-07 15:24:32 +00:00
|
|
|
thesky->reposition( current__view->get_view_pos(),
|
|
|
|
current__view->get_zero_elev(),
|
|
|
|
current__view->get_world_up(),
|
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
|
|
|
current__view->getLongitude_deg()
|
2001-10-28 16:16:30 +00:00
|
|
|
* SGD_DEGREES_TO_RADIANS,
|
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
|
|
|
current__view->getLatitude_deg()
|
2001-10-28 16:16:30 +00:00
|
|
|
* SGD_DEGREES_TO_RADIANS,
|
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
|
|
|
current__view->getAltitudeASL_ft() * SG_FEET_TO_METER,
|
2000-03-16 04:15:22 +00:00
|
|
|
cur_light_params.sun_rotation,
|
2000-07-07 20:28:51 +00:00
|
|
|
globals->get_time_params()->getGst(),
|
2000-07-08 05:09:24 +00:00
|
|
|
globals->get_ephem()->getSunRightAscension(),
|
|
|
|
globals->get_ephem()->getSunDeclination(),
|
|
|
|
50000.0,
|
|
|
|
globals->get_ephem()->getMoonRightAscension(),
|
|
|
|
globals->get_ephem()->getMoonDeclination(),
|
|
|
|
50000.0 );
|
2000-03-02 03:03:16 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
glEnable( GL_DEPTH_TEST );
|
2002-03-25 19:37:49 +00:00
|
|
|
if ( strcmp(fgGetString("/sim/rendering/fog"), "disabled") ) {
|
2000-03-17 06:16:15 +00:00
|
|
|
glEnable( GL_FOG );
|
|
|
|
glFogi( GL_FOG_MODE, GL_EXP2 );
|
|
|
|
glFogfv( GL_FOG_COLOR, l->adj_fog_color );
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
1999-10-22 00:27:49 +00:00
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
// set sun/lighting parameters
|
|
|
|
ssgGetLight( 0 ) -> setPosition( l->sun_vec );
|
|
|
|
|
|
|
|
// GL_LIGHT_MODEL_AMBIENT has a default non-zero value so if
|
2001-03-29 01:42:31 +00:00
|
|
|
// we only update GL_AMBIENT for our lights we will never get
|
|
|
|
// a completely dark scene. So, we set GL_LIGHT_MODEL_AMBIENT
|
|
|
|
// explicitely to black.
|
2001-03-28 18:11:05 +00:00
|
|
|
glLightModelfv( GL_LIGHT_MODEL_AMBIENT, black );
|
2001-03-28 00:39:29 +00:00
|
|
|
|
2001-03-28 18:11:05 +00:00
|
|
|
ssgGetLight( 0 ) -> setColour( GL_AMBIENT, l->scene_ambient );
|
2001-03-28 00:39:29 +00:00
|
|
|
ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse );
|
2002-07-21 15:40:51 +00:00
|
|
|
ssgGetLight( 0 ) -> setColour( GL_SPECULAR, l->scene_specular );
|
1999-10-20 22:18:54 +00:00
|
|
|
|
|
|
|
// texture parameters
|
2000-03-17 06:16:15 +00:00
|
|
|
// glEnable( GL_TEXTURE_2D );
|
|
|
|
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
|
|
|
|
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
// glMatrixMode( GL_PROJECTION );
|
|
|
|
// glLoadIdentity();
|
2002-04-07 15:24:32 +00:00
|
|
|
ssgSetFOV( current__view->get_h_fov(),
|
|
|
|
current__view->get_v_fov() );
|
1999-06-29 14:57:00 +00:00
|
|
|
|
2002-05-14 05:22:52 +00:00
|
|
|
double agl =
|
|
|
|
current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER
|
|
|
|
- globals->get_scenery()->get_cur_elev();
|
2002-03-05 22:25:11 +00:00
|
|
|
|
2002-03-28 16:14:04 +00:00
|
|
|
if ( agl > 10.0 ) {
|
|
|
|
scene_nearplane = 10.0f;
|
|
|
|
scene_farplane = 120000.0f;
|
|
|
|
} else {
|
2002-04-18 16:51:47 +00:00
|
|
|
scene_nearplane = groundlevel_nearplane->getDoubleValue();
|
2002-03-28 16:14:04 +00:00
|
|
|
scene_farplane = 120000.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
ssgSetNearFar( scene_nearplane, scene_farplane );
|
1999-06-19 04:48:07 +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
|
|
|
// $$$ begin - added VS Renganthan 17 Oct 2K
|
2002-04-07 15:24:32 +00:00
|
|
|
if(objc)
|
|
|
|
fgUpdateDCS();
|
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
|
|
|
// $$$ end - added VS Renganthan 17 Oct 2K
|
|
|
|
|
2000-01-12 18:09:35 +00:00
|
|
|
# ifdef FG_NETWORK_OLK
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/networking/network-olk") ) {
|
2000-02-28 04:16:12 +00:00
|
|
|
sgCoord fgdpos;
|
|
|
|
other = head->next; /* put listpointer to start */
|
|
|
|
while ( other != tail) { /* display all except myself */
|
|
|
|
if ( strcmp( other->ipadr, fgd_mcp_ip) != 0) {
|
|
|
|
other->fgd_sel->select(1);
|
|
|
|
sgSetCoord( &fgdpos, other->sgFGD_COORD );
|
|
|
|
other->fgd_pos->setTransform( &fgdpos );
|
|
|
|
}
|
|
|
|
other = other->next;
|
2000-01-12 18:09:35 +00:00
|
|
|
}
|
|
|
|
|
2000-02-28 04:16:12 +00:00
|
|
|
// fgd_sel->select(1);
|
|
|
|
// sgCopyMat4( sgTUX, current_view.sgVIEW);
|
|
|
|
// sgCoord fgdpos;
|
|
|
|
// sgSetCoord( &fgdpos, sgFGD_VIEW );
|
|
|
|
// fgd_pos->setTransform( &fgdpos);
|
|
|
|
}
|
2000-01-12 18:09:35 +00:00
|
|
|
# endif
|
|
|
|
|
1999-06-30 19:16:53 +00:00
|
|
|
// position tile nodes and update range selectors
|
2002-05-20 16:13:37 +00:00
|
|
|
|
|
|
|
// this is done in the main loop now...
|
|
|
|
// global_tile_mgr.prep_ssg_nodes(visibility_meters);
|
1999-06-30 19:16:53 +00:00
|
|
|
|
2001-01-26 00:21:36 +00:00
|
|
|
if ( fgGetBool("/sim/rendering/skyblend") ) {
|
|
|
|
// draw the sky backdrop
|
2001-03-28 17:52:40 +00:00
|
|
|
|
|
|
|
// we need a white diffuse light for the phase of the moon
|
|
|
|
ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, white );
|
|
|
|
|
2001-01-26 00:21:36 +00:00
|
|
|
thesky->preDraw();
|
2001-03-28 17:52:40 +00:00
|
|
|
|
|
|
|
// return to the desired diffuse color
|
|
|
|
ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse );
|
2001-01-26 00:21:36 +00:00
|
|
|
}
|
2000-06-20 02:29:31 +00:00
|
|
|
|
1999-06-30 19:16:53 +00:00
|
|
|
// draw the ssg scene
|
2000-08-22 04:45:31 +00:00
|
|
|
glEnable( GL_DEPTH_TEST );
|
2002-03-30 12:52:24 +00:00
|
|
|
|
2002-03-28 16:14:04 +00:00
|
|
|
ssgSetNearFar( scene_nearplane, scene_farplane );
|
2002-05-14 05:49:47 +00:00
|
|
|
ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2002-07-25 17:47:42 +00:00
|
|
|
// This is a bit kludgy. Every 200 frames, do an extra
|
2002-07-26 01:52:51 +00:00
|
|
|
// traversal of the scene graph without drawing anything, but
|
|
|
|
// with the field-of-view set to 360x360 degrees. This
|
|
|
|
// ensures that out-of-range random objects that are not in
|
|
|
|
// the current view frustum will still be freed properly.
|
2002-07-25 17:29:08 +00:00
|
|
|
static int counter = 0;
|
2002-07-25 17:47:42 +00:00
|
|
|
counter++;
|
2002-07-26 01:52:51 +00:00
|
|
|
if (counter == 200) {
|
2002-07-25 17:29:08 +00:00
|
|
|
sgFrustum f;
|
2002-07-26 01:52:51 +00:00
|
|
|
f.setFOV(360, 360);
|
|
|
|
// No need to put the near plane too close;
|
|
|
|
// this way, at least the aircraft can be
|
|
|
|
// culled.
|
|
|
|
f.setNearFar(1000, 1000000);
|
2002-07-25 17:29:08 +00:00
|
|
|
sgMat4 m;
|
|
|
|
ssgGetModelviewMatrix(m);
|
2002-07-25 17:47:42 +00:00
|
|
|
globals->get_scenery()->get_scene_graph()->cull(&f, m, true);
|
2002-07-26 01:52:51 +00:00
|
|
|
counter = 0;
|
2002-07-25 17:29:08 +00:00
|
|
|
}
|
|
|
|
|
2000-12-04 05:26:40 +00:00
|
|
|
// change state for lighting here
|
|
|
|
|
2002-11-01 21:56:48 +00:00
|
|
|
// draw runway lighting
|
|
|
|
glFogf (GL_FOG_DENSITY, rwy_exp2_punch_through);
|
2002-10-17 04:34:32 +00:00
|
|
|
ssgSetNearFar( scene_nearplane, scene_farplane );
|
|
|
|
|
2001-09-19 22:58:29 +00:00
|
|
|
#ifdef FG_EXPERIMENTAL_LIGHTING
|
|
|
|
// Enable states for drawing points with GL_extension
|
2002-10-24 14:05:40 +00:00
|
|
|
glEnable(GL_POINT_SMOOTH);
|
|
|
|
|
2001-09-19 22:58:29 +00:00
|
|
|
if (glutExtensionSupported("GL_EXT_point_parameters")) {
|
2002-10-17 04:34:32 +00:00
|
|
|
float quadratic[3] = {1.0, 0.001, 0.0000001};
|
2001-09-19 22:58:29 +00:00
|
|
|
// makes the points fade as they move away
|
|
|
|
glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, quadratic);
|
|
|
|
glPointParameterfEXT(GL_POINT_SIZE_MIN_EXT, 1.0);
|
|
|
|
}
|
2002-10-24 14:05:40 +00:00
|
|
|
glPointSize(2.0);
|
2001-09-19 22:58:29 +00:00
|
|
|
|
|
|
|
// blending function for runway lights
|
|
|
|
glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
|
|
|
|
#endif
|
|
|
|
|
2002-10-06 03:53:19 +00:00
|
|
|
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
|
|
|
|
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
|
|
|
|
glEnable(GL_TEXTURE_GEN_S);
|
|
|
|
glEnable(GL_TEXTURE_GEN_T);
|
|
|
|
glPolygonMode(GL_FRONT, GL_POINT);
|
2002-11-01 21:56:48 +00:00
|
|
|
|
|
|
|
// draw runway lighting
|
2002-10-06 03:53:19 +00:00
|
|
|
ssgCullAndDraw( globals->get_scenery()->get_rwy_lights_root() );
|
2002-11-01 21:56:48 +00:00
|
|
|
|
|
|
|
// change punch through and then draw taxi lighting
|
|
|
|
glFogf (GL_FOG_DENSITY, taxi_exp2_punch_through);
|
|
|
|
ssgCullAndDraw( globals->get_scenery()->get_taxi_lights_root() );
|
|
|
|
|
|
|
|
// clean up lighting
|
2002-10-06 03:53:19 +00:00
|
|
|
glPolygonMode(GL_FRONT, GL_FILL);
|
|
|
|
glDisable(GL_TEXTURE_GEN_S);
|
|
|
|
glDisable(GL_TEXTURE_GEN_T);
|
2000-12-04 05:26:40 +00:00
|
|
|
|
2002-09-10 19:43:33 +00:00
|
|
|
//static int _frame_count = 0;
|
|
|
|
//if (_frame_count % 30 == 0) {
|
|
|
|
// printf("SSG: %s\n", ssgShowStats());
|
|
|
|
//}
|
|
|
|
//else {
|
|
|
|
// ssgShowStats();
|
|
|
|
//}
|
|
|
|
//_frame_count++;
|
|
|
|
|
2002-03-30 12:52:24 +00:00
|
|
|
|
2001-09-19 22:58:29 +00:00
|
|
|
#ifdef FG_EXPERIMENTAL_LIGHTING
|
|
|
|
if (glutExtensionSupported("GL_EXT_point_parameters")) {
|
|
|
|
glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT,
|
|
|
|
default_attenuation);
|
|
|
|
}
|
|
|
|
|
|
|
|
glPointSize(1.0);
|
2002-10-17 04:34:32 +00:00
|
|
|
glDisable(GL_POINT_SMOOTH);
|
2001-09-19 22:58:29 +00:00
|
|
|
#endif
|
|
|
|
|
2002-11-01 21:56:48 +00:00
|
|
|
// draw ground lighting
|
|
|
|
ssgCullAndDraw( globals->get_scenery()->get_gnd_lights_root() );
|
|
|
|
|
2001-01-26 00:21:36 +00:00
|
|
|
if ( fgGetBool("/sim/rendering/skyblend") ) {
|
|
|
|
// draw the sky cloud layers
|
2002-09-13 20:38:15 +00:00
|
|
|
if (fgGetBool("/environment/clouds/status")) {
|
|
|
|
thesky->postDraw( cur_fdm_state->get_Altitude()
|
|
|
|
* SG_FEET_TO_METER );
|
|
|
|
}
|
2001-01-26 00:21:36 +00:00
|
|
|
}
|
1999-06-28 05:47:02 +00:00
|
|
|
|
2002-09-19 01:27:49 +00:00
|
|
|
if ( fgGetBool("/sim/rendering/clouds3d") ) {
|
2002-09-20 14:01:06 +00:00
|
|
|
glDisable( GL_FOG );
|
|
|
|
glDisable( GL_LIGHTING );
|
2002-09-19 01:27:49 +00:00
|
|
|
// cout << "drawing new clouds" << endl;
|
2002-10-04 15:19:07 +00:00
|
|
|
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ) ;
|
|
|
|
|
|
|
|
/*
|
|
|
|
glEnable( GL_TEXTURE_2D );
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
|
|
*/
|
|
|
|
|
2002-09-19 01:27:49 +00:00
|
|
|
sgClouds3d->Draw((sgVec4 *)current__view->get_VIEW());
|
2002-09-23 22:05:36 +00:00
|
|
|
glEnable( GL_FOG );
|
|
|
|
glEnable( GL_LIGHTING );
|
|
|
|
glEnable( GL_DEPTH_TEST );
|
|
|
|
glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
|
2002-09-19 01:27:49 +00:00
|
|
|
}
|
|
|
|
|
2002-09-20 15:30:54 +00:00
|
|
|
globals->get_model_mgr()->draw();
|
|
|
|
globals->get_aircraft_model()->draw();
|
|
|
|
|
1999-06-28 05:47:02 +00:00
|
|
|
// display HUD && Panel
|
2000-03-17 06:16:15 +00:00
|
|
|
glDisable( GL_FOG );
|
|
|
|
glDisable( GL_DEPTH_TEST );
|
|
|
|
// glDisable( GL_CULL_FACE );
|
|
|
|
// glDisable( GL_TEXTURE_2D );
|
2001-01-11 22:44:18 +00:00
|
|
|
|
|
|
|
// update the controls subsystem
|
2002-05-11 16:28:50 +00:00
|
|
|
globals->get_controls()->update(delta_time_sec);
|
2001-01-11 22:44:18 +00:00
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
hud_and_panel->apply();
|
1999-06-28 05:47:02 +00:00
|
|
|
fgCockpitUpdate();
|
|
|
|
|
2001-11-07 17:55:28 +00:00
|
|
|
// Use the hud_and_panel ssgSimpleState for rendering the ATC output
|
|
|
|
// This only works properly if called before the panel call
|
2002-05-11 16:28:50 +00:00
|
|
|
globals->get_ATC_display()->update(delta_time_sec);
|
2001-11-07 17:55:28 +00:00
|
|
|
|
2001-01-11 22:44:18 +00:00
|
|
|
// update the panel subsystem
|
2001-10-28 16:16:30 +00:00
|
|
|
if ( current_panel != NULL ) {
|
2002-05-11 16:28:50 +00:00
|
|
|
current_panel->update(delta_time_sec);
|
2001-10-28 16:16:30 +00:00
|
|
|
}
|
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
|
|
|
fgUpdate3DPanels();
|
2001-01-11 22:44:18 +00:00
|
|
|
|
1999-06-28 05:47:02 +00:00
|
|
|
// We can do translucent menus, so why not. :-)
|
2000-03-02 03:03:16 +00:00
|
|
|
menus->apply();
|
2000-03-17 06:16:15 +00:00
|
|
|
glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
|
1999-06-28 05:47:02 +00:00
|
|
|
puDisplay();
|
2000-03-17 06:16:15 +00:00
|
|
|
// glDisable ( GL_BLEND ) ;
|
1999-06-28 05:47:02 +00:00
|
|
|
|
2002-09-18 14:57:20 +00:00
|
|
|
glEnable( GL_DEPTH_TEST );
|
|
|
|
glEnable( GL_FOG );
|
2002-03-12 16:30:27 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
glutSwapBuffers();
|
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;
|
|
|
|
|
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
|
|
|
|
1998-12-09 18:50:12 +00:00
|
|
|
fgLIGHT *l = &cur_light_params;
|
1998-04-21 17:02:27 +00:00
|
|
|
|
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;
|
|
|
|
|
2002-05-14 05:22:52 +00:00
|
|
|
if ( !cur_fdm_state->get_inited() &&
|
|
|
|
globals->get_scenery()->get_cur_elev() > -9990 )
|
|
|
|
{
|
2002-04-11 04:26:07 +00:00
|
|
|
SG_LOG(SG_FLIGHT,SG_INFO, "Finally initializing fdm");
|
2002-02-17 21:05:27 +00:00
|
|
|
|
2001-10-28 16:16:30 +00:00
|
|
|
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
|
|
|
|
// instance ...
|
|
|
|
if ( !cur_fdm_state->get_inited() ) {
|
|
|
|
// do nothing, fdm isn't inited yet
|
|
|
|
} else {
|
2002-05-11 16:28:50 +00:00
|
|
|
// we have been inited, and we are good to go ...
|
2001-01-17 23:30:35 +00:00
|
|
|
|
|
|
|
if ( !inited ) {
|
|
|
|
inited = true;
|
|
|
|
}
|
|
|
|
|
2002-05-11 21:10:11 +00:00
|
|
|
globals->get_autopilot()->update(delta_time_sec);
|
|
|
|
cur_fdm_state->update(delta_time_sec);
|
2002-07-07 15:45:56 +00:00
|
|
|
globals->get_steam()->update(delta_time_sec);
|
1999-09-09 00:16:28 +00:00
|
|
|
}
|
|
|
|
|
2002-05-11 16:28:50 +00:00
|
|
|
globals->get_model_mgr()->update(delta_time_sec);
|
|
|
|
globals->get_aircraft_model()->update(delta_time_sec);
|
2002-04-11 04:26:07 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// update the view angle
|
2002-05-11 16:28:50 +00:00
|
|
|
globals->get_viewmgr()->update(delta_time_sec);
|
1998-07-22 21:40:43 +00:00
|
|
|
|
|
|
|
l->UpdateAdjFog();
|
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(),
|
|
|
|
globals->get_time_params()->getLst(),
|
|
|
|
cur_fdm_state->get_Latitude() );
|
2000-04-25 03:09:26 +00:00
|
|
|
|
|
|
|
// Update radio stack model
|
2002-05-11 16:28:50 +00:00
|
|
|
current_radiostack->update(delta_time_sec);
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void fgInitTimeDepCalcs( void ) {
|
2002-04-05 00:38:55 +00:00
|
|
|
// noop for now
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
1999-09-01 20:24:54 +00:00
|
|
|
|
1998-08-27 17:01:55 +00:00
|
|
|
static const double alt_adjust_ft = 3.758099;
|
2001-03-24 04:56:46 +00:00
|
|
|
static const double alt_adjust_m = alt_adjust_ft * SG_FEET_TO_METER;
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1999-09-01 20:24:54 +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 ) {
|
2002-05-11 16:28:50 +00:00
|
|
|
|
2001-10-28 16:16:30 +00:00
|
|
|
static const SGPropertyNode *longitude
|
|
|
|
= fgGetNode("/position/longitude-deg");
|
|
|
|
static const SGPropertyNode *latitude
|
|
|
|
= fgGetNode("/position/latitude-deg");
|
|
|
|
static const SGPropertyNode *altitude
|
|
|
|
= fgGetNode("/position/altitude-ft");
|
2002-02-13 02:37:44 +00:00
|
|
|
static const SGPropertyNode *clock_freeze
|
|
|
|
= fgGetNode("/sim/freeze/clock", true);
|
2002-02-10 04:18:10 +00:00
|
|
|
static const SGPropertyNode *cur_time_override
|
|
|
|
= fgGetNode("/sim/time/cur-time-override", true);
|
2001-10-28 16:16:30 +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;
|
|
|
|
}
|
|
|
|
current_time_stamp.stamp();
|
|
|
|
delta_time_sec = double(current_time_stamp - last_time_stamp) / 1000000.0;
|
|
|
|
if (clock_freeze->getBoolValue())
|
|
|
|
delta_time_sec = 0;
|
|
|
|
last_time_stamp = current_time_stamp;
|
|
|
|
globals->inc_sim_time_sec( delta_time_sec );
|
|
|
|
|
1999-01-09 13:37:32 +00:00
|
|
|
static long remainder = 0;
|
1999-10-23 00:09:26 +00:00
|
|
|
long elapsed;
|
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
|
|
|
|
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
|
|
|
FGLocation * acmodel_location = 0;
|
|
|
|
if(cur_fdm_state->getACModel() != 0) {
|
|
|
|
acmodel_location = (FGLocation *) cur_fdm_state->getACModel()->get3DModel()->getFGLocation();
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
2000-01-12 18:09:35 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/networking/network-olk") ) {
|
2000-02-28 04:16:12 +00:00
|
|
|
if ( net_is_registered == 0 ) { // We first have to reg. to fgd
|
|
|
|
// printf("FGD: Netupdate\n");
|
|
|
|
fgd_send_com( "A", FGFS_host); // Send Mat4 data
|
|
|
|
fgd_send_com( "B", FGFS_host); // Recv Mat4 data
|
|
|
|
}
|
2000-01-12 18:09:35 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1999-05-27 00:21:54 +00:00
|
|
|
#if defined( ENABLE_PLIB_JOYSTICK )
|
1998-12-18 23:40:55 +00:00
|
|
|
// Read joystick and update control settings
|
2001-06-04 21:08:06 +00:00
|
|
|
// if ( fgGetString("/sim/control-mode") == "joystick" )
|
|
|
|
// {
|
|
|
|
// fgJoystickRead();
|
|
|
|
// }
|
1998-12-18 23:40:55 +00:00
|
|
|
#elif defined( ENABLE_GLUT_JOYSTICK )
|
|
|
|
// Glut joystick support works by feeding a joystick handler
|
|
|
|
// function to glut. This is taken care of once in the joystick
|
|
|
|
// init routine and we don't have to worry about it again.
|
|
|
|
#endif
|
|
|
|
|
2002-05-12 00:12:19 +00:00
|
|
|
#ifndef FG_WEATHERCM
|
|
|
|
globals->get_environment_mgr()->update(delta_time_sec);
|
1999-08-12 17:13:44 +00:00
|
|
|
#endif
|
1998-10-02 12:46:43 +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",
|
2001-10-28 16:16:30 +00:00
|
|
|
scenery.get_cur_elev(),
|
2001-03-24 04:56:46 +00:00
|
|
|
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
|
|
|
|
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
|
|
|
// Curt is this code used? I don't see any problems when I comment it out.
|
|
|
|
if ( acmodel_location != 0 ) {
|
|
|
|
if ( acmodel_location->get_cur_elev_m() > -9990 && cur_fdm_state->get_inited() ) {
|
|
|
|
if ( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER <
|
|
|
|
(acmodel_location->get_cur_elev_m() + alt_adjust_m - 3.0) ) {
|
1998-07-12 03:14:42 +00:00
|
|
|
// now set aircraft altitude above ground
|
2000-01-13 20:12:16 +00:00
|
|
|
printf("(*) Current Altitude = %.2f < %.2f forcing to %.2f\n",
|
2001-03-24 04:56:46 +00:00
|
|
|
cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
|
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
|
|
|
acmodel_location->get_cur_elev_m() + alt_adjust_m - 3.0,
|
|
|
|
acmodel_location->get_cur_elev_m() + alt_adjust_m );
|
|
|
|
cur_fdm_state->set_Altitude( (acmodel_location->get_cur_elev_m()
|
|
|
|
+ alt_adjust_m) * SG_METER_TO_FEET );
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_ALL, SG_DEBUG,
|
1998-11-06 21:17:31 +00:00
|
|
|
"<*> resetting altitude to "
|
2001-03-24 04:56:46 +00:00
|
|
|
<< cur_fdm_state->get_Altitude() * SG_FEET_TO_METER
|
2000-10-19 21:24:43 +00:00
|
|
|
<< " meters" );
|
1998-07-12 03:14:42 +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
|
|
|
}
|
1998-07-12 03:14:42 +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
|
|
|
// End of code in question. (see Curt is this code used? above)
|
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",
|
2001-10-28 16:16:30 +00:00
|
|
|
scenery.get_cur_elev(),
|
2001-03-24 04:56:46 +00:00
|
|
|
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() ) {
|
|
|
|
// clock freeze requested
|
|
|
|
if ( cur_time_override->getLongValue() == 0 ) {
|
2002-02-13 02:46:01 +00:00
|
|
|
fgSetLong( "/sim/time/cur-time-override", t->get_cur_time() );
|
2002-02-13 02:37:44 +00:00
|
|
|
globals->set_warp( 0 );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// 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,
|
|
|
|
latitude->getDoubleValue() * SGD_DEGREES_TO_RADIANS,
|
2002-02-10 04:18:10 +00:00
|
|
|
cur_time_override->getLongValue(),
|
2000-07-07 17:27:37 +00:00
|
|
|
globals->get_warp() );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-07-07 17:27:37 +00:00
|
|
|
if ( globals->get_warp_delta() != 0 ) {
|
2000-07-05 02:39:30 +00:00
|
|
|
fgUpdateSkyAndLightingParams();
|
|
|
|
}
|
|
|
|
|
|
|
|
// update magvar model
|
2001-10-28 16:16:30 +00:00
|
|
|
globals->get_mag()->update( longitude->getDoubleValue()
|
|
|
|
* SGD_DEGREES_TO_RADIANS,
|
|
|
|
latitude->getDoubleValue()
|
|
|
|
* SGD_DEGREES_TO_RADIANS,
|
|
|
|
altitude->getDoubleValue() * SG_FEET_TO_METER,
|
2000-08-08 00:39:52 +00:00
|
|
|
globals->get_time_params()->getJD() );
|
2000-07-05 02:39:30 +00:00
|
|
|
|
1999-01-09 13:37:32 +00:00
|
|
|
// Get elapsed time (in usec) for this past frame
|
1998-04-21 17:02:27 +00:00
|
|
|
elapsed = fgGetTimeInterval();
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_ALL, SG_DEBUG,
|
1999-01-09 13:37:32 +00:00
|
|
|
"Elapsed time interval is = " << elapsed
|
1998-11-06 21:17:31 +00:00
|
|
|
<< ", previous remainder is = " << remainder );
|
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) ) {
|
1999-01-07 20:24:43 +00:00
|
|
|
general.set_frame_rate( frames );
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_ALL, SG_DEBUG,
|
1999-01-09 13:37:32 +00:00
|
|
|
"--> Frame rate is = " << general.get_frame_rate() );
|
1998-12-18 23:40:55 +00:00
|
|
|
frames = 0;
|
|
|
|
}
|
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
|
|
|
|
2002-03-01 17:39:52 +00:00
|
|
|
// Run ATC subsystem
|
2002-05-11 16:28:50 +00:00
|
|
|
globals->get_ATC_mgr()->update(delta_time_sec);
|
2002-04-03 23:54:44 +00:00
|
|
|
|
|
|
|
// Run the AI subsystem
|
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
|
2001-01-16 21:41:28 +00:00
|
|
|
|
|
|
|
// Calculate model iterations needed for next frame
|
|
|
|
elapsed += remainder;
|
|
|
|
|
2001-01-17 23:30:35 +00:00
|
|
|
global_multi_loop = (long)(((double)elapsed * 0.000001) *
|
2001-01-16 21:41:28 +00:00
|
|
|
fgGetInt("/sim/model-hz"));
|
|
|
|
remainder = elapsed - ( (global_multi_loop*1000000) /
|
|
|
|
fgGetInt("/sim/model-hz") );
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_ALL, SG_DEBUG,
|
2001-01-16 21:41:28 +00:00
|
|
|
"Model iterations needed = " << global_multi_loop
|
|
|
|
<< ", new remainder = " << remainder );
|
1998-12-18 23:40:55 +00:00
|
|
|
|
2001-01-17 23:30:35 +00:00
|
|
|
// chop max interations to something reasonable if the sim was
|
|
|
|
// delayed for an excesive amount of time
|
|
|
|
if ( global_multi_loop > 2.0 * fgGetInt("/sim/model-hz") ) {
|
|
|
|
global_multi_loop = (int)(2.0 * fgGetInt("/sim/model-hz") );
|
|
|
|
remainder = 0;
|
|
|
|
}
|
|
|
|
|
2001-01-16 21:41:28 +00:00
|
|
|
// flight model
|
|
|
|
if ( global_multi_loop > 0 ) {
|
2001-01-17 02:37:12 +00:00
|
|
|
fgUpdateTimeDepCalcs();
|
2001-01-16 21:41:28 +00:00
|
|
|
} else {
|
2001-10-29 04:39:54 +00:00
|
|
|
SG_LOG( SG_ALL, SG_DEBUG,
|
2001-01-16 21:41:28 +00:00
|
|
|
"Elapsed time is zero ... we're zinging" );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
1999-11-19 02:10:24 +00:00
|
|
|
// Do any I/O channel work that might need to be done
|
2002-08-25 20:56:16 +00:00
|
|
|
globals->get_io()->update( delta_time_sec );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2001-05-15 00:01:04 +00:00
|
|
|
// see if we need to load any deferred-load textures
|
|
|
|
material_lib.load_next_deferred();
|
|
|
|
|
1998-06-01 17:54:40 +00:00
|
|
|
// Run audio scheduler
|
1998-07-16 17:33:34 +00:00
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
2002-02-27 15:13:58 +00:00
|
|
|
if ( fgGetBool("/sim/sound/audible")
|
|
|
|
&& globals->get_soundmgr()->is_working() ) {
|
2002-08-26 20:46:13 +00:00
|
|
|
globals->get_soundmgr()->update( delta_time_sec );
|
1998-07-27 18:41:23 +00:00
|
|
|
}
|
1998-06-03 00:47:11 +00:00
|
|
|
#endif
|
1998-06-01 17:54:40 +00:00
|
|
|
|
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...
|
|
|
|
// we may want to move this to it's own class at some point
|
|
|
|
//
|
2002-04-19 00:25:25 +00:00
|
|
|
double visibility_meters = fgGetDouble("/environment/visibility-m");
|
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
|
|
|
FGViewer *current_view = globals->get_current_view();
|
|
|
|
|
|
|
|
// update tile manager for FDM...
|
|
|
|
// ...only if location is different than the viewer (to avoid duplicating effort)
|
|
|
|
if( acmodel_location != current_view->getFGLocation() ) {
|
|
|
|
if( acmodel_location != 0 ) {
|
2002-05-20 16:13:37 +00:00
|
|
|
global_tile_mgr.prep_ssg_nodes(visibility_meters,
|
|
|
|
acmodel_location->get_world_up(),
|
|
|
|
acmodel_location->get_tile_center());
|
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
|
|
|
global_tile_mgr.update( acmodel_location->getLongitude_deg(),
|
|
|
|
acmodel_location->getLatitude_deg(),
|
|
|
|
visibility_meters,
|
|
|
|
acmodel_location->get_absolute_view_pos(),
|
|
|
|
acmodel_location->get_current_bucket(),
|
2002-05-20 16:13:37 +00:00
|
|
|
acmodel_location->get_previous_bucket(),
|
|
|
|
acmodel_location->get_tile_center()
|
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
|
|
|
);
|
|
|
|
// save results of update in FGLocation for fdm...
|
|
|
|
if ( globals->get_scenery()->get_cur_elev() > -9990 ) {
|
|
|
|
acmodel_location->set_cur_elev_m( globals->get_scenery()->get_cur_elev() );
|
|
|
|
}
|
|
|
|
acmodel_location->set_current_bucket( global_tile_mgr.get_current_bucket() );
|
|
|
|
acmodel_location->set_previous_bucket( global_tile_mgr.get_previous_bucket() );
|
2002-05-20 16:13:37 +00:00
|
|
|
acmodel_location->set_tile_center( globals->get_scenery()->get_next_center() );
|
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-05-20 16:13:37 +00:00
|
|
|
global_tile_mgr.prep_ssg_nodes(visibility_meters,
|
|
|
|
current_view->getFGLocation()->get_world_up(),
|
|
|
|
current_view->getFGLocation()->get_tile_center());
|
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...
|
|
|
|
// 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.
|
|
|
|
global_tile_mgr.update( current_view->getLongitude_deg(),
|
|
|
|
current_view->getLatitude_deg(),
|
|
|
|
visibility_meters,
|
|
|
|
current_view->get_absolute_view_pos(),
|
|
|
|
current_view->getFGLocation()->get_current_bucket(),
|
2002-05-20 16:13:37 +00:00
|
|
|
current_view->getFGLocation()->get_previous_bucket(),
|
|
|
|
current_view->getFGLocation()->get_tile_center()
|
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
|
|
|
);
|
|
|
|
// save results of update in FGLocation for fdm...
|
|
|
|
if ( globals->get_scenery()->get_cur_elev() > -9990 ) {
|
|
|
|
current_view->getFGLocation()->set_cur_elev_m( globals->get_scenery()->get_cur_elev() );
|
|
|
|
}
|
|
|
|
current_view->getFGLocation()->set_current_bucket( global_tile_mgr.get_current_bucket() );
|
|
|
|
current_view->getFGLocation()->set_previous_bucket( global_tile_mgr.get_previous_bucket() );
|
2002-05-20 16:13:37 +00:00
|
|
|
current_view->getFGLocation()->set_tile_center( globals->get_scenery()->get_next_center() );
|
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
|
|
|
|
|
|
|
// 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 FGLocation as well...
|
|
|
|
if( acmodel_location == current_view->getFGLocation() ) {
|
|
|
|
if( acmodel_location != 0 ) {
|
|
|
|
if ( globals->get_scenery()->get_cur_elev() > -9990 ) {
|
|
|
|
acmodel_location->set_cur_elev_m( globals->get_scenery()->get_cur_elev() );
|
|
|
|
}
|
|
|
|
acmodel_location->set_current_bucket( global_tile_mgr.get_current_bucket() );
|
|
|
|
acmodel_location->set_previous_bucket( global_tile_mgr.get_previous_bucket() );
|
2002-05-20 16:13:37 +00:00
|
|
|
acmodel_location->set_tile_center( globals->get_scenery()->get_next_center() );
|
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
|
|
|
|
|
2002-05-20 16:13:37 +00:00
|
|
|
// redraw display
|
|
|
|
fgRenderFrame();
|
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
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
// This is the top level master main function that is registered as
|
|
|
|
// our idle funciton
|
|
|
|
|
|
|
|
// The first few passes take care of initialization things (a couple
|
|
|
|
// per pass) and once everything has been initialized fgMainLoop from
|
|
|
|
// then on.
|
|
|
|
|
|
|
|
static void fgIdleFunction ( void ) {
|
|
|
|
// printf("idle state == %d\n", idle_state);
|
|
|
|
|
|
|
|
if ( idle_state == 0 ) {
|
|
|
|
// Initialize the splash screen right away
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/startup/splash-screen") ) {
|
1998-07-06 21:34:17 +00:00
|
|
|
fgSplashInit();
|
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 1 ) {
|
2001-07-11 06:01:55 +00:00
|
|
|
// Initialize audio support
|
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
// Start the intro music
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/startup/intro-music") ) {
|
2001-03-25 14:20:12 +00:00
|
|
|
SGPath mp3file( globals->get_fg_root() );
|
1999-04-27 19:27:45 +00:00
|
|
|
mp3file.append( "Sounds/intro.mp3" );
|
|
|
|
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO,
|
1999-04-27 19:27:45 +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__ )
|
|
|
|
string command = "start /m `cygpath -w " + mp3file.str() + "`";
|
|
|
|
#elif defined( WIN32 )
|
|
|
|
string command = "start /m " + mp3file.str();
|
|
|
|
#else
|
2001-07-11 06:01:55 +00:00
|
|
|
string command = "mpg123 " + mp3file.str() + "> /dev/null 2>&1";
|
2002-02-05 05:04:02 +00:00
|
|
|
#endif
|
|
|
|
|
1998-08-27 17:01:55 +00:00
|
|
|
system ( command.c_str() );
|
1998-07-06 21:34:17 +00:00
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 2 ) {
|
|
|
|
// These are a few miscellaneous things that aren't really
|
|
|
|
// "subsystems" but still need to be initialized.
|
1998-07-27 18:41:23 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
#ifdef USE_GLIDE
|
1999-01-07 20:24:43 +00:00
|
|
|
if ( strstr ( general.get_glRenderer(), "Glide" ) ) {
|
1998-07-06 02:42:02 +00:00
|
|
|
grTexLodBiasValue ( GR_TMU0, 1.0 ) ;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 3 ) {
|
|
|
|
// This is the top level init routine which calls all the
|
|
|
|
// other subsystem initialization routines. If you are adding
|
2000-10-10 20:31:20 +00:00
|
|
|
// a subsystem to flightgear, its initialization call should
|
1998-07-06 02:42:02 +00:00
|
|
|
// located in this routine.
|
|
|
|
if( !fgInitSubsystems()) {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT,
|
1998-11-06 21:17:31 +00:00
|
|
|
"Subsystem initializations failed ..." );
|
|
|
|
exit(-1);
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 4 ) {
|
|
|
|
// setup OpenGL view parameters
|
|
|
|
fgInitVisuals();
|
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 5 ) {
|
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 6 ) {
|
1998-07-27 18:41:23 +00:00
|
|
|
// sleep(1);
|
1998-07-06 02:42:02 +00:00
|
|
|
idle_state = 1000;
|
2000-10-19 23:09:33 +00:00
|
|
|
|
2002-10-10 15:02:50 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO, "Panel visible = " << fgPanelVisible() );
|
2001-01-13 22:06:39 +00:00
|
|
|
fgReshape( fgGetInt("/sim/startup/xsize"),
|
|
|
|
fgGetInt("/sim/startup/ysize") );
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( idle_state == 1000 ) {
|
|
|
|
// We've finished all our initialization steps, from now on we
|
|
|
|
// run the main loop.
|
|
|
|
|
2002-04-07 15:24:32 +00:00
|
|
|
glutIdleFunc(fgMainLoop);
|
1998-07-06 02:42:02 +00:00
|
|
|
} else {
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/startup/splash-screen") ) {
|
1998-07-06 21:34:17 +00:00
|
|
|
fgSplashUpdate(0.0);
|
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-05-06 22:16:12 +00:00
|
|
|
// options.cxx needs to see this for toggle_panel()
|
1998-04-21 17:02:27 +00:00
|
|
|
// Handle new window size or exposure
|
1999-05-06 22:16:12 +00:00
|
|
|
void fgReshape( int width, int height ) {
|
2001-10-24 20:28:28 +00:00
|
|
|
int view_h;
|
|
|
|
|
Virtual cockpit patches from Andy Ross:
What the attached patch does is map your panel definition onto a (non
z-buffered) quad in front of your face. You can twist the view around
and see it move in the appropriate ways.
Apply the patch (let me know if folks need help with that step), and
then set the /sim/virtual-cockpit property to true. You can do this
on the command line with --prop:/sim/virtual-cockpit=1, or via the
property picker. Bind it to a key for fast toggling if you like.
The default bindings don't allow for "panning" the view, so you'll
have to modify yours. These are the mappings to my joystick's hat
switch, for those who need hints:
<axis n="6">
<desc>View Direction</desc>
<low>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/view/goal-offset-deg</property>
<step type="double">1.0</step>
</binding>
</low>
<high>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/view/goal-offset-deg</property>
<step type="double">-1.0</step>
</binding>
</high>
</axis>
<axis n="7">
<desc>View Elevation</desc>
<low>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/view/goal-tilt-deg</property>
<step type="double">1.0</step>
</binding>
</low>
<high>
<repeatable>true</repeatable>
<binding>
<command>property-adjust</command>
<property>/sim/view/goal-tilt-deg</property>
<step type="double">-1.0</step>
</binding>
</high>
</axis>
While the current implementation is happy with just plastering the
panel's notion of "screen" into the 3D world, this is actually more
general. Each panel can, in principle, have it's own coordinate
system, and you could build a cockpit out of a bunch of them. The
mapping is specified by providing a 3D coordinate for three corners of
the quad the panel should be mapped to; this should be pretty simple
to work with.
All that's needed for a perfectly general solution is a convention on
where to store the information (a cockpit xml file, or put it in the
aircraft -set file, or...), and some work on the panel's coordinate
system conventions (some of which don't coexist very nicely with a
generalized 3D environment). Combine that with a plib model for the
non-panel interior of the cockpit, and we're golden.
I'm actually really pleased with this. It worked better and more
quickly than I could have imagined, and impact on the surrounding code
is quite light -- a few property tests only. But some stuff is still
missing:
+ No equivalent work was done to the HUD, so it still displays
incorrect headings when the view changes. The use of pixel
coordinates deep in the HUD code is going to give me fits doing the
port, I sure. It's not nearly so well put together as the panel
(where I just changed the setup code -- none of the rendering code
changed at all).
+ I forgot that the panel was clickable. :) Input events still have
the screen coordinates, which essentially kills the interactivity
when in virtual cockpit mode. This won't be hard to fix; it's only
broken because I forgot the feature existed.
And one note about the implementation choice: to get away from the
inevitable near clip plane issue, the virtual cockpit renderer simply
disables the z buffer. This means that cockpits built using these
panels need to be z-sorted, which isn't too hard since they are static
geometry. It also means that no two "virtual panels" can ever be
allowed to interpenetrate. No biggie.
2002-03-03 00:06:24 +00:00
|
|
|
if ( (!fgGetBool("/sim/virtual-cockpit"))
|
|
|
|
&& fgPanelVisible() && idle_state == 1000 ) {
|
2001-10-24 20:28:28 +00:00
|
|
|
view_h = (int)(height * (current_panel->getViewHeight() -
|
|
|
|
current_panel->getYOffset()) / 768.0);
|
|
|
|
} else {
|
|
|
|
view_h = height;
|
|
|
|
}
|
|
|
|
|
2000-11-01 23:27:32 +00:00
|
|
|
// for all views
|
2002-04-07 15:24:32 +00:00
|
|
|
FGViewMgr *viewmgr = globals->get_viewmgr();
|
|
|
|
for ( int i = 0; i < viewmgr->size(); ++i ) {
|
|
|
|
viewmgr->get_view(i)->
|
|
|
|
set_aspect_ratio((float)view_h / (float)width);
|
2000-11-01 23:27:32 +00:00
|
|
|
}
|
|
|
|
|
2001-10-24 20:28:28 +00:00
|
|
|
glViewport( 0, (GLint)(height - view_h), (GLint)(width), (GLint)(view_h) );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2001-01-13 22:06:39 +00:00
|
|
|
fgSetInt("/sim/startup/xsize", width);
|
|
|
|
fgSetInt("/sim/startup/ysize", height);
|
2002-02-05 20:54:08 +00:00
|
|
|
guiInitMouse(width, height);
|
1999-09-28 22:43:52 +00:00
|
|
|
|
2002-04-07 15:24:32 +00:00
|
|
|
ssgSetFOV( viewmgr->get_current_view()->get_h_fov(),
|
|
|
|
viewmgr->get_current_view()->get_v_fov() );
|
1999-08-31 23:22:05 +00:00
|
|
|
|
2000-05-13 00:02:43 +00:00
|
|
|
fgHUDReshape();
|
2002-09-13 20:38:15 +00:00
|
|
|
sgClouds3d->Resize( viewmgr->get_current_view()->get_h_fov(),
|
|
|
|
viewmgr->get_current_view()->get_v_fov() );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// Initialize GLUT and define a main window
|
1998-05-06 03:16:23 +00:00
|
|
|
int fgGlutInit( int *argc, char **argv ) {
|
1999-06-02 22:22:47 +00:00
|
|
|
|
2000-09-10 00:04:50 +00:00
|
|
|
#if !defined( macintosh )
|
1998-04-24 00:49:17 +00:00
|
|
|
// GLUT will extract all glut specific options so later on we only
|
|
|
|
// need wory about our own.
|
2000-03-17 06:16:15 +00:00
|
|
|
glutInit(argc, argv);
|
1999-06-02 22:22:47 +00:00
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2002-09-16 14:56:16 +00:00
|
|
|
// Define Display Parameters. Clouds3d works best with --bpp32 option
|
|
|
|
if ( fgGetBool("/sim/rendering/clouds3d") ) {
|
|
|
|
glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_ALPHA );
|
|
|
|
} else {
|
|
|
|
glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
|
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO, "Opening a window: " <<
|
2001-01-13 22:06:39 +00:00
|
|
|
fgGetInt("/sim/startup/xsize") << "x"
|
|
|
|
<< fgGetInt("/sim/startup/ysize") );
|
1998-11-16 13:59:58 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// Define initial window size
|
2001-01-13 22:06:39 +00:00
|
|
|
glutInitWindowSize( fgGetInt("/sim/startup/xsize"),
|
|
|
|
fgGetInt("/sim/startup/ysize") );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
// Initialize windows
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( !fgGetBool("/sim/startup/game-mode")) {
|
1998-08-20 15:10:33 +00:00
|
|
|
// Open the regular window
|
2000-10-10 20:31:20 +00:00
|
|
|
glutCreateWindow("FlightGear");
|
1999-04-27 19:27:45 +00:00
|
|
|
#ifndef GLUT_WRONG_VERSION
|
1998-08-20 15:10:33 +00:00
|
|
|
} else {
|
|
|
|
// Open the cool new 'game mode' window
|
1999-01-27 04:49:17 +00:00
|
|
|
char game_mode_str[256];
|
2002-04-07 15:24:32 +00:00
|
|
|
//#define SYNC_OPENGL_WITH_DESKTOP_SETTINGS
|
|
|
|
#if defined(WIN32) && defined(SYNC_OPENGL_WITH_DESKTOP_SETTINGS)
|
|
|
|
#ifndef ENUM_CURRENT_SETTINGS
|
|
|
|
#define ENUM_CURRENT_SETTINGS ((DWORD)-1)
|
|
|
|
#define ENUM_REGISTRY_SETTINGS ((DWORD)-2)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
DEVMODE dm;
|
|
|
|
dm.dmSize = sizeof(DEVMODE);
|
|
|
|
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm);
|
|
|
|
fgSetInt("/sim/startup/xsize", dm.dmPelsWidth);
|
|
|
|
fgSetInt("/sim/startup/ysize", dm.dmPelsHeight);
|
|
|
|
glutInitWindowSize( fgGetInt("/sim/startup/xsize"),
|
|
|
|
fgGetInt("/sim/startup/ysize") );
|
|
|
|
sprintf( game_mode_str, "%dx%d:%d@%d",
|
|
|
|
dm.dmPelsWidth,
|
|
|
|
dm.dmPelsHeight,
|
|
|
|
dm.dmBitsPerPel,
|
|
|
|
dm.dmDisplayFrequency );
|
|
|
|
#else
|
|
|
|
// Open the cool new 'game mode' window
|
2000-05-13 00:02:43 +00:00
|
|
|
sprintf( game_mode_str, "width=%d height=%d bpp=%d",
|
2001-01-13 22:06:39 +00:00
|
|
|
fgGetInt("/sim/startup/xsize"),
|
|
|
|
fgGetInt("/sim/startup/ysize"),
|
|
|
|
fgGetInt("/sim/rendering/bits-per-pixel"));
|
1999-01-27 04:49:17 +00:00
|
|
|
|
2002-04-07 15:24:32 +00:00
|
|
|
#endif // HAVE_WINDOWS_H
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO,
|
1999-01-27 04:49:17 +00:00
|
|
|
"game mode params = " << game_mode_str );
|
|
|
|
glutGameModeString( game_mode_str );
|
1998-08-20 15:10:33 +00:00
|
|
|
glutEnterGameMode();
|
2002-04-07 15:24:32 +00:00
|
|
|
#endif // GLUT_WRONG_VERSION
|
1998-08-20 15:10:33 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-11-23 20:51:26 +00:00
|
|
|
// 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. :-(
|
1999-01-07 20:24:43 +00:00
|
|
|
general.set_glVendor( (char *)glGetString ( GL_VENDOR ) );
|
|
|
|
general.set_glRenderer( (char *)glGetString ( GL_RENDERER ) );
|
|
|
|
general.set_glVersion( (char *)glGetString ( GL_VERSION ) );
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_INFO, general.get_glRenderer() );
|
2000-12-05 14:27:27 +00:00
|
|
|
|
2000-12-13 23:02:02 +00:00
|
|
|
GLint tmp;
|
2000-09-18 21:02:59 +00:00
|
|
|
glGetIntegerv( GL_MAX_TEXTURE_SIZE, &tmp );
|
|
|
|
general.set_glMaxTexSize( tmp );
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG ( SG_GENERAL, SG_INFO, "Max texture size = " << tmp );
|
1998-11-23 20:51:26 +00:00
|
|
|
|
2000-12-05 14:27:27 +00:00
|
|
|
glGetIntegerv( GL_DEPTH_BITS, &tmp );
|
|
|
|
general.set_glDepthBits( tmp );
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG ( SG_GENERAL, SG_INFO, "Depth buffer bits = " << tmp );
|
2000-12-05 14:27:27 +00:00
|
|
|
|
2001-01-12 15:37:40 +00:00
|
|
|
return 1;
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// Initialize GLUT event handlers
|
|
|
|
int fgGlutInitEvents( void ) {
|
|
|
|
// call fgReshape() on window resizes
|
2000-03-17 06:16:15 +00:00
|
|
|
glutReshapeFunc( fgReshape );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2002-03-26 13:45:44 +00:00
|
|
|
// keyboard and mouse callbacks are set in FGInput::init
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// call fgMainLoop() whenever there is
|
|
|
|
// nothing else to do
|
2000-03-17 06:16:15 +00:00
|
|
|
glutIdleFunc( fgIdleFunction );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// draw the scene
|
2000-03-17 06:16:15 +00:00
|
|
|
glutDisplayFunc( fgRenderFrame );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2002-02-05 20:54:08 +00:00
|
|
|
return 1;
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2001-07-19 04:54:53 +00:00
|
|
|
// Main loop
|
|
|
|
int mainLoop( int argc, char **argv ) {
|
2001-10-29 04:39:54 +00:00
|
|
|
|
2000-09-10 00:04:50 +00:00
|
|
|
#if defined( macintosh )
|
2000-04-27 21:57:08 +00:00
|
|
|
freopen ("stdout.txt", "w", stdout );
|
|
|
|
freopen ("stderr.txt", "w", stderr );
|
1999-06-02 22:22:47 +00:00
|
|
|
argc = ccommand( &argv );
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
|
|
|
|
1998-11-16 13:59:58 +00:00
|
|
|
// set default log levels
|
2002-05-17 16:41:27 +00:00
|
|
|
sglog().setLogLevels( SG_ALL, SG_INFO );
|
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 "
|
2002-05-15 21:44:34 +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;
|
|
|
|
|
2002-05-12 00:12:19 +00:00
|
|
|
#ifndef FG_WEATHERCM
|
2002-02-22 22:51:34 +00:00
|
|
|
globals->set_environment_mgr(new FGEnvironmentMgr);
|
2002-02-23 04:50:47 +00:00
|
|
|
#endif
|
2002-02-22 22:51:34 +00:00
|
|
|
|
2001-01-13 22:06:39 +00:00
|
|
|
// seed the random number generater
|
|
|
|
sg_srandom_time();
|
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
SGRoute *route = new SGRoute;
|
|
|
|
globals->set_route( route );
|
|
|
|
|
2001-07-22 19:51:16 +00:00
|
|
|
FGControls *controls = new FGControls;
|
|
|
|
globals->set_controls( controls );
|
|
|
|
|
2002-07-07 15:45:56 +00:00
|
|
|
FGSteam *steam = new FGSteam;
|
|
|
|
globals->set_steam( steam );
|
|
|
|
|
2001-01-26 00:21:36 +00:00
|
|
|
string_list *col = new string_list;
|
|
|
|
globals->set_channel_options_list( col );
|
|
|
|
|
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
|
2002-09-14 01:58:40 +00:00
|
|
|
static char required_version[] = "0.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
|
|
|
|
|
2002-10-10 15:02:50 +00:00
|
|
|
cerr << endl << "Base package check failed ... " \
|
2002-09-18 16:13:08 +00:00
|
|
|
<< "Found version " << base_version << " at: " \
|
|
|
|
<< globals->get_fg_root() << endl;
|
2002-10-10 15:02:50 +00:00
|
|
|
cerr << "Please upgrade to version" << required_version << endl;
|
2001-07-16 19:17:58 +00:00
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
|
2000-09-25 21:41:50 +00:00
|
|
|
// Initialize the Aircraft directory to "" (UIUC)
|
|
|
|
aircraft_dir = "";
|
2000-03-22 22:01:33 +00:00
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// Load the configuration parameters
|
|
|
|
if ( !fgInitConfig(argc, argv) ) {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "Config option parsing failed ..." );
|
1998-11-06 21:17:31 +00:00
|
|
|
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.
|
|
|
|
if( !fgGlutInit(&argc, argv) ) {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT, "GLUT initialization failed ..." );
|
1998-11-06 21:17:31 +00:00
|
|
|
exit(-1);
|
1998-08-20 15:10:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Initialize the various GLUT Event Handlers.
|
|
|
|
if( !fgGlutInitEvents() ) {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT,
|
2000-04-19 21:22:16 +00:00
|
|
|
"GLUT event handler initialization failed ..." );
|
|
|
|
exit(-1);
|
1998-08-20 15:10:33 +00:00
|
|
|
}
|
2001-08-21 21:13:55 +00:00
|
|
|
|
|
|
|
// Initialize plib net interface
|
|
|
|
netInit( &argc, argv );
|
|
|
|
|
2000-04-19 21:22:16 +00:00
|
|
|
// Initialize ssg (from plib). Needs to come before we do any
|
|
|
|
// other ssg stuff, but after opengl/glut has been initialized.
|
|
|
|
ssgInit();
|
1998-08-20 15:10:33 +00:00
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// Initialize the user interface (we need to do this before
|
|
|
|
// passing off control to glut and before fgInitGeneral to get our
|
|
|
|
// fonts !!!
|
1999-05-12 01:11:17 +00:00
|
|
|
guiInit();
|
|
|
|
|
2001-05-23 20:54:51 +00:00
|
|
|
#ifdef GL_EXT_texture_lod_bias
|
|
|
|
glTexEnvf( GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, -0.5 ) ;
|
|
|
|
#endif
|
|
|
|
|
2002-10-17 04:34:32 +00:00
|
|
|
#ifdef FG_EXPERIMENTAL_LIGHTING
|
|
|
|
// get the address of our OpenGL extensions
|
|
|
|
# ifdef WIN32
|
|
|
|
glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)
|
|
|
|
wglGetProcAddress("glPointParameterfEXT");
|
|
|
|
glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)
|
|
|
|
wglGetProcAddress("glPointParameterfvEXT");
|
|
|
|
# elif linux
|
|
|
|
glPointParameterfEXT = (OpenGLFuncExt)
|
|
|
|
glXGetProcAddressARB((GLubyte *)"glPointParameterfEXT");
|
|
|
|
glPointParameterfvEXT = (OpenGLFuncExtv)
|
|
|
|
glXGetProcAddressARB((GLubyte *)"glPointParameterfvEXT");
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2002-02-22 20:20:23 +00:00
|
|
|
// Set position relative to glide slope if requested
|
|
|
|
fgSetPosFromGlideSlope();
|
|
|
|
|
2002-05-01 23:13:36 +00:00
|
|
|
// If we have an explicit, in-range lon/lat, use it.
|
|
|
|
// If not, check for an airport-id and use that.
|
|
|
|
// If not, default to the middle of the KSFO field.
|
|
|
|
// The default values for lon/lat are deliberately out of range
|
|
|
|
// so that the airport-id can take effect; valid lon/lat will
|
|
|
|
// override airport-id, however.
|
|
|
|
double lon_deg = fgGetDouble("/position/longitude-deg");
|
|
|
|
double lat_deg = fgGetDouble("/position/latitude-deg");
|
|
|
|
if (lon_deg < -180 || lon_deg > 180 || lat_deg < -90 || lat_deg > 90) {
|
2002-11-15 21:13:29 +00:00
|
|
|
if ( fgGetString("/sim/presets/airport-id")[0] != '\0' ) {
|
|
|
|
fgSetPosFromAirportIDandHdg( fgGetString("/sim/presets/airport-id"),
|
|
|
|
fgGetDouble("/sim/presets/heading-deg") );
|
2002-05-01 23:13:36 +00:00
|
|
|
// set tower position (a little off the heading for single
|
|
|
|
// runway airports)
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetTowerPosFromAirportID( fgGetString("/sim/presets/airport-id"),
|
|
|
|
fgGetDouble("/sim/presets/heading-deg") );
|
2002-05-01 23:13:36 +00:00
|
|
|
} else {
|
|
|
|
// Default to middle of KSFO field
|
2002-11-15 21:13:29 +00:00
|
|
|
fgSetDouble("/sim/presets/longitude-deg", -122.374843);
|
|
|
|
fgSetDouble("/sim/presets/latitude-deg", 37.619002);
|
2002-05-01 23:13:36 +00:00
|
|
|
}
|
2000-07-21 22:54:14 +00:00
|
|
|
}
|
|
|
|
|
2002-02-06 23:31:33 +00:00
|
|
|
SGTime *t = fgInitTime();
|
2000-07-07 20:28:51 +00:00
|
|
|
globals->set_time_params( t );
|
2000-03-16 04:15:22 +00:00
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// Do some quick general initializations
|
1998-07-27 18:41:23 +00:00
|
|
|
if( !fgInitGeneral()) {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_GENERAL, SG_ALERT,
|
1998-11-06 21:17:31 +00:00
|
|
|
"General initializations failed ..." );
|
|
|
|
exit(-1);
|
1998-07-27 18:41:23 +00:00
|
|
|
}
|
|
|
|
|
2001-03-25 14:20:12 +00:00
|
|
|
SGPath modelpath( globals->get_fg_root() );
|
1999-07-01 01:17:43 +00:00
|
|
|
ssgModelPath( (char *)modelpath.c_str() );
|
2002-05-14 05:49:47 +00:00
|
|
|
|
|
|
|
// Initialize the global scenery manager
|
|
|
|
globals->set_scenery( new FGScenery );
|
2002-05-14 06:08:28 +00:00
|
|
|
globals->get_scenery()->init();
|
|
|
|
globals->get_scenery()->bind();
|
2002-04-13 21:36:22 +00:00
|
|
|
|
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
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the property-based built-in commands
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
fgInitCommands();
|
|
|
|
|
2002-04-12 12:45:49 +00:00
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the general model subsystem.
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
2002-08-07 01:34:49 +00:00
|
|
|
globals->set_model_loader(new FGModelLoader);
|
|
|
|
globals->set_texture_loader(new FGTextureLoader);
|
2002-04-12 12:45:49 +00:00
|
|
|
globals->set_model_mgr(new FGModelMgr);
|
|
|
|
globals->get_model_mgr()->init();
|
|
|
|
globals->get_model_mgr()->bind();
|
|
|
|
|
2002-04-11 04:26:07 +00:00
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the 3D aircraft model subsystem.
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
globals->set_aircraft_model(new FGAircraftModel);
|
|
|
|
globals->get_aircraft_model()->init();
|
|
|
|
globals->get_aircraft_model()->bind();
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
// Initialize the view manager subsystem.
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
2002-04-05 18:49:04 +00:00
|
|
|
FGViewMgr *viewmgr = new FGViewMgr;
|
|
|
|
globals->set_viewmgr( viewmgr );
|
|
|
|
viewmgr->init();
|
|
|
|
viewmgr->bind();
|
|
|
|
|
2002-04-11 04:26:07 +00:00
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
// Initialize the sky
|
2001-03-25 14:20:12 +00:00
|
|
|
SGPath ephem_data_path( globals->get_fg_root() );
|
2000-03-16 23:01:57 +00:00
|
|
|
ephem_data_path.append( "Astro" );
|
2000-07-08 05:09:24 +00:00
|
|
|
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 );
|
2000-03-16 23:01:57 +00:00
|
|
|
|
2002-06-05 17:44:39 +00:00
|
|
|
// TODO: move to environment mgr
|
2001-05-15 00:01:04 +00:00
|
|
|
thesky = new SGSky;
|
2002-06-05 17:44:39 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2001-05-15 00:01:04 +00:00
|
|
|
|
2001-03-25 14:20:12 +00:00
|
|
|
SGPath sky_tex_path( globals->get_fg_root() );
|
2000-03-06 23:28:43 +00:00
|
|
|
sky_tex_path.append( "Textures" );
|
|
|
|
sky_tex_path.append( "Sky" );
|
2000-03-16 04:15:22 +00:00
|
|
|
thesky->texture_path( sky_tex_path.str() );
|
2000-03-16 23:01:57 +00:00
|
|
|
|
2000-06-20 02:29:31 +00:00
|
|
|
thesky->build( 550.0, 550.0,
|
2000-07-08 05:09:24 +00:00
|
|
|
globals->get_ephem()->getNumPlanets(),
|
|
|
|
globals->get_ephem()->getPlanets(), 60000.0,
|
|
|
|
globals->get_ephem()->getNumStars(),
|
|
|
|
globals->get_ephem()->getStars(), 60000.0 );
|
2000-07-05 02:39:30 +00:00
|
|
|
|
2000-08-08 00:39:52 +00:00
|
|
|
// Initialize MagVar model
|
|
|
|
SGMagVar *magvar = new SGMagVar();
|
|
|
|
globals->set_mag( magvar );
|
|
|
|
|
2002-03-03 23:20:55 +00:00
|
|
|
// airport = new ssgBranch;
|
|
|
|
// airport->setName( "Airport Lighting" );
|
|
|
|
// lighting->addKid( airport );
|
2000-12-04 05:26:40 +00:00
|
|
|
|
2001-09-19 22:58:29 +00:00
|
|
|
// ADA
|
|
|
|
fgLoadDCS();
|
|
|
|
// ADA
|
|
|
|
|
1999-06-30 20:21:04 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
|
|
|
// Do the network intialization
|
2001-01-13 22:06:39 +00:00
|
|
|
if ( fgGetBool("/sim/networking/network-olk") ) {
|
2002-04-13 21:36:22 +00:00
|
|
|
printf("Multipilot mode %s\n",
|
2002-05-14 05:49:47 +00:00
|
|
|
fg_net_init( globals->get_scenery()->get_scene_graph() ) );
|
2000-02-28 04:16:12 +00:00
|
|
|
}
|
1999-06-30 20:21:04 +00:00
|
|
|
#endif
|
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
// build our custom render states
|
|
|
|
fgBuildRenderStates();
|
2002-02-17 21:05:27 +00:00
|
|
|
|
1998-04-24 14:19:29 +00:00
|
|
|
// pass control off to the master GLUT event handler
|
1998-04-24 00:49:17 +00:00
|
|
|
glutMainLoop();
|
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// we never actually get here ... but to avoid compiler warnings,
|
|
|
|
// etc.
|
|
|
|
return 0;
|
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
|
|
|
|
|
|
|
|
|
|
|
// $$$ end - added VS Renganathan, 15 Oct 2K
|
2000-12-08 20:05:43 +00:00
|
|
|
// - added Venky , 12 Nov 2K
|
|
|
|
|
2002-01-04 20:56:28 +00:00
|
|
|
#if defined(__linux__) && defined(__i386__)
|
|
|
|
|
|
|
|
static void handleFPE (int);
|
|
|
|
|
|
|
|
static void
|
|
|
|
initFPE ()
|
|
|
|
{
|
|
|
|
fpu_control_t fpe_flags = 0;
|
|
|
|
_FPU_GETCW(fpe_flags);
|
|
|
|
// fpe_flags &= ~_FPU_MASK_IM; // invalid operation
|
|
|
|
// fpe_flags &= ~_FPU_MASK_DM; // denormalized operand
|
|
|
|
// fpe_flags &= ~_FPU_MASK_ZM; // zero-divide
|
|
|
|
// fpe_flags &= ~_FPU_MASK_OM; // overflow
|
|
|
|
// fpe_flags &= ~_FPU_MASK_UM; // underflow
|
|
|
|
// fpe_flags &= ~_FPU_MASK_PM; // precision (inexact result)
|
|
|
|
_FPU_SETCW(fpe_flags);
|
|
|
|
signal(SIGFPE, handleFPE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
handleFPE (int num)
|
|
|
|
{
|
|
|
|
initFPE();
|
|
|
|
SG_LOG(SG_GENERAL, SG_ALERT, "Floating point interrupt (SIGFPE)");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2002-09-10 19:43:33 +00:00
|
|
|
#ifdef __APPLE__
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
int lo;
|
|
|
|
int hi;
|
|
|
|
} PSN;
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
short CPSGetCurrentProcess(PSN *psn);
|
|
|
|
short CPSSetProcessName (PSN *psn, char *processname);
|
|
|
|
short CPSEnableForegroundOperation(PSN *psn, int _arg2, int _arg3, int _arg4, int _arg5);
|
|
|
|
short CPSSetFrontProcess(PSN *psn);
|
|
|
|
};
|
|
|
|
|
|
|
|
#define CPSEnableFG(psn) CPSEnableForegroundOperation(psn,0x03,0x3C,0x2C,0x1103)
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2001-07-19 04:54:53 +00:00
|
|
|
// Main entry point; catch any exceptions that have made it this far.
|
|
|
|
int main ( int argc, char **argv ) {
|
2001-10-11 22:07:45 +00:00
|
|
|
|
2001-12-22 19:10:37 +00:00
|
|
|
// Enable floating-point exceptions for Linux/x86
|
2001-12-22 23:16:43 +00:00
|
|
|
#if defined(__linux__) && defined(__i386__)
|
2002-01-04 20:56:28 +00:00
|
|
|
initFPE();
|
2001-12-22 19:10:37 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// Enable floating-point exceptions for Windows
|
2001-10-24 21:25:11 +00:00
|
|
|
#if defined( _MSC_VER ) && defined( DEBUG )
|
2001-10-11 22:07:45 +00:00
|
|
|
// Christian, we should document what this does
|
|
|
|
_control87( _EM_INEXACT, _MCW_EM );
|
|
|
|
#endif
|
|
|
|
|
2001-10-24 21:25:11 +00:00
|
|
|
#if defined( HAVE_BC5PLUS )
|
|
|
|
_control87(MCW_EM, MCW_EM); /* defined in float.h */
|
|
|
|
#endif
|
|
|
|
|
2002-09-10 19:43:33 +00:00
|
|
|
// Keyboard focus hack
|
|
|
|
#ifdef __APPLE__
|
|
|
|
{
|
|
|
|
PSN psn;
|
|
|
|
|
|
|
|
glutInit (&argc, argv);
|
|
|
|
|
|
|
|
CPSGetCurrentProcess(&psn);
|
|
|
|
CPSSetProcessName(&psn, "FlightGear");
|
|
|
|
CPSEnableFG(&psn);
|
|
|
|
CPSSetFrontProcess(&psn);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2001-10-11 22:07:45 +00:00
|
|
|
// FIXME: add other, more specific
|
|
|
|
// exceptions.
|
|
|
|
try {
|
|
|
|
mainLoop(argc, argv);
|
|
|
|
} catch (sg_throwable &t) {
|
2002-04-04 17:51:40 +00:00
|
|
|
// We must use cerr rather than
|
|
|
|
// logging, since logging may be
|
|
|
|
// disabled.
|
|
|
|
cerr << "Fatal error: " << t.getFormattedMessage()
|
|
|
|
<< "\n (received from " << t.getOrigin() << ')' << endl;
|
2001-10-11 22:07:45 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2001-07-19 04:54:53 +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
|
|
|
void fgLoadDCS(void) {
|
|
|
|
|
2001-01-17 02:37:12 +00:00
|
|
|
ssgEntity *ship_obj = NULL;
|
2001-09-19 22:58:29 +00:00
|
|
|
|
2000-12-08 20:05:43 +00:00
|
|
|
char obj_filename[25];
|
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
for ( int k = 0; k < 32; k++ ) {
|
2000-12-08 20:05:43 +00:00
|
|
|
ship_pos[k]=NULL;
|
|
|
|
}
|
|
|
|
|
2001-03-25 14:20:12 +00:00
|
|
|
SGPath tile_path( globals->get_fg_root());
|
2000-12-08 20:05:43 +00:00
|
|
|
tile_path.append( "Scenery" );
|
|
|
|
tile_path.append( "Objects.txt" );
|
2001-03-25 14:20:12 +00:00
|
|
|
sg_gzifstream in( tile_path.str() );
|
2000-12-08 20:05:43 +00:00
|
|
|
if ( ! in.is_open() ) {
|
2001-03-24 06:03:11 +00:00
|
|
|
SG_LOG( SG_TERRAIN, SG_ALERT, "Cannot open file: " << tile_path.str() );
|
2001-03-28 00:39:29 +00:00
|
|
|
} else {
|
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
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
SGPath modelpath( globals->get_fg_root() );
|
|
|
|
modelpath.append( "Models" );
|
|
|
|
modelpath.append( "Geometry" );
|
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
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
SGPath texturepath( globals->get_fg_root() );
|
|
|
|
texturepath.append( "Models" );
|
|
|
|
texturepath.append( "Textures" );
|
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
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
ssgModelPath( (char *)modelpath.c_str() );
|
|
|
|
ssgTexturePath( (char *)texturepath.c_str() );
|
|
|
|
|
|
|
|
ship_sel = new ssgSelector;
|
|
|
|
|
|
|
|
char c;
|
|
|
|
while ( ! in.eof() ) {
|
|
|
|
in >> ::skipws;
|
|
|
|
if ( in.get( c ) && c == '#' ) {
|
|
|
|
in >> skipeol;
|
|
|
|
} else {
|
|
|
|
in.putback(c);
|
|
|
|
in >> obj_filename >> obj_lat[objc] >> obj_lon[objc] >> obj_alt[objc];
|
|
|
|
/* cout << endl << obj_filename << " " << obj_lat[objc] << " " << obj_lon[objc] << " " << obj_alt[objc] << endl;
|
|
|
|
int chj=getchar();*/
|
2000-12-08 20:05:43 +00:00
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
obj_lon[objc] *=SGD_DEGREES_TO_RADIANS;
|
|
|
|
obj_lat[objc] *=SGD_DEGREES_TO_RADIANS;
|
|
|
|
|
|
|
|
ship_pos[objc] = new ssgTransform;
|
2000-12-08 20:05:43 +00:00
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
// type "repeat" in objects.txt to load one more
|
|
|
|
// instance of the last object.
|
2000-12-08 20:05:43 +00:00
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
if ( strcmp(obj_filename,"repeat") != 0) {
|
2002-08-07 01:34:49 +00:00
|
|
|
ship_obj =
|
|
|
|
globals->get_model_loader()->load_model( obj_filename );
|
2001-03-28 00:39:29 +00:00
|
|
|
}
|
2000-12-08 20:05:43 +00:00
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
if ( ship_obj != NULL ) {
|
2001-09-19 22:58:29 +00:00
|
|
|
ship_obj->setName(obj_filename);
|
|
|
|
if (objc == 0)
|
|
|
|
ship_obj->clrTraversalMaskBits( SSGTRAV_HOT );
|
|
|
|
else
|
|
|
|
ship_obj->setTraversalMaskBits( SSGTRAV_HOT );
|
2001-03-28 00:39:29 +00:00
|
|
|
ship_pos[objc]->addKid( ship_obj ); // add object to transform node
|
|
|
|
ship_sel->addKid( ship_pos[objc] ); // add transform node to selector
|
2001-09-19 22:58:29 +00:00
|
|
|
SG_LOG( SG_TERRAIN, SG_ALERT, "Loaded file: "
|
|
|
|
<< obj_filename );
|
2001-03-28 00:39:29 +00:00
|
|
|
} else {
|
|
|
|
SG_LOG( SG_TERRAIN, SG_ALERT, "Cannot open file: "
|
|
|
|
<< obj_filename );
|
|
|
|
}
|
2000-12-08 20:05:43 +00:00
|
|
|
|
2001-09-19 22:58:29 +00:00
|
|
|
// temporary hack for deck lights - ultimately should move to PLib (when??)
|
|
|
|
//const char *extn = file_extension ( obj_filename ) ;
|
|
|
|
if ( objc == 1 ){
|
|
|
|
ssgVertexArray *lights = new ssgVertexArray( 100 );
|
|
|
|
ssgVertexArray *lightpoints = new ssgVertexArray( 100 );
|
|
|
|
ssgVertexArray *lightnormals = new ssgVertexArray( 100 );
|
|
|
|
ssgVertexArray *lightdir = new ssgVertexArray( 100 );
|
|
|
|
int ltype[500], light_type;
|
|
|
|
static int ltcount = 0;
|
|
|
|
string token;
|
|
|
|
sgVec3 rway_dir,rway_normal,lightpt;
|
|
|
|
Point3D node;
|
|
|
|
modelpath.append(obj_filename);
|
|
|
|
sg_gzifstream in1( modelpath.str() );
|
|
|
|
if ( ! in1.is_open() ) {
|
|
|
|
SG_LOG( SG_TERRAIN, SG_ALERT, "Cannot open file: " << modelpath.str() );
|
|
|
|
} else {
|
|
|
|
while ( ! in1.eof() ) {
|
2001-10-11 22:07:45 +00:00
|
|
|
in1 >> ::skipws;
|
2001-09-19 22:58:29 +00:00
|
|
|
if ( in1.get( c ) && c == '#' ) {
|
|
|
|
in1 >> skipeol;
|
|
|
|
} else {
|
|
|
|
in1.putback(c);
|
|
|
|
in1 >> token;
|
|
|
|
//cout << token << endl;
|
|
|
|
if ( token == "runway" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (rway_dir, node[0], node[1], node[2] );
|
|
|
|
} else if ( token == "edgelight" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (rway_normal, node[0], node[1], node[2] );
|
|
|
|
light_type = 1;
|
|
|
|
} else if ( token == "taxi" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (rway_normal, node[0], node[1], node[2] );
|
|
|
|
light_type = 2;
|
|
|
|
} else if ( token == "vasi" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (rway_normal, node[0], node[1], node[2] );
|
|
|
|
light_type = 3;
|
|
|
|
} else if ( token == "threshold" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (rway_normal, node[0], node[1], node[2] );
|
|
|
|
light_type = 4;
|
|
|
|
} else if ( token == "rabbit" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (rway_normal, node[0], node[1], node[2] );
|
|
|
|
light_type = 5;
|
|
|
|
} else if ( token == "ols" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (rway_ols, node[0], node[1], node[2] );
|
|
|
|
light_type = 6;
|
|
|
|
} else if ( token == "red" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (rway_normal, node[0], node[1], node[2] );
|
|
|
|
light_type = 7;
|
|
|
|
} else if ( token == "green" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (rway_normal, node[0], node[1], node[2] );
|
|
|
|
light_type = 8;
|
|
|
|
} else if ( token == "lp" ) {
|
|
|
|
in1 >> node;
|
|
|
|
sgSetVec3 (lightpt, node[0], node[1], node[2] );
|
|
|
|
lightpoints->add( lightpt );
|
|
|
|
lightnormals->add( rway_normal );
|
|
|
|
lightdir->add( rway_dir );
|
|
|
|
ltype[ltcount]= light_type;
|
|
|
|
ltcount++;
|
|
|
|
}
|
|
|
|
if (in1.eof()) break;
|
|
|
|
}
|
|
|
|
} //while
|
|
|
|
|
|
|
|
if ( lightpoints->getNum() ) {
|
|
|
|
ssgBranch *lightpoints_branch;
|
|
|
|
long int dummy = -999;
|
|
|
|
dummy_tile = new FGTileEntry((SGBucket)dummy);
|
|
|
|
dummy_tile->lightmaps_sequence = new ssgSelector;
|
|
|
|
dummy_tile->ols_transform = new ssgTransform;
|
|
|
|
|
|
|
|
// call function to generate the runway lights
|
|
|
|
lightpoints_branch =
|
|
|
|
dummy_tile->gen_runway_lights( lightpoints, lightnormals,
|
|
|
|
lightdir, ltype);
|
|
|
|
lightpoints_brightness->addKid(lightpoints_branch);
|
|
|
|
lightpoints_transform->addKid(lightpoints_brightness);
|
|
|
|
//dummy_tile->lightmaps_sequence->setTraversalMaskBits( SSGTRAV_HOT );
|
|
|
|
lightpoints_transform->addKid( dummy_tile->lightmaps_sequence );
|
|
|
|
lightpoints_transform->ref();
|
2002-10-06 03:53:19 +00:00
|
|
|
globals->get_scenery()->get_gnd_lights_root()->addKid( lightpoints_transform );
|
2001-09-19 22:58:29 +00:00
|
|
|
}
|
|
|
|
} //if in1
|
|
|
|
} //if objc
|
|
|
|
// end hack for deck lights
|
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
objc++;
|
|
|
|
|
|
|
|
if (in.eof()) break;
|
|
|
|
}
|
|
|
|
} // while
|
|
|
|
|
|
|
|
SG_LOG ( SG_TERRAIN, SG_ALERT, "Finished object processing." );
|
|
|
|
|
2002-05-14 05:49:47 +00:00
|
|
|
globals->get_scenery()->get_terrain_branch()->addKid( ship_sel ); //add selector node to root node
|
2001-03-28 00:39:29 +00:00
|
|
|
}
|
2000-12-08 20:05:43 +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
|
|
|
return;
|
2000-12-08 20:05:43 +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
|
|
|
|
|
|
|
|
|
|
|
void fgUpdateDCS (void) {
|
|
|
|
|
2001-01-17 02:37:12 +00:00
|
|
|
// double eye_lat,eye_lon,eye_alt;
|
|
|
|
// static double obj_head;
|
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
|
|
|
double sl_radius,obj_latgc;
|
2001-01-17 02:37:12 +00:00
|
|
|
// float nresultmat[4][4];
|
|
|
|
// sgMat4 Trans,rothead,rotlon,rot180,rotlat,resultmat1,resultmat2,resultmat3;
|
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
|
|
|
double bz[3];
|
|
|
|
|
|
|
|
// Instantaneous Geodetic Lat/Lon/Alt of moving object
|
2000-12-08 20:05:43 +00:00
|
|
|
FGADA *fdm = (FGADA *)current_aircraft.fdm_state;
|
|
|
|
|
|
|
|
// Deck should be the first object in objects.txt in case of fdm=ada
|
|
|
|
|
2002-03-26 02:38:11 +00:00
|
|
|
if (!strcmp(fgGetString("/sim/flight-model"), "ada")) {
|
2001-09-19 22:58:29 +00:00
|
|
|
if ((fdm->get_iaux(1))==1)
|
|
|
|
{
|
|
|
|
obj_lat[1] = fdm->get_daux(1)*SGD_DEGREES_TO_RADIANS;
|
|
|
|
obj_lon[1] = fdm->get_daux(2)*SGD_DEGREES_TO_RADIANS;
|
|
|
|
obj_alt[1] = fdm->get_daux(3);
|
|
|
|
obj_pitch[1] = fdm->get_faux(1);
|
|
|
|
obj_roll[1] = fdm->get_faux(2);
|
|
|
|
}
|
2000-12-08 20:05:43 +00:00
|
|
|
}
|
|
|
|
|
2001-03-28 00:39:29 +00:00
|
|
|
for ( int m = 0; m < objc; m++ ) {
|
2001-03-24 04:48:44 +00:00
|
|
|
//cout << endl << obj_lat[m]*SGD_RADIANS_TO_DEGREES << " " << obj_lon[m]*SGD_RADIANS_TO_DEGREES << " " << obj_alt[m] << " " << objc << endl;
|
2000-12-08 20:05:43 +00:00
|
|
|
//int v=getchar();
|
|
|
|
|
|
|
|
//Geodetic to Geocentric angles for rotation
|
|
|
|
sgGeodToGeoc(obj_lat[m],obj_alt[m],&sl_radius,&obj_latgc);
|
|
|
|
|
|
|
|
//moving object gbs-posn in cartesian coords
|
|
|
|
Point3D obj_posn = Point3D( obj_lon[m],obj_lat[m],obj_alt[m]);
|
|
|
|
Point3D obj_pos = sgGeodToCart( obj_posn );
|
|
|
|
|
|
|
|
// Translate moving object w.r.t eye
|
2002-05-14 05:22:52 +00:00
|
|
|
Point3D Objtrans = obj_pos - globals->get_scenery()->get_center();
|
2000-12-08 20:05:43 +00:00
|
|
|
bz[0]=Objtrans.x();
|
|
|
|
bz[1]=Objtrans.y();
|
|
|
|
bz[2]=Objtrans.z();
|
|
|
|
|
|
|
|
// rotate dynamic objects for lat,lon & alt and other motion about its axes
|
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
|
|
|
|
|
|
|
sgMat4 sgTRANS;
|
|
|
|
sgMakeTransMat4( sgTRANS, bz[0],bz[1],bz[2]);
|
|
|
|
|
|
|
|
sgVec3 ship_fwd,ship_rt,ship_up;
|
|
|
|
sgSetVec3( ship_fwd, 1.0, 0.0, 0.0);//east,roll
|
|
|
|
sgSetVec3( ship_rt, 0.0, 1.0, 0.0);//up,pitch
|
|
|
|
sgSetVec3( ship_up, 0.0, 0.0, 1.0); //north,yaw
|
|
|
|
|
2001-09-19 22:58:29 +00:00
|
|
|
sgMat4 sgROT_lon, sgROT_lat, sgROT_hdg, sgROT_pitch, sgROT_roll;
|
2001-03-24 04:48:44 +00:00
|
|
|
sgMakeRotMat4( sgROT_lon, obj_lon[m]*SGD_RADIANS_TO_DEGREES, ship_up );
|
|
|
|
sgMakeRotMat4( sgROT_lat, 90-obj_latgc*SGD_RADIANS_TO_DEGREES, ship_rt );
|
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
|
|
|
sgMakeRotMat4( sgROT_hdg, 180.0, ship_up );
|
2001-09-19 22:58:29 +00:00
|
|
|
sgMakeRotMat4( sgROT_pitch, obj_pitch[m], ship_rt );
|
|
|
|
sgMakeRotMat4( sgROT_roll, obj_roll[m], ship_fwd );
|
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
|
|
|
|
|
|
|
sgMat4 sgTUX;
|
|
|
|
sgCopyMat4( sgTUX, sgROT_hdg );
|
2001-09-19 22:58:29 +00:00
|
|
|
sgPostMultMat4( sgTUX, sgROT_pitch );
|
|
|
|
sgPostMultMat4( sgTUX, sgROT_roll );
|
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
|
|
|
sgPostMultMat4( sgTUX, sgROT_lat );
|
|
|
|
sgPostMultMat4( sgTUX, sgROT_lon );
|
|
|
|
sgPostMultMat4( sgTUX, sgTRANS );
|
|
|
|
|
|
|
|
sgCoord shippos;
|
2000-12-08 20:05:43 +00:00
|
|
|
sgSetCoord(&shippos, sgTUX );
|
|
|
|
ship_pos[m]->setTransform( &shippos );
|
2001-09-19 22:58:29 +00:00
|
|
|
// temporary hack for deck lights - ultimately should move to PLib (when ??)
|
|
|
|
if (m == 1) {
|
|
|
|
if (lightpoints_transform) {
|
|
|
|
lightpoints_transform->setTransform( &shippos );
|
|
|
|
float sun_angle = cur_light_params.sun_angle * SGD_RADIANS_TO_DEGREES;
|
|
|
|
if ( sun_angle > 89 ) {
|
|
|
|
lightpoints_brightness->select(0x01);
|
|
|
|
} else {
|
|
|
|
lightpoints_brightness->select(0x00);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
float elev;
|
|
|
|
sgVec3 rp,to;
|
|
|
|
float *vp;
|
|
|
|
float alt;
|
|
|
|
float ref_elev;
|
|
|
|
sgXformPnt3( rp, rway_ols, sgTUX );
|
|
|
|
vp = globals->get_current_view()->get_view_pos();
|
|
|
|
to[0] = rp[0]-vp[0];
|
|
|
|
to[1] = rp[1]-vp[1];
|
|
|
|
to[2] = rp[2]-vp[2];
|
|
|
|
float dist = sgLengthVec3( to );
|
|
|
|
alt = (current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER)-rway_ols[2];
|
|
|
|
|
|
|
|
elev = asin(alt/dist)*SGD_RADIANS_TO_DEGREES;
|
|
|
|
|
|
|
|
ref_elev = elev - 3.75; // +ve above, -ve below
|
|
|
|
|
|
|
|
unsigned int sel;
|
|
|
|
sel = 0xFF;
|
|
|
|
// DO NOT DELETE THIS CODE - This is to compare a discrete FLOLS (without LOD) with analog FLOLS
|
|
|
|
// if (ref_elev > 0.51) sel = 0x21;
|
|
|
|
// if ((ref_elev <= 0.51) & (ref_elev > 0.17)) sel = 0x22;
|
|
|
|
// if ((ref_elev <= 0.17) & (ref_elev >= -0.17)) sel = 0x24;
|
|
|
|
// if ((ref_elev < -0.17) & (ref_elev >= -0.51)) sel = 0x28;
|
|
|
|
// if (ref_elev < -0.51) sel = 0x30;
|
|
|
|
// DO NOT DELETE THIS CODE - This is to compare a discrete FLOLS (without LOD) with analog FLOLS
|
|
|
|
dummy_tile->lightmaps_sequence->select(sel);
|
|
|
|
|
|
|
|
sgVec3 up;
|
|
|
|
sgCopyVec3 (up, ship_up);
|
|
|
|
if (dist > 750)
|
|
|
|
sgScaleVec3 (up, 4.0*ref_elev*dist/750.0);
|
|
|
|
else
|
|
|
|
sgScaleVec3 (up, 4.0*ref_elev);
|
|
|
|
dummy_tile->ols_transform->setTransform(up);
|
|
|
|
//cout << "ref_elev " << ref_elev << endl;
|
|
|
|
}
|
|
|
|
// end hack for deck lights
|
|
|
|
|
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
|
|
|
}
|
2001-03-28 00:39:29 +00:00
|
|
|
if ( ship_sel != NULL ) {
|
2001-09-19 22:58:29 +00:00
|
|
|
ship_sel->select(0xFFFFFFFE); // first object is ownship, added to acmodel
|
2001-03-28 00:39:29 +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
|
|
|
|
|
|
|
// $$$ end - added VS Renganathan, 15 Oct 2K
|
2000-12-08 20:05:43 +00:00
|
|
|
// added Venky , 12 Nov 2K
|