Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/graphics/effects/rain_effect.cc @ 8824

Last change on this file since 8824 was 8793, checked in by patrick, 18 years ago

trunk: merged the weather engine branche to the trunk

File size: 9.3 KB
RevLine 
[7561]1/*
[8793]2  orxonox - the future of 3D-vertical-scrollers
3 
4  Copyright (C) 2004 orx
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2, or (at your option)
9  any later version.
10 
[7561]11### File Specific:
[8793]12  main-programmer: hdavid, amaechler
[7561]13*/
14
15#include "rain_effect.h"
16
17#include "util/loading/load_param.h"
18#include "util/loading/factory.h"
[7646]19#include "util/loading/resource_manager.h"
[7561]20
21#include "glincl.h"
[7652]22#include "p_node.h"
[7562]23#include "state.h"
[7628]24#include "spark_particles.h"
25#include "plane_emitter.h"
[7696]26#include "shell_command.h"
[8255]27#include "light.h"
[8793]28#include "cloud_effect.h"
[7562]29
30#include "parser/tinyxml/tinyxml.h"
31
[8793]32// Define shell commands
[7696]33SHELL_COMMAND(activate, RainEffect, activateRain);
34SHELL_COMMAND(deactivate, RainEffect, deactivateRain);
[8495]35SHELL_COMMAND(startraining, RainEffect, startRaining);
36SHELL_COMMAND(stopraining, RainEffect, stopRaining);
[7577]37
[7561]38using namespace std;
39
40CREATE_FACTORY(RainEffect, CL_RAIN_EFFECT);
41
[8793]42/**
43 * @brief standard constructor
44 */
45RainEffect::RainEffect(const TiXmlElement* root)
46{
47  this->setClassID(CL_RAIN_EFFECT, "RainEffect");
[8255]48
[8793]49  this->init();
[7561]50
[8793]51  if (root != NULL)
52    this->loadParams(root);
[7561]53
[8793]54  //load rain sound
55  if (this->rainBuffer != NULL)
56    ResourceManager::getInstance()->unload(this->rainBuffer);
57  this->rainBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/atmosphere/rain.wav", WAV);
[7646]58
[8793]59  //load wind sound
60  if (this->rainWindForce != 0)
61  {
62    if (this->windBuffer != NULL)
63      ResourceManager::getInstance()->unload(this->windBuffer);
64    this->windBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/atmosphere/wind.wav", WAV);
65  }
[7646]66
[8793]67  if(rainActivate)
68  {
69    this->activate();
70    RainEffect::rainParticles->precache((int)this->rainLife * 2);
71  }
[7561]72}
73
[8793]74/**
75 * @brief standard deconstructor
76 */
77RainEffect::~RainEffect()
78{
79  this->deactivate();
[7696]80
[8793]81  if (this->rainBuffer != NULL)
82    ResourceManager::getInstance()->unload(this->rainBuffer);
[7696]83
[8793]84  if (this->windBuffer != NULL)
85    ResourceManager::getInstance()->unload(this->windBuffer);
[7561]86}
87
[8793]88/**
89 * @brief initalizes the rain effect with default values
90 */
91void RainEffect::init()
92{
93  //Default values
94  this->rainActivate = false;
95  this->rainMove = false;
96  this->rainCoord = Vector(500, 500, 500);
97  this->rainSize = Vector2D(1000, 1000);
98  this->rainRate = 4000;
99  this->rainVelocity = -300;
100  this->rainLife = 4;
101  this->rainWindForce  = 0;
102  this->rainFadeInDuration = 0;
103  this->rainFadeOutDuration = 0;
104 
105  this->cloudColor = Vector(0.8f, 0.8f, 0.8f);
106  this->skyColor = Vector(0.0f, 0.0f, 0.0f);
[7561]107
[8793]108  this->rainMaxParticles = this->rainRate * this->rainLife;
109  this->localTimer = 0;
110  this->soundRainVolume = 0.3f;
111  this->emitter = new PlaneEmitter(this->rainSize);
[8255]112
[8793]113  lightMan = LightManager::getInstance();
114  this->rainAmbient = lightMan->getAmbientColor();
[7628]115}
[7561]116
[8793]117/**
118 * @brief loads the rain effect parameters.
119 * @param root: the XML-Element to load the data from
120 */
121void RainEffect::loadParams(const TiXmlElement* root)
122{
123  WeatherEffect::loadParams(root);
[7561]124
[8793]125  LoadParam(root, "coord", this, RainEffect, setRainCoord);
126  LoadParam(root, "size", this, RainEffect, setRainSize);
127  LoadParam(root, "rate", this, RainEffect, setRainRate);
128  LoadParam(root, "velocity", this, RainEffect, setRainVelocity);
129  LoadParam(root, "life", this, RainEffect, setRainLife);
130  LoadParam(root, "wind", this, RainEffect, setRainWind);
131  LoadParam(root, "fadeinduration", this, RainEffect, setRainFadeIn);
132  LoadParam(root, "fadeoutduration", this, RainEffect, setRainFadeOut);
133  LoadParam(root, "cloudcolor", this, RainEffect, setCloudColor);
134  LoadParam(root, "skycolor", this, RainEffect, setSkyColor);
[7646]135
[8793]136  LOAD_PARAM_START_CYCLE(root, element);
137  {
138    LoadParam_CYCLE(element, "option", this, RainEffect, setRainOption);
139  }
140  LOAD_PARAM_END_CYCLE(element);
[7561]141}
142
[7577]143SparkParticles* RainEffect::rainParticles = NULL;
[7561]144
[8793]145/**
146 * @brief activates the rain effect
147 */
148void RainEffect::activate()
149{
150  PRINTF(0)( "Activating RainEffect, coord: %f, %f, %f, size: %f, %f, rate: %f, velocity: %f, moveRain: %s\n", this->rainCoord.x, this->rainCoord.y, this->rainCoord.z, this->rainSize.x, this-> rainSize.y, this->rainRate, this->rainVelocity, this->rainMove ? "true" : "false" );
[7577]151
[8793]152  this->rainActivate = true;
[8255]153
[8793]154  if (unlikely(RainEffect::rainParticles == NULL))
155  {
156    RainEffect::rainParticles = new SparkParticles((int) this->rainMaxParticles);
157    RainEffect::rainParticles->setName("RainParticles");
158    RainEffect::rainParticles->setLifeSpan(this->rainLife, 2);
159    RainEffect::rainParticles->setRadius(0, 0.03);
160    RainEffect::rainParticles->setRadius(0.2, 0.02);
161    RainEffect::rainParticles->setRadius(1, 0.01);
162    RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2); // grey blue 1
163    RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2); // grey blue 2
164    RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2); // light grey
165  }
[7577]166
[8793]167  this->emitter->setSystem(RainEffect::rainParticles);
[7577]168
[8793]169  this->emitter->setRelCoor(this->rainCoord);
[7577]170
[8793]171  this->emitter->setEmissionRate(this->rainRate);
172  this->emitter->setEmissionVelocity(this->rainVelocity);
[7628]173
[8793]174  this->emitter->setSpread(this->rainWindForce / 50, 0.2);
[8316]175
[8793]176  // plays the rain sound and loops it
177  this->soundSource.play(this->rainBuffer, this->soundRainVolume, true);
[8255]178
[8793]179  // if there is wind, play the wind sound
180  if (this->rainWindForce != 0)
181    this->soundSource.play(this->windBuffer, 0.1f * this->rainWindForce, true);
[8316]182
[8793]183  if (this->rainFadeInDuration == 0)
184    lightMan->setAmbientColor(.1,.1,.1);
185 
186  // Change the cloudcolor,skycolor
187  this->oldCloudColor = CloudEffect::cloudColor;
188  this->oldSkyColor = CloudEffect::skyColor;
189  CloudEffect::changeCloudColor(this->cloudColor);
190  CloudEffect::changeSkyColor(this->skyColor);
[7561]191}
192
[8793]193/**
194 * @brief deactivates the rain effect
195 */
196void RainEffect::deactivate()
197{
198  PRINTF(0)("Deactivating RainEffect\n");
[7561]199
[8793]200  this->rainActivate = false;
201  this->emitter->setSystem(NULL);
[8316]202
[8793]203  // Stop Sound
204  this->soundSource.stop();
[7577]205
[8793]206  // Restore Light Ambient
207  lightMan->setAmbientColor(this->rainAmbient, this->rainAmbient, this->rainAmbient);
208 
209  CloudEffect::changeCloudColor(this->oldCloudColor);
210  CloudEffect::changeSkyColor(this->oldSkyColor);
211}
[7646]212
[8793]213/**
214 * @brief ticks the rain effect
215 * @param dt: tick float
216 */
217void RainEffect::tick (float dt)
218{
219  if (!this->rainActivate)
220    return;
[8316]221
[8793]222  if (this->rainMove)
223  {
224    this->rainCoord = State::getCameraNode()->getAbsCoor();
225    this->emitter->setRelCoor(this->rainCoord.x , this->rainCoord.y+800, this->rainCoord.z);
226  }
[7696]227
[8793]228  if (this->rainFadeInDuration != 0 && this->localTimer < this->rainFadeInDuration)
229  {
230    this->localTimer += dt;
231    float progress = this->localTimer / this->rainFadeInDuration;
[8316]232
[8793]233    // Dim Light
234    lightMan->setAmbientColor(1 - progress * 0.9, 1 - progress * 0.9, 1 - progress * 0.9);
[8255]235
[8793]236    // use alpha in color to fade in
237    RainEffect::rainParticles->setColor(0,   0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1
238    RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2
239    RainEffect::rainParticles->setColor(1,   0.7, 0.7, 0.7, 0.2 * progress); // light grey
[8255]240
[8793]241    // increase radius for more "heavy" rain
242    RainEffect::rainParticles->setRadius(0, 0.03 * progress);
243    RainEffect::rainParticles->setRadius(0.2, 0.02 * progress);
244    RainEffect::rainParticles->setRadius(1, 0.01 * progress);
[8255]245
[8793]246    // increase sound volume
247    if (!this->soundSource.isPlaying())
248      this->soundSource.play(this->rainBuffer, this->soundRainVolume, true);
[8255]249
[8793]250    this->soundSource.gain(this->rainBuffer, this->soundRainVolume * progress);
251  }
252  else if ( this->rainFadeOutDuration != 0 )
253  {
254    if ( this->localTimer < this->rainFadeOutDuration )
255    {
256      this->localTimer += dt;
257      float progress = 1 - (this->localTimer / this->rainFadeOutDuration);
[8255]258
[8793]259      // Fade In Light
260      lightMan->setAmbientColor(1 - progress * 0.9, 1 - progress * 0.9, 1 - progress * 0.9);
[8316]261
[8793]262      // use alpha in color to fade out
263      RainEffect::rainParticles->setColor(0,   0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1
264      RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2
265      RainEffect::rainParticles->setColor(1,   0.7, 0.7, 0.7, 0.2 * progress); // light grey
[8495]266
[8793]267      // decrease radius
268      RainEffect::rainParticles->setRadius(0, 0.03 * progress);
269      RainEffect::rainParticles->setRadius(0.2, 0.02 * progress);
270      RainEffect::rainParticles->setRadius(1, 0.01 * progress);
[8495]271
[8793]272      // decrease sound volume
273      if (!this->soundSource.isPlaying())
274        this->soundSource.play(this->rainBuffer, this->soundRainVolume, true);
[8495]275
[8793]276      this->soundSource.gain(this->rainBuffer, this->soundRainVolume * progress);
[8495]277    }
[8793]278    else
279      this->deactivate();
280  }
[7646]281}
[8255]282
[8793]283/**
284 * @brief starts raining slowly
285*/
286void RainEffect::startRaining()
287{
[8255]288
[8793]289  if (this->rainActivate)
290    this->deactivate();
[8255]291
[8793]292  if (!this->rainFadeInDuration > 0)
293    this->rainFadeInDuration = 20;
[8255]294
[8793]295  this->localTimer = 0;
[8495]296
[8793]297  this->activate();
[8255]298}
[8495]299
[8793]300/**
301 * @brief stops raining slowly
302 */
303void RainEffect::stopRaining()
304{
[8495]305
[8793]306  if (!this->rainActivate)
307    this->activate();
[8495]308
[8793]309  if (!this->rainFadeOutDuration > 0)
310    this->rainFadeOutDuration = 20;
[8495]311
[8793]312  this->localTimer = 0;
313}
[8495]314
[8793]315/**
316 * @brief hides the rain
317 */
318void RainEffect::hideRain()
319{
320  RainEffect::rainParticles->setColor(0, 0,0,0, 0);
321  RainEffect::rainParticles->setColor(0, 0,0,0, 0);
[8495]322}
Note: See TracBrowser for help on using the repository browser.