]> git.mxchange.org Git - simgear.git/blob - simgear/environment/visual_enviro.hxx
Reduce compiler.h to almost nothing (but it's worth keeping around I think, for
[simgear.git] / simgear / environment / visual_enviro.hxx
1 // Visual environment helper class
2 //
3 // Written by Harald JOHNSEN, started April 2005.
4 //
5 // Copyright (C) 2005  Harald JOHNSEN - hjohnsen@evc.net
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 //
22 #ifndef _VISUAL_ENVIRO_HXX
23 #define _VISUAL_ENVIRO_HXX
24
25 #include <plib/sg.h>
26
27 #include <simgear/compiler.h>
28 #include <string>
29 #include <vector>
30
31 SG_USING_STD(vector);
32 SG_USING_STD(string);
33
34 class SGLightning;
35 class SGSoundMgr;
36
37 /**
38  * Simulate some echo on a weather radar.
39  * Container class for the wx radar instrument.
40  */
41 class SGWxRadarEcho {
42 public:
43         SGWxRadarEcho(float _heading, float _alt, float _radius, float _dist,
44                         double _LWC, bool _lightning, int _cloudId ) :
45           heading( _heading ),
46           alt ( _alt ),
47           radius ( _radius ),
48           dist ( _dist ),
49           LWC ( _LWC ),
50           lightning ( _lightning ),
51           cloudId ( _cloudId )
52         {}
53
54         /** the heading in radian is versus north */
55         float heading;
56         float alt, radius, dist;
57         /** reflectivity converted to liquid water content. */
58         double LWC;
59         /** if true then this data is for a lightning else it is for water echo. */
60         bool lightning;
61         /** Unique identifier of cloud */
62         int cloudId;
63 };
64
65 typedef vector<SGWxRadarEcho> list_of_SGWxRadarEcho;
66
67 /**
68  * Visual environment helper class.
69  */
70 class SGEnviro {
71 friend class SGLightning;
72 private:
73         void DrawCone2(float baseRadius, float height, int slices, bool down, double rain_norm, double speed);
74         void lt_update(void);
75
76         bool view_in_cloud;
77         bool precipitation_enable_state;
78         float precipitation_density;
79         float precipitation_max_alt;
80         bool turbulence_enable_state;
81         double last_cloud_turbulence, cloud_turbulence;
82         bool lightning_enable_state;
83         double elapsed_time, dt;
84         sgVec4  fog_color;
85         sgMat4 transform;
86         double last_lon, last_lat, last_alt;
87         SGSoundMgr      *soundMgr;
88         bool            snd_active, snd_playing;
89         double          snd_timer, snd_wait, snd_pos_lat, snd_pos_lon, snd_dist;
90         double          min_time_before_lt;
91
92         float fov_width, fov_height;
93
94         /** a list of all the radar echo. */
95         list_of_SGWxRadarEcho radarEcho;
96         static sgVec3 min_light;
97         static SGfloat streak_bright_nearmost_layer,
98                                    streak_bright_farmost_layer,
99                                    streak_period_max,
100                                    streak_period_change_per_kt,
101                                    streak_period_min,
102                                    streak_length_min,
103                                    streak_length_change_per_kt,
104                                    streak_length_max;
105         static int streak_count_min, streak_count_max;
106         static SGfloat cone_base_radius,
107                                    cone_height;
108
109 public:
110         SGEnviro();
111         ~SGEnviro();
112
113         /** Read the config from the precipitation rendering config properties.
114          * @param precip_rendering_cfgNode "/sim/rendering/precipitation" in fg
115          * Set from whatever info present in the
116          * subnodes passed, substituting hardwired defaults for missing fields.
117          * If NULL is given, do nothing.
118          */
119         void config(const class SGPropertyNode* precip_rendering_cfgNode);
120
121     /**
122      * Forward a few states used for renderings.
123      */
124         void startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double alt, double delta_time);
125
126         void endOfFrame(void);
127
128     /**
129      * Whenever a cloud is drawn we check his 'impact' on the environment.
130      * @param heading direction of cloud in radians
131      * @param alt asl of cloud in meters
132      * @param radius radius of cloud in meters
133      * @param family cloud family
134      * @param dist  squared dist to cloud in meters
135      */
136         void callback_cloud(float heading, float alt, float radius, int family, float dist, int cloudId);
137
138         void drawRain(double pitch, double roll, double heading, double hspeed, double rain_norm);
139     /**
140      * Draw rain or snow precipitation around the viewer.
141      * @param rain_norm rain normalized intensity given by metar class
142      * @param snow_norm snow normalized intensity given by metar class
143      * @param hail_norm hail normalized intensity given by metar class
144      * @param pitch pitch rotation of viewer
145      * @param roll roll rotation of viewer
146      * @param hspeed moving horizontal speed of viewer in kt
147      */
148         void drawPrecipitation(double rain_norm, double snow_norm, double hail_norm,
149                                                         double pitch, double roll, double heading, double hspeed);
150
151     /**
152      * Draw the lightnings spawned by cumulo nimbus.
153      */
154         void drawLightning(void);
155
156     /**
157      * Forward the fog color used by the rain rendering.
158      * @param adj_fog_color color of the fog
159      */
160         void setLight(sgVec4 adj_fog_color);
161
162         // this can be queried to add some turbulence for example
163         bool is_view_in_cloud(void) const;
164         void set_view_in_cloud(bool incloud);
165         double get_cloud_turbulence(void) const;
166
167         // Clouds
168         // return the size of the memory pool used by texture impostors
169         int get_clouds_CacheSize(void) const;
170         int get_CacheResolution(void) const;
171         float get_clouds_visibility(void) const;
172         float get_clouds_density(void) const;
173         bool get_clouds_enable_state(void) const;
174         bool get_turbulence_enable_state(void) const;
175
176     /**
177      * Set the size of the impostor texture cache for 3D clouds.
178      * @param sizeKb size of the texture pool in Kb
179      */
180         void set_clouds_CacheSize(int sizeKb);
181     /**
182      * Set the resolution of the impostor texture for 3D clouds.
183      * @param resolutionPixels size of each texture in pixels (64|128|256)
184      */
185         void set_CacheResolution(int resolutionPixels);
186     /**
187      * Set the maximum range used when drawing clouds.
188          * Clouds are blended from totaly transparent at max range to totaly opaque around the viewer
189      * @param distance in meters
190      */
191         void set_clouds_visibility(float distance);
192     /**
193      * Set the proportion of clouds that will be rendered to limit drop in FPS.
194      * @param density 0..100 no clouds drawn when density == 0, all are drawn when density == 100
195      */
196         void set_clouds_density(float density);
197     /**
198      * Enable or disable the use of 3D clouds.
199      * @param enable when false we draw the 2D layers
200      */
201         void set_clouds_enable_state(bool enable);
202     /**
203      * Enable or disable the use of proximity cloud turbulence.
204      * @param enable when true the turbulence is computed based on type of cloud around the AC
205      */
206         void set_turbulence_enable_state(bool enable);
207
208         // rain/snow
209         float get_precipitation_density(void) const;
210         bool get_precipitation_enable_state(void) const;
211
212         /** 
213          * Decrease the precipitation density to the given percentage.
214          * (Only show the given percentage of rain streaks etc.)
215          * Default precipitation density upon construction is 100.0.
216          * @param density 0.0 to 100.0
217          */
218         void set_precipitation_density(float density);
219     /**
220      * Enable or disable the rendering of precipitation around the viewer.
221      * @param enable when true we will draw precipitation depending on metar data
222      */
223         void set_precipitation_enable_state(bool enable);
224
225         // others
226         bool get_lightning_enable_state(void) const;
227     /**
228      * Enable or disable the rendering of lightning and the thunder sound.
229      * @param enable when true we will draw lightning spwaned by cumulonimbus
230      */
231         void set_lightning_enable_state(bool enable);
232
233     /**
234      * Spawn a new lighning at specified lon/lat.
235      * @param lon position of the new lightning
236      * @param lat position of the new lightning
237      * @param alt asl of the starting point of the lightning in meters
238      */
239         void addLightning(double lon, double lat, double alt);
240
241     /**
242      * Forward the sound manager instance to be able to play samples.
243      * @param mgr a running sound manager
244      */
245         void set_soundMgr(SGSoundMgr *mgr);
246
247         void setFOV( float w, float h );
248         void getFOV( float &w, float &h );
249
250         list_of_SGWxRadarEcho *get_radar_echo(void);
251
252         sgMat4 *get_transform(void) { return &transform; }
253 };
254
255 extern SGEnviro sgEnviro;
256
257 #endif // _VISUAL_ENVIRO_HXX