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++
33 #include <FDM/flight.hxx>
34 #include <Math/mat3.h>
35 #include <Math/point3d.hxx>
36 #include <Time/fg_time.hxx>
37 #include <Time/light.hxx>
39 #include "options.hxx"
42 // used in views.cxx and tilemgr.cxx
43 #define USE_FAST_FOV_CLIP
46 // Define a structure containing view information
51 // the current offset from forward for viewing
54 // the goal view offset for viewing (used for smooth view changes)
55 double goal_view_offset;
57 // flag forcing update of fov related stuff
60 // fov of view is specified in the y direction, win_ratio is used to
61 // calculate the fov in the X direction = width/height
64 // width & height of window
65 int winWidth, winHeight;
67 // sin and cos of (fov / 2) in Y axis
68 double sin_fov_y, cos_fov_y;
69 double sinlon, coslon;
71 // slope of view frustum edge in eye space Y axis
74 // sin and cos of (fov / 2) in X axis
75 double sin_fov_x, cos_fov_x;
77 // slope of view frustum edge in eye space X axis
80 #if defined( USE_FAST_FOV_CLIP )
81 double fov_x_clip, fov_y_clip;
82 #endif // USE_FAST_FOV_CLIP
84 // View frustum cull ratio (% of tiles culled ... used for
85 // reporting purposes)
88 // Number of triangles rendered;
92 // absolute view position
95 // view position translated to scenery.center
98 // cartesion coordinates of current lon/lat if at sea level
99 // translated to scenery.center*/
100 Point3D cur_zero_elev;
102 // vector in cartesian coordinates from current position to the
103 // postion on the earth's surface the sun is directly over
106 // surface direction to go to head towards sun
107 MAT3vec surface_to_sun;
109 // vector in cartesian coordinates from current position to the
110 // postion on the earth's surface the moon is directly over
113 // surface direction to go to head towards moon
114 MAT3vec surface_to_moon;
116 // surface vector heading south
117 MAT3vec surface_south;
119 // surface vector heading east (used to unambiguously align sky
121 MAT3vec surface_east;
123 // local up vector (normal to the plane tangent to the earth's
124 // surface at the spot we are directly above
127 // up vector for the view (usually point straight up through the
128 // top of the aircraft
131 // the vector pointing straight out the nose of the aircraft
132 MAT3vec view_forward;
134 // Transformation matrix for eye coordinates to aircraft coordinates
137 // Transformation matrix for the view direction offset relative to
138 // the AIRCRAFT matrix
141 // Transformation matrix for aircraft coordinates to world
145 // Combined transformation from eye coordinates to world coordinates
146 MAT3mat EYE_TO_WORLD;
148 // Inverse of EYE_TO_WORLD which is a transformation from world
149 // coordinates to eye coordinates
150 MAT3mat WORLD_TO_EYE;
152 // Current model view matrix;
153 GLdouble MODEL_VIEW[16];
163 // Initialize a view class
166 // Basically, this is a modified version of the Mesa gluLookAt()
167 // function that's been modified slightly so we can capture the
168 // result (and use it later) otherwise this all gets calculated in
169 // OpenGL land and we don't have access to the results.
170 void LookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,
171 GLdouble centerx, GLdouble centery, GLdouble centerz,
172 GLdouble upx, GLdouble upy, GLdouble upz );
174 // Update the view volume, position, and orientation
175 void UpdateViewParams( void );
177 // Flag to request that UpdateFOV() be called next time
178 // UpdateViewMath() is run.
179 inline void force_update_fov_math() { update_fov = true; }
181 // Update the view parameters
182 void UpdateViewMath( FGInterface *f );
184 // Update the "World to Eye" transformation matrix
185 void UpdateWorldToEye( FGInterface *f );
187 // Update the field of view coefficients
188 void UpdateFOV( const fgOPTIONS& o );
190 // accessor functions
191 inline double get_view_offset() const { return view_offset; }
192 inline void set_view_offset( double a ) { view_offset = a; }
193 inline void inc_view_offset( double amt ) { view_offset += amt; }
194 inline double get_goal_view_offset() const { return goal_view_offset; }
195 inline void set_goal_view_offset( double a) { goal_view_offset = a; }
196 inline double get_win_ratio() const { return win_ratio; }
197 inline void set_win_ratio( double r ) { win_ratio = r; }
198 inline int get_winWidth() const { return winWidth; }
199 inline void set_winWidth( int w ) { winWidth = w; }
200 inline int get_winHeight() const { return winHeight; }
201 inline void set_winHeight( int h ) { winHeight = h; }
202 inline double get_slope_y() const { return slope_y; }
203 inline double get_slope_x() const { return slope_x; }
204 #if defined( USE_FAST_FOV_CLIP )
205 inline double get_fov_x_clip() const { return fov_x_clip; }
206 inline double get_fov_y_clip() const { return fov_y_clip; }
207 #endif // USE_FAST_FOV_CLIP
208 inline double get_vfc_ratio() const { return vfc_ratio; }
209 inline void set_vfc_ratio(double r) { vfc_ratio = r; }
210 inline int get_tris_rendered() const { return tris_rendered; }
211 inline void set_tris_rendered( int tris) { tris_rendered = tris; }
212 inline int get_tris_culled() const { return tris_culled; }
213 inline void set_tris_culled( int tris) { tris_culled = tris; }
214 inline Point3D get_abs_view_pos() const { return abs_view_pos; }
215 inline Point3D get_view_pos() const { return view_pos; }
216 inline Point3D get_cur_zero_elev() const { return cur_zero_elev; }
217 inline double *get_to_sun() { return to_sun; }
218 inline void set_to_sun( double x, double y, double z) {
223 inline double *get_surface_to_sun() { return surface_to_sun; }
224 inline void set_surface_to_sun( double x, double y, double z) {
225 surface_to_sun[0] = x;
226 surface_to_sun[1] = y;
227 surface_to_sun[2] = z;
229 inline double *get_to_moon() { return to_moon; }
230 inline void set_to_moon( double x, double y, double z) {
235 inline double *get_surface_to_moon() { return surface_to_moon; }
236 inline void set_surface_to_moon( double x, double y, double z) {
237 surface_to_moon[0] = x;
238 surface_to_moon[1] = y;
239 surface_to_moon[2] = z;
241 inline double *get_surface_south() { return surface_south; }
242 inline double *get_surface_east() { return surface_east; }
243 inline double *get_local_up() { return local_up; }
244 inline const MAT3mat *get_WORLD_TO_EYE() const { return &WORLD_TO_EYE; }
245 inline GLdouble *get_MODEL_VIEW() { return MODEL_VIEW; }
249 extern FGView current_view;