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