]> git.mxchange.org Git - flightgear.git/blob - src/Time/light.hxx
First quick hack at panel shading.
[flightgear.git] / src / Time / light.hxx
1 // light.hxx -- lighting routines
2 //
3 // Written by Curtis Olson, started April 1998.
4 //
5 // Copyright (C) 1998  Curtis L. Olson  - curt@me.umn.edu
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
23
24 #ifndef _LIGHT_HXX
25 #define _LIGHT_HXX
26
27
28 #ifndef __cplusplus                                                          
29 # error This library requires C++
30 #endif                                   
31
32
33 #ifdef HAVE_CONFIG_H
34 #  include <config.h>
35 #endif
36
37 #ifdef HAVE_WINDOWS_H
38 #  include <windows.h>
39 #endif
40
41 #include <GL/glut.h>
42 #include <simgear/xgl/xgl.h>
43
44 #include <plib/sg.h>                    // plib include
45
46 #include <simgear/math/interpolater.hxx>
47 #include <simgear/math/point3d.hxx>
48
49
50 // Define a structure containing the global lighting parameters
51 class fgLIGHT {
52
53     // Lighting look up tables (based on sun angle with local horizon)
54     fgINTERPTABLE *ambient_tbl;
55     fgINTERPTABLE *diffuse_tbl;
56     fgINTERPTABLE *sky_tbl;
57
58 public:
59
60     ///////////////////////////////////////////////////////////
61     // position of the sun in various forms
62
63     // in geocentric coordinates
64     double sun_lon, sun_gc_lat;
65
66     // in cartesian coordiantes
67     Point3D fg_sunpos;
68
69     // (in view coordinates)
70     sgVec4 sun_vec;
71
72     // inverse (in view coordinates)
73     sgVec4 sun_vec_inv;
74
75     // the angle between the sun and the local horizontal (in radians)
76     double sun_angle;
77
78     // the rotation around our vertical axis of the sun (relative to
79     // due south with positive numbers going in the counter clockwise
80     // direction.)  This is the direction we'd need to face if we
81     // wanted to travel towards the sun.
82     double sun_rotation;
83
84     ///////////////////////////////////////////////////////////
85     // Have the same for the moon. Useful for having some light at night
86     // and stuff. I (Durk) also want to use this for adding similar 
87     // coloring effects to the moon as I did to the sun. 
88     ///////////////////////////////////////////////////////////
89     // position of the moon in various forms
90
91     // in geocentric coordinates
92     double moon_lon, moon_gc_lat;
93
94     // in cartesian coordiantes
95     Point3D fg_moonpos;
96
97     // (in view coordinates)
98     GLfloat moon_vec[4];
99
100     // inverse (in view coordinates)
101     GLfloat moon_vec_inv[4];
102
103     // the angle between the moon and the local horizontal (in radians)
104     double moon_angle;
105
106     // the rotation around our vertical axis of the moon (relative to
107     // due south with positive numbers going in the counter clockwise
108     // direction.)  This is the direction we'd need to face if we
109     // wanted to travel towards the sun.
110     double moon_rotation;
111
112     ///////////////////////////////////////////////////////////
113     // Derived lighting values
114
115     // ambient component
116     GLfloat scene_ambient[4];
117
118     // diffuse component
119     GLfloat scene_diffuse[4];
120
121     // fog color
122     GLfloat fog_color[4];
123
124     // fog color adjusted for sunset effects
125     GLfloat adj_fog_color[4];
126
127     // clear screen color
128     GLfloat sky_color[4];
129
130     // Constructor
131     fgLIGHT( void );
132
133     // initialize lighting tables
134     void Init( void );
135
136     // update lighting parameters based on current sun position
137     void Update( void);
138
139     // calculate fog color adjusted for sunrise/sunset effects
140     void UpdateAdjFog( void );
141
142     // Destructor
143     ~fgLIGHT( void );
144 };
145
146
147 // Global shared light parameter structure
148 extern fgLIGHT cur_light_params;
149
150
151 #endif // _LIGHT_HXX