History

moved finger particles over to hand.cpp

Jeffrey Ventrella committed 13 years ago

Commit 0481a811 parent 56d0c7d6 files · +221 −172Browse files

Showing the changes to interface/src/ParticleSystem.cpp (1 of 6 files). Show all

Unified · Split

interface/src/ParticleSystem.cpp+47−59
@@ -22,24 +22,23 @@ ParticleSystem::ParticleSystem() { · 21 unmodified lines
22 _upDirection = glm::vec3(0.0f, 1.0f, 0.0f); // default22 _upDirection = glm::vec3(0.0f, 1.0f, 0.0f); // default
23 23
24 for (unsigned int e = 0; e < MAX_EMITTERS; e++) {24 for (unsigned int e = 0; e < MAX_EMITTERS; e++) {
25 _emitter[e].position = glm::vec3(0.0f, 0.0f, 0.0f);25 _emitter[e].position = glm::vec3(0.0f, 0.0f, 0.0f);
26 _emitter[e].rotation = glm::quat();26 _emitter[e].rotation = glm::quat();
27 _emitter[e].right = IDENTITY_RIGHT;27 _emitter[e].right = IDENTITY_RIGHT;
28 _emitter[e].up = IDENTITY_UP;28 _emitter[e].up = IDENTITY_UP;
29 _emitter[e].front = IDENTITY_FRONT;29 _emitter[e].front = IDENTITY_FRONT;
30 _emitter[e].bounce = DEFAULT_PARTICLE_BOUNCE;30 _emitter[e].showingEmitter = false;
31 _emitter[e].airFriction = DEFAULT_PARTICLE_AIR_FRICTION;31 _emitter[e].particleAttributes.bounce = DEFAULT_PARTICLE_BOUNCE;
32 _emitter[e].gravity = 0.0f;32 _emitter[e].particleAttributes.airFriction = DEFAULT_PARTICLE_AIR_FRICTION;
33 _emitter[e].jitter = 0.0f;33 _emitter[e].particleAttributes.gravity = 0.0f;
34 _emitter[e].emitterAttraction = 0.0f;34 _emitter[e].particleAttributes.jitter = 0.0f;
35 _emitter[e].tornadoForce = 0.0f;35 _emitter[e].particleAttributes.emitterAttraction = 0.0f;
36 _emitter[e].neighborAttraction = 0.0f;36 _emitter[e].particleAttributes.tornadoForce = 0.0f;
37 _emitter[e].neighborRepulsion = 0.0f;37 _emitter[e].particleAttributes.neighborAttraction = 0.0f;
38 _emitter[e].collisionSphereRadius = 0.0f;38 _emitter[e].particleAttributes.neighborRepulsion = 0.0f;
39 _emitter[e].collisionSpherePosition = glm::vec3(0.0f, 0.0f, 0.0f);39 _emitter[e].particleAttributes.collisionSphereRadius = 0.0f;
40 _emitter[e].usingCollisionSphere = false;40 _emitter[e].particleAttributes.collisionSpherePosition = glm::vec3(0.0f, 0.0f, 0.0f);
41 _emitter[e].showingEmitter = false;41 _emitter[e].particleAttributes.usingCollisionSphere = false;
42
43 }; 42 };
44 43
45 for (unsigned int p = 0; p < MAX_PARTICLES; p++) {44 for (unsigned int p = 0; p < MAX_PARTICLES; p++) {
@@ -56,19 +55,11 @@ ParticleSystem::ParticleSystem() { · 10 unmodified lines
56 55
57int ParticleSystem::addEmitter() {56int ParticleSystem::addEmitter() {
58 57
59 printf( "\n" );
60 printf( "ParticleSystem::addEmitter\n" );
61
62 _numEmitters ++;58 _numEmitters ++;
63 59
64 if (_numEmitters > MAX_EMITTERS) {60 if (_numEmitters > MAX_EMITTERS) {
65
66 printf( "Oops! _numEmitters > MAX_EMITTERS... returning -1\n" );
67
68 return -1;61 return -1;
69 }62 }
70
71 printf( "ok, _numEmitters is %d,and the index of this newly added emitter is %d.\n", _numEmitters, _numEmitters-1 );
72 63
73 return _numEmitters - 1;64 return _numEmitters - 1;
74}65}
@@ -81,8 +72,6 @@ void ParticleSystem::simulate(float deltaTime) { · 6 unmodified lines
81 updateEmitter(e, deltaTime); 72 updateEmitter(e, deltaTime);
82 }73 }
83 74
84 runSpecialEffectsTest(0, deltaTime);
85
86 // update particles75 // update particles
87 for (unsigned int p = 0; p < _numParticles; p++) {76 for (unsigned int p = 0; p < _numParticles; p++) {
88 if (_particle[p].alive) {77 if (_particle[p].alive) {
@@ -157,24 +146,23 @@ void ParticleSystem::setOrangeBlueColorPalette() { · 68 unmodified lines
157}146}
158 147
159 148
160void ParticleSystem::runSpecialEffectsTest(int e, float deltaTime) {149void ParticleSystem::setParticleAttributesForEmitter(int emitterIndex, ParticleAttributes attributes) {
161
162 _timer += deltaTime;
163
164 _emitter[e].gravity = 0.0f + 0.05f * sinf( _timer * 0.52f );
165 _emitter[e].airFriction = (DEFAULT_PARTICLE_AIR_FRICTION + 0.5f) + 2.0f * sinf( _timer * 0.32f );
166 _emitter[e].jitter = 0.05f + 0.05f * sinf( _timer * 0.42f );
167 _emitter[e].emitterAttraction = 0.015f + 0.015f * cosf( _timer * 0.6f );
168 _emitter[e].tornadoForce = 0.0f + 0.03f * sinf( _timer * 0.7f );
169 _emitter[e].neighborAttraction = 0.1f + 0.1f * cosf( _timer * 0.8f );
170 _emitter[e].neighborRepulsion = 0.2f + 0.2f * sinf( _timer * 0.4f );
171 150
172 if (_emitter[e].gravity < 0.0f) {151 _emitter[emitterIndex].particleAttributes.bounce = attributes.bounce;
173 _emitter[e].gravity = 0.0f;152 _emitter[emitterIndex].particleAttributes.gravity = attributes.gravity;
174 }153 _emitter[emitterIndex].particleAttributes.airFriction = attributes.airFriction;
154 _emitter[emitterIndex].particleAttributes.jitter = attributes.jitter;
155 _emitter[emitterIndex].particleAttributes.emitterAttraction = attributes.emitterAttraction;
156 _emitter[emitterIndex].particleAttributes.tornadoForce = attributes.tornadoForce;
157 _emitter[emitterIndex].particleAttributes.neighborAttraction = attributes.neighborAttraction;
158 _emitter[emitterIndex].particleAttributes.neighborRepulsion = attributes.neighborRepulsion;
159 _emitter[emitterIndex].particleAttributes.usingCollisionSphere = attributes.usingCollisionSphere;
160 _emitter[emitterIndex].particleAttributes.collisionSpherePosition = attributes.collisionSpherePosition;
161 _emitter[emitterIndex].particleAttributes.collisionSphereRadius = attributes.collisionSphereRadius;
175}162}
176 163
177 164
165
178void ParticleSystem::updateParticle(int p, float deltaTime) {166void ParticleSystem::updateParticle(int p, float deltaTime) {
179 167
180 _particle[p].age += deltaTime;168 _particle[p].age += deltaTime;
@@ -189,14 +177,14 @@ void ParticleSystem::updateParticle(int p, float deltaTime) { · 8 unmodified lines
189 _particle[p].velocity += 177 _particle[p].velocity +=
190 glm::vec3178 glm::vec3
191 (179 (
192 -myEmitter.jitter * ONE_HALF + myEmitter.jitter * randFloat(), 180 -myEmitter.particleAttributes.jitter * ONE_HALF + myEmitter.particleAttributes.jitter * randFloat(),
193 -myEmitter.jitter * ONE_HALF + myEmitter.jitter * randFloat(), 181 -myEmitter.particleAttributes.jitter * ONE_HALF + myEmitter.particleAttributes.jitter * randFloat(),
194 -myEmitter.jitter * ONE_HALF + myEmitter.jitter * randFloat()182 -myEmitter.particleAttributes.jitter * ONE_HALF + myEmitter.particleAttributes.jitter * randFloat()
195 ) * deltaTime;183 ) * deltaTime;
196 184
197 // apply attraction to home position185 // apply attraction to home position
198 glm::vec3 vectorToHome = myEmitter.position - _particle[p].position;186 glm::vec3 vectorToHome = myEmitter.position - _particle[p].position;
199 _particle[p].velocity += vectorToHome * myEmitter.emitterAttraction * deltaTime;187 _particle[p].velocity += vectorToHome * myEmitter.particleAttributes.emitterAttraction * deltaTime;
200 188
201 // apply neighbor attraction189 // apply neighbor attraction
202 int neighbor = p + 1;190 int neighbor = p + 1;
@@ -207,20 +195,20 @@ void ParticleSystem::updateParticle(int p, float deltaTime) { · 4 unmodified lines
207 if ( _particle[neighbor].emitterIndex == _particle[p].emitterIndex) {195 if ( _particle[neighbor].emitterIndex == _particle[p].emitterIndex) {
208 glm::vec3 vectorToNeighbor = _particle[p].position - _particle[neighbor].position;196 glm::vec3 vectorToNeighbor = _particle[p].position - _particle[neighbor].position;
209 197
210 _particle[p].velocity -= vectorToNeighbor * myEmitter.neighborAttraction * deltaTime;198 _particle[p].velocity -= vectorToNeighbor * myEmitter.particleAttributes.neighborAttraction * deltaTime;
211 199
212 float distanceToNeighbor = glm::length(vectorToNeighbor);200 float distanceToNeighbor = glm::length(vectorToNeighbor);
213 if (distanceToNeighbor > 0.0f) {201 if (distanceToNeighbor > 0.0f) {
214 _particle[neighbor].velocity += (vectorToNeighbor / ( 1.0f + distanceToNeighbor * distanceToNeighbor)) * myEmitter.neighborRepulsion * deltaTime;202 _particle[neighbor].velocity += (vectorToNeighbor / ( 1.0f + distanceToNeighbor * distanceToNeighbor)) * myEmitter.particleAttributes.neighborRepulsion * deltaTime;
215 }203 }
216 }204 }
217 205
218 // apply tornado force206 // apply tornado force
219 glm::vec3 tornadoDirection = glm::cross(vectorToHome, myEmitter.up);207 glm::vec3 tornadoDirection = glm::cross(vectorToHome, myEmitter.up);
220 _particle[p].velocity += tornadoDirection * myEmitter.tornadoForce * deltaTime;208 _particle[p].velocity += tornadoDirection * myEmitter.particleAttributes.tornadoForce * deltaTime;
221 209
222 // apply air friction210 // apply air friction
223 float drag = 1.0 - myEmitter.airFriction * deltaTime;211 float drag = 1.0 - myEmitter.particleAttributes.airFriction * deltaTime;
224 if (drag < 0.0f) {212 if (drag < 0.0f) {
225 _particle[p].velocity = glm::vec3(0.0f, 0.0f, 0.0f);213 _particle[p].velocity = glm::vec3(0.0f, 0.0f, 0.0f);
226 } else {214 } else {
@@ -228,7 +216,7 @@ void ParticleSystem::updateParticle(int p, float deltaTime) { · 1 unmodified line
228 }216 }
229 217
230 // apply gravity218 // apply gravity
231 _particle[p].velocity -= _upDirection * myEmitter.gravity * deltaTime; 219 _particle[p].velocity -= _upDirection * myEmitter.particleAttributes.gravity * deltaTime;
232 220
233 // update position by velocity221 // update position by velocity
234 _particle[p].position += _particle[p].velocity;222 _particle[p].position += _particle[p].velocity;
@@ -238,29 +226,29 @@ void ParticleSystem::updateParticle(int p, float deltaTime) { · 3 unmodified lines
238 _particle[p].position.y = _particle[p].radius;226 _particle[p].position.y = _particle[p].radius;
239 227
240 if (_particle[p].velocity.y < 0.0f) {228 if (_particle[p].velocity.y < 0.0f) {
241 _particle[p].velocity.y *= -myEmitter.bounce;229 _particle[p].velocity.y *= -myEmitter.particleAttributes.bounce;
242 }230 }
243 }231 }
244 232
245 // collision with sphere233 // collision with sphere
246 if (myEmitter.usingCollisionSphere) {234 if (myEmitter.particleAttributes.usingCollisionSphere) {
247 glm::vec3 vectorToSphereCenter = myEmitter.collisionSpherePosition - _particle[p].position;235 glm::vec3 vectorToSphereCenter = myEmitter.particleAttributes.collisionSpherePosition - _particle[p].position;
248 float distanceToSphereCenter = glm::length(vectorToSphereCenter);236 float distanceToSphereCenter = glm::length(vectorToSphereCenter);
249 float combinedRadius = myEmitter.collisionSphereRadius + _particle[p].radius;237 float combinedRadius = myEmitter.particleAttributes.collisionSphereRadius + _particle[p].radius;
250 if (distanceToSphereCenter < combinedRadius) {238 if (distanceToSphereCenter < combinedRadius) {
251 239
252 if (distanceToSphereCenter > 0.0f){240 if (distanceToSphereCenter > 0.0f){
253 glm::vec3 directionToSphereCenter = vectorToSphereCenter / distanceToSphereCenter;241 glm::vec3 directionToSphereCenter = vectorToSphereCenter / distanceToSphereCenter;
254 _particle[p].position = myEmitter.collisionSpherePosition - directionToSphereCenter * combinedRadius; 242 _particle[p].position = myEmitter.particleAttributes.collisionSpherePosition - directionToSphereCenter * combinedRadius;
255 }243 }
256 }244 }
257 }245 }
258}246}
259 247
260void ParticleSystem::setCollisionSphere(int e, glm::vec3 position, float radius) {248void ParticleSystem::setCollisionSphere(int e, glm::vec3 position, float radius) {
261 _emitter[e].usingCollisionSphere = true;249 _emitter[e].particleAttributes.usingCollisionSphere = true;
262 _emitter[e].collisionSpherePosition = position; 250 _emitter[e].particleAttributes.collisionSpherePosition = position;
263 _emitter[e].collisionSphereRadius = radius;251 _emitter[e].particleAttributes.collisionSphereRadius = radius;
264}252}
265 253
266void ParticleSystem::render() {254void ParticleSystem::render() {