]> git.mxchange.org Git - flightgear.git/blob - src/WeatherCM/FGLocalWeatherDatabase.h
Fixes to Christian's latest weather submission.
[flightgear.git] / src / WeatherCM / FGLocalWeatherDatabase.h
1 /*****************************************************************************
2
3  Header:       FGLocalWeatherDatabase.h 
4  Author:       Christian Mayer
5  Date started: 28.05.99
6
7  -------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
8
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
17  details.
18
19  You should have received a copy of the GNU General Public License along with
20  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21  Place - Suite 330, Boston, MA  02111-1307, USA.
22
23  Further information about the GNU General Public License can also be found on
24  the world wide web at http://www.gnu.org.
25
26 FUNCTIONAL DESCRIPTION
27 ------------------------------------------------------------------------------
28 Database for the local weather
29 This database is the only one that gets called from FG
30
31 HISTORY
32 ------------------------------------------------------------------------------
33 28.05.1999 Christian Mayer      Created
34 16.06.1999 Durk Talsma          Portability for Linux
35 20.06.1999 Christian Mayer      added lots of consts
36 30.06.1999 Christian Mayer      STL portability
37 11.10.1999 Christian Mayer      changed set<> to map<> on Bernie Bright's 
38                                 suggestion
39 19.10.1999 Christian Mayer      change to use PLIB's sg instead of Point[2/3]D
40                                 and lots of wee code cleaning
41 *****************************************************************************/
42
43 /****************************************************************************/
44 /* SENTRY                                                                   */
45 /****************************************************************************/
46 #ifndef FGLocalWeatherDatabase_H
47 #define FGLocalWeatherDatabase_H
48
49 /****************************************************************************/
50 /* INCLUDES                                                                 */
51 /****************************************************************************/
52 //This is only here for smoother code change. In the end the WD should be clean
53 //of *any* OpenGL:
54 #ifdef HAVE_WINDOWS_H
55 #  include <windows.h>
56 #endif
57 #include <GL/glut.h>
58 #include <XGL/xgl.h>
59
60 #include <vector>
61
62 #include "sg.h"
63
64 #include "FGPhysicalProperties.h"
65 #include "FGGlobalWeatherDatabase.h"
66 #include "FGMicroWeather.h"
67 #include "FGWeatherFeature.h"
68 #include "FGWeatherDefs.h"
69
70 /****************************************************************************/
71 /* DEFINES                                                                  */
72 /****************************************************************************/
73 FG_USING_STD(vector);
74 FG_USING_NAMESPACE(std);
75
76 /****************************************************************************/
77 /* CLASS DECLARATION                                                        */
78 /****************************************************************************/
79 class FGLocalWeatherDatabase
80 {
81 private:
82 protected:
83     FGGlobalWeatherDatabase *global;    //point to the global database
84
85     typedef vector<FGMicroWeather>       FGMicroWeatherList;
86     typedef FGMicroWeatherList::iterator FGMicroWeatherListIt;
87
88     typedef vector<sgVec2>      pointVector;
89     typedef vector<pointVector> tileVector;
90
91     /************************************************************************/
92     /* make tiles out of points on a 2D plane                               */
93     /************************************************************************/
94     void tileLocalWeather(const FGPhysicalProperties2DVector& EntryList);
95
96     FGMicroWeatherList WeatherAreas;
97
98     WeatherPrecision WeatherVisibility; //how far do I need to simulate the
99                                         //local weather? Unit: metres
100     sgVec3 last_known_position;
101
102
103     /************************************************************************/
104     /* return the index of the area with point p                            */
105     /************************************************************************/
106     unsigned int AreaWith(const sgVec2& p) const;
107     unsigned int AreaWith(const sgVec3& p) const
108     {
109         sgVec2 temp;
110         sgSetVec2(temp, p[0], p[1]);
111
112         return AreaWith(temp);
113     }
114
115 public:
116     static FGLocalWeatherDatabase *theFGLocalWeatherDatabase;  
117     
118     enum DatabaseWorkingType {
119         use_global,     //use global database for data
120         manual,         //use only user inputs
121         distant,        //use distant information, e.g. like LAN when used in
122                         //a multiplayer environment
123         random,         //generate weather randomly
124         default_mode    //use only default values
125     };
126
127     DatabaseWorkingType DatabaseStatus;
128
129     /************************************************************************/
130     /* Constructor and Destructor                                           */
131     /************************************************************************/
132     FGLocalWeatherDatabase(
133         const sgVec3&             position,
134         const WeatherPrecision    visibility = DEFAULT_WEATHER_VISIBILITY,
135         const DatabaseWorkingType type       = PREFERED_WORKING_TYPE);
136
137     FGLocalWeatherDatabase(
138         const WeatherPrecision    position_lat,
139         const WeatherPrecision    position_lon,
140         const WeatherPrecision    position_alt,
141         const WeatherPrecision    visibility = DEFAULT_WEATHER_VISIBILITY,
142         const DatabaseWorkingType type       = PREFERED_WORKING_TYPE)
143     {
144         cout << "This constructor is broken and should *NOT* be used!" << endl;
145         exit(-1);
146
147         sgVec3 position;
148         sgSetVec3( position, position_lat, position_lon, position_alt );
149
150         // Christian: the following line does not do what you intend.
151         // It just creates a new FGLocalWeatherDatabase which isn't
152         // assigned to anything so it is immediately discared.
153
154         /* BAD --> */ FGLocalWeatherDatabase( position, visibility, type );
155     }
156
157     ~FGLocalWeatherDatabase();
158
159     /************************************************************************/
160     /* reset the whole database                                             */
161     /************************************************************************/
162     void reset(const DatabaseWorkingType type = PREFERED_WORKING_TYPE);
163
164     /************************************************************************/
165     /* update the database. Since the last call we had dt seconds           */
166     /************************************************************************/
167     void update(const WeatherPrecision dt);                     //time has changed
168     void update(const sgVec3& p);                               //position has  changed
169     void update(const sgVec3& p, const WeatherPrecision dt);    //time and/or position has changed
170
171     /************************************************************************/
172     /* Get the physical properties on the specified point p                 */
173     /************************************************************************/
174     FGPhysicalProperties get(const sgVec2& p) const;
175     FGPhysicalProperty   get(const sgVec3& p) const;
176
177     WeatherPrecision     getAirDensity(const sgVec3& p) const;
178     
179     /************************************************************************/
180     /* Add a weather feature at the point p and surrounding area            */
181     /************************************************************************/
182
183     void addWind         (const WeatherPrecision alt, const sgVec3& x,          const sgVec2& p);
184     void addTurbulence   (const WeatherPrecision alt, const sgVec3& x,          const sgVec2& p);
185     void addTemperature  (const WeatherPrecision alt, const WeatherPrecision x, const sgVec2& p);
186     void addAirPressure  (const WeatherPrecision alt, const WeatherPrecision x, const sgVec2& p);
187     void addVaporPressure(const WeatherPrecision alt, const WeatherPrecision x, const sgVec2& p);
188     void addCloud        (const WeatherPrecision alt, const FGCloudItem& x,     const sgVec2& p);
189
190     void setSnowRainIntensity   (const WeatherPrecision x, const sgVec2& p);
191     void setSnowRainType        (const SnowRainType x,     const sgVec2& p);
192     void setLightningProbability(const WeatherPrecision x, const sgVec2& p);
193
194     void addProperties(const FGPhysicalProperties2D& x);    //add a property
195     void setProperties(const FGPhysicalProperties2D& x);    //change a property
196
197     /************************************************************************/
198     /* get/set weather visibility                                           */
199     /************************************************************************/
200     void             setWeatherVisibility(const WeatherPrecision visibility);
201     WeatherPrecision getWeatherVisibility(void) const;
202 };
203
204 extern FGLocalWeatherDatabase *WeatherDatabase;
205 void fgUpdateWeatherDatabase(void);
206
207 /****************************************************************************/
208 /* get/set weather visibility                                               */
209 /****************************************************************************/
210 void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecision visibility)
211 {
212     if (visibility >= MINIMUM_WEATHER_VISIBILITY)
213         WeatherVisibility = visibility;
214     else
215         WeatherVisibility = MINIMUM_WEATHER_VISIBILITY;
216
217     //This code doesn't belong here as this is the optical visibility and not
218     //the visibility of the weather database (that should be bigger...). The
219     //optical visibility should be calculated from the vapor pressure e.g.
220     //But for the sake of a smoother change from the old way to the new one...
221
222     GLfloat fog_exp_density;
223     GLfloat fog_exp2_density;
224     
225     // for GL_FOG_EXP
226     fog_exp_density = -log(0.01 / WeatherVisibility);
227     
228     // for GL_FOG_EXP2
229     fog_exp2_density = sqrt( -log(0.01) ) / WeatherVisibility;
230     
231     // Set correct opengl fog density
232     xglFogf (GL_FOG_DENSITY, fog_exp2_density);
233     
234     // FG_LOG( FG_INPUT, FG_DEBUG, "Fog density = " << w->fog_density );
235     //cerr << "FGLocalWeatherDatabase::setWeatherVisibility(" << visibility << "):\n";
236     //cerr << "Fog density = " << fog_exp_density << "\n";
237     
238
239 }
240
241 WeatherPrecision inline FGLocalWeatherDatabase::getWeatherVisibility(void) const
242 {
243     //cerr << "FGLocalWeatherDatabase::getWeatherVisibility() = " << WeatherVisibility << "\n";
244     return WeatherVisibility;
245 }
246
247
248 /****************************************************************************/
249 #endif /*FGLocalWeatherDatabase_H*/