X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=simgear%2Fenvironment%2Fvisual_enviro.hxx;h=e51bd4d69540671bea5f611a2cbb83e2f4ce0524;hb=84dd54b33a6d8b35e57c32194b025f79245f35c4;hp=f8a7e6c0e9fdb0f171cdf6ce1a8ea21a137869b2;hpb=d37992aaf9c21ebed166e093fb6d339dd6784316;p=simgear.git diff --git a/simgear/environment/visual_enviro.hxx b/simgear/environment/visual_enviro.hxx index f8a7e6c0..e51bd4d6 100644 --- a/simgear/environment/visual_enviro.hxx +++ b/simgear/environment/visual_enviro.hxx @@ -16,29 +16,152 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // #ifndef _VISUAL_ENVIRO_HXX #define _VISUAL_ENVIRO_HXX -class SGEnviro { +#include + +#include +#include STL_STRING +#include + +SG_USING_STD(vector); +SG_USING_STD(string); + +class SGLightning; +class SGSoundMgr; + +/** + * Simulate some echo on a weather radar. + * Container class for the wx radar instrument. + */ +class SGWxRadarEcho { +public: + SGWxRadarEcho(float _heading, float _alt, float _radius, float _dist, double _LWC, bool _lightning, int _cloudId) : + heading( _heading ), + alt ( _alt ), + radius ( _radius ), + dist ( _dist ), + LWC ( _LWC ), + lightning ( _lightning ), + cloudId ( _cloudId ) + {} + /** the heading in radian is versus north */ + float heading; + float alt, radius, dist; + /** reflectivity converted to liquid water content. */ + double LWC; + /** if true then this data is for a lightning else it is for water echo. */ + bool lightning; + /** Unique identifier of cloud */ + int cloudId; +}; + +typedef vector list_of_SGWxRadarEcho; + +/** + * Visual environment helper class. + */ +class SGEnviro { +friend class SGLightning; private: + void DrawCone2(float baseRadius, float height, int slices, bool down, double rain_norm, double speed); + void lt_update(void); + bool view_in_cloud; bool precipitation_enable_state; float precipitation_density; + float precipitation_max_alt; + bool turbulence_enable_state; + double last_cloud_turbulence, cloud_turbulence; + bool lightning_enable_state; + double elapsed_time, dt; + sgVec4 fog_color; + sgMat4 transform; + double last_lon, last_lat, last_alt; + SGSoundMgr *soundMgr; + bool snd_active, snd_playing; + double snd_timer, snd_wait, snd_pos_lat, snd_pos_lon, snd_dist; + double min_time_before_lt; + + float fov_width, fov_height; + + /** a list of all the radar echo. */ + list_of_SGWxRadarEcho radarEcho; + static sgVec3 min_light; + static SGfloat streak_bright_nearmost_layer, + streak_bright_farmost_layer, + streak_period_max, + streak_period_change_per_kt, + streak_period_min, + streak_length_min, + streak_length_change_per_kt, + streak_length_max; + static int streak_count_min, streak_count_max; + static SGfloat cone_base_radius, + cone_height; public: SGEnviro(); ~SGEnviro(); - void startOfFrame(void); + /** Read the config from the precipitation rendering config properties. + * @param precip_rendering_cfgNode "/sim/rendering/precipitation" in fg + * Set from whatever info present in the + * subnodes passed, substituting hardwired defaults for missing fields. + * If NULL is given, do nothing. + */ + void config(const class SGPropertyNode* precip_rendering_cfgNode); + + /** + * Forward a few states used for renderings. + */ + void startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double alt, double delta_time); + void endOfFrame(void); + /** + * Whenever a cloud is drawn we check his 'impact' on the environment. + * @param heading direction of cloud in radians + * @param alt asl of cloud in meters + * @param radius radius of cloud in meters + * @param family cloud family + * @param dist squared dist to cloud in meters + */ + void callback_cloud(float heading, float alt, float radius, int family, float dist, int cloudId); + + void drawRain(double pitch, double roll, double heading, double hspeed, double rain_norm); + /** + * Draw rain or snow precipitation around the viewer. + * @param rain_norm rain normalized intensity given by metar class + * @param snow_norm snow normalized intensity given by metar class + * @param hail_norm hail normalized intensity given by metar class + * @param pitch pitch rotation of viewer + * @param roll roll rotation of viewer + * @param hspeed moving horizontal speed of viewer in kt + */ + void drawPrecipitation(double rain_norm, double snow_norm, double hail_norm, + double pitch, double roll, double heading, double hspeed); + + /** + * Draw the lightnings spawned by cumulo nimbus. + */ + void drawLightning(void); + + /** + * Forward the fog color used by the rain rendering. + * @param adj_fog_color color of the fog + */ + void setLight(sgVec4 adj_fog_color); + // this can be queried to add some turbulence for example bool is_view_in_cloud(void) const; void set_view_in_cloud(bool incloud); + double get_cloud_turbulence(void) const; // Clouds // return the size of the memory pool used by texture impostors @@ -47,25 +170,87 @@ public: float get_clouds_visibility(void) const; float get_clouds_density(void) const; bool get_clouds_enable_state(void) const; + bool get_turbulence_enable_state(void) const; + /** + * Set the size of the impostor texture cache for 3D clouds. + * @param sizeKb size of the texture pool in Kb + */ void set_clouds_CacheSize(int sizeKb); + /** + * Set the resolution of the impostor texture for 3D clouds. + * @param resolutionPixels size of each texture in pixels (64|128|256) + */ void set_CacheResolution(int resolutionPixels); + /** + * Set the maximum range used when drawing clouds. + * Clouds are blended from totaly transparent at max range to totaly opaque around the viewer + * @param distance in meters + */ void set_clouds_visibility(float distance); + /** + * Set the proportion of clouds that will be rendered to limit drop in FPS. + * @param density 0..100 no clouds drawn when density == 0, all are drawn when density == 100 + */ void set_clouds_density(float density); + /** + * Enable or disable the use of 3D clouds. + * @param enable when false we draw the 2D layers + */ void set_clouds_enable_state(bool enable); + /** + * Enable or disable the use of proximity cloud turbulence. + * @param enable when true the turbulence is computed based on type of cloud around the AC + */ + void set_turbulence_enable_state(bool enable); // rain/snow float get_precipitation_density(void) const; bool get_precipitation_enable_state(void) const; + /** + * Decrease the precipitation density to the given percentage. + * (Only show the given percentage of rain streaks etc.) + * Default precipitation density upon construction is 100.0. + * @param density 0.0 to 100.0 + */ void set_precipitation_density(float density); + /** + * Enable or disable the rendering of precipitation around the viewer. + * @param enable when true we will draw precipitation depending on metar data + */ void set_precipitation_enable_state(bool enable); // others bool get_lightning_enable_state(void) const; + /** + * Enable or disable the rendering of lightning and the thunder sound. + * @param enable when true we will draw lightning spwaned by cumulonimbus + */ void set_lightning_enable_state(bool enable); + + /** + * Spawn a new lighning at specified lon/lat. + * @param lon position of the new lightning + * @param lat position of the new lightning + * @param alt asl of the starting point of the lightning in meters + */ + void addLightning(double lon, double lat, double alt); + + /** + * Forward the sound manager instance to be able to play samples. + * @param mgr a running sound manager + */ + void set_soundMgr(SGSoundMgr *mgr); + + void setFOV( float w, float h ); + void getFOV( float &w, float &h ); + + list_of_SGWxRadarEcho *get_radar_echo(void); + + sgMat4 *get_transform(void) { return &transform; } }; extern SGEnviro sgEnviro; -#endif // _VISUAL_ENVIRO_HXX \ No newline at end of file +#endif // _VISUAL_ENVIRO_HXX