1 | #include "dxstdafx.h"
|
---|
2 | #include ".\particleemitter.h"
|
---|
3 | #include "ParticleGroup.h"
|
---|
4 | #include "GameManager.h"
|
---|
5 |
|
---|
6 | ParticleEmitter::ParticleEmitter(void) : ParticleCube() {
|
---|
7 | this->width = 2;
|
---|
8 | this->height = 2;
|
---|
9 | this->depth = 1;
|
---|
10 | this->pid = 0;
|
---|
11 | this->updatePlanes();
|
---|
12 | this->setEMBirthRate(10);
|
---|
13 | this->setEMEmissionDuration(10);
|
---|
14 | this->setEMParticleVelocity(10);
|
---|
15 | this->setEMHorizontalDegree(0.3f);
|
---|
16 | this->setEMVerticalDegree(0.3f);
|
---|
17 | this->setEMParticleLifeTime(5);
|
---|
18 | this->setEMRotationalDegree(50, 50, 50);
|
---|
19 | this->firstFrame = true;
|
---|
20 | this->deleteMe = true;
|
---|
21 | this->emitting = false;
|
---|
22 | this->useHeatHaze = false;
|
---|
23 | this->nodeType |= Scene::NODE_PARTICLEEMITTER;
|
---|
24 | this->sound = NULL;
|
---|
25 | }
|
---|
26 |
|
---|
27 | ParticleEmitter::~ParticleEmitter(void) {
|
---|
28 | }
|
---|
29 |
|
---|
30 |
|
---|
31 | void ParticleEmitter::setEMBirthRate(float _birthRate) {
|
---|
32 | this->birthRate = _birthRate;
|
---|
33 | }
|
---|
34 |
|
---|
35 | void ParticleEmitter::setEMEmissionDuration(float _emissionDur) {
|
---|
36 | this->lifeTime = 0;
|
---|
37 | this->nextEmit = 0;
|
---|
38 | this->pid = 0;
|
---|
39 | this->particleEmitted = 1;
|
---|
40 | this->emissionDur = _emissionDur;
|
---|
41 | }
|
---|
42 |
|
---|
43 | void ParticleEmitter::setEMParticleLifeTime(float _particleLifeTime) {
|
---|
44 | this->particleLifeTime = _particleLifeTime;
|
---|
45 | }
|
---|
46 |
|
---|
47 | void ParticleEmitter::setEMParticleVelocity(float _velocity) {
|
---|
48 | this->velocity = _velocity;
|
---|
49 | }
|
---|
50 |
|
---|
51 | void ParticleEmitter::setEMHorizontalDegree(float _horDegree) {
|
---|
52 | this->horDegree = _horDegree;
|
---|
53 | }
|
---|
54 |
|
---|
55 | void ParticleEmitter::setEMVerticalDegree(float _verDegree) {
|
---|
56 | this->verDegree = _verDegree;
|
---|
57 | }
|
---|
58 |
|
---|
59 | void ParticleEmitter::setEMRotationalDegree(float _rX, float _rY, float _rZ) {
|
---|
60 | this->rotDegree.setXYZ(_rX, _rY, _rZ);
|
---|
61 | }
|
---|
62 |
|
---|
63 | void ParticleEmitter::setDeleteMeAfterEmission(bool _deleteMe) {
|
---|
64 | this->deleteMe = _deleteMe;
|
---|
65 | }
|
---|
66 |
|
---|
67 | void ParticleEmitter::addRefNode(Node &node) {
|
---|
68 | node.setVisible(false);
|
---|
69 | node.setStandBy(true);
|
---|
70 | this->refNodeVector.push_back(&node);
|
---|
71 | }
|
---|
72 |
|
---|
73 | /*void ParticleEmitter::attachRefEmitter(PartikelEmitter &emitter) {
|
---|
74 | this->refEmitter = &emitter;
|
---|
75 | }*/
|
---|
76 |
|
---|
77 | void ParticleEmitter::update(float dt) {
|
---|
78 | //PartikelCube::update(dt);
|
---|
79 | if(this->firstFrame) {
|
---|
80 | this->emitting = true;
|
---|
81 | this->firstFrame = false;
|
---|
82 | srand((UINT)time(NULL));
|
---|
83 | if(this->sound) {
|
---|
84 | this->sound->play();
|
---|
85 | }
|
---|
86 | return;
|
---|
87 | }
|
---|
88 | this->lifeTime+=dt;
|
---|
89 |
|
---|
90 | if(this->lifeTime < this->emissionDur) {
|
---|
91 | if(this->sound) {
|
---|
92 | this->sound->setPosition(this->getAbsolutePosition());
|
---|
93 | }
|
---|
94 | float dtEmission = 1/this->birthRate; //this->emissionDur/this->birthRate;
|
---|
95 | int pCount = (int) (this->lifeTime/dtEmission);
|
---|
96 | int n = pCount-this->particleEmitted;
|
---|
97 | //ParticleEmitter *pEmitter;
|
---|
98 | for(int i=0; i<n;i++) {
|
---|
99 | Node *node;
|
---|
100 | Node *refNode;
|
---|
101 |
|
---|
102 | //pid = (int)((((float)rand())/RAND_MAX)*this->refNodeVector.size())-1;
|
---|
103 | pid = (int) ((((float) rand())/(RAND_MAX+1))*(this->refNodeVector.size()-1));
|
---|
104 | if(pid<0)
|
---|
105 | pid = 0;
|
---|
106 | if(pid>this->refNodeVector.size()-1)
|
---|
107 | pid = 0;
|
---|
108 |
|
---|
109 | /*char temp[100];
|
---|
110 | sprintf(temp, "refNodeVector.size = %i", this->refNodeVector.size());
|
---|
111 | this->myScene->manager->printToConsole(temp);*/
|
---|
112 |
|
---|
113 | if(this->refNodeVector.size()==0) {
|
---|
114 | this->myScene->manager->printToConsole("ParticleEmitter::refNodeVector.size = 0!!!");
|
---|
115 | return;
|
---|
116 | }
|
---|
117 |
|
---|
118 | refNode = this->refNodeVector.at(pid);
|
---|
119 | node = refNode->clone();
|
---|
120 | this->myScene->addToParticleList(node);
|
---|
121 | node->setStandBy(false);
|
---|
122 |
|
---|
123 | /*if(this->refEmitter!=NULL) {
|
---|
124 | pEmitter = this->sMgr->createPartikelEmitter(*node);
|
---|
125 | //Clone refEmitter
|
---|
126 | pEmitter->setEMBirthRate(this->refEmitter->birthRate);
|
---|
127 | pEmitter->setEMEmissionDuration(this->refEmitter->emissionDur);
|
---|
128 | pEmitter->setEMPartikelVelocity(this->refEmitter->velocity);
|
---|
129 | pEmitter->setEMHorizontalDegree(this->refEmitter->horDegree);
|
---|
130 | pEmitter->setEMVerticalDegree(this->refEmitter->verDegree);
|
---|
131 | pEmitter->setEMRotationalDegree(this->refEmitter->rotDegree.x, this->refEmitter->rotDegree.y, this->refEmitter->rotDegree.z);
|
---|
132 | pEmitter->setEMPartikelLifeTime(this->refEmitter->partikelLifeTime);
|
---|
133 | pEmitter->setDeleteMeAfterEmission(this->refEmitter->deleteEmitter);
|
---|
134 | pEmitter->refNodeVector = this->refEmitter->refNodeVector;
|
---|
135 | pEmitter->setDimensions(this->width, this->height, this->depth);
|
---|
136 | }*/
|
---|
137 |
|
---|
138 | node->setVisible(true);
|
---|
139 | //node->setParticleGroup(this->getParticleGroup());
|
---|
140 | node->setTimeToLive(this->particleLifeTime);
|
---|
141 | this->myParticleGroup->addParticle(this->myScene->getSmartPointer(node));
|
---|
142 |
|
---|
143 | node->setColDetGroup(this->pColDetGroup);
|
---|
144 |
|
---|
145 | //Set Velocity
|
---|
146 | Vector v;
|
---|
147 | v.x = (FLOAT)(((float)rand())/RAND_MAX - 0.5)*2*this->horDegree;
|
---|
148 | v.y = (FLOAT)(((float)rand())/RAND_MAX - 0.5)*2*this->verDegree;
|
---|
149 | v.z = 1; //StandardDirection
|
---|
150 | v.normalize();
|
---|
151 | v = v*this->velocity;
|
---|
152 | this->addVelocityToParticle(node, v);
|
---|
153 |
|
---|
154 | //Set EmitPosition
|
---|
155 | Vector p;
|
---|
156 | p = this->getAbsolutePosition();
|
---|
157 | p.x += (FLOAT)(((float)rand())/RAND_MAX - 0.5)*this->width;
|
---|
158 | p.y += (FLOAT)(((float)rand())/RAND_MAX - 0.5)*this->height;
|
---|
159 | node->setPosition(p);
|
---|
160 |
|
---|
161 | //Set Rotation
|
---|
162 | Vector rotP;
|
---|
163 | rotP.x = (FLOAT)(((float)rand())/RAND_MAX - 0.5)*this->rotDegree.x;
|
---|
164 | rotP.y = (FLOAT)(((float)rand())/RAND_MAX - 0.5)*this->rotDegree.y;
|
---|
165 | rotP.z = (FLOAT)(((float)rand())/RAND_MAX - 0.5)*this->rotDegree.z;
|
---|
166 |
|
---|
167 | node->getActor()->addLocalTorque(rotP.getNxVector());
|
---|
168 | node->getActor()->setSolverIterationCount(1);
|
---|
169 |
|
---|
170 | this->particleEmitted++;
|
---|
171 | }
|
---|
172 | } else if(this->deleteMe) {
|
---|
173 | this->killMe();
|
---|
174 | } else {
|
---|
175 | if(this->sound) {
|
---|
176 | this->sound->stop();
|
---|
177 | }
|
---|
178 | this->setStandBy(true);
|
---|
179 | }
|
---|
180 | if(this->lifeTime >= this->emissionDur) {
|
---|
181 | if(this->sound) {
|
---|
182 | this->sound->stop();
|
---|
183 | }
|
---|
184 | this->emitting = false;
|
---|
185 | }
|
---|
186 | }
|
---|
187 |
|
---|
188 | void ParticleEmitter::restartEmitting()
|
---|
189 | {
|
---|
190 | this->firstFrame = true;
|
---|
191 | this->lifeTime = 0;
|
---|
192 | this->nextEmit = 0;
|
---|
193 | this->pid = 0;
|
---|
194 | this->particleEmitted = 1;
|
---|
195 | this->setStandBy(false);
|
---|
196 | }
|
---|
197 |
|
---|
198 | bool ParticleEmitter::isEmitting() {
|
---|
199 | return this->emitting;
|
---|
200 | }
|
---|
201 |
|
---|
202 | void ParticleEmitter::killMe() {
|
---|
203 | //this->myScene->manager->printToConsole("deleteEmitter!");
|
---|
204 | for(UINT i=0;i<this->refNodeVector.size();i++) {
|
---|
205 | //this->myScene->setTrigger(Scene::TRIGGER_KILLNODE, this->refNodeVector.at(i), sceneLifeTime + this->particleLifeTime + 0.5);
|
---|
206 | this->refNodeVector.at(i)->killMe();
|
---|
207 | }
|
---|
208 | this->refNodeVector.clear();
|
---|
209 | this->myParticleGroup->removeParticleEmitter(this);
|
---|
210 | ParticleCube::killMe();
|
---|
211 | }
|
---|
212 |
|
---|
213 | void ParticleEmitter::setParticleGroup(ParticleGroup* _particleGroup)
|
---|
214 | {
|
---|
215 | this->myParticleGroup = _particleGroup;
|
---|
216 | this->particleGroup = this->myParticleGroup->getParticleGroup(); //Diese Zeile könnte falsch sein!!
|
---|
217 | }
|
---|
218 |
|
---|
219 | void ParticleEmitter::setUseHeatHaze(bool _use)
|
---|
220 | {
|
---|
221 | this->useHeatHaze = _use;
|
---|
222 | }
|
---|
223 | bool ParticleEmitter::getUseHeatHaze()
|
---|
224 | {
|
---|
225 | return this->useHeatHaze;
|
---|
226 | }
|
---|
227 |
|
---|
228 | Node* ParticleEmitter::clone()
|
---|
229 | {
|
---|
230 | //this->myScene->manager->printToConsole(" cloning Emitter");
|
---|
231 | ParticleGroup* pg = (ParticleGroup*) this->myScene->createNode(Scene::NODE_PARTICLEGROUP, this->myParticleGroup->hasRenderer());
|
---|
232 |
|
---|
233 | /*char temp[100];
|
---|
234 | sprintf(temp, " new ParticleGroupID = %i", pg->getParticleGroup());
|
---|
235 | this->myScene->manager->printToConsole(temp);*/
|
---|
236 |
|
---|
237 | ParticleEmitter* obj = (ParticleEmitter*) this->myScene->createNode(Scene::NODE_PARTICLEEMITTER);
|
---|
238 |
|
---|
239 | obj->setDimensions(this->width, this->height, this->depth);
|
---|
240 | obj->setEMBirthRate(this->birthRate);
|
---|
241 | obj->setEMEmissionDuration(this->emissionDur);
|
---|
242 | obj->setEMHorizontalDegree(this->horDegree);
|
---|
243 | obj->setEMParticleLifeTime(this->particleLifeTime);
|
---|
244 | obj->setEMParticleVelocity(this->velocity);
|
---|
245 | obj->setEMRotationalDegree(this->rotDegree.x, this->rotDegree.y, this->rotDegree.z);
|
---|
246 | obj->setDeleteMeAfterEmission(this->deleteMe);
|
---|
247 | obj->setUseHeatHaze(this->useHeatHaze);
|
---|
248 | obj->firstFrame = true;
|
---|
249 | obj->lifeTime = 0;
|
---|
250 | obj->pColDetGroup = this->pColDetGroup;
|
---|
251 |
|
---|
252 | //RefNodes!
|
---|
253 | Node* node = NULL;
|
---|
254 | for(UINT i=0;i<this->refNodeVector.size();i++) {
|
---|
255 | //this->myScene->manager->printToConsole(" refNode cloned!");
|
---|
256 | node = this->refNodeVector.at(i)->clone();
|
---|
257 | node->setBehaveAs(Node::RIGIDBODY);
|
---|
258 | node->setColDetGroup(this->pColDetGroup);
|
---|
259 | obj->addRefNode(*node);
|
---|
260 | //obj->addRefNode(*this->refNodeVector.at(i)->clone());
|
---|
261 | //obj->addRefNode(*this->refNodeVector.at(i));
|
---|
262 | }
|
---|
263 | //ParticleGroup
|
---|
264 | //this->myParticleGroup->addParticleEmitter(this->myScene->getSmartPointer(obj));
|
---|
265 | pg->addParticleEmitter(this->myScene->getSmartPointer(obj));
|
---|
266 |
|
---|
267 | obj->pActorDesc = this->pActorDesc;
|
---|
268 | obj->pBodyDesc = this->pBodyDesc;
|
---|
269 | obj->pActorDesc.body = &obj->pBodyDesc;
|
---|
270 |
|
---|
271 | return obj;
|
---|
272 | }
|
---|
273 |
|
---|
274 | void ParticleEmitter::addEmittingSound(SoundNode* _sound)
|
---|
275 | {
|
---|
276 | this->sound = _sound;
|
---|
277 | this->addChild(this->myScene->getSmartPointer(this->sound));
|
---|
278 | }
|
---|