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"
52 // Define a structure containing view information
57 // the current offset from forward for viewing
60 // the goal view offset for viewing (used for smooth view changes)
61 double goal_view_offset;
63 // flag forcing update of fov related stuff
66 // fov of view is specified in the y direction, win_ratio is used to
67 // calculate the fov in the X direction = width/height
70 // width & height of window
71 int winWidth, winHeight;
73 // sin and cos of (fov / 2) in Y axis
74 double sin_fov_y, cos_fov_y;
76 // slope of view frustum edge in eye space Y axis
79 // sin and cos of (fov / 2) in X axis
80 double sin_fov_x, cos_fov_x;
82 // slope of view frustum edge in eye space X axis
85 // View frustum cull ratio (% of tiles culled ... used for
86 // reporting purposes)
89 // absolute view position
90 fgPoint3d abs_view_pos;
92 // view position translated to scenery.center
95 // cartesion coordinates of current lon/lat if at sea level
96 // translated to scenery.center*/
97 fgPoint3d cur_zero_elev;
99 // vector in cartesian coordinates from current position to the
100 // postion on the earth's surface the sun is directly over
103 // surface direction to go to head towards sun
104 MAT3vec surface_to_sun;
106 // surface vector heading south
107 MAT3vec surface_south;
109 // surface vector heading east (used to unambiguously align sky
111 MAT3vec surface_east;
113 // local up vector (normal to the plane tangent to the earth's
114 // surface at the spot we are directly above
117 // up vector for the view (usually point straight up through the
118 // top of the aircraft
121 // the vector pointing straight out the nose of the aircraft
122 MAT3vec view_forward;
124 // Transformation matrix for eye coordinates to aircraft coordinates
127 // Transformation matrix for aircraft coordinates to world
131 // Combined transformation from eye coordinates to world coordinates
132 MAT3mat EYE_TO_WORLD;
134 // Inverse of EYE_TO_WORLD which is a transformation from world
135 // coordinates to eye coordinates
136 MAT3mat WORLD_TO_EYE;
138 // Current model view matrix;
139 GLdouble MODEL_VIEW[16];
144 // Initialize a view class
147 // Update the view parameters
148 void Update( fgFLIGHT *f );
150 // Update the "World to Eye" transformation matrix
151 void UpdateWorldToEye( fgFLIGHT *f );
153 // Update the field of view parameters
154 void UpdateFOV( fgOPTIONS *o );
161 extern fgVIEW current_view;
164 // Basically, this is a modified version of the Mesa gluLookAt()
165 // function that's been modified slightly so we can capture the result
166 // before sending it off to OpenGL land.
167 void fg_gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,
168 GLdouble centerx, GLdouble centery, GLdouble centerz,
169 GLdouble upx, GLdouble upy, GLdouble upz );
176 // Revision 1.10 1998/07/08 14:45:09 curt
177 // polar3d.h renamed to polar3d.hxx
178 // vector.h renamed to vector.hxx
179 // updated audio support so it waits to create audio classes (and tie up
180 // /dev/dsp) until the mpg123 player is finished.
182 // Revision 1.9 1998/07/04 00:52:27 curt
183 // Add my own version of gluLookAt() (which is nearly identical to the
184 // Mesa/glu version.) But, by calculating the Model View matrix our selves
185 // we can save this matrix without having to read it back in from the video
186 // card. This hopefully allows us to save a few cpu cycles when rendering
187 // out the fragments because we can just use glLoadMatrixd() with the
188 // precalculated matrix for each tile rather than doing a push(), translate(),
189 // pop() for every fragment.
191 // Panel status defaults to off for now until it gets a bit more developed.
193 // Extract OpenGL driver info on initialization.
195 // Revision 1.8 1998/05/27 02:24:06 curt
196 // View optimizations by Norman Vine.
198 // Revision 1.7 1998/05/17 16:59:04 curt
199 // First pass at view frustum culling now operational.
201 // Revision 1.6 1998/05/16 13:08:37 curt
202 // C++ - ified views.[ch]xx
203 // Shuffled some additional view parameters into the fgVIEW class.
204 // Changed tile-radius to tile-diameter because it is a much better
206 // Added a WORLD_TO_EYE transformation to views.cxx. This allows us
207 // to transform world space to eye space for view frustum culling.
209 // Revision 1.5 1998/05/02 01:51:02 curt
210 // Updated polartocart conversion routine.
212 // Revision 1.4 1998/04/28 01:20:24 curt
213 // Type-ified fgTIME and fgVIEW.
214 // Added a command line option to disable textures.
216 // Revision 1.3 1998/04/25 22:06:31 curt
217 // Edited cvs log messages in source files ... bad bad bad!
219 // Revision 1.2 1998/04/24 00:49:22 curt
220 // Wrapped "#include <config.h>" in "#ifdef HAVE_CONFIG_H"
221 // Trying out some different option parsing code.
222 // Some code reorganization.
224 // Revision 1.1 1998/04/22 13:25:46 curt
225 // C++ - ifing the code.
226 // Starting a bit of reorganization of lighting code.
228 // Revision 1.11 1998/04/21 17:02:42 curt
229 // Prepairing for C++ integration.
231 // Revision 1.10 1998/02/07 15:29:45 curt
232 // Incorporated HUD changes and struct/typedef changes from Charlie Hotchkiss
233 // <chotchkiss@namg.us.anritsu.com>
235 // Revision 1.9 1998/01/29 00:50:29 curt
236 // Added a view record field for absolute x, y, z position.
238 // Revision 1.8 1998/01/27 00:47:58 curt
239 // Incorporated Paul Bleisch's <pbleisch@acm.org> new debug message
240 // system and commandline/config file processing code.
242 // Revision 1.7 1998/01/22 02:59:38 curt
243 // Changed #ifdef FILE_H to #ifdef _FILE_H
245 // Revision 1.6 1998/01/19 19:27:10 curt
246 // Merged in make system changes from Bob Kuehne <rpk@sgi.com>
247 // This should simplify things tremendously.
249 // Revision 1.5 1997/12/22 04:14:32 curt
250 // Aligned sky with sun so dusk/dawn effects can be correct relative to the sun.
252 // Revision 1.4 1997/12/17 23:13:36 curt
253 // Began working on rendering a sky.
255 // Revision 1.3 1997/12/15 23:54:51 curt
256 // Add xgl wrappers for debugging.
257 // Generate terrain normals on the fly.
259 // Revision 1.2 1997/12/10 22:37:48 curt
260 // Prepended "fg" on the name of all global structures that didn't have it yet.
261 // i.e. "struct WEATHER {}" became "struct fgWEATHER {}"
263 // Revision 1.1 1997/08/27 21:31:18 curt