X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FWeatherCM%2FFGLocalWeatherDatabase.h;h=7155854ae70dcad9193ea2604a657c55b337cb9e;hb=8f3aa1bebd7c60b1ad328d10beae841daab4e292;hp=38ffa6625e4d3f94fda5c3ea340f1718edfe3aa1;hpb=b645c8cf7e4aecc006b0d90a0ff7b4b0ad95cc62;p=flightgear.git diff --git a/src/WeatherCM/FGLocalWeatherDatabase.h b/src/WeatherCM/FGLocalWeatherDatabase.h index 38ffa6625..7155854ae 100644 --- a/src/WeatherCM/FGLocalWeatherDatabase.h +++ b/src/WeatherCM/FGLocalWeatherDatabase.h @@ -4,7 +4,7 @@ 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 @@ -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 +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 */ /****************************************************************************/ -//This is only here for smoother code change. In the end the WD should be clean -//of *any* OpenGL: -#ifdef HAVE_WINDOWS_H -# include -#endif -#include -#include +#include + +#include + +#include "sphrintp.h" #include "FGPhysicalProperties.h" -#include "FGGlobalWeatherDatabase.h" -#include "FGMicroWeather.h" +#include "FGPhysicalProperty.h" + + #include "FGWeatherFeature.h" #include "FGWeatherDefs.h" -#include +#include "FGThunderstorm.h" /****************************************************************************/ /* DEFINES */ @@ -73,30 +80,27 @@ class FGLocalWeatherDatabase { private: protected: - FGGlobalWeatherDatabase *global; //point to the global database - - typedef vector FGMicroWeatherList; - typedef FGMicroWeatherList::iterator FGMicroWeatherListIt; + SphereInterpolate *database; - typedef vector pointVector; + typedef vector pointVector; typedef vector 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 @@ -104,65 +108,96 @@ public: 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; - 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 */ /************************************************************************/ + // !! 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 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; @@ -171,40 +206,16 @@ void fgUpdateWeatherDatabase(void); /****************************************************************************/ /* 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; }