]> git.mxchange.org Git - flightgear.git/blob - Main/views.hxx
C++-ifying.
[flightgear.git] / Main / views.hxx
1 // views.hxx -- data structures and routines for managing and view parameters.
2 //
3 // Written by Curtis Olson, started August 1997.
4 //
5 // Copyright (C) 1997  Curtis L. Olson  - curt@infoplane.com
6 //
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.
11 //
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.
16 //
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.
20 //
21 // $Id$
22 // (Log is kept at end of this file)
23
24
25 #ifndef _VIEWS_HXX
26 #define _VIEWS_HXX
27
28
29 #ifndef __cplusplus                                                          
30 # error This library requires C++
31 #endif                                   
32
33
34 #include <Flight/flight.hxx>
35 #include <Math/mat3.h>
36 #include <Math/point3d.hxx>
37 #include <Time/fg_time.hxx>
38 #include <Time/light.hxx>
39
40 #include "options.hxx"
41
42
43 // used in views.cxx and tilemgr.cxx
44 #define USE_FAST_FOV_CLIP 
45
46
47 // Define a structure containing view information
48 class fgVIEW {
49
50 public:
51
52     // the current offset from forward for viewing
53     double view_offset;
54
55     // the goal view offset for viewing (used for smooth view changes)
56     double goal_view_offset;
57
58     // flag forcing update of fov related stuff
59     bool update_fov;
60         
61     // fov of view is specified in the y direction, win_ratio is used to
62     // calculate the fov in the X direction = width/height
63     double win_ratio;
64
65     // width & height of window
66     int winWidth, winHeight;
67
68     // sin and cos of (fov / 2) in Y axis
69     double sin_fov_y, cos_fov_y;
70     double sinlon, coslon;
71
72     // slope of view frustum edge in eye space Y axis
73     double slope_y;
74
75     // sin and cos of (fov / 2) in X axis
76     double sin_fov_x, cos_fov_x;
77
78     // slope of view frustum edge in eye space X axis
79     double slope_x;
80
81 #if defined( USE_FAST_FOV_CLIP )
82     double fov_x_clip, fov_y_clip;
83 #endif // USE_FAST_FOV_CLIP
84
85     // View frustum cull ratio (% of tiles culled ... used for
86     // reporting purposes)
87     double vfc_ratio;
88
89     // Number of triangles rendered;
90     int tris_rendered;
91
92     // absolute view position
93     Point3D abs_view_pos;
94
95     // view position translated to scenery.center
96     Point3D view_pos;
97
98     // cartesion coordinates of current lon/lat if at sea level
99     // translated to scenery.center*/
100     Point3D cur_zero_elev;
101
102     // vector in cartesian coordinates from current position to the
103     // postion on the earth's surface the sun is directly over
104     MAT3vec to_sun;
105     
106     // surface direction to go to head towards sun
107     MAT3vec surface_to_sun;
108
109     // surface vector heading south
110     MAT3vec surface_south;
111
112     // surface vector heading east (used to unambiguously align sky
113     // with sun)
114     MAT3vec surface_east;
115
116     // local up vector (normal to the plane tangent to the earth's
117     // surface at the spot we are directly above
118     MAT3vec local_up;
119
120     // up vector for the view (usually point straight up through the
121     // top of the aircraft
122     MAT3vec view_up;
123
124     // the vector pointing straight out the nose of the aircraft
125     MAT3vec view_forward;
126
127     // Transformation matrix for eye coordinates to aircraft coordinates
128     MAT3mat AIRCRAFT;
129
130     // Transformation matrix for aircraft coordinates to world
131     // coordinates
132     MAT3mat WORLD;
133
134     // Combined transformation from eye coordinates to world coordinates
135     MAT3mat EYE_TO_WORLD;
136
137     // Inverse of EYE_TO_WORLD which is a transformation from world
138     // coordinates to eye coordinates
139     MAT3mat WORLD_TO_EYE;
140
141     // Current model view matrix;
142     GLdouble MODEL_VIEW[16];
143
144     // Constructor
145     fgVIEW( void );
146
147     // Initialize a view class
148     void Init( void );
149
150     void update_globals( fgFLIGHT *f );
151
152     // Basically, this is a modified version of the Mesa gluLookAt()
153     // function that's been modified slightly so we can capture the
154     // result before sending it off to OpenGL land.
155     void LookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,
156                  GLdouble centerx, GLdouble centery, GLdouble centerz,
157                  GLdouble upx, GLdouble upy, GLdouble upz );
158
159     // Update the view volume, position, and orientation
160     void UpdateViewParams( void );
161
162     // Update the view parameters
163     void UpdateViewMath( fgFLIGHT *f );
164
165     // Update the "World to Eye" transformation matrix
166     void UpdateWorldToEye(  fgFLIGHT *f );
167
168     // Update the field of view parameters
169     void UpdateFOV( fgOPTIONS *o );
170         
171     // Destructor
172     ~fgVIEW( void );
173 };
174
175
176 extern fgVIEW current_view;
177
178
179 #endif // _VIEWS_HXX
180
181
182 // $Log$
183 // Revision 1.15  1998/10/16 23:27:56  curt
184 // C++-ifying.
185 //
186 // Revision 1.14  1998/10/16 00:54:04  curt
187 // Converted to Point3D class.
188 //
189 // Revision 1.13  1998/09/08 15:04:36  curt
190 // Optimizations by Norman Vine.
191 //
192 // Revision 1.12  1998/08/24 20:11:15  curt
193 // Added i/I to toggle full vs. minimal HUD.
194 // Added a --hud-tris vs --hud-culled option.
195 // Moved options accessor funtions to options.hxx.
196 //
197 // Revision 1.11  1998/08/20 20:32:35  curt
198 // Reshuffled some of the code in and around views.[ch]xx
199 //
200 // Revision 1.10  1998/07/08 14:45:09  curt
201 // polar3d.h renamed to polar3d.hxx
202 // vector.h renamed to vector.hxx
203 // updated audio support so it waits to create audio classes (and tie up
204 //   /dev/dsp) until the mpg123 player is finished.
205 //
206 // Revision 1.9  1998/07/04 00:52:27  curt
207 // Add my own version of gluLookAt() (which is nearly identical to the
208 // Mesa/glu version.)  But, by calculating the Model View matrix our selves
209 // we can save this matrix without having to read it back in from the video
210 // card.  This hopefully allows us to save a few cpu cycles when rendering
211 // out the fragments because we can just use glLoadMatrixd() with the
212 // precalculated matrix for each tile rather than doing a push(), translate(),
213 // pop() for every fragment.
214 //
215 // Panel status defaults to off for now until it gets a bit more developed.
216 //
217 // Extract OpenGL driver info on initialization.
218 //
219 // Revision 1.8  1998/05/27 02:24:06  curt
220 // View optimizations by Norman Vine.
221 //
222 // Revision 1.7  1998/05/17 16:59:04  curt
223 // First pass at view frustum culling now operational.
224 //
225 // Revision 1.6  1998/05/16 13:08:37  curt
226 // C++ - ified views.[ch]xx
227 // Shuffled some additional view parameters into the fgVIEW class.
228 // Changed tile-radius to tile-diameter because it is a much better
229 //   name.
230 // Added a WORLD_TO_EYE transformation to views.cxx.  This allows us
231 //  to transform world space to eye space for view frustum culling.
232 //
233 // Revision 1.5  1998/05/02 01:51:02  curt
234 // Updated polartocart conversion routine.
235 //
236 // Revision 1.4  1998/04/28 01:20:24  curt
237 // Type-ified fgTIME and fgVIEW.
238 // Added a command line option to disable textures.
239 //
240 // Revision 1.3  1998/04/25 22:06:31  curt
241 // Edited cvs log messages in source files ... bad bad bad!
242 //
243 // Revision 1.2  1998/04/24 00:49:22  curt
244 // Wrapped "#include <config.h>" in "#ifdef HAVE_CONFIG_H"
245 // Trying out some different option parsing code.
246 // Some code reorganization.
247 //
248 // Revision 1.1  1998/04/22 13:25:46  curt
249 // C++ - ifing the code.
250 // Starting a bit of reorganization of lighting code.
251 //
252 // Revision 1.11  1998/04/21 17:02:42  curt
253 // Prepairing for C++ integration.
254 //
255 // Revision 1.10  1998/02/07 15:29:45  curt
256 // Incorporated HUD changes and struct/typedef changes from Charlie Hotchkiss
257 // <chotchkiss@namg.us.anritsu.com>
258 //
259 // Revision 1.9  1998/01/29 00:50:29  curt
260 // Added a view record field for absolute x, y, z position.
261 //
262 // Revision 1.8  1998/01/27 00:47:58  curt
263 // Incorporated Paul Bleisch's <pbleisch@acm.org> new debug message
264 // system and commandline/config file processing code.
265 //
266 // Revision 1.7  1998/01/22 02:59:38  curt
267 // Changed #ifdef FILE_H to #ifdef _FILE_H
268 //
269 // Revision 1.6  1998/01/19 19:27:10  curt
270 // Merged in make system changes from Bob Kuehne <rpk@sgi.com>
271 // This should simplify things tremendously.
272 //
273 // Revision 1.5  1997/12/22 04:14:32  curt
274 // Aligned sky with sun so dusk/dawn effects can be correct relative to the sun.
275 //
276 // Revision 1.4  1997/12/17 23:13:36  curt
277 // Began working on rendering a sky.
278 //
279 // Revision 1.3  1997/12/15 23:54:51  curt
280 // Add xgl wrappers for debugging.
281 // Generate terrain normals on the fly.
282 //
283 // Revision 1.2  1997/12/10 22:37:48  curt
284 // Prepended "fg" on the name of all global structures that didn't have it yet.
285 // i.e. "struct WEATHER {}" became "struct fgWEATHER {}"
286 //
287 // Revision 1.1  1997/08/27 21:31:18  curt
288 // Initial revision.
289 //