X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fenvironment%2Fprecipitation.cxx;h=d22bbfd8e8eba15c4e71f1fd2c24e5ed6447a987;hb=b47d1ad5fd8ed111cae99c1f65f5bb65a5371501;hp=785616931bae8d34ffc4cebde137d1fde31839d1;hpb=c724e5fb201efac3dc9e0fb8bea662c7235c56bf;p=simgear.git diff --git a/simgear/environment/precipitation.cxx b/simgear/environment/precipitation.cxx index 78561693..d22bbfd8 100644 --- a/simgear/environment/precipitation.cxx +++ b/simgear/environment/precipitation.cxx @@ -22,52 +22,34 @@ * 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 "visual_enviro.hxx" #include -#include -#include -#include -#include -#include -#include - - - - -SG_USING_STD(string); -SG_USING_STD(list); - +#include /** * @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; +SGPrecipitation::SGPrecipitation() : + _freeze(false), _enabled(true), _snow_intensity(0.0), _rain_intensity(0.0), _clip_distance(5.0) +{ + _precipitationEffect = new osgParticle::PrecipitationEffect; } - -/** - * @brief SGPrecipitation destructor - */ -SGPrecipitation::~SGPrecipitation(void) { +void SGPrecipitation::setEnabled( bool value ) +{ + _enabled = value; } +bool SGPrecipitation::getEnabled() const +{ + return _enabled; +} /** * @brief Build and add the object "precipitationEffect" @@ -75,15 +57,29 @@ SGPrecipitation::~SGPrecipitation(void) { * 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; +osg::Group* SGPrecipitation::build(void) +{ + osg::Group* group = new osg::Group; + + _precipitationEffect->snow(0); + _precipitationEffect->rain(0); + + if (_clip_distance!=0.0) + { + osg::ref_ptr clipNode = new osg::ClipNode; + clipNode->addClipPlane( new osg::ClipPlane( 0 ) ); + clipNode->getClipPlane(0)->setClipPlane( 0.0, 0.0, -1.0, -_clip_distance ); + clipNode->setReferenceFrame(osg::ClipNode::ABSOLUTE_RF); + clipNode->addChild(_precipitationEffect.get()); + + group->addChild(clipNode.get()); + } + else + { + group->addChild(_precipitationEffect.get()); + } + + return group; } @@ -93,13 +89,14 @@ osg::Group* SGPrecipitation::build(void) { * 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; +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; } @@ -109,13 +106,14 @@ void SGPrecipitation::setSnowIntensity(float 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; +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; } @@ -126,8 +124,9 @@ void SGPrecipitation::setRainIntensity(float intensity) { * * This function permits you to turn off the rain to snow. */ -void SGPrecipitation::setFreezing(bool freeze) { - this->_freeze = freeze; +void SGPrecipitation::setFreezing(bool freeze) +{ + this->_freeze = freeze; } @@ -140,17 +139,18 @@ void SGPrecipitation::setFreezing(bool freeze) { * 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; +void SGPrecipitation::setWindProperty(double heading, double speed) +{ + double x, y, z; - heading = (heading + 180) * SGD_DEGREES_TO_RADIANS; - speed = speed * SG_FEET_TO_METER; + heading = (heading + 180) * SGD_DEGREES_TO_RADIANS; + speed = speed * SG_FEET_TO_METER; - x = -cos(heading) * speed; - y = sin(heading) * speed; - z = 0; + x = -cos(heading) * speed; + y = sin(heading) * speed; + z = 0; - this->_wind_vec = osg::Vec3(x, y, z); + this->_wind_vec = osg::Vec3(x, y, z); } @@ -163,43 +163,41 @@ void SGPrecipitation::setWindProperty(double heading, double speed) { * * 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); +bool SGPrecipitation::update(void) +{ + if (this->_freeze) { + if (this->_rain_intensity > 0) + this->_snow_intensity = this->_rain_intensity; + } + + if (_enabled && 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->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->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->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 (_enabled && 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->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->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; -} + _precipitationEffect->setParticleColor( osg::Vec4(0x7A, 0xCE, 0xFF, 0x80)); + } else { + _precipitationEffect->snow(0); + _precipitationEffect->rain(0); + } + return true; +}