]> git.mxchange.org Git - flightgear.git/blobdiff - src/WeatherCM/FGLocalWeatherDatabase.h
UIUC flight model contribution. This is based on LaRCsim, but can read
[flightgear.git] / src / WeatherCM / FGLocalWeatherDatabase.h
index 38ffa6625e4d3f94fda5c3ea340f1718edfe3aa1..7155854ae70dcad9193ea2604a657c55b337cb9e 100644 (file)
@@ -4,7 +4,7 @@
  Author:       Christian Mayer
  Date started: 28.05.99
 
  Author:       Christian Mayer
  Date started: 28.05.99
 
- ---------- Copyright (C) 1999  Christian Mayer (vader@t-online.de) ----------
+ -------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
 
  This program is free software; you can redistribute it and/or modify it under
  the terms of the GNU General Public License as published by the Free Software
 
  This program is free software; you can redistribute it and/or modify it under
  the terms of the GNU General Public License as published by the Free Software
@@ -34,6 +34,14 @@ HISTORY
 16.06.1999 Durk Talsma         Portability for Linux
 20.06.1999 Christian Mayer     added lots of consts
 30.06.1999 Christian Mayer     STL portability
 16.06.1999 Durk Talsma         Portability for Linux
 20.06.1999 Christian Mayer     added lots of consts
 30.06.1999 Christian Mayer     STL portability
+11.10.1999 Christian Mayer     changed set<> to map<> on Bernie Bright's 
+                               suggestion
+19.10.1999 Christian Mayer     change to use PLIB's sg instead of Point[2/3]D
+                               and lots of wee code cleaning
+14.12.1999 Christian Mayer     Changed the internal structure to use Dave
+                                Eberly's spherical interpolation code. This
+                               stops our dependancy on the (ugly) voronoi
+                               code and simplyfies the code structure a lot.
 *****************************************************************************/
 
 /****************************************************************************/
 *****************************************************************************/
 
 /****************************************************************************/
@@ -45,20 +53,19 @@ HISTORY
 /****************************************************************************/
 /* INCLUDES                                                                */
 /****************************************************************************/
 /****************************************************************************/
 /* INCLUDES                                                                */
 /****************************************************************************/
-//This is only here for smoother code change. In the end the WD should be clean
-//of *any* OpenGL:
-#ifdef HAVE_WINDOWS_H
-#  include <windows.h>
-#endif
-#include <GL/glut.h>
-#include <XGL/xgl.h>
+#include <vector>
+
+#include <plib/sg.h>
+
+#include "sphrintp.h"
 
 #include "FGPhysicalProperties.h"
 
 #include "FGPhysicalProperties.h"
-#include "FGGlobalWeatherDatabase.h"
-#include "FGMicroWeather.h"
+#include "FGPhysicalProperty.h"
+
+
 #include "FGWeatherFeature.h"
 #include "FGWeatherDefs.h"
 #include "FGWeatherFeature.h"
 #include "FGWeatherDefs.h"
-#include <vector>
+#include "FGThunderstorm.h"
 
 /****************************************************************************/
 /* DEFINES                                                                 */
 
 /****************************************************************************/
 /* DEFINES                                                                 */
@@ -73,30 +80,27 @@ class FGLocalWeatherDatabase
 {
 private:
 protected:
 {
 private:
 protected:
-    FGGlobalWeatherDatabase *global;   //point to the global database
-
-    typedef vector<FGMicroWeather> FGMicroWeatherList;
-    typedef FGMicroWeatherList::iterator FGMicroWeatherListIt;
+    SphereInterpolate<FGPhysicalProperties> *database;
 
 
-    typedef vector<Point2D> pointVector;
+    typedef vector<sgVec2>      pointVector;
     typedef vector<pointVector> tileVector;
 
     /************************************************************************/
     /* make tiles out of points on a 2D plane                              */
     /************************************************************************/
     typedef vector<pointVector> tileVector;
 
     /************************************************************************/
     /* make tiles out of points on a 2D plane                              */
     /************************************************************************/
-    void tileLocalWeather(const FGPhysicalProperties2DVector& EntryList);
-
-    FGMicroWeatherList WeatherAreas;
-
-    WeatherPrecition WeatherVisibility;        //how far do I need to simulate the
+    WeatherPrecision WeatherVisibility;        //how far do I need to simulate the
                                        //local weather? Unit: metres
                                        //local weather? Unit: metres
-    Point3D last_known_position;
+    sgVec3 last_known_position;
+
+    bool Thunderstorm;                 //is there a thunderstorm near by?
+    FGThunderstorm *theThunderstorm;   //pointer to the thunderstorm.
 
 public:
     static FGLocalWeatherDatabase *theFGLocalWeatherDatabase;  
     
     enum DatabaseWorkingType {
 
 public:
     static FGLocalWeatherDatabase *theFGLocalWeatherDatabase;  
     
     enum DatabaseWorkingType {
-       use_global,     //use global database for data
+       use_global,     //use global database for data !!obsolete!!
+       use_internet,   //use the weather data that came from the internet
        manual,         //use only user inputs
        distant,        //use distant information, e.g. like LAN when used in
                        //a multiplayer environment
        manual,         //use only user inputs
        distant,        //use distant information, e.g. like LAN when used in
                        //a multiplayer environment
@@ -104,65 +108,96 @@ public:
        default_mode    //use only default values
     };
 
        default_mode    //use only default values
     };
 
-protected:
     DatabaseWorkingType DatabaseStatus;
 
     DatabaseWorkingType DatabaseStatus;
 
-    /************************************************************************/
-    /* return the index of the area with point p                           */
-    /************************************************************************/
-    unsigned int AreaWith(const Point2D& p) const;
+    void init( const WeatherPrecision visibility, const DatabaseWorkingType type );
 
 
-public:
     /************************************************************************/
     /* Constructor and Destructor                                          */
     /************************************************************************/
     FGLocalWeatherDatabase(
     /************************************************************************/
     /* Constructor and Destructor                                          */
     /************************************************************************/
     FGLocalWeatherDatabase(
-       const Point3D& posititon,
-       const WeatherPrecition& visibility = DEFAULT_WEATHER_VISIBILIY,
-       const DatabaseWorkingType& type = PREFERED_WORKING_TYPE);
+       const sgVec3&             position,
+       const WeatherPrecision    visibility = DEFAULT_WEATHER_VISIBILITY,
+       const DatabaseWorkingType type       = PREFERED_WORKING_TYPE)
+    {
+       sgCopyVec3( last_known_position, position );
+
+       init( visibility, type );
+
+       theFGLocalWeatherDatabase = this;
+    }
+
+    FGLocalWeatherDatabase(
+       const WeatherPrecision    position_lat,
+       const WeatherPrecision    position_lon,
+       const WeatherPrecision    position_alt,
+       const WeatherPrecision    visibility = DEFAULT_WEATHER_VISIBILITY,
+       const DatabaseWorkingType type       = PREFERED_WORKING_TYPE)
+    {
+       sgSetVec3( last_known_position, position_lat, position_lon, position_alt );
+
+       init( visibility, type );
+
+       theFGLocalWeatherDatabase = this;
+    }
+
     ~FGLocalWeatherDatabase();
 
     /************************************************************************/
     /* reset the whole database                                                    */
     /************************************************************************/
     ~FGLocalWeatherDatabase();
 
     /************************************************************************/
     /* reset the whole database                                                    */
     /************************************************************************/
-    void reset(const DatabaseWorkingType& type = PREFERED_WORKING_TYPE);
+    void reset(const DatabaseWorkingType type = PREFERED_WORKING_TYPE);
 
     /************************************************************************/
     /* update the database. Since the last call we had dt seconds          */
     /************************************************************************/
 
     /************************************************************************/
     /* update the database. Since the last call we had dt seconds          */
     /************************************************************************/
-    void update(const WeatherPrecition& dt);                   //time has changed
-    void update(const Point3D& p);                             //position has  changed
-    void update(const Point3D& p, const WeatherPrecition& dt); //time and/or position has changed
+    void update(const WeatherPrecision dt);                    //time has changed
+    void update(const sgVec3& p);                              //position has  changed
+    void update(const sgVec3& p, const WeatherPrecision dt);   //time and/or position has changed
 
     /************************************************************************/
     /* Get the physical properties on the specified point p                */
     /************************************************************************/
 
     /************************************************************************/
     /* Get the physical properties on the specified point p                */
     /************************************************************************/
-    FGPhysicalProperty get(const Point3D& p) const;
-    WeatherPrecition getAirDensity(const Point3D& p) const;
+#ifdef MACOS
+    /* fix a problem with mw compilers in that they don't know the
+       difference between the next two methods. Since the first one
+       doesn't seem to be used anywhere, I commented it out. This is
+       supposed to be fixed in the forthcoming CodeWarrior Release
+       6. */
+#else
+    FGPhysicalProperties get(const sgVec2& p) const;
+#endif
+    FGPhysicalProperty   get(const sgVec3& p) const;
+
+    WeatherPrecision     getAirDensity(const sgVec3& p) const;
     
     /************************************************************************/
     /* Add a weather feature at the point p and surrounding area           */
     /************************************************************************/
     
     /************************************************************************/
     /* Add a weather feature at the point p and surrounding area           */
     /************************************************************************/
+    // !! Adds aren't supported anymore !!
 
 
-    void addWind(const FGWindItem& x, const Point2D& p);
-    void addTurbulence(const FGTurbulenceItem& x, const Point2D& p);
-    void addTemperature(const FGTemperatureItem& x, const Point2D& p);
-    void addAirPressure(const FGAirPressureItem& x, const Point2D& p);
-    void addVaporPressure(const FGVaporPressureItem& x, const Point2D& p);
-    void addCloud(const FGCloudItem& x, const Point2D& p);
+    void setSnowRainIntensity   (const WeatherPrecision x, const sgVec2& p);
+    void setSnowRainType        (const SnowRainType x,     const sgVec2& p);
+    void setLightningProbability(const WeatherPrecision x, const sgVec2& p);
 
 
-    void setSnowRainIntensity(const WeatherPrecition& x, const Point2D& p);
-    void setSnowRainType(const SnowRainType& x, const Point2D& p);
-    void setLightningProbability(const WeatherPrecition& x, const Point2D& p);
-
-    void addProperties(const FGPhysicalProperties2D& x);    //add a property
     void setProperties(const FGPhysicalProperties2D& x);    //change a property
 
     /************************************************************************/
     /* get/set weather visibility                                          */
     /************************************************************************/
     void setProperties(const FGPhysicalProperties2D& x);    //change a property
 
     /************************************************************************/
     /* get/set weather visibility                                          */
     /************************************************************************/
-    void setWeatherVisibility(const WeatherPrecition& visibility);
-    WeatherPrecition getWeatherVisibility(void) const;
+    void             setWeatherVisibility(const WeatherPrecision visibility);
+    WeatherPrecision getWeatherVisibility(void) const;
+
+    /************************************************************************/
+    /* figure out if there's a thunderstorm that has to be taken care of    */
+    /************************************************************************/
+    void updateThunderstorm(const float dt)
+    {
+       if (Thunderstorm == false)
+           return;
+
+       theThunderstorm->update( dt );
+    }
 };
 
 extern FGLocalWeatherDatabase *WeatherDatabase;
 };
 
 extern FGLocalWeatherDatabase *WeatherDatabase;
@@ -171,40 +206,16 @@ void fgUpdateWeatherDatabase(void);
 /****************************************************************************/
 /* get/set weather visibility                                              */
 /****************************************************************************/
 /****************************************************************************/
 /* get/set weather visibility                                              */
 /****************************************************************************/
-void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecition& visibility)
+void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecision visibility)
 {
 {
-    if (visibility >= MINIMUM_WEATHER_VISIBILIY)
+    if (visibility >= MINIMUM_WEATHER_VISIBILITY)
        WeatherVisibility = visibility;
     else
        WeatherVisibility = visibility;
     else
-       WeatherVisibility = MINIMUM_WEATHER_VISIBILIY;
-
-    //This code doesn't belong here as this is the optical visibility and not
-    //the visibility of the weather database (that should be bigger...). The
-    //optical visibility should be calculated from the vapor pressure e.g.
-    //But for the sake of a smoother change from the old way to the new one...
-
-    GLfloat fog_exp_density;
-    GLfloat fog_exp2_density;
-    
-    // for GL_FOG_EXP
-    fog_exp_density = -log(0.01 / WeatherVisibility);
-    
-    // for GL_FOG_EXP2
-    fog_exp2_density = sqrt( -log(0.01) ) / WeatherVisibility;
-    
-    // Set correct opengl fog density
-    xglFogf (GL_FOG_DENSITY, fog_exp2_density);
-    
-    // FG_LOG( FG_INPUT, FG_DEBUG, "Fog density = " << w->fog_density );
-    //cerr << "FGLocalWeatherDatabase::setWeatherVisibility(" << visibility << "):\n";
-    //cerr << "Fog density = " << fog_exp_density << "\n";
-    
-
+       WeatherVisibility = MINIMUM_WEATHER_VISIBILITY;
 }
 
 }
 
-WeatherPrecition inline FGLocalWeatherDatabase::getWeatherVisibility(void) const
+WeatherPrecision inline FGLocalWeatherDatabase::getWeatherVisibility(void) const
 {
 {
-    //cerr << "FGLocalWeatherDatabase::getWeatherVisibility() = " << WeatherVisibility << "\n";
     return WeatherVisibility;
 }
 
     return WeatherVisibility;
 }