1 // location.hxx -- class for determining model location in the flightgear world.
3 // Written by Jim Wilson, David Megginson, started April 2002.
5 // Copyright (C) 2002 Jim Wilson, David Megginson
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 // General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 #ifndef _SG_LOCATION_HXX
25 #define _SG_LOCATION_HXX
29 # error This library requires C++
32 #include <simgear/compiler.h>
33 #include <simgear/constants.h>
34 #include <simgear/math/point3d.hxx>
36 #include <plib/sg.h> // plib include
39 // Define a structure containing view information
48 virtual ~SGLocation( void );
50 //////////////////////////////////////////////////////////////////////
51 // Part 2: user settings.
52 //////////////////////////////////////////////////////////////////////
54 // Geodetic position of model...
55 virtual double getLongitude_deg () const { return _lon_deg; }
56 virtual double getLatitude_deg () const { return _lat_deg; }
57 virtual double getAltitudeASL_ft () const { return _alt_ft; }
58 virtual void setPosition (double lon_deg, double lat_deg, double alt_ft);
61 // Reference orientation rotations...
62 // These are rotations that represent the plane attitude effect on
63 // the view (in Pilot view). IE The view frustrum rotates as the plane
64 // turns, pitches, and rolls.
65 // In model view (lookat/chaseview) these end up changing the angle that
66 // the eye is looking at the ojbect (ie the model).
67 // FIXME: the FGModel class should have its own version of these so that
68 // it can generate it's own model rotations.
69 virtual double getRoll_deg () const { return _roll_deg; }
70 virtual double getPitch_deg () const {return _pitch_deg; }
71 virtual double getHeading_deg () const {return _heading_deg; }
72 virtual void setOrientation (double roll_deg, double pitch_deg, double heading_deg);
75 //////////////////////////////////////////////////////////////////////
76 // Part 3: output vectors and matrices in FlightGear coordinates.
77 //////////////////////////////////////////////////////////////////////
79 // Vectors and positions...
81 //! Get the absolute view position in fgfs coordinates.
82 virtual double * get_absolute_view_pos( );
84 //! Return the position relative to the given scenery center.
85 virtual float * get_view_pos( const Point3D& scenery_center );
87 // Get world up vector
88 virtual float *get_world_up()
89 { recalcAbsolutePosition(); return _world_up; }
91 // Get surface east vector
92 virtual float *get_surface_east()
93 { recalcAbsolutePosition(); return _surface_east; }
95 // Get surface south vector
96 virtual float *get_surface_south()
97 { recalcAbsolutePosition(); return _surface_south; }
99 // Elevation of ground under location (based on scenery output)...
100 void set_cur_elev_m ( double elev ) { _cur_elev_m = elev; }
101 inline double get_cur_elev_m () { return _cur_elev_m; }
104 virtual const sgVec4 *getTransformMatrix() {
108 virtual const sgVec4 *getCachedTransformMatrix() { return TRANS; }
110 virtual const sgVec4 *getUpMatrix(const Point3D& scenery_center) {
111 recalcAbsolutePosition();
114 virtual const sgVec4 *getCachedUpMatrix() { return UP; }
118 //////////////////////////////////////////////////////////////////
120 //////////////////////////////////////////////////////////////////
122 // flag forcing a recalc of derived view parameters
123 mutable bool _orientation_dirty, _position_dirty;
125 mutable sgdVec3 _absolute_view_pos;
126 mutable sgVec3 _relative_view_pos;
136 // elevation of ground under this location...
139 // surface vector heading south
140 mutable sgVec3 _surface_south;
142 // surface vector heading east (used to unambiguously align sky
144 mutable sgVec3 _surface_east;
146 // world up vector (normal to the plane tangent to the earth's
147 // surface at the spot we are directly above)
148 mutable sgVec3 _world_up;
150 // sg versions of our friendly matrices
151 mutable sgMat4 TRANS, UP;
153 //////////////////////////////////////////////////////////////////
154 // private functions //
155 //////////////////////////////////////////////////////////////////
157 void recalcOrientation() const;
158 void recalcAbsolutePosition() const;
162 #endif // _SG_LOCATION_HXX