Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/graphics/effects/snow_effect.cc @ 9744

Last change on this file since 9744 was 9406, checked in by bensch, 18 years ago

orxonox/trunk: merged the proxy back

merged with commandsvn merge -r9346:HEAD https://svn.orxonox.net/orxonox/branches/proxy .

no conflicts

File size: 7.7 KB
Line 
1/*
2        orxonox - the future of 3D-vertical-scrollers
3
4        Copyright (C) 2004 orx
5
6        This program is free software; you can redistribute it and/or modify
7        it under the terms of the GNU General Public License as published by
8        the Free Software Foundation; either version 2, or (at your option)
9        any later version.
10
11### File Specific:
12        main-programmer: hdavid, amaechler
13*/
14
15#include "snow_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 "debug.h"
23
24#include "p_node.h"
25#include "state.h"
26#include "sprite_particles.h"
27#include "plane_emitter.h"
28#include "shell_command.h"
29#include "script_class.h"
30#include "cloud_effect.h"
31
32#include "parser/tinyxml/tinyxml.h"
33
34SHELL_COMMAND(activate, SnowEffect, activateSnow);
35SHELL_COMMAND(deactivate, SnowEffect, deactivateSnow);
36
37
38CREATE_SCRIPTABLE_CLASS(SnowEffect, CL_SNOW_EFFECT,
39                            addMethod("activate", ExecutorLua0<SnowEffect>(&SnowEffect::activate))
40                            ->addMethod("deactivate", ExecutorLua0<SnowEffect>(&SnowEffect::deactivate))
41                       );
42
43CREATE_FACTORY(SnowEffect, CL_SNOW_EFFECT);
44
45SnowEffect::SnowEffect(const TiXmlElement* root)
46{
47        this->setClassID(CL_SNOW_EFFECT, "SnowEffect");
48
49        this->init();
50
51        if (root != NULL)
52                this->loadParams(root);
53
54        this->windBuffer = NULL;
55        //load wind sound
56        if (this->snowWindForce >= 1) {
57          this->windBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/atmosphere/wind.wav", WAV);
58        }
59
60  if(snowActivate) {
61                this->activate();
62    SnowEffect::snowParticles->precache((int) this->snowLife);
63  }
64}
65
66
67SnowEffect::~SnowEffect()
68{
69        this->deactivate();
70}
71
72SpriteParticles* SnowEffect::snowParticles = NULL;
73
74void SnowEffect::loadParams(const TiXmlElement* root)
75{
76        WeatherEffect::loadParams(root);
77
78        LoadParam(root, "numParticles", this, SnowEffect, numParticles);
79        LoadParam(root, "materialTexture", this, SnowEffect, materialTexture);
80        LoadParam(root, "lifeSpans", this, SnowEffect, lifeSpan);
81        LoadParam(root, "radius", this, SnowEffect, radius);
82        LoadParam(root, "mass", this, SnowEffect, mass);
83        LoadParam(root, "emissionRate", this, SnowEffect, emissionRate);
84        LoadParam(root, "emissionVelocity", this, SnowEffect, emissionVelocity);
85        LoadParam(root, "wind", this, SnowEffect, wind);
86        LoadParam(root, "size", this, SnowEffect, size);
87        LoadParam(root, "coord", this, SnowEffect, coord);
88  LoadParam(root, "cloudcolor", this, SnowEffect, setCloudColor);
89  LoadParam(root, "skycolor", this, SnowEffect, setSkyColor);
90  LoadParam(root, "fadetime", this, SnowEffect, setFadeTime);
91
92        LOAD_PARAM_START_CYCLE(root, element);
93        {
94                LoadParam_CYCLE(element, "option", this, SnowEffect, setSnowOption);
95        }
96        LOAD_PARAM_END_CYCLE(element);
97}
98
99void SnowEffect::init()
100{
101        this->emitter = new PlaneEmitter();
102
103        // Default values
104        this->snowActivate = false;
105        this->snowMove = false;
106        this->particles = 12000;
107        this->texture = "maps/snow_flake_01_32x32.png";
108        this->snowLife = 8;
109        this->randomLife = 2;
110        this->snowRadius = 3.5;
111        this->randomRadius = 1;
112        this->snowMass = 1.0;
113        this->randomMass = 0.3;
114        this->rate = 900;
115        this->velocity = -100;
116        this->randomVelocity = 5;
117        this->angle = 0.5;
118        this->randomAngle = 0.2;
119        this->alpha = 0.5;
120        this->snowSize = Vector2D(2500, 2500);
121        this->snowCoord = Vector(100,450,400);
122        this->snowWindForce = 1;
123
124  this->fadeTime = 10;
125  this->cloudColor = Vector(0.2f, 0.2f, 0.2f);
126  this->skyColor = Vector(0.0f, 0.0f, 0.0f);
127}
128
129void SnowEffect::activate()
130{
131        PRINTF(3)("Activating SnowEffect\n");
132
133        this->snowActivate = true;
134
135        SnowEffect::snowParticles = new SpriteParticles(particles);
136        SnowEffect::snowParticles->setName("SnowEffectTrailParticles");
137        SnowEffect::snowParticles->setMaterialTexture(texture);
138        SnowEffect::snowParticles->setLifeSpan(snowLife, randomLife);
139        SnowEffect::snowParticles->setRadius(0.0, snowRadius, randomRadius);
140        SnowEffect::snowParticles->setRadius(0.2, snowRadius, randomRadius*0.8);
141        SnowEffect::snowParticles->setRadius(1.0, snowRadius, randomRadius*0.5);
142        SnowEffect::snowParticles->setMass(0, snowMass, randomMass);
143        SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha);
144        SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2);
145        SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0);
146
147        this->emitter->setSystem(SnowEffect::snowParticles);
148
149        this->emitter->setRelCoor(snowCoord);
150        this->emitter->setEmissionRate(rate);
151        this->emitter->setEmissionVelocity(velocity, randomVelocity);
152        this->emitter->setSpread(angle * this->snowWindForce , randomAngle * this->snowWindForce);
153        this->emitter->setSize(snowSize);
154
155  if (this->snowWindForce != 0)
156    this->soundSource.play(this->windBuffer, 0.1f * this->snowWindForce, true);
157
158  // Store cloud- and sky color before the snow
159  this->oldCloudColor = CloudEffect::cloudColor;
160  this->oldSkyColor   = CloudEffect::skyColor;
161
162  // Change the colors
163  CloudEffect::changeCloudColor(this->cloudColor, this->fadeTime);
164  CloudEffect::changeSkyColor(this->skyColor, this->fadeTime);
165
166}
167
168
169void SnowEffect::deactivate()
170{
171        PRINTF(3)("Deactivating SnowEffect\n");
172
173        this->snowActivate = false;
174        this->emitter->setSystem(NULL);
175
176        if (this->windBuffer != NULL)
177                ResourceManager::getInstance()->unload(this->windBuffer);
178
179  // Restore the old cloud- and sky color
180  CloudEffect::changeCloudColor(this->oldCloudColor, this->fadeTime);
181  CloudEffect::changeSkyColor(this->oldSkyColor, this->fadeTime);
182}
183
184void SnowEffect::draw() const
185{
186        if (!this->snowActivate)
187                return;
188}
189
190void SnowEffect::tick(float dt)
191{
192        if (!this->snowActivate)
193                return;
194
195        /*
196        float distance = (State::getCameraNode()->getAbsCoor() - Vector(snowCoord.x, State::getCameraNode()->getAbsCoor().y, snowCoord.z)).len();
197
198        if(activated)
199        {
200        if(distance > 0.3*snowSize.x || distance > 0.3*snowSize.y)
201                        this->deactivate();
202        else if(distance > 0.25*snowSize.x || distance > 0.25*snowSize.y)
203        this->alpha = 0.15;
204        else if(distance > 0.2*snowSize.x || distance > 0.2*snowSize.y)
205        this->alpha = 0.25;
206        else if(distance > 0.1*snowSize.x || distance > 0.1*snowSize.y)
207        this->alpha = 0.4;
208
209        SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha);
210        SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2);
211        SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0);
212        }
213        else
214        {
215        if(distance < 0.3*snowSize.x || distance < 0.3*snowSize.y )
216        this->activate();
217        if( distance < 0.25*snowSize.x || distance < 0.25*snowSize.y )
218        this->alpha = 0.25;
219        else if( distance < 0.2*snowSize.x || distance < 0.2*snowSize.y )
220        this->alpha = 0.4;
221        else if( distance < 0.1*snowSize.x || distance < 0.1*snowSize.y )
222        this->alpha = 0.5;
223
224        SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha);
225        SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2);
226        SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0);
227        }*/
228
229        if (this->snowMove) {
230                this->snowCoord = State::getCameraNode()->getAbsCoor();
231                this->emitter->setRelCoor(this->snowCoord.x , this->snowCoord.y+300, this->snowCoord.z);
232        }
233}
Note: See TracBrowser for help on using the repository browser.