Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

raise the number:)

File size: 6.6 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);
33
34SHELL_COMMAND(startRaining, RainEffect, startRaining);
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 = 3000;
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       
213}
214
215void RainEffect::startRaining() {
216
217        if (this->rainActivate)
218                this->deactivate();
219
220        if (!this->rainFadeInDuration > 0)
221                this->rainFadeInDuration = 20;
222
223        this->localTimer = 0;
224        this->activate();
225
226}
Note: See TracBrowser for help on using the repository browser.