Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/atmospheric_engine/src/lib/graphics/effects/snow_effect.cc @ 8022

Last change on this file since 8022 was 8022, checked in by hdavid, 18 years ago

branches/atmospheric_engine: activating/deactivating snowEffect in the oxw-file works,default: deactivate

File size: 5.9 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
30#include "parser/tinyxml/tinyxml.h"
31
32SHELL_COMMAND(activate, SnowEffect, activateSnow);
33SHELL_COMMAND(deactivate, SnowEffect, deactivateSnow);
34
35using namespace std;
36
37CREATE_FACTORY(SnowEffect, CL_SNOW_EFFECT);
38
39SnowEffect::SnowEffect(const TiXmlElement* root)
40{
41        this->setClassID(CL_SNOW_EFFECT, "SnowEffect");
42
43        this->init();
44
45        if (root != NULL)
46                this->loadParams(root);
47
48        //load wind sound
49        if (this->snowWindForce > 1) {
50                if (this->windBuffer != NULL)
51                        ResourceManager::getInstance()->unload(this->windBuffer);
52                        this->windBuffer = (OrxSound::SoundBuffer*)ResourceManager::getInstance()->load("sound/wind.wav", WAV);
53        }
54
55  if(snowActivate)
56    this->activate();
57}
58
59
60SnowEffect::~SnowEffect()
61{
62        this->deactivate();
63}
64
65SpriteParticles* SnowEffect::snowParticles = NULL;
66
67void SnowEffect::loadParams(const TiXmlElement* root)
68{
69        WeatherEffect::loadParams(root);
70
71        LoadParam(root, "numParticles", this, SnowEffect, numParticles);
72        LoadParam(root, "materialTexture", this, SnowEffect, materialTexture);
73        LoadParam(root, "lifeSpans", this, SnowEffect, lifeSpan);
74        LoadParam(root, "radius", this, SnowEffect, radius);
75        LoadParam(root, "mass", this, SnowEffect, mass);
76        LoadParam(root, "emissionRate", this, SnowEffect, emissionRate);
77        LoadParam(root, "emissionVelocity", this, SnowEffect, emissionVelocity);
78  LoadParam(root, "wind", this, SnowEffect, wind);
79        LoadParam(root, "size", this, SnowEffect, size);
80        LoadParam(root, "coord", this, SnowEffect, coord);
81 
82  LOAD_PARAM_START_CYCLE(root, element);
83  {
84    LoadParam_CYCLE(element, "option", this, SnowEffect, setSnowOption);
85  }
86  LOAD_PARAM_END_CYCLE(element);
87}
88
89bool SnowEffect::init()
90{
91        this->emitter = new PlaneEmitter();
92
93        // Default values
94  this->snowActivate = false;
95  this->snowMove = false;
96        this->particles = 12000;
97        this->texture = "maps/snow_flake_01_32x32.png";
98        this->life = 8;
99        this->randomLife = 2;
100        this->snowRadius = 3.5;
101        this->randomRadius = 1;
102        this->snowMass = 1.0;
103        this->randomMass = 0.3;
104        this->rate = 900;
105        this->velocity = -100;
106        this->randomVelocity = 5;
107        this->angle = 0.5;
108        this->randomAngle = 0.2;
109        this->alpha = 0.5;
110        this->snowSize = Vector2D(2500, 2500);
111  this->snowCoord = Vector(100,450,400);
112        this->snowWindForce = 1;
113
114//      this->activated = false;
115}
116
117bool SnowEffect::activate()
118{
119        PRINTF(0)("Activating SnowEffect\n");
120//      activated = true;
121
122        SnowEffect::snowParticles = new SpriteParticles(particles);
123        SnowEffect::snowParticles->setName("SnowEffectTrailParticles");
124        SnowEffect::snowParticles->setMaterialTexture(texture);
125        SnowEffect::snowParticles->setLifeSpan(life, randomLife);
126        SnowEffect::snowParticles->setRadius(0.0, snowRadius, randomRadius);
127        SnowEffect::snowParticles->setRadius(0.2, snowRadius, randomRadius*0.8);
128        SnowEffect::snowParticles->setRadius(1.0, snowRadius, randomRadius*0.5);
129        SnowEffect::snowParticles->setMass(0, snowMass, randomMass);
130        SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha);
131        SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2);
132        SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0);
133
134        this->emitter->setSystem(SnowEffect::snowParticles);
135
136        this->emitter->setRelCoor(snowCoord);
137        this->emitter->setEmissionRate(rate);
138        this->emitter->setEmissionVelocity(velocity, randomVelocity);
139        this->emitter->setSpread(angle * this->snowWindForce , randomAngle * this->snowWindForce);
140        this->emitter->setSize(snowSize);
141
142  //SnowEffect::snowParticles->precache(8);
143
144        if (this->snowWindForce > 1)
145                this->soundSource.loop(this->windBuffer);
146}
147
148
149bool SnowEffect::deactivate()
150{
151        PRINTF(0)("Deactivating SnowEffect\n");
152        //activated = false;
153
154        this->emitter->setSystem(NULL);
155
156        if (this->windBuffer != NULL)
157                ResourceManager::getInstance()->unload(this->windBuffer);
158
159}
160
161void SnowEffect::activateSnow()
162{
163        this->activate();
164}
165
166void SnowEffect::deactivateSnow()
167{
168        this->deactivate();
169}
170
171void SnowEffect::draw() const
172{
173}
174
175void SnowEffect::tick(float dt)
176{/*
177  float distance = (State::getCameraNode()->getAbsCoor() - Vector(snowCoord.x, State::getCameraNode()->getAbsCoor().y, snowCoord.z)).len();
178 
179  if(activated)
180  {
181    if(distance > 0.3*snowSize.x || distance > 0.3*snowSize.y)
182                  this->deactivate();
183    else if(distance > 0.25*snowSize.x || distance > 0.25*snowSize.y)
184      this->alpha = 0.15;
185    else if(distance > 0.2*snowSize.x || distance > 0.2*snowSize.y)
186      this->alpha = 0.25;
187    else if(distance > 0.1*snowSize.x || distance > 0.1*snowSize.y)
188      this->alpha = 0.4;
189
190    SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha);
191    SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2);
192    SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0);
193  }
194  else
195  {
196  if(distance < 0.3*snowSize.x || distance < 0.3*snowSize.y )
197    this->activate();
198  if( distance < 0.25*snowSize.x || distance < 0.25*snowSize.y )
199    this->alpha = 0.25;
200  else if( distance < 0.2*snowSize.x || distance < 0.2*snowSize.y )
201    this->alpha = 0.4;
202  else if( distance < 0.1*snowSize.x || distance < 0.1*snowSize.y )
203    this->alpha = 0.5;
204
205    SnowEffect::snowParticles->setColor(0,1, 1, 1, alpha);
206    SnowEffect::snowParticles->setColor(.5, .6, .6, .6, alpha/2);
207    SnowEffect::snowParticles->setColor(1, .0, .0, .0, .0);
208}*/
209  if (this->snowMove) {
210    this->snowCoord = State::getCameraNode()->getAbsCoor();
211    this->emitter->setRelCoor(this->snowCoord.x , this->snowCoord.y+300, this->snowCoord.z);
212  }
213}
214
Note: See TracBrowser for help on using the repository browser.