History

added collision plane

Jeffrey Ventrella committed 13 years ago

Commit 05e0bf31 parent cecb9084 files · +30 −7Browse files

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

Unified · Split

interface/src/ParticleSystem.cpp+16−7
@@ -56,6 +56,9 @@ ParticleSystem::ParticleSystem() { · 55 unmodified lines
5656 a->collisionSphereRadius = 0.0f;
5757 a->collisionSpherePosition = glm::vec3(0.0f, 0.0f, 0.0f);
5858 a->usingCollisionSphere = false;
59+ a->collisionPlaneNormal = _upDirection;
60+ a->collisionPlanePosition = glm::vec3(0.0f, 0.0f, 0.0f);
61+ a->usingCollisionPlane = false;
5962 }
6063 };
6164
@@ -186,6 +189,9 @@ void ParticleSystem::setParticleAttributes(int emitterIndex, ParticleLifeStage l · 124 unmodified lines
186189 a->usingCollisionSphere = attributes.usingCollisionSphere;
187190 a->collisionSpherePosition = attributes.collisionSpherePosition;
188191 a->collisionSphereRadius = attributes.collisionSphereRadius;
192+ a->usingCollisionPlane = attributes.usingCollisionPlane;
193+ a->collisionPlanePosition = attributes.collisionPlanePosition;
194+ a->collisionPlaneNormal = attributes.collisionPlaneNormal;
189195 }
190196
191197
@@ -260,13 +266,16 @@ void ParticleSystem::updateParticle(int p, float deltaTime) { · 68 unmodified lines
260266
261267 // update position by velocity
262268 _particle[p].position += _particle[p].velocity;
263−
264− // collision with ground
265− if (_particle[p].position.y < _particle[p].radius) {
266− _particle[p].position.y = _particle[p].radius;
267−
268− if (_particle[p].velocity.y < 0.0f) {
269− _particle[p].velocity.y *= -myEmitter.particleAttributes[lifeStage].bounce;
269+
270+ // collision with the plane surface
271+ if (myEmitter.particleAttributes[lifeStage].usingCollisionPlane) {
272+ glm::vec3 vectorFromParticleToPlanePosition = _particle[p].position - myEmitter.particleAttributes[lifeStage].collisionPlanePosition;
273+ glm::vec3 normal = myEmitter.particleAttributes[lifeStage].collisionPlaneNormal;
274+ float dot = glm::dot(vectorFromParticleToPlanePosition, normal);
275+ if (dot < _particle[p].radius) {
276+ _particle[p].position += normal * (_particle[p].radius - dot);
277+ float planeNormalComponentOfVelocity = glm::dot(_particle[p].velocity, normal);
278+ _particle[p].velocity -= normal * planeNormalComponentOfVelocity * (1.0f + myEmitter.particleAttributes[lifeStage].bounce);
270279 }
271280 }
272281