]> git.mxchange.org Git - flightgear.git/blob - src/Time/light.hxx
toggle fullscreen: also adapt GUI plane when resizing
[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  - http://www.flightgear.org/~curt
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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 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 #include <simgear/compiler.h>
38
39 #include <simgear/props/props.hxx>
40 #include <simgear/structure/subsystem_mgr.hxx>
41 #include <simgear/props/tiedpropertylist.hxx>
42 #include <simgear/math/interpolater.hxx>
43
44
45 // Define a structure containing the global lighting parameters
46 class FGLight : public SGSubsystem
47 {
48
49 private:
50
51     /*
52      * Lighting look up tables (based on sun angle with local horizon)
53      */
54     SGInterpTable *_ambient_tbl, *_diffuse_tbl, *_specular_tbl;
55     SGInterpTable *_sky_tbl;
56
57     /**
58      * position of the sun and moon in various forms
59      */
60
61     // in geocentric coordinates
62     double _sun_lon, _sun_lat;
63     double _moon_lon, _moon_gc_lat;
64
65     // (in view coordinates)
66     SGVec4f _sun_vec, _moon_vec;
67
68     // inverse (in view coordinates)
69     SGVec4f _sun_vec_inv, _moon_vec_inv;
70
71     // the angle between the celestial object and the local horizontal
72     // (in radians)
73     double _sun_angle, _moon_angle;
74     double _prev_sun_angle;
75
76     // the rotation around our vertical axis of the sun (relative to
77     // due south with positive numbers going in the counter clockwise
78     // direction.)  This is the direction we'd need to face if we
79     // wanted to travel towards celestial object.
80     double _sun_rotation, _moon_rotation;
81
82     /**
83      * Derived lighting values
84      */
85
86     // ambient, diffuse and specular component
87     SGVec4f _scene_ambient;
88     SGVec4f _scene_diffuse;
89     SGVec4f _scene_specular;
90     SGVec4f _scene_chrome;
91
92     // clear sky, fog and cloud color
93     SGVec4f _sun_color;
94     SGVec4f _sky_color;
95     SGVec4f _fog_color;
96     SGVec4f _cloud_color;
97
98     // clear sky and fog color adjusted for sunset effects
99     SGVec4f _adj_fog_color;
100     SGVec4f _adj_sky_color;
101
102     // input parameters affected by the weather system
103     float _saturation;
104     float _scattering;
105     float _overcast;
106
107     double _dt_total;
108
109     void update_sky_color ();
110     void update_adj_fog_color ();
111
112     void updateSunPos();
113     
114     // properties for chrome light; not a tie because I want to fire
115     // property listeners when the values change.
116     SGPropertyNode_ptr _chromeProps[4];
117   
118     SGPropertyNode_ptr _sunAngleRad;
119
120     simgear::TiedPropertyList _tiedProperties;
121
122     /**
123      * Tied-properties helper, record nodes which are tied for easy un-tie-ing
124      */
125     template <typename T>
126     void tie(SGPropertyNode* aNode, const char* aRelPath, const SGRawValue<T>& aRawValue)
127     {
128         _tiedProperties.Tie(aNode->getNode(aRelPath, true), aRawValue);
129     }
130
131 public:
132
133     FGLight ();
134     virtual ~FGLight ();
135
136     virtual void init ();
137     virtual void reinit ();
138     virtual void bind ();
139     virtual void unbind ();
140     virtual void update ( double dt );
141
142
143     // Color related functions
144
145     inline const SGVec4f& scene_ambient () const { return _scene_ambient; }
146     inline const SGVec4f& scene_diffuse () const { return _scene_diffuse; }
147     inline const SGVec4f& scene_specular () const { return _scene_specular; }
148     inline const SGVec4f& scene_chrome () const { return _scene_chrome; }
149
150     inline const SGVec4f& sky_color () const { return _sky_color; }
151     inline const SGVec4f& cloud_color () const { return _cloud_color; }
152     inline const SGVec4f& adj_fog_color () const { return _adj_fog_color; }
153     inline const SGVec4f& adj_sky_color () const { return _adj_sky_color; }
154
155     // Sun related functions
156
157     inline double get_sun_angle () const { return _sun_angle; }
158     inline void set_sun_angle (double a) { _sun_angle = a; }
159
160     inline double get_sun_rotation () const { return _sun_rotation; }
161     inline void set_sun_rotation (double r) { _sun_rotation = r; }
162
163     inline double get_sun_lon () const { return _sun_lon; }
164     inline void set_sun_lon (double l) { _sun_lon = l; }
165
166     inline double get_sun_lat () const { return _sun_lat; }
167     inline void set_sun_lat (double l) { _sun_lat = l; }
168
169     inline SGVec4f& sun_vec () { return _sun_vec; }
170     inline SGVec4f& sun_vec_inv () { return _sun_vec_inv; }
171
172
173     // Moon related functions
174
175     inline double get_moon_angle () const { return _moon_angle; }
176     inline void set_moon_angle (double a) { _moon_angle = a; }
177
178     inline double get_moon_rotation () const { return _moon_rotation; }
179     inline void set_moon_rotation (double r) { _moon_rotation = r; }
180
181     inline double get_moon_lon () const { return _moon_lon; }
182     inline void set_moon_lon (double l) { _moon_lon = l; }
183
184     inline double get_moon_gc_lat () const { return _moon_gc_lat; }
185     inline void set_moon_gc_lat (double l) { _moon_gc_lat = l; }
186
187     inline const SGVec4f& moon_vec () const { return _moon_vec; }
188     inline const SGVec4f& moon_vec_inv () const { return _moon_vec_inv; }
189 };
190
191 #endif // _LIGHT_HXX
192