1 /*****************************************************************************
3 Header: FGLocalWeatherDatabase.h
4 Author: Christian Mayer
7 ---------- Copyright (C) 1999 Christian Mayer (vader@t-online.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 *****************************************************************************/
39 /****************************************************************************/
41 /****************************************************************************/
42 #ifndef FGLocalWeatherDatabase_H
43 #define FGLocalWeatherDatabase_H
45 /****************************************************************************/
47 /****************************************************************************/
48 //This is only here for smoother code change. In the end the WD should be clean
59 #include "FGPhysicalProperties.h"
60 #include "FGGlobalWeatherDatabase.h"
61 #include "FGMicroWeather.h"
62 #include "FGWeatherFeature.h"
63 #include "FGWeatherDefs.h"
65 /****************************************************************************/
67 /****************************************************************************/
69 FG_USING_NAMESPACE(std);
71 /****************************************************************************/
72 /* CLASS DECLARATION */
73 /****************************************************************************/
74 class FGLocalWeatherDatabase
78 FGGlobalWeatherDatabase *global; //point to the global database
80 typedef vector<FGMicroWeather> FGMicroWeatherList;
81 typedef FGMicroWeatherList::iterator FGMicroWeatherListIt;
83 typedef vector<Point2D> pointVector;
84 typedef vector<pointVector> tileVector;
86 /************************************************************************/
87 /* make tiles out of points on a 2D plane */
88 /************************************************************************/
89 void tileLocalWeather(const FGPhysicalProperties2DVector& EntryList);
91 FGMicroWeatherList WeatherAreas;
93 WeatherPrecition WeatherVisibility; //how far do I need to simulate the
94 //local weather? Unit: metres
95 Point3D last_known_position;
98 static FGLocalWeatherDatabase *theFGLocalWeatherDatabase;
100 enum DatabaseWorkingType {
101 use_global, //use global database for data
102 manual, //use only user inputs
103 distant, //use distant information, e.g. like LAN when used in
104 //a multiplayer environment
105 random, //generate weather randomly
106 default_mode //use only default values
110 DatabaseWorkingType DatabaseStatus;
112 /************************************************************************/
113 /* return the index of the area with point p */
114 /************************************************************************/
115 unsigned int AreaWith(const Point2D& p) const;
118 /************************************************************************/
119 /* Constructor and Destructor */
120 /************************************************************************/
121 FGLocalWeatherDatabase(
122 const Point3D& posititon,
123 const WeatherPrecition& visibility = DEFAULT_WEATHER_VISIBILIY,
124 const DatabaseWorkingType& type = PREFERED_WORKING_TYPE);
125 ~FGLocalWeatherDatabase();
127 /************************************************************************/
128 /* reset the whole database */
129 /************************************************************************/
130 void reset(const DatabaseWorkingType& type = PREFERED_WORKING_TYPE);
132 /************************************************************************/
133 /* update the database. Since the last call we had dt seconds */
134 /************************************************************************/
135 void update(const WeatherPrecition& dt); //time has changed
136 void update(const Point3D& p); //position has changed
137 void update(const Point3D& p, const WeatherPrecition& dt); //time and/or position has changed
139 /************************************************************************/
140 /* Get the physical properties on the specified point p */
141 /************************************************************************/
142 FGPhysicalProperty get(const Point3D& p) const;
143 FGPhysicalProperty get(const sgVec3& p) const;
145 WeatherPrecition getAirDensity(const Point3D& p) const;
146 WeatherPrecition getAirDensity(const sgVec3& p) const;
148 /************************************************************************/
149 /* Add a weather feature at the point p and surrounding area */
150 /************************************************************************/
152 void addWind(const FGWindItem& x, const Point2D& p);
153 void addTurbulence(const FGTurbulenceItem& x, const Point2D& p);
154 void addTemperature(const FGTemperatureItem& x, const Point2D& p);
155 void addAirPressure(const FGAirPressureItem& x, const Point2D& p);
156 void addVaporPressure(const FGVaporPressureItem& x, const Point2D& p);
157 void addCloud(const FGCloudItem& x, const Point2D& p);
159 void setSnowRainIntensity(const WeatherPrecition& x, const Point2D& p);
160 void setSnowRainType(const SnowRainType& x, const Point2D& p);
161 void setLightningProbability(const WeatherPrecition& x, const Point2D& p);
163 void addProperties(const FGPhysicalProperties2D& x); //add a property
164 void setProperties(const FGPhysicalProperties2D& x); //change a property
166 /************************************************************************/
167 /* get/set weather visibility */
168 /************************************************************************/
169 void setWeatherVisibility(const WeatherPrecition& visibility);
170 WeatherPrecition getWeatherVisibility(void) const;
173 extern FGLocalWeatherDatabase *WeatherDatabase;
174 void fgUpdateWeatherDatabase(void);
176 /****************************************************************************/
177 /* get/set weather visibility */
178 /****************************************************************************/
179 void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecition& visibility)
181 if (visibility >= MINIMUM_WEATHER_VISIBILIY)
182 WeatherVisibility = visibility;
184 WeatherVisibility = MINIMUM_WEATHER_VISIBILIY;
186 //This code doesn't belong here as this is the optical visibility and not
187 //the visibility of the weather database (that should be bigger...). The
188 //optical visibility should be calculated from the vapor pressure e.g.
189 //But for the sake of a smoother change from the old way to the new one...
191 GLfloat fog_exp_density;
192 GLfloat fog_exp2_density;
195 fog_exp_density = -log(0.01 / WeatherVisibility);
198 fog_exp2_density = sqrt( -log(0.01) ) / WeatherVisibility;
200 // Set correct opengl fog density
201 xglFogf (GL_FOG_DENSITY, fog_exp2_density);
203 // FG_LOG( FG_INPUT, FG_DEBUG, "Fog density = " << w->fog_density );
204 //cerr << "FGLocalWeatherDatabase::setWeatherVisibility(" << visibility << "):\n";
205 //cerr << "Fog density = " << fog_exp_density << "\n";
210 WeatherPrecition inline FGLocalWeatherDatabase::getWeatherVisibility(void) const
212 //cerr << "FGLocalWeatherDatabase::getWeatherVisibility() = " << WeatherVisibility << "\n";
213 return WeatherVisibility;
217 /****************************************************************************/
218 #endif /*FGLocalWeatherDatabase_H*/