]> git.mxchange.org Git - simgear.git/blob - simgear/environment/precipitation.cxx
Remove unused class SGEnviro
[simgear.git] / simgear / environment / precipitation.cxx
1 /**
2  * @file precipitation.cxx
3  * @author Nicolas VIVIEN
4  * @date 2008-02-10
5  *
6  * @note Copyright (C) 2008 Nicolas VIVIEN
7  *
8  * @brief Precipitation effects to draw rain and snow.
9  *
10  * @par Licences
11  *   This program is free software; you can redistribute it and/or
12  *   modify it under the terms of the GNU General Public License as
13  *   published by the Free Software Foundation; either version 2 of the
14  *   License, or (at your option) any later version.
15  *
16  *   This program is distributed in the hope that it will be useful, but
17  *   WITHOUT ANY WARRANTY; without even the implied warranty of
18  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  *   General Public License for more details.
20  *
21  *   You should have received a copy of the GNU General Public License
22  *   along with this program; if not, write to the Free Software
23  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
24  *
25  */
26
27 #include "precipitation.hxx"
28 //#include "visual_enviro.hxx"
29
30 #include <simgear/constants.h>
31 #include <osg/ClipNode>
32
33 /**
34  * @brief SGPrecipitation constructor
35  *
36  * Build a new OSG object from osgParticle.
37  */
38 SGPrecipitation::SGPrecipitation() :
39     _freeze(false), _enabled(true), _snow_intensity(0.0), _rain_intensity(0.0), _clip_distance(5.0)
40 {
41     _precipitationEffect = new osgParticle::PrecipitationEffect;
42 }
43
44 void SGPrecipitation::setEnabled( bool value )
45 {
46     _enabled = value;
47 }
48
49 bool SGPrecipitation::getEnabled() const
50 {
51     return _enabled;
52 }
53
54 /**
55  * @brief Build and add the object "precipitationEffect"
56  *
57  * This function permits you to create an object precipitationEffect and initialize it.
58  * I define by default the color of water (for raining)
59  */
60 osg::Group* SGPrecipitation::build(void)
61 {
62     osg::Group* group = new osg::Group;
63
64     _precipitationEffect->snow(0);      
65     _precipitationEffect->rain(0);      
66
67     if (_clip_distance!=0.0)
68     {    
69         osg::ref_ptr<osg::ClipNode> clipNode = new osg::ClipNode;
70         clipNode->addClipPlane( new osg::ClipPlane( 0 ) );
71         clipNode->getClipPlane(0)->setClipPlane( 0.0, 0.0, -1.0, -_clip_distance );
72         clipNode->setReferenceFrame(osg::ClipNode::ABSOLUTE_RF);
73         clipNode->addChild(_precipitationEffect.get());
74
75         group->addChild(clipNode.get());
76     }
77     else
78     {
79         group->addChild(_precipitationEffect.get());
80     }
81
82     return group;
83 }
84
85
86 /**
87  * @brief Define the snow intensity
88  *
89  * This function permits you to define and change the snow intensity
90  * The param 'intensity' is normed (0 to 1).
91  */
92 void SGPrecipitation::setSnowIntensity(float intensity)
93 {
94     if (this->_snow_intensity < intensity-0.001)
95         this->_snow_intensity += 0.001;
96     else if (this->_snow_intensity > intensity+0.001)
97         this->_snow_intensity -= 0.001;
98     else
99         this->_snow_intensity = intensity;
100 }
101
102
103 /**
104  * @brief Define the rain intensity
105  *
106  * This function permits you to define and change the rain intensity
107  * The param 'intensity' is normed (0 to 1).
108  */
109 void SGPrecipitation::setRainIntensity(float intensity)
110 {
111     if (this->_rain_intensity < intensity-0.001)
112         this->_rain_intensity += 0.001;
113     else if (this->_rain_intensity > intensity+0.001)
114         this->_rain_intensity -= 0.001;
115     else
116         this->_rain_intensity = intensity;
117 }
118
119
120 /** 
121  * @brief Freeze the rain to snow
122  * 
123  * @param freeze Boolean 
124  * 
125  * This function permits you to turn off the rain to snow.
126  */
127 void SGPrecipitation::setFreezing(bool freeze)
128 {
129     this->_freeze = freeze;
130 }
131
132
133 /**
134  * @brief Define the wind direction and speed
135  *
136  * This function permits you to define and change the wind direction
137  * 
138  * After apply the MatrixTransform to the osg::Precipitation object,
139  * x points full south... From wind heading and speed, we can calculate
140  * the wind vector.
141  */
142 void SGPrecipitation::setWindProperty(double heading, double speed)
143 {
144     double x, y, z;
145
146     heading = (heading + 180) * SGD_DEGREES_TO_RADIANS;
147     speed = speed * SG_FEET_TO_METER;
148
149     x = -cos(heading) * speed;
150     y = sin(heading) * speed;
151     z = 0;
152
153     this->_wind_vec = osg::Vec3(x, y, z);
154 }
155
156
157 /**
158  * @brief Update the precipitation effects
159  *
160  * This function permits you to update the precipitation effects.
161  * Be careful, if snow and rain intensity are greater than '0', snow effect
162  * will be first.
163  *
164  * The settings come from the osgParticule/PrecipitationEffect.cpp exemple.
165  */
166 bool SGPrecipitation::update(void)
167 {
168     if (this->_freeze) {
169         if (this->_rain_intensity > 0) 
170             this->_snow_intensity = this->_rain_intensity;
171     }
172
173     if (_enabled && this->_snow_intensity > 0) {
174         _precipitationEffect->setWind(_wind_vec);
175         _precipitationEffect->setParticleSpeed( -0.75f - 0.25f*_snow_intensity);
176                 
177         _precipitationEffect->setParticleSize(0.02f + 0.03f*_snow_intensity);
178         _precipitationEffect->setMaximumParticleDensity(_snow_intensity * 7.2f);
179         _precipitationEffect->setCellSize(osg::Vec3(5.0f / (0.25f+_snow_intensity), 5.0f / (0.25f+_snow_intensity), 5.0f));
180                 
181         _precipitationEffect->setNearTransition(25.f);
182         _precipitationEffect->setFarTransition(100.0f - 60.0f*sqrtf(_snow_intensity));
183                 
184         _precipitationEffect->setParticleColor(osg::Vec4(0.85, 0.85, 0.85, 1.0) - osg::Vec4(0.1, 0.1, 0.1, 1.0) * _snow_intensity);
185     } else if (_enabled && this->_rain_intensity > 0) {
186         _precipitationEffect->setWind(_wind_vec);
187         _precipitationEffect->setParticleSpeed( -2.0f + -5.0f*_rain_intensity);
188                 
189         _precipitationEffect->setParticleSize(0.01 + 0.02*_rain_intensity);
190         _precipitationEffect->setMaximumParticleDensity(_rain_intensity * 7.5f);
191         _precipitationEffect->setCellSize(osg::Vec3(5.0f / (0.25f+_rain_intensity), 5.0f / (0.25f+_rain_intensity), 5.0f));
192                 
193         _precipitationEffect->setNearTransition(25.f);
194         _precipitationEffect->setFarTransition(100.0f - 60.0f*sqrtf(_rain_intensity));
195                 
196         _precipitationEffect->setParticleColor( osg::Vec4(0x7A, 0xCE, 0xFF, 0x80));
197     } else {
198         _precipitationEffect->snow(0);  
199         _precipitationEffect->rain(0);  
200     }
201
202     return true;
203 }