1 // views.hxx -- data structures and routines for managing and view parameters.
3 // Written by Curtis Olson, started August 1997.
5 // Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com
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., 675 Mass Ave, Cambridge, MA 02139, USA.
29 # error This library requires C++
32 #include <Include/compiler.h>
36 #include <sg.h> // plib include
38 #include <FDM/flight.hxx>
39 #include <Math/mat3.h>
40 #include <Math/point3d.hxx>
41 #include <Time/fg_time.hxx>
42 #include <Time/light.hxx>
44 #include "options.hxx"
54 typedef list < FGMat4Wrapper > sgMat4_list;
55 typedef sgMat4_list::iterator sgMat4_list_iterator;
56 typedef sgMat4_list::const_iterator const_sgMat4_list_iterator;
59 // used in views.cxx and tilemgr.cxx
60 #define USE_FAST_FOV_CLIP
63 // Define a structure containing view information
70 FG_VIEW_FIRST_PERSON = 0,
74 // the current offset from forward for viewing
77 // the goal view offset for viewing (used for smooth view changes)
78 double goal_view_offset;
80 // flag forcing update of fov related stuff
83 // fov of view is specified in the y direction, win_ratio is used to
84 // calculate the fov in the X direction = width/height
87 // width & height of window
88 int winWidth, winHeight;
90 // sin and cos of (fov / 2) in Y axis
91 double sin_fov_y, cos_fov_y;
92 double sinlon, coslon;
94 // slope of view frustum edge in eye space Y axis
97 // sin and cos of (fov / 2) in X axis
98 double sin_fov_x, cos_fov_x;
100 // slope of view frustum edge in eye space X axis
103 #if defined( USE_FAST_FOV_CLIP )
104 double fov_x_clip, fov_y_clip;
105 #endif // USE_FAST_FOV_CLIP
107 // View frustum cull ratio (% of tiles culled ... used for
108 // reporting purposes)
111 // Number of triangles rendered;
115 // absolute view position
116 Point3D abs_view_pos;
118 // view position translated to scenery.center
121 // cartesion coordinates of current lon/lat if at sea level
122 // translated to scenery.center
123 Point3D cur_zero_elev;
125 // vector in cartesian coordinates from current position to the
126 // postion on the earth's surface the sun is directly over
129 // surface direction to go to head towards sun
130 MAT3vec surface_to_sun;
132 // vector in cartesian coordinates from current position to the
133 // postion on the earth's surface the moon is directly over
136 // surface direction to go to head towards moon
137 MAT3vec surface_to_moon;
139 // surface vector heading south
140 MAT3vec surface_south;
142 // surface vector heading east (used to unambiguously align sky
144 MAT3vec surface_east;
146 // local up vector (normal to the plane tangent to the earth's
147 // surface at the spot we are directly above
150 // up vector for the view (usually point straight up through the
151 // top of the aircraft
155 // the vector pointing straight out the nose of the aircraft
156 MAT3vec view_forward;
158 // Transformation matrix for eye coordinates to aircraft coordinates
161 // Transformation matrix for the view direction offset relative to
162 // the AIRCRAFT matrix
164 sgMat4 sgVIEW_OFFSET;
166 // Current model view matrix;
167 GLfloat MODEL_VIEW[16];
170 fgViewMode view_mode;
172 // sg versions of our friendly matrices
173 sgMat4 sgLOCAL, sgUP, sgVIEW_ROT, sgTRANS, sgVIEW, sgLARC_TO_SSG;
175 // queue of view matrices so we can have a follow view
186 // Initialize a view class
189 // Update the view volume, position, and orientation
190 void UpdateViewParams( void );
192 // Flag to request that UpdateFOV() be called next time
193 // UpdateViewMath() is run.
194 inline void force_update_fov_math() { update_fov = true; }
196 // Update the view parameters
197 void UpdateViewMath( FGInterface *f );
199 // Update the field of view coefficients
200 void UpdateFOV( const fgOPTIONS& o );
203 void cycle_view_mode();
205 // accessor functions
206 inline double get_view_offset() const { return view_offset; }
207 inline void set_view_offset( double a ) { view_offset = a; }
208 inline void inc_view_offset( double amt ) { view_offset += amt; }
209 inline double get_goal_view_offset() const { return goal_view_offset; }
210 inline void set_goal_view_offset( double a) { goal_view_offset = a; }
211 inline double get_win_ratio() const { return win_ratio; }
212 inline void set_win_ratio( double r ) { win_ratio = r; }
213 inline int get_winWidth() const { return winWidth; }
214 inline void set_winWidth( int w ) { winWidth = w; }
215 inline int get_winHeight() const { return winHeight; }
216 inline void set_winHeight( int h ) { winHeight = h; }
217 inline double get_slope_y() const { return slope_y; }
218 inline double get_slope_x() const { return slope_x; }
219 #if defined( USE_FAST_FOV_CLIP )
220 inline double get_fov_x_clip() const { return fov_x_clip; }
221 inline double get_fov_y_clip() const { return fov_y_clip; }
222 #endif // USE_FAST_FOV_CLIP
223 inline double get_vfc_ratio() const { return vfc_ratio; }
224 inline void set_vfc_ratio(double r) { vfc_ratio = r; }
225 inline int get_tris_rendered() const { return tris_rendered; }
226 inline void set_tris_rendered( int tris) { tris_rendered = tris; }
227 inline int get_tris_culled() const { return tris_culled; }
228 inline void set_tris_culled( int tris) { tris_culled = tris; }
229 inline Point3D get_abs_view_pos() const { return abs_view_pos; }
230 inline Point3D get_view_pos() const { return view_pos; }
231 inline Point3D get_cur_zero_elev() const { return cur_zero_elev; }
232 inline double *get_to_sun() { return to_sun; }
233 inline void set_to_sun( double x, double y, double z) {
238 inline double *get_surface_to_sun() { return surface_to_sun; }
239 inline void set_surface_to_sun( double x, double y, double z) {
240 surface_to_sun[0] = x;
241 surface_to_sun[1] = y;
242 surface_to_sun[2] = z;
244 inline double *get_to_moon() { return to_moon; }
245 inline void set_to_moon( double x, double y, double z) {
250 inline double *get_surface_to_moon() { return surface_to_moon; }
251 inline void set_surface_to_moon( double x, double y, double z) {
252 surface_to_moon[0] = x;
253 surface_to_moon[1] = y;
254 surface_to_moon[2] = z;
256 inline double *get_surface_south() { return surface_south; }
257 inline double *get_surface_east() { return surface_east; }
258 inline double *get_local_up() { return local_up; }
259 inline double *get_view_forward() { return view_forward; }
260 inline GLfloat *get_MODEL_VIEW() { return MODEL_VIEW; }
264 extern FGView current_view;