diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 567602cd34..72deb6340a 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -337,7 +337,17 @@ void AvatarManager::handleCollisionEvents(const CollisionEvents& collisionEvents // but most avatars are roughly the same size, so let's not be so fancy yet. const float AVATAR_STRETCH_FACTOR = 1.0f; - AudioInjector::playSound(collisionSound, energyFactorOfFull, AVATAR_STRETCH_FACTOR, myAvatar->getPosition()); + + _collisionInjectors.remove_if([](QPointer& injector) { + return !injector || injector->isFinished(); + }); + + static const int MAX_INJECTOR_COUNT = 3; + if (_collisionInjectors.size() < MAX_INJECTOR_COUNT) { + auto injector = AudioInjector::playSound(collisionSound, energyFactorOfFull, AVATAR_STRETCH_FACTOR, + myAvatar->getPosition()); + _collisionInjectors.emplace_back(injector); + } myAvatar->collisionWithEntity(collision); return; } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 1cd295d69f..9be186301d 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -25,6 +25,7 @@ #include "AvatarMotionState.h" class MyAvatar; +class AudioInjector; class AvatarManager : public AvatarHashMap { Q_OBJECT @@ -94,6 +95,8 @@ private: bool _shouldShowReceiveStats = false; + std::list> _collisionInjectors; + SetOfAvatarMotionStates _motionStatesThatMightUpdate; SetOfMotionStates _motionStatesToAddToPhysics; VectorOfMotionStates _motionStatesToRemoveFromPhysics;