Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 8261 was 8255, checked in by bensch, 19 years ago

merged the atmos back with command: https://svn.orxonox.net/orxonox/branches/atmospheric_engine

File size: 6.4 KB
RevLine 
[7561]1/*
[8255]2orxonox - the future of 3D-vertical-scrollers
[7561]3
[8255]4Copyright (C) 2004 orx
[7561]5
[8255]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.
[7561]10
11### File Specific:
[8255]12main-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"
[7562]28
29#include "parser/tinyxml/tinyxml.h"
30
[7696]31SHELL_COMMAND(activate, RainEffect, activateRain);
32SHELL_COMMAND(deactivate, RainEffect, deactivateRain);
[7577]33
[8255]34SHELL_COMMAND(startRaining, RainEffect, startRaining);
35
[7561]36using namespace std;
37
38CREATE_FACTORY(RainEffect, CL_RAIN_EFFECT);
39
[8255]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
[7561]42RainEffect::RainEffect(const TiXmlElement* root)
43{
[7652]44        this->setClassID(CL_RAIN_EFFECT, "RainEffect");
[7561]45
[7652]46        this->init();
[7561]47
[7652]48        if (root != NULL)
49                this->loadParams(root);
[7646]50
[7696]51        //load rain sound
[7652]52        if (this->rainBuffer != NULL)
53                ResourceManager::getInstance()->unload(this->rainBuffer);
[7810]54        this->rainBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/rain.wav", WAV);
[7646]55
[7696]56        //load wind sound
[8255]57        if (this->rainWindForce != 0) {
[7696]58                if (this->windBuffer != NULL)
59                        ResourceManager::getInstance()->unload(this->windBuffer);
[7810]60                this->windBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/wind.wav", WAV);
[7696]61        }
62
[8255]63        if(rainActivate)
64                this->activate();
[7561]65}
66
67RainEffect::~RainEffect()
68{
[7652]69        this->deactivate();
[7696]70
71        if (this->rainBuffer != NULL)
72                ResourceManager::getInstance()->unload(this->rainBuffer);
73
74        if (this->windBuffer != NULL)
75                ResourceManager::getInstance()->unload(this->windBuffer);
[7561]76}
77
78void RainEffect::loadParams(const TiXmlElement* root)
79{
[7628]80        WeatherEffect::loadParams(root);
[7561]81
[7628]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);
[7652]86        LoadParam(root, "life", this, RainEffect, setRainLife);
[7682]87        LoadParam(root, "wind", this, RainEffect, setRainWind);
[8255]88        LoadParam(root, "startraining", this, RainEffect, setRainStart);
89
90        LOAD_PARAM_START_CYCLE(root, element);
91        {
92                LoadParam_CYCLE(element, "option", this, RainEffect, setRainOption);
93        }
94        LOAD_PARAM_END_CYCLE(element);
95
[7628]96}
[7561]97
98
[7628]99bool RainEffect::init()
100{
[7652]101        //Default values
[8255]102        this->rainActivate = false;
103        this->rainMove = false;
[7652]104        this->rainCoord = Vector(500, 500, 500);
105        this->rainSize = Vector2D(1000, 1000);
[7682]106        this->rainRate = 3000;
[7652]107        this->rainVelocity = -300;
[7682]108        this->rainLife = 4;
109        this->rainMaxParticles = this->rainRate * this->rainLife;
[7685]110        this->rainWindForce  = 0;
[8255]111        this->rainStartDuration = 0;
112        this->localTimer = 0;
113        this->soundRainVolume = 0.8f;
[7646]114
[7652]115        this->emitter = new PlaneEmitter(this->rainSize);
[8255]116
117        lightMan = LightManager::getInstance();
118        this->rainAmbient = lightMan->getAmbientColor();
[7561]119}
120
121
[7577]122SparkParticles* RainEffect::rainParticles = NULL;
[7561]123
124bool RainEffect::activate()
125{
[7652]126        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]127
[8255]128        this->rainActivate = true;
129
[7577]130        if (unlikely(RainEffect::rainParticles == NULL))
131        {
[7682]132                RainEffect::rainParticles = new SparkParticles((int) this->rainMaxParticles);
[7577]133                RainEffect::rainParticles->setName("RainParticles");
[7682]134                RainEffect::rainParticles->precache((int)this->rainLife);
[7652]135                RainEffect::rainParticles->setLifeSpan(this->rainLife, 2);
[7682]136                RainEffect::rainParticles->setRadius(0, 0.03);
137                RainEffect::rainParticles->setRadius(0.2, 0.02);
138                RainEffect::rainParticles->setRadius(1, 0.01);
[8255]139                RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2);     // grey blue 1
140                RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2);   // grey blue 2
141                RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2);     // light grey
[7577]142        }
143
144        this->emitter->setSystem(RainEffect::rainParticles);
145
[7628]146        this->emitter->setRelCoor(this->rainCoord);
[7577]147
[7628]148        this->emitter->setEmissionRate(this->rainRate);
[7646]149        this->emitter->setEmissionVelocity(this->rainVelocity);
[7628]150
[7685]151        this->emitter->setSpread(this->rainWindForce / 50, 0.2);
[7696]152       
[8255]153        this->soundSource.loop(this->rainBuffer, this->soundRainVolume);
154        if (this->rainWindForce != 0) this->soundSource.loop(this->windBuffer, 0.1f * this->rainWindForce);
155
156        lightMan->setAmbientColor(.1,.1,.1);
[7561]157}
158
159
160bool RainEffect::deactivate()
161{
[7652]162        PRINTF(0)("Deactivating RainEffect\n");
[8255]163       
164        this->rainActivate = false;
[7696]165        this->emitter->setSystem(NULL);
[7577]166
[8255]167        // Stop Sound
[7696]168        this->soundSource.stop();
[7646]169
[8255]170        // Restore Light Ambient
171        lightMan->setAmbientColor(this->rainAmbient, this->rainAmbient, this->rainAmbient);
[7696]172}
173
[7646]174void RainEffect::tick (float dt)
175{
[8255]176        if (!this->rainActivate)
177                return;
178               
[7685]179        if (this->rainMove) {
180                this->rainCoord = State::getCameraNode()->getAbsCoor();
[7691]181                this->emitter->setRelCoor(this->rainCoord.x , this->rainCoord.y+800, this->rainCoord.z);
[7685]182        }
[8255]183
184        if (this->rainStartDuration != 0 && this->localTimer < this->rainStartDuration) {
185                this->localTimer += dt;
186                float progress = this->localTimer / this->rainStartDuration;
187
188                // Dim Light
189                lightMan->setAmbientColor(1.1 - progress, 1.1 - progress, 1.1 - progress);
190
191                // use alpha in color to fade in
192                RainEffect::rainParticles->setColor(0,   0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1
193                RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2
194                RainEffect::rainParticles->setColor(1,   0.7, 0.7, 0.7, 0.2 * progress); // light grey
195
196                // increase radius for more "heavy" rain
197                RainEffect::rainParticles->setRadius(0, 0.03 * progress);
198                RainEffect::rainParticles->setRadius(0.2, 0.02 * progress);
199                RainEffect::rainParticles->setRadius(1, 0.01 * progress);
200
201                // increase sound volume
202                // this->soundSource.fadein(this->rainBuffer, 10);
203        }
204       
[7646]205}
[8255]206
207void RainEffect::startRaining() {
208
209        if (this->rainActivate)
210                this->deactivate();
211
212        this->rainStartDuration = 10;
213        this->localTimer = 0;
214        this->activate();
215
216}
Note: See TracBrowser for help on using the repository browser.