Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 8317 was 8316, checked in by bensch, 18 years ago

trunk: fixed most -Wall warnings… but there are still many missing :/

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();
[8316]119
120        return true;
[7561]121}
122
123
[7577]124SparkParticles* RainEffect::rainParticles = NULL;
[7561]125
126bool RainEffect::activate()
127{
[7652]128        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]129
[8255]130        this->rainActivate = true;
131
[7577]132        if (unlikely(RainEffect::rainParticles == NULL))
133        {
[7682]134                RainEffect::rainParticles = new SparkParticles((int) this->rainMaxParticles);
[7577]135                RainEffect::rainParticles->setName("RainParticles");
[7682]136                RainEffect::rainParticles->precache((int)this->rainLife);
[7652]137                RainEffect::rainParticles->setLifeSpan(this->rainLife, 2);
[7682]138                RainEffect::rainParticles->setRadius(0, 0.03);
139                RainEffect::rainParticles->setRadius(0.2, 0.02);
140                RainEffect::rainParticles->setRadius(1, 0.01);
[8255]141                RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2);     // grey blue 1
142                RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2);   // grey blue 2
143                RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2);     // light grey
[7577]144        }
145
146        this->emitter->setSystem(RainEffect::rainParticles);
147
[7628]148        this->emitter->setRelCoor(this->rainCoord);
[7577]149
[7628]150        this->emitter->setEmissionRate(this->rainRate);
[7646]151        this->emitter->setEmissionVelocity(this->rainVelocity);
[7628]152
[7685]153        this->emitter->setSpread(this->rainWindForce / 50, 0.2);
[8316]154
[8255]155        this->soundSource.loop(this->rainBuffer, this->soundRainVolume);
156        if (this->rainWindForce != 0) this->soundSource.loop(this->windBuffer, 0.1f * this->rainWindForce);
157
158        lightMan->setAmbientColor(.1,.1,.1);
[8316]159
160        return true;
[7561]161}
162
163
164bool RainEffect::deactivate()
165{
[7652]166        PRINTF(0)("Deactivating RainEffect\n");
[8316]167
[8255]168        this->rainActivate = false;
[7696]169        this->emitter->setSystem(NULL);
[7577]170
[8255]171        // Stop Sound
[7696]172        this->soundSource.stop();
[7646]173
[8255]174        // Restore Light Ambient
175        lightMan->setAmbientColor(this->rainAmbient, this->rainAmbient, this->rainAmbient);
[8316]176
177        return true;
[7696]178}
179
[7646]180void RainEffect::tick (float dt)
181{
[8255]182        if (!this->rainActivate)
183                return;
[8316]184
[7685]185        if (this->rainMove) {
186                this->rainCoord = State::getCameraNode()->getAbsCoor();
[7691]187                this->emitter->setRelCoor(this->rainCoord.x , this->rainCoord.y+800, this->rainCoord.z);
[7685]188        }
[8255]189
190        if (this->rainStartDuration != 0 && this->localTimer < this->rainStartDuration) {
191                this->localTimer += dt;
192                float progress = this->localTimer / this->rainStartDuration;
193
194                // Dim Light
195                lightMan->setAmbientColor(1.1 - progress, 1.1 - progress, 1.1 - progress);
196
197                // use alpha in color to fade in
198                RainEffect::rainParticles->setColor(0,   0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1
199                RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2
200                RainEffect::rainParticles->setColor(1,   0.7, 0.7, 0.7, 0.2 * progress); // light grey
201
202                // increase radius for more "heavy" rain
203                RainEffect::rainParticles->setRadius(0, 0.03 * progress);
204                RainEffect::rainParticles->setRadius(0.2, 0.02 * progress);
205                RainEffect::rainParticles->setRadius(1, 0.01 * progress);
206
207                // increase sound volume
208                // this->soundSource.fadein(this->rainBuffer, 10);
209        }
[8316]210
[7646]211}
[8255]212
213void RainEffect::startRaining() {
214
215        if (this->rainActivate)
216                this->deactivate();
217
218        this->rainStartDuration = 10;
219        this->localTimer = 0;
220        this->activate();
221
222}
Note: See TracBrowser for help on using the repository browser.