2002-04-11 04:26:07 +00:00
|
|
|
// location.hxx -- class for determining model location in the flightgear world.
|
|
|
|
//
|
2002-04-11 16:40:59 +00:00
|
|
|
// Written by Jim Wilson, David Megginson, started April 2002.
|
2002-04-11 04:26:07 +00:00
|
|
|
//
|
2002-04-11 16:40:59 +00:00
|
|
|
// Copyright (C) 2002 Jim Wilson, David Megginson
|
|
|
|
//
|
|
|
|
// 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$
|
2002-04-11 04:26:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
#ifndef _LOCATION_HXX
|
|
|
|
#define _LOCATION_HXX
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef __cplusplus
|
|
|
|
# error This library requires C++
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <simgear/compiler.h>
|
|
|
|
#include <simgear/constants.h>
|
2002-05-20 16:13:37 +00:00
|
|
|
#include <simgear/math/point3d.hxx>
|
2002-04-11 04:26:07 +00:00
|
|
|
|
|
|
|
#include <plib/sg.h> // plib include
|
|
|
|
|
|
|
|
#include "fgfs.hxx"
|
|
|
|
|
|
|
|
|
|
|
|
// Define a structure containing view information
|
|
|
|
class FGLocation
|
|
|
|
{
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
// Constructor
|
|
|
|
FGLocation( void );
|
|
|
|
|
|
|
|
// Destructor
|
|
|
|
virtual ~FGLocation( void );
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// Part 1: standard FGSubsystem implementation.
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
virtual void init ();
|
|
|
|
virtual void bind ();
|
|
|
|
virtual void unbind ();
|
|
|
|
void update (int dt);
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// Part 2: user settings.
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// Geodetic position of model...
|
|
|
|
virtual double getLongitude_deg () const { return _lon_deg; }
|
|
|
|
virtual double getLatitude_deg () const { return _lat_deg; }
|
|
|
|
virtual double getAltitudeASL_ft () const { return _alt_ft; }
|
|
|
|
virtual void setPosition (double lon_deg, double lat_deg, double alt_ft);
|
|
|
|
|
|
|
|
|
|
|
|
// Reference orientation rotations...
|
|
|
|
// These are rotations that represent the plane attitude effect on
|
|
|
|
// the view (in Pilot view). IE The view frustrum rotates as the plane
|
|
|
|
// turns, pitches, and rolls.
|
|
|
|
// In model view (lookat/chaseview) these end up changing the angle that
|
|
|
|
// the eye is looking at the ojbect (ie the model).
|
|
|
|
// FIXME: the FGModel class should have its own version of these so that
|
|
|
|
// it can generate it's own model rotations.
|
|
|
|
virtual double getRoll_deg () const { return _roll_deg; }
|
|
|
|
virtual double getPitch_deg () const {return _pitch_deg; }
|
|
|
|
virtual double getHeading_deg () const {return _heading_deg; }
|
|
|
|
virtual void setOrientation (double roll_deg, double pitch_deg, double heading_deg);
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// Part 3: output vectors and matrices in FlightGear coordinates.
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// Vectors and positions...
|
|
|
|
|
|
|
|
// Get zero view_pos
|
|
|
|
virtual float * get_view_pos() { return _relative_view_pos; }
|
|
|
|
// Get the absolute view position in fgfs coordinates.
|
|
|
|
virtual double * get_absolute_view_pos ();
|
|
|
|
// Get zero elev
|
|
|
|
virtual float * get_zero_elev() { return _zero_elev_view_pos; }
|
|
|
|
// Get world up vector
|
|
|
|
virtual float *get_world_up() { return _world_up; }
|
|
|
|
// Get the relative (to scenery center) view position in fgfs coordinates.
|
|
|
|
virtual float * getRelativeViewPos ();
|
|
|
|
// Get the absolute zero-elevation view position in fgfs coordinates.
|
|
|
|
virtual float * getZeroElevViewPos ();
|
|
|
|
// Get surface east vector
|
|
|
|
virtual float *get_surface_east() { return _surface_east; }
|
|
|
|
// Get surface south vector
|
|
|
|
virtual float *get_surface_south() { return _surface_south; }
|
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
|
|
|
// Elevation of ground under location (based on scenery output)...
|
|
|
|
void set_cur_elev_m ( double elev ) { _cur_elev_m = elev; }
|
|
|
|
inline double get_cur_elev_m () { return _cur_elev_m; }
|
|
|
|
// Interface to current buckets for use with tilemgr...
|
2002-05-20 16:13:37 +00:00
|
|
|
void set_tile_center ( Point3D tile_center ) { _tile_center = tile_center; }
|
|
|
|
inline Point3D get_tile_center () { return _tile_center; }
|
2002-04-11 04:26:07 +00:00
|
|
|
|
|
|
|
// Matrices...
|
2002-04-13 13:11:34 +00:00
|
|
|
virtual const sgVec4 * getTransformMatrix() { if ( _dirty ) { recalc(); } return TRANS; }
|
|
|
|
virtual const sgVec4 * getCachedTransformMatrix() { return TRANS; }
|
|
|
|
virtual const sgVec4 * getUpMatrix() { if ( _dirty ) { recalc(); } return UP; }
|
|
|
|
virtual const sgVec4 * getCachedUpMatrix() { return UP; }
|
2002-04-11 04:26:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// private data //
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
// flag forcing a recalc of derived view parameters
|
|
|
|
bool _dirty;
|
|
|
|
|
|
|
|
mutable sgdVec3 _absolute_view_pos;
|
|
|
|
mutable sgVec3 _relative_view_pos;
|
|
|
|
mutable sgVec3 _zero_elev_view_pos;
|
|
|
|
|
|
|
|
double _lon_deg;
|
|
|
|
double _lat_deg;
|
|
|
|
double _alt_ft;
|
|
|
|
|
|
|
|
double _roll_deg;
|
|
|
|
double _pitch_deg;
|
|
|
|
double _heading_deg;
|
|
|
|
|
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
|
|
|
// elevation of ground under this location...
|
|
|
|
double _cur_elev_m;
|
2002-05-20 16:13:37 +00:00
|
|
|
Point3D _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
|
|
|
|
2002-04-11 04:26:07 +00:00
|
|
|
// surface vector heading south
|
|
|
|
sgVec3 _surface_south;
|
|
|
|
|
|
|
|
// surface vector heading east (used to unambiguously align sky
|
|
|
|
// with sun)
|
|
|
|
sgVec3 _surface_east;
|
|
|
|
|
|
|
|
// world up vector (normal to the plane tangent to the earth's
|
|
|
|
// surface at the spot we are directly above
|
|
|
|
sgVec3 _world_up;
|
|
|
|
|
|
|
|
// sg versions of our friendly matrices
|
|
|
|
sgMat4 TRANS, UP;
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
// private functions //
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
void recalc ();
|
|
|
|
void recalcPosition (double lon_deg, double lat_deg, double alt_ft) const;
|
|
|
|
|
|
|
|
inline void set_dirty() { _dirty = true; }
|
|
|
|
inline void set_clean() { _dirty = false; }
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // _LOCATION_HXX
|