From bb98457d09525b7ff04fb7505601f15455c74180 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 3 Oct 2018 16:23:09 -0700 Subject: [PATCH 1/2] Fix avatars transit on domain enter --- interface/src/avatar/AvatarManager.cpp | 6 +++++- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 5 +++++ libraries/avatars-renderer/src/avatars-renderer/Avatar.h | 1 + libraries/avatars/src/AvatarData.h | 4 ++++ libraries/avatars/src/AvatarHashMap.cpp | 6 ++++-- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 7d91681c0e..661b13d6d1 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) { + 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..fe3e1644c4 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -126,6 +126,11 @@ AvatarTransit::Status AvatarTransit::update(float deltaTime, const glm::vec3& av 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..7764d0ef54 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -84,6 +84,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 { From a05e493e0634dbb57b71fb75dfbddf11134609a0 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 3 Oct 2018 17:09:51 -0700 Subject: [PATCH 2/2] Long distance avatars should not be new --- interface/src/avatar/AvatarManager.cpp | 2 +- .../avatars-renderer/src/avatars-renderer/Avatar.cpp | 9 +++++++-- libraries/avatars-renderer/src/avatars-renderer/Avatar.h | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 661b13d6d1..c268561a8d 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -276,7 +276,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { numAvatarsUpdated++; } auto transitStatus = avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); - if (avatar->getIsNewAvatar() && transitStatus == AvatarTransit::Status::START_TRANSIT) { + if (avatar->getIsNewAvatar() && (transitStatus == AvatarTransit::Status::START_TRANSIT || transitStatus == AvatarTransit::Status::ABORT_TRANSIT)) { avatar->_transit.reset(); avatar->setIsNewAvatar(false); } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index fe3e1644c4..e3d6e707a2 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -118,8 +118,13 @@ 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); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 7764d0ef54..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 {