From 70c675e9bec19f09674656f43c5980665426200c Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 23 Jan 2014 16:03:52 -0800 Subject: [PATCH 1/2] Adding comments and minor cleanup after tracking down some NaN's that were showing up in collision sound triggers. --- libraries/octree/src/Octree.cpp | 1 + .../particles/src/ParticleCollisionSystem.cpp | 24 ++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 808b49d475..5d25f0c164 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -592,6 +592,7 @@ bool findSpherePenetrationOp(OctreeElement* element, void* extraData) { if (element->hasContent()) { glm::vec3 elementPenetration; if (element->findSpherePenetration(args->center, args->radius, elementPenetration, &args->penetratedObject)) { + // NOTE: it is possible for this penetration accumulation algorithm to produce a final penetration vector with zero length. args->penetration = addPenetrations(args->penetration, elementPenetration * (float)(TREE_SCALE)); args->found = true; } diff --git a/libraries/particles/src/ParticleCollisionSystem.cpp b/libraries/particles/src/ParticleCollisionSystem.cpp index ff65bc4298..f386b3ef4a 100644 --- a/libraries/particles/src/ParticleCollisionSystem.cpp +++ b/libraries/particles/src/ParticleCollisionSystem.cpp @@ -79,8 +79,8 @@ void ParticleCollisionSystem::updateCollisionWithVoxels(Particle* particle) { // let the particles run their collision scripts if they have them particle->collisionWithVoxel(voxelDetails); - collisionInfo._penetration /= (float)(TREE_SCALE); updateCollisionSound(particle, collisionInfo._penetration, COLLISION_FREQUENCY); + collisionInfo._penetration /= (float)(TREE_SCALE); applyHardCollision(particle, ELASTICITY, DAMPING, collisionInfo); delete voxelDetails; // cleanup returned details @@ -134,7 +134,6 @@ void ParticleCollisionSystem::updateCollisionWithParticles(Particle* particleA) _packetSender->releaseQueuedMessages(); - penetration /= (float)(TREE_SCALE); updateCollisionSound(particleA, penetration, COLLISION_FREQUENCY); } } @@ -184,8 +183,8 @@ void ParticleCollisionSystem::updateCollisionWithAvatars(Particle* particle) { } // HACK END - collisionInfo._penetration /= (float)(TREE_SCALE); updateCollisionSound(particle, collisionInfo._penetration, COLLISION_FREQUENCY); + collisionInfo._penetration /= (float)(TREE_SCALE); applyHardCollision(particle, elasticity, damping, collisionInfo); } } @@ -216,8 +215,8 @@ void ParticleCollisionSystem::updateCollisionWithAvatars(Particle* particle) { } // HACK END - collisionInfo._penetration /= (float)(TREE_SCALE); updateCollisionSound(particle, collisionInfo._penetration, COLLISION_FREQUENCY); + collisionInfo._penetration /= (float)(TREE_SCALE); applyHardCollision(particle, ELASTICITY, damping, collisionInfo); } } @@ -293,18 +292,21 @@ void ParticleCollisionSystem::updateCollisionSound(Particle* particle, const glm velocity -= _scale * glm::length(gravity) * GRAVITY_EARTH * deltaTime * glm::normalize(gravity); } */ - float velocityTowardCollision = glm::dot(velocity, glm::normalize(penetration)); - float velocityTangentToCollision = glm::length(velocity) - velocityTowardCollision; + float normalSpeed = glm::dot(velocity, glm::normalize(penetration)); + // NOTE: it is possible for normalSpeed to be NaN at this point + // (sometimes the average penetration of a bunch of voxels is a zero length vector which cannot be normalized) + // however the check below will fail (NaN comparisons always fail) and everything will be fine. - if (velocityTowardCollision > AUDIBLE_COLLISION_THRESHOLD) { + if (normalSpeed > AUDIBLE_COLLISION_THRESHOLD) { // Volume is proportional to collision velocity // Base frequency is modified upward by the angle of the collision // Noise is a function of the angle of collision // Duration of the sound is a function of both base frequency and velocity of impact + float tangentialSpeed = glm::length(velocity) - normalSpeed; _audio->startCollisionSound( - std::min(COLLISION_LOUDNESS * velocityTowardCollision, 1.f), - frequency * (1.f + velocityTangentToCollision / velocityTowardCollision), - std::min(velocityTangentToCollision / velocityTowardCollision * NOISE_SCALING, 1.f), - 1.f - DURATION_SCALING * powf(frequency, 0.5f) / velocityTowardCollision, false); + std::min(COLLISION_LOUDNESS * normalSpeed, 1.f), + frequency * (1.f + tangentialSpeed / normalSpeed), + std::min(tangentialSpeed / normalSpeed * NOISE_SCALING, 1.f), + 1.f - DURATION_SCALING * powf(frequency, 0.5f) / normalSpeed, false); } } From 93482d9d1888dfbda410f813dcb7410c543a4b45 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Thu, 23 Jan 2014 16:41:03 -0800 Subject: [PATCH 2/2] Fixing indentation. --- libraries/particles/src/ParticleCollisionSystem.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libraries/particles/src/ParticleCollisionSystem.cpp b/libraries/particles/src/ParticleCollisionSystem.cpp index 65ed8f1e2b..8eb525a388 100644 --- a/libraries/particles/src/ParticleCollisionSystem.cpp +++ b/libraries/particles/src/ParticleCollisionSystem.cpp @@ -303,10 +303,9 @@ void ParticleCollisionSystem::updateCollisionSound(Particle* particle, const glm // Noise is a function of the angle of collision // Duration of the sound is a function of both base frequency and velocity of impact float tangentialSpeed = glm::length(velocity) - normalSpeed; - _audio->startCollisionSound( - std::min(COLLISION_LOUDNESS * normalSpeed, 1.f), - frequency * (1.f + tangentialSpeed / normalSpeed), - std::min(tangentialSpeed / normalSpeed * NOISE_SCALING, 1.f), - 1.f - DURATION_SCALING * powf(frequency, 0.5f) / normalSpeed, false); + _audio->startCollisionSound( std::min(COLLISION_LOUDNESS * normalSpeed, 1.f), + frequency * (1.f + tangentialSpeed / normalSpeed), + std::min(tangentialSpeed / normalSpeed * NOISE_SCALING, 1.f), + 1.f - DURATION_SCALING * powf(frequency, 0.5f) / normalSpeed, false); } }