From c724e5fb201efac3dc9e0fb8bea662c7235c56bf Mon Sep 17 00:00:00 2001 From: timoore Date: Tue, 4 Mar 2008 08:54:00 +0000 Subject: [PATCH] precipitation effects from Nicolas Vivien --- simgear/environment/Makefile.am | 4 +- simgear/environment/precipitation.cxx | 205 ++++++++++++++++++++++++++ simgear/environment/precipitation.hxx | 72 +++++++++ 3 files changed, 279 insertions(+), 2 deletions(-) create mode 100644 simgear/environment/precipitation.cxx create mode 100644 simgear/environment/precipitation.hxx diff --git a/simgear/environment/Makefile.am b/simgear/environment/Makefile.am index 5505aa5d..f6042f85 100644 --- a/simgear/environment/Makefile.am +++ b/simgear/environment/Makefile.am @@ -2,8 +2,8 @@ includedir = @includedir@/environment lib_LIBRARIES = libsgenvironment.a -include_HEADERS = metar.hxx visual_enviro.hxx +include_HEADERS = metar.hxx visual_enviro.hxx precipitation.hxx -libsgenvironment_a_SOURCES = metar.cxx visual_enviro.cxx +libsgenvironment_a_SOURCES = metar.cxx visual_enviro.cxx precipitation.cxx INCLUDES = -I$(top_srcdir) diff --git a/simgear/environment/precipitation.cxx b/simgear/environment/precipitation.cxx new file mode 100644 index 00000000..78561693 --- /dev/null +++ b/simgear/environment/precipitation.cxx @@ -0,0 +1,205 @@ +/** + * @file precipitation.cxx + * @author Nicolas VIVIEN + * @date 2008-02-10 + * + * @note Copyright (C) 2008 Nicolas VIVIEN + * + * @brief Precipitation effects to draw rain and snow. + * + * @par Licences + * 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 Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * @par CVS + * $Id$ + */ + +#include "precipitation.hxx" + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + + + +SG_USING_STD(string); +SG_USING_STD(list); + + +/** + * @brief SGPrecipitation constructor + * + * Build a new OSG object from osgParticle. + */ +SGPrecipitation::SGPrecipitation() { + this->setSnowIntensity(0.0); + this->setRainIntensity(0.0); + this->setFreezing(false); + this->setWindProperty(0.0, 0.0); + + precipitationEffect = new osgParticle::PrecipitationEffect; +} + + +/** + * @brief SGPrecipitation destructor + */ +SGPrecipitation::~SGPrecipitation(void) { +} + + +/** + * @brief Build and add the object "precipitationEffect" + * + * This function permits you to create an object precipitationEffect and initialize it. + * I define by default the color of water (for raining) + */ +osg::Group* SGPrecipitation::build(void) { + group = new osg::Group; + + precipitationEffect->snow(0); + precipitationEffect->rain(0); + + group->addChild(precipitationEffect.get()); + + return group; +} + + +/** + * @brief Define the snow intensity + * + * This function permits you to define and change the snow intensity + * The param 'intensity' is normed (0 to 1). + */ +void SGPrecipitation::setSnowIntensity(float intensity) { + if (this->_snow_intensity < intensity-0.001) + this->_snow_intensity += 0.001; + else if (this->_snow_intensity > intensity+0.001) + this->_snow_intensity -= 0.001; + else + this->_snow_intensity = intensity; +} + + +/** + * @brief Define the rain intensity + * + * This function permits you to define and change the rain intensity + * The param 'intensity' is normed (0 to 1). + */ +void SGPrecipitation::setRainIntensity(float intensity) { + if (this->_rain_intensity < intensity-0.001) + this->_rain_intensity += 0.001; + else if (this->_rain_intensity > intensity+0.001) + this->_rain_intensity -= 0.001; + else + this->_rain_intensity = intensity; +} + + +/** + * @brief Freeze the rain to snow + * + * @param freeze Boolean + * + * This function permits you to turn off the rain to snow. + */ +void SGPrecipitation::setFreezing(bool freeze) { + this->_freeze = freeze; +} + + +/** + * @brief Define the wind direction and speed + * + * This function permits you to define and change the wind direction + * + * After apply the MatrixTransform to the osg::Precipitation object, + * x points full south... From wind heading and speed, we can calculate + * the wind vector. + */ +void SGPrecipitation::setWindProperty(double heading, double speed) { + double x, y, z; + + heading = (heading + 180) * SGD_DEGREES_TO_RADIANS; + speed = speed * SG_FEET_TO_METER; + + x = -cos(heading) * speed; + y = sin(heading) * speed; + z = 0; + + this->_wind_vec = osg::Vec3(x, y, z); +} + + +/** + * @brief Update the precipitation effects + * + * This function permits you to update the precipitation effects. + * Be careful, if snow and rain intensity are greater than '0', snow effect + * will be first. + * + * The settings come from the osgParticule/PrecipitationEffect.cpp exemple. + */ +bool SGPrecipitation::update(void) { + if (this->_freeze) { + if (this->_rain_intensity > 0) + this->_snow_intensity = this->_rain_intensity; + } + + if (this->_snow_intensity > 0) { + precipitationEffect->setWind(_wind_vec); + precipitationEffect->setParticleSpeed( -0.75f - 0.25f*_snow_intensity); + + precipitationEffect->setParticleSize(0.02f + 0.03f*_snow_intensity); + precipitationEffect->setMaximumParticleDensity(_snow_intensity * 7.2f); + precipitationEffect->setCellSize(osg::Vec3(5.0f / (0.25f+_snow_intensity), 5.0f / (0.25f+_snow_intensity), 5.0f)); + + precipitationEffect->setNearTransition(25.f); + precipitationEffect->setFarTransition(100.0f - 60.0f*sqrtf(_snow_intensity)); + + precipitationEffect->setParticleColor(osg::Vec4(0.85, 0.85, 0.85, 1.0) - osg::Vec4(0.1, 0.1, 0.1, 1.0) * _snow_intensity); + } + else if (this->_rain_intensity > 0){ + precipitationEffect->setWind(_wind_vec); + precipitationEffect->setParticleSpeed( -2.0f + -5.0f*_rain_intensity); + + precipitationEffect->setParticleSize(0.01 + 0.02*_rain_intensity); + precipitationEffect->setMaximumParticleDensity(_rain_intensity * 7.5f); + precipitationEffect->setCellSize(osg::Vec3(5.0f / (0.25f+_rain_intensity), 5.0f / (0.25f+_rain_intensity), 5.0f)); + + precipitationEffect->setNearTransition(25.f); + precipitationEffect->setFarTransition(100.0f - 60.0f*sqrtf(_rain_intensity)); + + precipitationEffect->setParticleColor( osg::Vec4(0x7A, 0xCE, 0xFF, 0x80)); + } + else { + precipitationEffect->snow(0); + precipitationEffect->rain(0); + } + + return true; +} + diff --git a/simgear/environment/precipitation.hxx b/simgear/environment/precipitation.hxx new file mode 100644 index 00000000..37b497d5 --- /dev/null +++ b/simgear/environment/precipitation.hxx @@ -0,0 +1,72 @@ +/** + * @file precipitation.hxx + * @author Nicolas VIVIEN + * @date 2008-02-10 + * + * @note Copyright (C) 2008 Nicolas VIVIEN + * + * @brief Precipitation effects to draw rain and snow. + * + * @par Licences + * 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 Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * @par CVS + * $Id$ + */ + +#ifndef _PRECIPITATION_HXX +#define _PRECIPITATION_HXX + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +class SGPrecipitation { +private: + bool _freeze; + + float _snow_intensity; + float _rain_intensity; + + int _wind_dir; + osg::Vec3 _wind_vec; + + osg::Group *group; + osg::ref_ptr precipitationEffect; + +public: + SGPrecipitation(); + ~SGPrecipitation(); + osg::Group* build(void); + bool update(void); + + void setWindProperty(double, double); + void setFreezing(bool); + void setRainIntensity(float); + void setSnowIntensity(float); +}; + +#endif -- 2.39.5