]> git.mxchange.org Git - flightgear.git/blob - src/WeatherCM/FGLocalWeatherDatabase.h
5be5482572c7e42a203fdbe4f1ae7e6ea4893e7f
[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 (vader@t-online.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 *****************************************************************************/
38
39 /****************************************************************************/
40 /* SENTRY                                                                   */
41 /****************************************************************************/
42 #ifndef FGLocalWeatherDatabase_H
43 #define FGLocalWeatherDatabase_H
44
45 /****************************************************************************/
46 /* INCLUDES                                                                 */
47 /****************************************************************************/
48 //This is only here for smoother code change. In the end the WD should be clean
49 //of *any* OpenGL:
50 #ifdef HAVE_WINDOWS_H
51 #  include <windows.h>
52 #endif
53 #include <GL/glut.h>
54 #include <XGL/xgl.h>
55
56 #include <vector>
57 #include "sg.h"
58
59 #include "FGPhysicalProperties.h"
60 #include "FGGlobalWeatherDatabase.h"
61 #include "FGMicroWeather.h"
62 #include "FGWeatherFeature.h"
63 #include "FGWeatherDefs.h"
64
65 /****************************************************************************/
66 /* DEFINES                                                                  */
67 /****************************************************************************/
68 FG_USING_STD(vector);
69 FG_USING_NAMESPACE(std);
70
71 /****************************************************************************/
72 /* CLASS DECLARATION                                                        */
73 /****************************************************************************/
74 class FGLocalWeatherDatabase
75 {
76 private:
77 protected:
78     FGGlobalWeatherDatabase *global;    //point to the global database
79
80     typedef vector<FGMicroWeather> FGMicroWeatherList;
81     typedef FGMicroWeatherList::iterator FGMicroWeatherListIt;
82
83     typedef vector<Point2D> pointVector;
84     typedef vector<pointVector> tileVector;
85
86     /************************************************************************/
87     /* make tiles out of points on a 2D plane                               */
88     /************************************************************************/
89     void tileLocalWeather(const FGPhysicalProperties2DVector& EntryList);
90
91     FGMicroWeatherList WeatherAreas;
92
93     WeatherPrecition WeatherVisibility; //how far do I need to simulate the
94                                         //local weather? Unit: metres
95     Point3D last_known_position;
96
97 public:
98     static FGLocalWeatherDatabase *theFGLocalWeatherDatabase;  
99     
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
107     };
108
109 protected:
110     DatabaseWorkingType DatabaseStatus;
111
112     /************************************************************************/
113     /* return the index of the area with point p                            */
114     /************************************************************************/
115     unsigned int AreaWith(const Point2D& p) const;
116
117 public:
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();
126
127     /************************************************************************/
128     /* reset the whole database                                             */
129     /************************************************************************/
130     void reset(const DatabaseWorkingType& type = PREFERED_WORKING_TYPE);
131
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
138
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;
144
145     WeatherPrecition getAirDensity(const Point3D& p) const;
146     WeatherPrecition getAirDensity(const sgVec3& p) const;
147     
148     /************************************************************************/
149     /* Add a weather feature at the point p and surrounding area            */
150     /************************************************************************/
151
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);
158
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);
162
163     void addProperties(const FGPhysicalProperties2D& x);    //add a property
164     void setProperties(const FGPhysicalProperties2D& x);    //change a property
165
166     /************************************************************************/
167     /* get/set weather visibility                                           */
168     /************************************************************************/
169     void setWeatherVisibility(const WeatherPrecition& visibility);
170     WeatherPrecition getWeatherVisibility(void) const;
171 };
172
173 extern FGLocalWeatherDatabase *WeatherDatabase;
174 void fgUpdateWeatherDatabase(void);
175
176 /****************************************************************************/
177 /* get/set weather visibility                                               */
178 /****************************************************************************/
179 void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecition& visibility)
180 {
181     if (visibility >= MINIMUM_WEATHER_VISIBILIY)
182         WeatherVisibility = visibility;
183     else
184         WeatherVisibility = MINIMUM_WEATHER_VISIBILIY;
185
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...
190
191     GLfloat fog_exp_density;
192     GLfloat fog_exp2_density;
193     
194     // for GL_FOG_EXP
195     fog_exp_density = -log(0.01 / WeatherVisibility);
196     
197     // for GL_FOG_EXP2
198     fog_exp2_density = sqrt( -log(0.01) ) / WeatherVisibility;
199     
200     // Set correct opengl fog density
201     xglFogf (GL_FOG_DENSITY, fog_exp2_density);
202     
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";
206     
207
208 }
209
210 WeatherPrecition inline FGLocalWeatherDatabase::getWeatherVisibility(void) const
211 {
212     //cerr << "FGLocalWeatherDatabase::getWeatherVisibility() = " << WeatherVisibility << "\n";
213     return WeatherVisibility;
214 }
215
216
217 /****************************************************************************/
218 #endif /*FGLocalWeatherDatabase_H*/