2 // views.hxx -- data structures and routines for managing and view parameters.
4 // Written by Curtis Olson, started August 1997.
6 // Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License as
10 // published by the Free Software Foundation; either version 2 of the
11 // License, or (at your option) any later version.
13 // This program is distributed in the hope that it will be useful, but
14 // WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 // (Log is kept at end of this file)
31 # error This library requires C++
35 #include <Include/fg_types.h>
36 #include <Flight/flight.h>
37 #include <Math/mat3.h>
38 #include <Time/fg_time.hxx>
39 #include <Time/light.hxx>
41 #include "options.hxx"
44 // used in views.cxx and tilemgr.cxx
45 #define USE_FAST_FOV_CLIP
48 // Define a structure containing view information
53 // the current offset from forward for viewing
56 // the goal view offset for viewing (used for smooth view changes)
57 double goal_view_offset;
59 // flag forcing update of fov related stuff
62 // fov of view is specified in the y direction, win_ratio is used to
63 // calculate the fov in the X direction = width/height
66 // width & height of window
67 int winWidth, winHeight;
69 // sin and cos of (fov / 2) in Y axis
70 double sin_fov_y, cos_fov_y;
71 double sinlon, coslon;
73 // slope of view frustum edge in eye space Y axis
76 // sin and cos of (fov / 2) in X axis
77 double sin_fov_x, cos_fov_x;
79 // slope of view frustum edge in eye space X axis
82 #if defined( USE_FAST_FOV_CLIP )
83 double fov_x_clip, fov_y_clip;
84 #endif // USE_FAST_FOV_CLIP
86 // View frustum cull ratio (% of tiles culled ... used for
87 // reporting purposes)
90 // Number of triangles rendered;
93 // absolute view position
94 fgPoint3d abs_view_pos;
96 // view position translated to scenery.center
99 // cartesion coordinates of current lon/lat if at sea level
100 // translated to scenery.center*/
101 fgPoint3d cur_zero_elev;
103 // vector in cartesian coordinates from current position to the
104 // postion on the earth's surface the sun is directly over
107 // surface direction to go to head towards sun
108 MAT3vec surface_to_sun;
110 // surface vector heading south
111 MAT3vec surface_south;
113 // surface vector heading east (used to unambiguously align sky
115 MAT3vec surface_east;
117 // local up vector (normal to the plane tangent to the earth's
118 // surface at the spot we are directly above
121 // up vector for the view (usually point straight up through the
122 // top of the aircraft
125 // the vector pointing straight out the nose of the aircraft
126 MAT3vec view_forward;
128 // Transformation matrix for eye coordinates to aircraft coordinates
131 // Transformation matrix for aircraft coordinates to world
135 // Combined transformation from eye coordinates to world coordinates
136 MAT3mat EYE_TO_WORLD;
138 // Inverse of EYE_TO_WORLD which is a transformation from world
139 // coordinates to eye coordinates
140 MAT3mat WORLD_TO_EYE;
142 // Current model view matrix;
143 GLdouble MODEL_VIEW[16];
148 // Initialize a view class
151 void update_globals( fgFLIGHT *f );
153 // Basically, this is a modified version of the Mesa gluLookAt()
154 // function that's been modified slightly so we can capture the
155 // result before sending it off to OpenGL land.
156 void LookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,
157 GLdouble centerx, GLdouble centery, GLdouble centerz,
158 GLdouble upx, GLdouble upy, GLdouble upz );
160 // Update the view volume, position, and orientation
161 void UpdateViewParams( void );
163 // Update the view parameters
164 void UpdateViewMath( fgFLIGHT *f );
166 // Update the "World to Eye" transformation matrix
167 void UpdateWorldToEye( fgFLIGHT *f );
169 // Update the field of view parameters
170 void UpdateFOV( fgOPTIONS *o );
177 extern fgVIEW current_view;
184 // Revision 1.13 1998/09/08 15:04:36 curt
185 // Optimizations by Norman Vine.
187 // Revision 1.12 1998/08/24 20:11:15 curt
188 // Added i/I to toggle full vs. minimal HUD.
189 // Added a --hud-tris vs --hud-culled option.
190 // Moved options accessor funtions to options.hxx.
192 // Revision 1.11 1998/08/20 20:32:35 curt
193 // Reshuffled some of the code in and around views.[ch]xx
195 // Revision 1.10 1998/07/08 14:45:09 curt
196 // polar3d.h renamed to polar3d.hxx
197 // vector.h renamed to vector.hxx
198 // updated audio support so it waits to create audio classes (and tie up
199 // /dev/dsp) until the mpg123 player is finished.
201 // Revision 1.9 1998/07/04 00:52:27 curt
202 // Add my own version of gluLookAt() (which is nearly identical to the
203 // Mesa/glu version.) But, by calculating the Model View matrix our selves
204 // we can save this matrix without having to read it back in from the video
205 // card. This hopefully allows us to save a few cpu cycles when rendering
206 // out the fragments because we can just use glLoadMatrixd() with the
207 // precalculated matrix for each tile rather than doing a push(), translate(),
208 // pop() for every fragment.
210 // Panel status defaults to off for now until it gets a bit more developed.
212 // Extract OpenGL driver info on initialization.
214 // Revision 1.8 1998/05/27 02:24:06 curt
215 // View optimizations by Norman Vine.
217 // Revision 1.7 1998/05/17 16:59:04 curt
218 // First pass at view frustum culling now operational.
220 // Revision 1.6 1998/05/16 13:08:37 curt
221 // C++ - ified views.[ch]xx
222 // Shuffled some additional view parameters into the fgVIEW class.
223 // Changed tile-radius to tile-diameter because it is a much better
225 // Added a WORLD_TO_EYE transformation to views.cxx. This allows us
226 // to transform world space to eye space for view frustum culling.
228 // Revision 1.5 1998/05/02 01:51:02 curt
229 // Updated polartocart conversion routine.
231 // Revision 1.4 1998/04/28 01:20:24 curt
232 // Type-ified fgTIME and fgVIEW.
233 // Added a command line option to disable textures.
235 // Revision 1.3 1998/04/25 22:06:31 curt
236 // Edited cvs log messages in source files ... bad bad bad!
238 // Revision 1.2 1998/04/24 00:49:22 curt
239 // Wrapped "#include <config.h>" in "#ifdef HAVE_CONFIG_H"
240 // Trying out some different option parsing code.
241 // Some code reorganization.
243 // Revision 1.1 1998/04/22 13:25:46 curt
244 // C++ - ifing the code.
245 // Starting a bit of reorganization of lighting code.
247 // Revision 1.11 1998/04/21 17:02:42 curt
248 // Prepairing for C++ integration.
250 // Revision 1.10 1998/02/07 15:29:45 curt
251 // Incorporated HUD changes and struct/typedef changes from Charlie Hotchkiss
252 // <chotchkiss@namg.us.anritsu.com>
254 // Revision 1.9 1998/01/29 00:50:29 curt
255 // Added a view record field for absolute x, y, z position.
257 // Revision 1.8 1998/01/27 00:47:58 curt
258 // Incorporated Paul Bleisch's <pbleisch@acm.org> new debug message
259 // system and commandline/config file processing code.
261 // Revision 1.7 1998/01/22 02:59:38 curt
262 // Changed #ifdef FILE_H to #ifdef _FILE_H
264 // Revision 1.6 1998/01/19 19:27:10 curt
265 // Merged in make system changes from Bob Kuehne <rpk@sgi.com>
266 // This should simplify things tremendously.
268 // Revision 1.5 1997/12/22 04:14:32 curt
269 // Aligned sky with sun so dusk/dawn effects can be correct relative to the sun.
271 // Revision 1.4 1997/12/17 23:13:36 curt
272 // Began working on rendering a sky.
274 // Revision 1.3 1997/12/15 23:54:51 curt
275 // Add xgl wrappers for debugging.
276 // Generate terrain normals on the fly.
278 // Revision 1.2 1997/12/10 22:37:48 curt
279 // Prepended "fg" on the name of all global structures that didn't have it yet.
280 // i.e. "struct WEATHER {}" became "struct fgWEATHER {}"
282 // Revision 1.1 1997/08/27 21:31:18 curt