Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/atmospheric_engine/src/lib/graphics/effects/rain_effect.cc @ 8356

Last change on this file since 8356 was 8356, checked in by amaechler, 18 years ago

branches/atmospheric_engine: fadeins generalized

File size: 7.7 KB
Line 
1/*
2orxonox - the future of 3D-vertical-scrollers
3
4Copyright (C) 2004 orx
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11### File Specific:
12main-programmer: hdavid, amaechler
13*/
14
15#include "rain_effect.h"
16
17#include "util/loading/load_param.h"
18#include "util/loading/factory.h"
19#include "util/loading/resource_manager.h"
20
21#include "glincl.h"
22#include "p_node.h"
23#include "state.h"
24#include "spark_particles.h"
25#include "plane_emitter.h"
26#include "shell_command.h"
27#include "light.h"
28
29#include "parser/tinyxml/tinyxml.h"
30
31SHELL_COMMAND(activate, RainEffect, activateRain);
32SHELL_COMMAND(deactivate, RainEffect, deactivateRain);
33SHELL_COMMAND(startraining, RainEffect, startRaining);
34SHELL_COMMAND(stopraining, RainEffect, stopRaining);
35
36using namespace std;
37
38CREATE_FACTORY(RainEffect, CL_RAIN_EFFECT);
39
40// TODO: Dim Light with Rain, Finish preCaching, check out if multiple rain emitters work,  Think about what happens with building poss. to hang movewithcam off, benchmark, possible to activate lightening, turn off visibility when in a building, variable emitter size depending on playable, also rain velocity
41
42RainEffect::RainEffect(const TiXmlElement* root)
43{
44        this->setClassID(CL_RAIN_EFFECT, "RainEffect");
45
46        this->init();
47
48        if (root != NULL)
49                this->loadParams(root);
50
51        //load rain sound
52        if (this->rainBuffer != NULL)
53                ResourceManager::getInstance()->unload(this->rainBuffer);
54        this->rainBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/atmosphere/rain.wav", WAV);
55
56        //load wind sound
57        if (this->rainWindForce != 0) {
58                if (this->windBuffer != NULL)
59                        ResourceManager::getInstance()->unload(this->windBuffer);
60                this->windBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/atmosphere/wind.wav", WAV);
61        }
62
63        if(rainActivate)
64                this->activate();
65}
66
67RainEffect::~RainEffect()
68{
69        this->deactivate();
70
71        if (this->rainBuffer != NULL)
72                ResourceManager::getInstance()->unload(this->rainBuffer);
73
74        if (this->windBuffer != NULL)
75                ResourceManager::getInstance()->unload(this->windBuffer);
76}
77
78void RainEffect::loadParams(const TiXmlElement* root)
79{
80        WeatherEffect::loadParams(root);
81
82        LoadParam(root, "coord", this, RainEffect, setRainCoord);
83        LoadParam(root, "size", this, RainEffect, setRainSize);
84        LoadParam(root, "rate", this, RainEffect, setRainRate);
85        LoadParam(root, "velocity", this, RainEffect, setRainVelocity);
86        LoadParam(root, "life", this, RainEffect, setRainLife);
87        LoadParam(root, "wind", this, RainEffect, setRainWind);
88        LoadParam(root, "fadeinduration", this, RainEffect, setRainFadeIn);
89        LoadParam(root, "fadeoutduration", this, RainEffect, setRainFadeOut);
90
91        LOAD_PARAM_START_CYCLE(root, element);
92        {
93                LoadParam_CYCLE(element, "option", this, RainEffect, setRainOption);
94        }
95        LOAD_PARAM_END_CYCLE(element);
96
97}
98
99
100bool RainEffect::init()
101{
102        //Default values
103        this->rainActivate = false;
104        this->rainMove = false;
105        this->rainCoord = Vector(500, 500, 500);
106        this->rainSize = Vector2D(1000, 1000);
107        this->rainRate = 4000;
108        this->rainVelocity = -300;
109        this->rainLife = 4;
110        this->rainMaxParticles = this->rainRate * this->rainLife;
111        this->rainWindForce  = 0;
112        this->rainFadeInDuration = 0;
113        this->rainFadeOutDuration = 0;
114        this->localTimer = 0;
115        this->soundRainVolume = 0.8f;
116
117        this->emitter = new PlaneEmitter(this->rainSize);
118
119        lightMan = LightManager::getInstance();
120        this->rainAmbient = lightMan->getAmbientColor();
121
122        return 0;
123}
124
125
126SparkParticles* RainEffect::rainParticles = NULL;
127
128bool RainEffect::activate()
129{
130        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" );
131
132        this->rainActivate = true;
133
134        if (unlikely(RainEffect::rainParticles == NULL))
135        {
136                RainEffect::rainParticles = new SparkParticles((int) this->rainMaxParticles);
137                RainEffect::rainParticles->setName("RainParticles");
138                RainEffect::rainParticles->precache((int)this->rainLife);
139                RainEffect::rainParticles->setLifeSpan(this->rainLife, 2);
140                RainEffect::rainParticles->setRadius(0, 0.03);
141                RainEffect::rainParticles->setRadius(0.2, 0.02);
142                RainEffect::rainParticles->setRadius(1, 0.01);
143                RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2);     // grey blue 1
144                RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2);   // grey blue 2
145                RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2);     // light grey
146        }
147
148        this->emitter->setSystem(RainEffect::rainParticles);
149
150        this->emitter->setRelCoor(this->rainCoord);
151
152        this->emitter->setEmissionRate(this->rainRate);
153        this->emitter->setEmissionVelocity(this->rainVelocity);
154
155        this->emitter->setSpread(this->rainWindForce / 50, 0.2);
156       
157        this->soundSource.loop(this->rainBuffer, this->soundRainVolume);
158        if (this->rainWindForce != 0) this->soundSource.loop(this->windBuffer, 0.1f * this->rainWindForce);
159
160        lightMan->setAmbientColor(.1,.1,.1);
161
162        return 0;
163}
164
165
166bool RainEffect::deactivate()
167{
168        PRINTF(0)("Deactivating RainEffect\n");
169       
170        this->rainActivate = false;
171        this->emitter->setSystem(NULL);
172
173        // Stop Sound
174        this->soundSource.stop();
175
176        // Restore Light Ambient
177        lightMan->setAmbientColor(this->rainAmbient, this->rainAmbient, this->rainAmbient);
178
179        return 0;
180}
181
182void RainEffect::tick (float dt)
183{
184        if (!this->rainActivate)
185                return;
186               
187        if (this->rainMove) {
188                this->rainCoord = State::getCameraNode()->getAbsCoor();
189                this->emitter->setRelCoor(this->rainCoord.x , this->rainCoord.y+800, this->rainCoord.z);
190        }
191
192        if (this->rainFadeInDuration != 0 && this->localTimer < this->rainFadeInDuration) {
193                this->localTimer += dt;
194                float progress = this->localTimer / this->rainFadeInDuration;
195
196                // Dim Light
197                lightMan->setAmbientColor(1.1 - progress, 1.1 - progress, 1.1 - progress);
198
199                // use alpha in color to fade in
200                RainEffect::rainParticles->setColor(0,   0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1
201                RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2
202                RainEffect::rainParticles->setColor(1,   0.7, 0.7, 0.7, 0.2 * progress); // light grey
203
204                // increase radius for more "heavy" rain
205                RainEffect::rainParticles->setRadius(0, 0.03 * progress);
206                RainEffect::rainParticles->setRadius(0.2, 0.02 * progress);
207                RainEffect::rainParticles->setRadius(1, 0.01 * progress);
208
209                // increase sound volume
210                // this->soundSource.fadein(this->rainBuffer, 10);
211        }
212        else if (this->rainFadeOutDuration != 0 && this->localTimer < this->rainFadeOutDuration) {
213                this->localTimer += dt;
214                float progress = 1 - (this->localTimer / this->rainFadeOutDuration);
215
216                // Dim Light
217                lightMan->setAmbientColor(1.1 - progress, 1.1 - progress, 1.1 - progress);
218
219                // use alpha in color to fade in
220                RainEffect::rainParticles->setColor(0,   0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1
221                RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2
222                RainEffect::rainParticles->setColor(1,   0.7, 0.7, 0.7, 0.2 * progress); // light grey
223
224                // increase radius for more "heavy" rain
225                RainEffect::rainParticles->setRadius(0, 0.03 * progress);
226                RainEffect::rainParticles->setRadius(0.2, 0.02 * progress);
227                RainEffect::rainParticles->setRadius(1, 0.01 * progress);
228
229                // increase sound volume
230                // this->soundSource.fadein(this->rainBuffer, 10);
231        }
232       
233}
234
235void RainEffect::startRaining() {
236
237        if (this->rainActivate)
238                this->deactivate();
239
240        if (!this->rainFadeInDuration > 0)
241                this->rainFadeInDuration = 20;
242
243        this->localTimer = 0;
244        this->activate();
245
246}
247
248void RainEffect::stopRaining() {
249
250        if (this->rainActivate)
251                this->deactivate();
252
253        if (!this->rainFadeOutDuration > 0)
254                this->rainFadeOutDuration = 20;
255
256        this->localTimer = 0;
257        this->activate();
258
259}
Note: See TracBrowser for help on using the repository browser.