diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index e98e082b35..b80d53e6c3 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -417,7 +417,7 @@ void AvatarManager::buildPhysicsTransaction(PhysicsEngine::Transaction& transact avatar->resetDetailedMotionStates(); } else { - { + if (avatar->_motionState == nullptr) { ShapeInfo shapeInfo; avatar->computeShapeInfo(shapeInfo); btCollisionShape* shape = const_cast(ObjectMotionState::getShapeManager()->getShape(shapeInfo)); @@ -427,21 +427,20 @@ void AvatarManager::buildPhysicsTransaction(PhysicsEngine::Transaction& transact avatar->_motionState = motionState; transaction.objectsToAdd.push_back(motionState); } - else { - failedShapeBuilds.insert(avatar); - } } - - { + auto& detailedMotionStates = avatar->getDetailedMotionStates(); + if (detailedMotionStates.size() == 0) { for (int i = 0; i < avatar->getJointCount(); i++) { avatar->addNewMotionState(avatar, i); } - auto& detailedMotionStates = avatar->getDetailedMotionStates(); for (auto& mState : detailedMotionStates) { transaction.objectsToAdd.push_back(mState); } qCDebug(animation) << "Creating " << detailedMotionStates.size() << " detailed motion states from " << avatar->getSessionUUID(); } + if (avatar->_motionState == nullptr || detailedMotionStates.size() == 0) { + failedShapeBuilds.insert(avatar); + } } } else if (isInPhysics) { transaction.objectsToChange.push_back(avatar->_motionState); diff --git a/interface/src/avatar/OtherAvatar.cpp b/interface/src/avatar/OtherAvatar.cpp index 30793f1696..7495e5e2df 100644 --- a/interface/src/avatar/OtherAvatar.cpp +++ b/interface/src/avatar/OtherAvatar.cpp @@ -118,7 +118,6 @@ int OtherAvatar::parseDataFromBuffer(const QByteArray& buffer) { } void OtherAvatar::addNewMotionState(std::shared_ptr avatar, int jointIndex) { - std::lock_guard lock(_mStateLock); if (jointIndex > -1 && jointIndex < _multiSphereShapes.size()) { auto& data = _multiSphereShapes[jointIndex].getSpheresData(); std::vector positions; @@ -138,10 +137,7 @@ void OtherAvatar::addNewMotionState(std::shared_ptr avatar, int joi } } } -const std::vector& OtherAvatar::getDetailedMotionStates() { - std::lock_guard lock(_mStateLock); - return _detailedMotionStates; -} + void OtherAvatar::resetDetailedMotionStates() { for (size_t i = 0; i < _detailedMotionStates.size(); i++) { _detailedMotionStates[i] = nullptr; diff --git a/interface/src/avatar/OtherAvatar.h b/interface/src/avatar/OtherAvatar.h index a337d5d299..18b93b8aad 100644 --- a/interface/src/avatar/OtherAvatar.h +++ b/interface/src/avatar/OtherAvatar.h @@ -39,7 +39,7 @@ public: int parseDataFromBuffer(const QByteArray& buffer) override; - bool isInPhysicsSimulation() const { return _motionState != nullptr; } + bool isInPhysicsSimulation() const { return _motionState != nullptr && _detailedMotionStates.size() > 0; } void rebuildCollisionShape() override; void setWorkloadRegion(uint8_t region); @@ -47,7 +47,7 @@ public: bool needsPhysicsUpdate() const; void addNewMotionState(std::shared_ptr avatar, int jointIndex); - const std::vector& getDetailedMotionStates(); + const std::vector& getDetailedMotionStates() { return _detailedMotionStates; } void resetDetailedMotionStates(); friend AvatarManager; @@ -59,7 +59,6 @@ protected: std::vector _detailedMotionStates; int32_t _spaceIndex { -1 }; uint8_t _workloadRegion { workload::Region::INVALID }; - std::mutex _mStateLock; }; using OtherAvatarPointer = std::shared_ptr;