mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 19:02:55 +02:00
Merge pull request #8002 from Atlante45/fix/avatar-collision-sounds
Fix Avatar collision sounds triggering all the time.
This commit is contained in:
commit
e891a53ddd
3 changed files with 18 additions and 6 deletions
|
@ -322,7 +322,7 @@ void AvatarManager::handleCollisionEvents(const CollisionEvents& collisionEvents
|
||||||
const auto characterController = myAvatar->getCharacterController();
|
const auto characterController = myAvatar->getCharacterController();
|
||||||
const float avatarVelocityChange = (characterController ? glm::length(characterController->getVelocityChange()) : 0.0f);
|
const float avatarVelocityChange = (characterController ? glm::length(characterController->getVelocityChange()) : 0.0f);
|
||||||
const float velocityChange = glm::length(collision.velocityChange) + avatarVelocityChange;
|
const float velocityChange = glm::length(collision.velocityChange) + avatarVelocityChange;
|
||||||
const float MIN_AVATAR_COLLISION_ACCELERATION = 0.01f;
|
const float MIN_AVATAR_COLLISION_ACCELERATION = 2.4f; // walking speed
|
||||||
const bool isSound = (collision.type == CONTACT_EVENT_TYPE_START) && (velocityChange > MIN_AVATAR_COLLISION_ACCELERATION);
|
const bool isSound = (collision.type == CONTACT_EVENT_TYPE_START) && (velocityChange > MIN_AVATAR_COLLISION_ACCELERATION);
|
||||||
|
|
||||||
if (!isSound) {
|
if (!isSound) {
|
||||||
|
@ -330,14 +330,24 @@ void AvatarManager::handleCollisionEvents(const CollisionEvents& collisionEvents
|
||||||
}
|
}
|
||||||
// Your avatar sound is personal to you, so let's say the "mass" part of the kinetic energy is already accounted for.
|
// Your avatar sound is personal to you, so let's say the "mass" part of the kinetic energy is already accounted for.
|
||||||
const float energy = velocityChange * velocityChange;
|
const float energy = velocityChange * velocityChange;
|
||||||
const float COLLISION_ENERGY_AT_FULL_VOLUME = 0.5f;
|
const float COLLISION_ENERGY_AT_FULL_VOLUME = 10.0f;
|
||||||
const float energyFactorOfFull = fmin(1.0f, energy / COLLISION_ENERGY_AT_FULL_VOLUME);
|
const float energyFactorOfFull = fmin(1.0f, energy / COLLISION_ENERGY_AT_FULL_VOLUME);
|
||||||
|
|
||||||
// For general entity collisionSoundURL, playSound supports changing the pitch for the sound based on the size of the object,
|
// For general entity collisionSoundURL, playSound supports changing the pitch for the sound based on the size of the object,
|
||||||
// but most avatars are roughly the same size, so let's not be so fancy yet.
|
// but most avatars are roughly the same size, so let's not be so fancy yet.
|
||||||
const float AVATAR_STRETCH_FACTOR = 1.0f;
|
const float AVATAR_STRETCH_FACTOR = 1.0f;
|
||||||
|
|
||||||
AudioInjector::playSound(collisionSound, energyFactorOfFull, AVATAR_STRETCH_FACTOR, myAvatar->getPosition());
|
|
||||||
|
_collisionInjectors.remove_if([](QPointer<AudioInjector>& 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);
|
myAvatar->collisionWithEntity(collision);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "AvatarMotionState.h"
|
#include "AvatarMotionState.h"
|
||||||
|
|
||||||
class MyAvatar;
|
class MyAvatar;
|
||||||
|
class AudioInjector;
|
||||||
|
|
||||||
class AvatarManager : public AvatarHashMap {
|
class AvatarManager : public AvatarHashMap {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -94,6 +95,8 @@ private:
|
||||||
|
|
||||||
bool _shouldShowReceiveStats = false;
|
bool _shouldShowReceiveStats = false;
|
||||||
|
|
||||||
|
std::list<QPointer<AudioInjector>> _collisionInjectors;
|
||||||
|
|
||||||
SetOfAvatarMotionStates _motionStatesThatMightUpdate;
|
SetOfAvatarMotionStates _motionStatesThatMightUpdate;
|
||||||
SetOfMotionStates _motionStatesToAddToPhysics;
|
SetOfMotionStates _motionStatesToAddToPhysics;
|
||||||
VectorOfMotionStates _motionStatesToRemoveFromPhysics;
|
VectorOfMotionStates _motionStatesToRemoveFromPhysics;
|
||||||
|
|
|
@ -401,11 +401,10 @@ glm::vec3 CharacterController::getLinearVelocity() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 CharacterController::getVelocityChange() const {
|
glm::vec3 CharacterController::getVelocityChange() const {
|
||||||
glm::vec3 velocity(0.0f);
|
|
||||||
if (_rigidBody) {
|
if (_rigidBody) {
|
||||||
velocity = bulletToGLM(_rigidBody->getLinearVelocity());
|
return bulletToGLM(_velocityChange);
|
||||||
}
|
}
|
||||||
return velocity;
|
return glm::vec3(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CharacterController::clearMotors() {
|
void CharacterController::clearMotors() {
|
||||||
|
|
Loading…
Reference in a new issue