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
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.
*****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/* 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 "sg.h"
+
+#include <plib/sg.h>
+
+#include "sphrintp.h"
#include "FGPhysicalProperties.h"
-#include "FGGlobalWeatherDatabase.h"
-#include "FGMicroWeather.h"
+#include "FGPhysicalProperty.h"
+
+
#include "FGWeatherFeature.h"
#include "FGWeatherDefs.h"
+#include "FGThunderstorm.h"
/****************************************************************************/
/* DEFINES */
{
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 */
/************************************************************************/
- 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
- 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 {
- 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
default_mode //use only default values
};
-protected:
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(
- 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 */
/************************************************************************/
- 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 */
/************************************************************************/
- 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 */
/************************************************************************/
- FGPhysicalProperty get(const Point3D& p) const;
- FGPhysicalProperty get(const sgVec3& 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;
- WeatherPrecition getAirDensity(const Point3D& p) const;
- WeatherPrecition getAirDensity(const sgVec3& p) const;
+ WeatherPrecision getAirDensity(const sgVec3& p) const;
/************************************************************************/
/* Add a weather feature at the point p and surrounding area */
/************************************************************************/
+ // !! Adds aren't supported anymore !!
- void addWind(const WeatherPrecition alt, const Point3D& x, const Point2D& p);
- void addTurbulence(const WeatherPrecition alt, const Point3D& x, const Point2D& p);
- void addTemperature(const WeatherPrecition alt, const WeatherPrecition x, const Point2D& p);
- void addAirPressure(const WeatherPrecition alt, const WeatherPrecition x, const Point2D& p);
- void addVaporPressure(const WeatherPrecition alt, const WeatherPrecition x, const Point2D& p);
- void addCloud(const WeatherPrecition alt, const FGCloudItem& x, const Point2D& 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 setSnowRainIntensity (const WeatherPrecision x, const sgVec2& p);
+ void setSnowRainType (const SnowRainType x, const sgVec2& p);
+ void setLightningProbability(const WeatherPrecision x, const sgVec2& p);
- void addProperties(const FGPhysicalProperties2D& x); //add a property
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;
/****************************************************************************/
/* 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 = 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;
}