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