Changeset 8905 in orxonox.OLD for branches/mountain_lake/src/lib/graphics/effects/rain_effect.cc
- Timestamp:
- Jun 29, 2006, 1:42:48 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/mountain_lake/src/lib/graphics/effects/rain_effect.cc
r8837 r8905 1 1 /* 2 2 orxonox - the future of 3D-vertical-scrollers 3 3 4 4 Copyright (C) 2004 orx 5 5 6 6 This program is free software; you can redistribute it and/or modify 7 7 it under the terms of the GNU General Public License as published by 8 8 the Free Software Foundation; either version 2, or (at your option) 9 9 any later version. 10 10 11 11 ### File Specific: 12 12 main-programmer: hdavid, amaechler 13 13 */ 14 15 #define DEBUG_SPECIAL_MODULE DEBUG_MODULE_GRAPHICS 14 16 15 17 #include "rain_effect.h" … … 43 45 * @brief standard constructor 44 46 */ 45 RainEffect::RainEffect(const TiXmlElement* root) 46 { 47 this->setClassID(CL_RAIN_EFFECT, "RainEffect"); 48 49 this->init(); 50 51 if (root != NULL) 52 this->loadParams(root); 53 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); 58 59 //load wind sound 60 if (this->rainWindForce != 0) 61 { 47 RainEffect::RainEffect(const TiXmlElement* root) { 48 this->setClassID(CL_RAIN_EFFECT, "RainEffect"); 49 50 this->init(); 51 52 if (root != NULL) 53 this->loadParams(root); 54 55 //load rain sound 56 if (this->rainBuffer != NULL) 57 ResourceManager::getInstance()->unload(this->rainBuffer); 58 this->rainBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/atmosphere/rain.wav", WAV); 59 60 //load wind sound 61 if (this->rainWindForce != 0) { 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 } 66 67 if(rainActivate) { 68 this->activate(); 69 RainEffect::rainParticles->precache((int)this->rainLife * 2); 70 } 71 } 72 73 /** 74 * @brief standard deconstructor 75 */ 76 RainEffect::~RainEffect() { 77 this->deactivate(); 78 79 if (this->rainBuffer != NULL) 80 ResourceManager::getInstance()->unload(this->rainBuffer); 81 62 82 if (this->windBuffer != NULL) 63 ResourceManager::getInstance()->unload(this->windBuffer); 64 this->windBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/atmosphere/wind.wav", WAV); 65 } 66 67 if(rainActivate) 68 { 69 this->activate(); 70 RainEffect::rainParticles->precache((int)this->rainLife * 2); 71 } 72 } 73 74 /** 75 * @brief standard deconstructor 76 */ 77 RainEffect::~RainEffect() 78 { 79 this->deactivate(); 80 81 if (this->rainBuffer != NULL) 82 ResourceManager::getInstance()->unload(this->rainBuffer); 83 84 if (this->windBuffer != NULL) 85 ResourceManager::getInstance()->unload(this->windBuffer); 83 ResourceManager::getInstance()->unload(this->windBuffer); 86 84 } 87 85 … … 89 87 * @brief initalizes the rain effect with default values 90 88 */ 91 void RainEffect::init() 92 { 93 //Default values94 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.6f, 0.6f, 0.6f);106 this->skyColor = Vector(0.0f, 0.0f, 0.0f); 107 108 this->rainMaxParticles = this->rainRate * this->rainLife;109 this->localTimer = 0; 110 this->soundRainVolume = 0.3f;111 this->emitter = new PlaneEmitter(this->rainSize);112 113 lightMan = LightManager::getInstance();114 this->rainAmbient = lightMan->getAmbientColor(); 89 void RainEffect::init() { 90 //Default values 91 this->rainActivate = false; 92 this->rainFadeInActivate = false; 93 this->rainFadeOutActivate = false; 94 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 = 10; 103 this->rainFadeOutDuration = 10; 104 105 this->cloudColor = Vector(0.6f, 0.6f, 0.6f); 106 this->skyColor = Vector(0.0f, 0.0f, 0.0f); 107 108 this->rainMaxParticles = this->rainRate * this->rainLife; 109 this->localTimer = 0; 110 this->soundRainVolume = 0.3f; 111 this->emitter = new PlaneEmitter(this->rainSize); 112 115 113 } 116 114 … … 119 117 * @param root: the XML-Element to load the data from 120 118 */ 121 void RainEffect::loadParams(const TiXmlElement* root) 122 { 123 WeatherEffect::loadParams(root); 124 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); 135 136 LOAD_PARAM_START_CYCLE(root, element); 137 { 138 LoadParam_CYCLE(element, "option", this, RainEffect, setRainOption); 139 } 140 LOAD_PARAM_END_CYCLE(element); 119 void RainEffect::loadParams(const TiXmlElement* root) { 120 WeatherEffect::loadParams(root); 121 122 LoadParam(root, "coord", this, RainEffect, setRainCoord); 123 LoadParam(root, "size", this, RainEffect, setRainSize); 124 LoadParam(root, "rate", this, RainEffect, setRainRate); 125 LoadParam(root, "velocity", this, RainEffect, setRainVelocity); 126 LoadParam(root, "life", this, RainEffect, setRainLife); 127 LoadParam(root, "wind", this, RainEffect, setRainWind); 128 LoadParam(root, "fadeinduration", this, RainEffect, setRainFadeIn); 129 LoadParam(root, "fadeoutduration", this, RainEffect, setRainFadeOut); 130 LoadParam(root, "cloudcolor", this, RainEffect, setCloudColor); 131 LoadParam(root, "skycolor", this, RainEffect, setSkyColor); 132 133 LOAD_PARAM_START_CYCLE(root, element); 134 { 135 LoadParam_CYCLE(element, "option", this, RainEffect, setRainOption); 136 } 137 LOAD_PARAM_END_CYCLE(element); 141 138 } 142 139 … … 146 143 * @brief activates the rain effect 147 144 */ 148 void 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" ); 151 152 this->rainActivate = true; 153 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 } 166 167 this->emitter->setSystem(RainEffect::rainParticles); 168 169 this->emitter->setRelCoor(this->rainCoord); 170 171 this->emitter->setEmissionRate(this->rainRate); 172 this->emitter->setEmissionVelocity(this->rainVelocity); 173 174 this->emitter->setSpread(this->rainWindForce / 50, 0.2); 175 176 // plays the rain sound and loops it 177 this->soundSource.play(this->rainBuffer, this->soundRainVolume, true); 178 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); 182 183 // Change the cloudcolor,skycolor 184 this->oldCloudColor = CloudEffect::cloudColor; 185 this->oldSkyColor = CloudEffect::skyColor; 186 CloudEffect::changeCloudColor(this->cloudColor, this->rainFadeInDuration); 187 CloudEffect::changeSkyColor(this->skyColor, this->rainFadeInDuration); 145 void RainEffect::activate() { 146 PRINTF(3)( "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" ); 147 148 this->rainActivate = true; 149 150 if (unlikely(RainEffect::rainParticles == NULL)) { 151 RainEffect::rainParticles = new SparkParticles((int) this->rainMaxParticles); 152 RainEffect::rainParticles->setName("RainParticles"); 153 RainEffect::rainParticles->setLifeSpan(this->rainLife, 2); 154 RainEffect::rainParticles->setRadius(0, 0.03); 155 RainEffect::rainParticles->setRadius(0.2, 0.02); 156 RainEffect::rainParticles->setRadius(1, 0.01); 157 RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2); // grey blue 1 158 RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2); // grey blue 2 159 RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2); // light grey 160 } 161 162 this->emitter->setSystem(RainEffect::rainParticles); 163 this->emitter->setRelCoor(this->rainCoord); 164 this->emitter->setEmissionRate(this->rainRate); 165 this->emitter->setEmissionVelocity(this->rainVelocity); 166 this->emitter->setSpread(this->rainWindForce / 50, 0.2); 167 168 // play rain sound and loop it 169 this->soundSource.play(this->rainBuffer, this->soundRainVolume, true); 170 171 // if there's wind, play wind sound 172 if (this->rainWindForce > 0) 173 this->soundSource.play(this->windBuffer, 0.1f * this->rainWindForce, true); 174 175 // Store cloud- and sky color before the rain; 176 this->oldCloudColor = CloudEffect::cloudColor; 177 this->oldSkyColor = CloudEffect::skyColor; 178 179 // If we're not fading, change color immediately 180 if (!this->rainFadeInActivate || !this->rainFadeOutActivate) { 181 CloudEffect::changeCloudColor(this->cloudColor, 0); 182 CloudEffect::changeSkyColor(this->skyColor, 0); 183 } 188 184 } 189 185 … … 191 187 * @brief deactivates the rain effect 192 188 */ 193 void RainEffect::deactivate() 194 { 195 PRINTF(0)("Deactivating RainEffect\n"); 196 197 this->rainActivate = false;198 this->emitter->setSystem(NULL);199 200 // Stop Sound201 this->soundSource.stop(); 202 203 // Restore Light Ambient204 lightMan->setAmbientColor(this->rainAmbient, this->rainAmbient, this->rainAmbient); 205 206 CloudEffect::changeCloudColor(this->oldCloudColor, this->rainFadeOutDuration);207 CloudEffect::changeSkyColor(this->oldSkyColor, this->rainFadeOutDuration);189 void RainEffect::deactivate() { 190 PRINTF(3)("Deactivating RainEffect\n"); 191 192 this->rainActivate = false; 193 this->rainFadeInActivate = false; 194 this->rainFadeOutActivate = false; 195 196 this->emitter->setSystem(NULL); 197 198 // Stop Sound 199 this->soundSource.stop(); 200 201 // Restore the old cloud- and sky color 202 CloudEffect::changeCloudColor(this->oldCloudColor, 0); 203 CloudEffect::changeSkyColor(this->oldSkyColor, 0); 208 204 } 209 205 … … 212 208 * @param dt: tick float 213 209 */ 214 void RainEffect::tick (float dt) 215 { 216 if (!this->rainActivate) 217 return; 218 219 if (this->rainMove) 220 { 221 this->rainCoord = State::getCameraNode()->getAbsCoor(); 222 this->emitter->setRelCoor(this->rainCoord.x , this->rainCoord.y+800, this->rainCoord.z); 223 } 224 225 if (this->rainFadeInDuration != 0 && this->localTimer < this->rainFadeInDuration) 226 { 227 this->localTimer += dt; 228 float progress = this->localTimer / this->rainFadeInDuration; 229 230 // Dim Light 231 lightMan->setAmbientColor(1 - progress * 0.9, 1 - progress * 0.9, 1 - progress * 0.9); 232 233 // use alpha in color to fade in 234 RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1 235 RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2 236 RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2 * progress); // light grey 237 238 // increase radius for more "heavy" rain 239 RainEffect::rainParticles->setRadius(0, 0.03 * progress); 240 RainEffect::rainParticles->setRadius(0.2, 0.02 * progress); 241 RainEffect::rainParticles->setRadius(1, 0.01 * progress); 242 243 // increase sound volume 244 if (!this->soundSource.isPlaying()) 245 this->soundSource.play(this->rainBuffer, this->soundRainVolume, true); 246 247 this->soundSource.gain(this->rainBuffer, this->soundRainVolume * progress); 248 } 249 else if ( this->rainFadeOutDuration != 0 ) 250 { 251 if ( this->localTimer < this->rainFadeOutDuration ) 252 { 253 this->localTimer += dt; 254 float progress = 1 - (this->localTimer / this->rainFadeOutDuration); 255 256 // Fade In Light 257 lightMan->setAmbientColor(1 - progress * 0.9, 1 - progress * 0.9, 1 - progress * 0.9); 258 259 // use alpha in color to fade out 260 RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1 261 RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2 262 RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2 * progress); // light grey 263 264 // decrease radius 265 RainEffect::rainParticles->setRadius(0, 0.03 * progress); 266 RainEffect::rainParticles->setRadius(0.2, 0.02 * progress); 267 RainEffect::rainParticles->setRadius(1, 0.01 * progress); 268 269 // decrease sound volume 270 if (!this->soundSource.isPlaying()) 271 this->soundSource.play(this->rainBuffer, this->soundRainVolume, true); 272 273 this->soundSource.gain(this->rainBuffer, this->soundRainVolume * progress); 274 } 275 else 276 this->deactivate(); 277 } 210 void RainEffect::tick (float dt) { 211 if (!this->rainActivate) 212 return; 213 214 if (this->rainMove) { 215 this->rainCoord = State::getCameraNode()->getAbsCoor(); 216 this->emitter->setRelCoor(this->rainCoord.x , this->rainCoord.y+800, this->rainCoord.z); 217 } 218 219 if (this->rainFadeInActivate) { 220 PRINTF(4)("tick fading IN RainEffect\n"); 221 222 this->localTimer += dt; 223 float progress = this->localTimer / this->rainFadeInDuration; 224 225 // use alpha in color to fade in rain 226 RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1 227 RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2 228 RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2 * progress); // light grey 229 230 // increase radius for more "heavy" rain 231 RainEffect::rainParticles->setRadius(0, 0.03 * progress); 232 RainEffect::rainParticles->setRadius(0.2, 0.02 * progress); 233 RainEffect::rainParticles->setRadius(1, 0.01 * progress); 234 235 // increase sound volume 236 if (!this->soundSource.isPlaying()) 237 this->soundSource.play(this->rainBuffer, this->soundRainVolume, true); 238 this->soundSource.gain(this->rainBuffer, this->soundRainVolume * progress); 239 240 if (progress >= 1) 241 this->rainFadeInActivate = false; 242 } 243 244 if (this->rainFadeOutActivate) { 245 PRINTF(4)("tick fading OUT RainEffect\n"); 246 247 this->localTimer += dt; 248 float progress = 1 - (this->localTimer / this->rainFadeOutDuration); 249 250 // use alpha in color to fade out 251 RainEffect::rainParticles->setColor(0, 0.3, 0.3, 0.5, 0.2 * progress); // grey blue 1 252 RainEffect::rainParticles->setColor(0.5, 0.4, 0.4, 0.5, 0.2 * progress); // grey blue 2 253 RainEffect::rainParticles->setColor(1, 0.7, 0.7, 0.7, 0.2 * progress); // light grey 254 255 // decrease radius 256 RainEffect::rainParticles->setRadius(0, 0.03 * progress); 257 RainEffect::rainParticles->setRadius(0.2, 0.02 * progress); 258 RainEffect::rainParticles->setRadius(1, 0.01 * progress); 259 260 // decrease sound volume 261 if (!this->soundSource.isPlaying()) 262 this->soundSource.play(this->rainBuffer, this->soundRainVolume, true); 263 this->soundSource.gain(this->rainBuffer, this->soundRainVolume * progress); 264 265 if (progress <= 0) { 266 PRINTF(4)("tick fading OUT RainEffect COMPLETED! Deactivating...\n"); 267 this->rainFadeOutActivate = false; 268 this->deactivate(); 269 } 270 } 278 271 } 279 272 … … 281 274 * @brief starts raining slowly 282 275 */ 283 void RainEffect::startRaining() 284 { 285 286 if (this->rainActivate) 287 this->deactivate(); 288 289 if (!this->rainFadeInDuration > 0) 290 this->rainFadeInDuration = 10; 291 292 this->localTimer = 0; 293 294 this->activate(); 276 void RainEffect::startRaining() { 277 PRINTF(4)("startRaining function;\n"); 278 279 // If it is already raining, do nothing 280 if (this->rainActivate) 281 return; 282 283 this->localTimer = 0; 284 this->rainFadeInActivate = true; 285 286 PRINTF(4)("startRaining function complete; fadedur: %f\n", this->rainFadeInDuration); 287 this->activate(); 288 289 CloudEffect::changeCloudColor(this->cloudColor, this->rainFadeInDuration); 290 CloudEffect::changeSkyColor(this->skyColor, this->rainFadeInDuration); 295 291 } 296 292 … … 298 294 * @brief stops raining slowly 299 295 */ 300 void RainEffect::stopRaining() 301 { 302 303 if (!this->rainActivate) 304 this->activate(); 305 306 if (!this->rainFadeOutDuration > 0) 307 this->rainFadeOutDuration = 10; 308 309 this->localTimer = 0; 296 void RainEffect::stopRaining() { 297 PRINTF(4)("stopRaining function;\n"); 298 299 // If it is not raining, do nothing 300 if (!this->rainActivate) 301 return; 302 303 this->localTimer = 0; 304 this->rainFadeOutActivate = true; 305 306 PRINTF(4)("stopRaining function completed; fadedur: %f\n", this->rainFadeOutDuration); 307 308 CloudEffect::changeCloudColor(this->oldCloudColor, this->rainFadeOutDuration); 309 CloudEffect::changeSkyColor(this->oldSkyColor, this->rainFadeOutDuration); 310 310 } 311 311 … … 313 313 * @brief hides the rain 314 314 */ 315 void RainEffect::hideRain() 316 { 317 RainEffect::rainParticles->setColor(0, 0,0,0, 0); 318 RainEffect::rainParticles->setColor(0, 0,0,0, 0); 319 } 315 void RainEffect::hideRain() { 316 RainEffect::rainParticles->setColor(0, 0,0,0, 0); 317 RainEffect::rainParticles->setColor(0, 0,0,0, 0); 318 }
Note: See TracChangeset
for help on using the changeset viewer.