mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-04-17 11:38:45 +02:00
Merge pull request #14150 from AndrewMeadows/remove-expired-avatarEntities
remove expired avatarEntities from their avatars
This commit is contained in:
commit
2d8458f03e
7 changed files with 29 additions and 2 deletions
|
@ -5921,6 +5921,10 @@ void Application::update(float deltaTime) {
|
|||
// update the rendering without any simulation
|
||||
getEntities()->update(false);
|
||||
}
|
||||
// remove recently dead avatarEntities
|
||||
SetOfEntities deadAvatarEntities;
|
||||
_entitySimulation->takeDeadAvatarEntities(deadAvatarEntities);
|
||||
avatarManager->removeDeadAvatarEntities(deadAvatarEntities);
|
||||
}
|
||||
|
||||
// AvatarManager update
|
||||
|
|
|
@ -452,6 +452,17 @@ void AvatarManager::handleProcessedPhysicsTransaction(PhysicsEngine::Transaction
|
|||
transaction.clear();
|
||||
}
|
||||
|
||||
void AvatarManager::removeDeadAvatarEntities(const SetOfEntities& deadEntities) {
|
||||
for (auto entity : deadEntities) {
|
||||
QUuid sessionID = entity->getOwningAvatarID();
|
||||
AvatarSharedPointer avatar = getAvatarBySessionID(sessionID);
|
||||
if (avatar) {
|
||||
const bool REQUIRES_REMOVAL_FROM_TREE = false;
|
||||
avatar->clearAvatarEntity(entity->getID(), REQUIRES_REMOVAL_FROM_TREE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason) {
|
||||
auto avatar = std::static_pointer_cast<OtherAvatar>(removedAvatar);
|
||||
{
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <avatars-renderer/ScriptAvatar.h>
|
||||
#include <AudioInjector.h>
|
||||
#include <workload/Space.h>
|
||||
#include <EntitySimulation.h> // for SetOfEntities
|
||||
|
||||
#include "AvatarMotionState.h"
|
||||
#include "MyAvatar.h"
|
||||
|
@ -187,6 +188,7 @@ public:
|
|||
void queuePhysicsChange(const OtherAvatarPointer& avatar);
|
||||
void buildPhysicsTransaction(PhysicsEngine::Transaction& transaction);
|
||||
void handleProcessedPhysicsTransaction(PhysicsEngine::Transaction& transaction);
|
||||
void removeDeadAvatarEntities(const SetOfEntities& deadEntities);
|
||||
|
||||
public slots:
|
||||
/**jsdoc
|
||||
|
|
|
@ -137,7 +137,7 @@ MyAvatar::MyAvatar(QThread* thread) :
|
|||
_useSnapTurnSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "useSnapTurn", _useSnapTurn),
|
||||
_userHeightSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "userHeight", DEFAULT_AVATAR_HEIGHT),
|
||||
_flyingHMDSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "flyingHMD", _flyingPrefHMD),
|
||||
_avatarEntityCountSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "avatarEntityData" << "size", _flyingPrefHMD)
|
||||
_avatarEntityCountSetting(QStringList() << AVATAR_SETTINGS_GROUP_NAME << "avatarEntityData" << "size", 0)
|
||||
{
|
||||
_clientTraitsHandler = std::unique_ptr<ClientTraitsHandler>(new ClientTraitsHandler(this));
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ protected:
|
|||
QMutex _dynamicsMutex { QMutex::Recursive };
|
||||
|
||||
protected:
|
||||
SetOfEntities _deadEntities;
|
||||
SetOfEntities _deadEntities; // dead entities that might still be in the _entityTree
|
||||
|
||||
private:
|
||||
void moveSimpleKinematics();
|
||||
|
|
|
@ -79,6 +79,9 @@ void PhysicalEntitySimulation::removeEntityInternal(EntityItemPointer entity) {
|
|||
_deadEntities.insert(entity);
|
||||
}
|
||||
}
|
||||
if (entity->getClientOnly()) {
|
||||
_deadAvatarEntities.insert(entity);
|
||||
}
|
||||
}
|
||||
|
||||
void PhysicalEntitySimulation::removeOwnershipData(EntityMotionState* motionState) {
|
||||
|
@ -123,6 +126,11 @@ void PhysicalEntitySimulation::takeDeadEntities(SetOfEntities& deadEntities) {
|
|||
_deadEntities.clear();
|
||||
}
|
||||
|
||||
void PhysicalEntitySimulation::takeDeadAvatarEntities(SetOfEntities& deadEntities) {
|
||||
_deadAvatarEntities.swap(deadEntities);
|
||||
_deadAvatarEntities.clear();
|
||||
}
|
||||
|
||||
void PhysicalEntitySimulation::changeEntityInternal(EntityItemPointer entity) {
|
||||
// queue incoming changes: from external sources (script, EntityServer, etc) to physics engine
|
||||
QMutexLocker lock(&_mutex);
|
||||
|
|
|
@ -60,6 +60,7 @@ public:
|
|||
virtual void applyDynamicChanges() override;
|
||||
|
||||
virtual void takeDeadEntities(SetOfEntities& deadEntities) override;
|
||||
void takeDeadAvatarEntities(SetOfEntities& deadEntities);
|
||||
|
||||
signals:
|
||||
void entityCollisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision);
|
||||
|
@ -112,6 +113,7 @@ private:
|
|||
|
||||
VectorOfEntityMotionStates _owned;
|
||||
VectorOfEntityMotionStates _bids;
|
||||
SetOfEntities _deadAvatarEntities;
|
||||
workload::SpacePointer _space;
|
||||
uint64_t _nextBidExpiry;
|
||||
uint32_t _lastStepSendPackets { 0 };
|
||||
|
|
Loading…
Reference in a new issue