diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 7d91681c0e..c268561a8d 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -275,7 +275,11 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { if (inView && avatar->hasNewJointData()) { numAvatarsUpdated++; } - avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); + auto transitStatus = avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); + if (avatar->getIsNewAvatar() && (transitStatus == AvatarTransit::Status::START_TRANSIT || transitStatus == AvatarTransit::Status::ABORT_TRANSIT)) { + avatar->_transit.reset(); + avatar->setIsNewAvatar(false); + } avatar->simulate(deltaTime, inView); avatar->updateRenderItem(renderTransaction); avatar->updateSpaceProxy(workloadTransaction); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index b4b213dc87..e3d6e707a2 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -118,14 +118,24 @@ AvatarTransit::Status AvatarTransit::update(float deltaTime, const glm::vec3& av float oneFrameDistance = glm::length(currentPosition - _lastPosition); const float MAX_TRANSIT_DISTANCE = 30.0f; float scaledMaxTransitDistance = MAX_TRANSIT_DISTANCE * _scale; - if (oneFrameDistance > config._triggerDistance && oneFrameDistance < scaledMaxTransitDistance && !_isTransiting) { - start(deltaTime, _lastPosition, currentPosition, config); + if (oneFrameDistance > config._triggerDistance && !_isTransiting) { + if (oneFrameDistance < scaledMaxTransitDistance) { + start(deltaTime, _lastPosition, currentPosition, config); + } else { + _lastPosition = currentPosition; + return Status::ABORT_TRANSIT; + } } _lastPosition = currentPosition; _status = updatePosition(deltaTime); return _status; } +void AvatarTransit::reset() { + _lastPosition = _endPosition; + _currentPosition = _endPosition; + _isTransiting = false; +} void AvatarTransit::start(float deltaTime, const glm::vec3& startPosition, const glm::vec3& endPosition, const AvatarTransit::TransitConfig& config) { _startPosition = startPosition; _endPosition = endPosition; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index fe5d310812..1087f74c07 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -56,7 +56,8 @@ public: IDLE = 0, START_TRANSIT, TRANSITING, - END_TRANSIT + END_TRANSIT, + ABORT_TRANSIT }; enum EaseType { @@ -84,6 +85,7 @@ public: glm::vec3 getEndPosition() { return _endPosition; } float getTransitTime() { return _totalTime; } void setScale(float scale) { _scale = scale; } + void reset(); private: Status updatePosition(float deltaTime); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index a890482e9a..860772b7c9 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -1190,6 +1190,9 @@ public: void setReplicaIndex(int replicaIndex) { _replicaIndex = replicaIndex; } int getReplicaIndex() { return _replicaIndex; } + void setIsNewAvatar(bool isNewAvatar) { _isNewAvatar = isNewAvatar; } + bool getIsNewAvatar() { return _isNewAvatar; } + signals: /**jsdoc @@ -1452,6 +1455,7 @@ protected: bool _hasProcessedFirstIdentity { false }; float _density; int _replicaIndex { 0 }; + bool _isNewAvatar { true }; // null unless MyAvatar or ScriptableAvatar sending traits data to mixer std::unique_ptr _clientTraitsHandler; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index c8ea68dae4..af65a32ef5 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -259,18 +259,20 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointersetIsNewAvatar(true); auto replicaIDs = _replicas.getReplicaIDs(sessionUUID); for (auto replicaID : replicaIDs) { auto replicaAvatar = addAvatar(replicaID, sendingNode); + replicaAvatar->setIsNewAvatar(true); _replicas.addReplica(sessionUUID, replicaAvatar); } } - - + // have the matching (or new) avatar parse the data from the packet int bytesRead = avatar->parseDataFromBuffer(byteArray); message->seek(positionBeforeRead + bytesRead); _replicas.parseDataFromBuffer(sessionUUID, byteArray); + return avatar; } else {