1 /*****************************************************************************
3 Header: FGLocalWeatherDatabase.h
4 Author: Christian Mayer
7 -------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
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
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
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.
23 Further information about the GNU General Public License can also be found on
24 the world wide web at http://www.gnu.org.
26 FUNCTIONAL DESCRIPTION
27 ------------------------------------------------------------------------------
28 Database for the local weather
29 This database is the only one that gets called from FG
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
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 *****************************************************************************/
43 /****************************************************************************/
45 /****************************************************************************/
46 #ifndef FGLocalWeatherDatabase_H
47 #define FGLocalWeatherDatabase_H
49 /****************************************************************************/
51 /****************************************************************************/
52 //This is only here for smoother code change. In the end the WD should be clean
64 #include "FGPhysicalProperties.h"
65 #include "FGGlobalWeatherDatabase.h"
66 #include "FGMicroWeather.h"
67 #include "FGWeatherFeature.h"
68 #include "FGWeatherDefs.h"
70 /****************************************************************************/
72 /****************************************************************************/
74 FG_USING_NAMESPACE(std);
76 /****************************************************************************/
77 /* CLASS DECLARATION */
78 /****************************************************************************/
79 class FGLocalWeatherDatabase
83 FGGlobalWeatherDatabase *global; //point to the global database
85 typedef vector<FGMicroWeather> FGMicroWeatherList;
86 typedef FGMicroWeatherList::iterator FGMicroWeatherListIt;
88 typedef vector<sgVec2> pointVector;
89 typedef vector<pointVector> tileVector;
91 /************************************************************************/
92 /* make tiles out of points on a 2D plane */
93 /************************************************************************/
94 void tileLocalWeather(const FGPhysicalProperties2DVector& EntryList);
96 FGMicroWeatherList WeatherAreas;
98 WeatherPrecision WeatherVisibility; //how far do I need to simulate the
99 //local weather? Unit: metres
100 sgVec3 last_known_position;
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
110 sgSetVec2(temp, p[0], p[1]);
112 return AreaWith(temp);
116 static FGLocalWeatherDatabase *theFGLocalWeatherDatabase;
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
127 DatabaseWorkingType DatabaseStatus;
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);
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)
144 cout << "This constructor is broken and should *NOT* be used!" << endl;
148 sgSetVec3( position, position_lat, position_lon, position_alt );
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.
154 /* BAD --> */ FGLocalWeatherDatabase( position, visibility, type );
157 ~FGLocalWeatherDatabase();
159 /************************************************************************/
160 /* reset the whole database */
161 /************************************************************************/
162 void reset(const DatabaseWorkingType type = PREFERED_WORKING_TYPE);
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
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;
177 WeatherPrecision getAirDensity(const sgVec3& p) const;
179 /************************************************************************/
180 /* Add a weather feature at the point p and surrounding area */
181 /************************************************************************/
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);
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);
194 void addProperties(const FGPhysicalProperties2D& x); //add a property
195 void setProperties(const FGPhysicalProperties2D& x); //change a property
197 /************************************************************************/
198 /* get/set weather visibility */
199 /************************************************************************/
200 void setWeatherVisibility(const WeatherPrecision visibility);
201 WeatherPrecision getWeatherVisibility(void) const;
204 extern FGLocalWeatherDatabase *WeatherDatabase;
205 void fgUpdateWeatherDatabase(void);
207 /****************************************************************************/
208 /* get/set weather visibility */
209 /****************************************************************************/
210 void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecision visibility)
212 if (visibility >= MINIMUM_WEATHER_VISIBILITY)
213 WeatherVisibility = visibility;
215 WeatherVisibility = MINIMUM_WEATHER_VISIBILITY;
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...
222 GLfloat fog_exp_density;
223 GLfloat fog_exp2_density;
226 fog_exp_density = -log(0.01 / WeatherVisibility);
229 fog_exp2_density = sqrt( -log(0.01) ) / WeatherVisibility;
231 // Set correct opengl fog density
232 xglFogf (GL_FOG_DENSITY, fog_exp2_density);
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";
241 WeatherPrecision inline FGLocalWeatherDatabase::getWeatherVisibility(void) const
243 //cerr << "FGLocalWeatherDatabase::getWeatherVisibility() = " << WeatherVisibility << "\n";
244 return WeatherVisibility;
248 /****************************************************************************/
249 #endif /*FGLocalWeatherDatabase_H*/