From 4d381b9d04ec5d93a58842ac5dbd0a8cb817487e Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 12 Sep 2018 10:01:41 -0700 Subject: [PATCH 01/17] Smooth other avatars positions --- interface/src/avatar/AvatarManager.cpp | 20 ++++++++++ interface/src/avatar/AvatarManager.h | 18 +++++++++ .../src/avatars-renderer/Avatar.cpp | 38 +++++++++++++++++++ .../src/avatars-renderer/Avatar.h | 19 ++++++++++ 4 files changed, 95 insertions(+) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index e9486b9def..26b3119c2f 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -78,6 +78,12 @@ AvatarManager::AvatarManager(QObject* parent) : removeAvatar(nodeID, KillAvatarReason::AvatarIgnored); } }); + + const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; + const int AVATAR_TRANSIT_FRAME_COUNT = 20; + + _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; + _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -250,6 +256,20 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { if (inView && avatar->hasNewJointData()) { numAvatarsUpdated++; } + // smooth other avatars positions + { + float oneFrameDistance = glm::length(avatar->_globalPosition - avatar->_lastPosition); + if (oneFrameDistance > _avatarTransitMaxDistance) { + avatar->_transit.start(avatar->_lastPosition, avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramePerMeter, _avatarTransitDistanceBased); + } + if (avatar->_transit.isTransiting()) { + glm::vec3 nextPosition; + if (avatar->_transit.getNextPosition(nextPosition)) { + avatar->setWorldPosition(nextPosition); + } + } + } + avatar->simulate(deltaTime, inView); avatar->updateRenderItem(renderTransaction); avatar->updateSpaceProxy(workloadTransaction); diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index bcdfc064bd..dd2c431cec 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -178,6 +178,15 @@ public: */ Q_INVOKABLE QVariantMap getPalData(const QList specificAvatarIdentifiers = QList()); + Q_INVOKABLE void setAvatarTransitDistanceBased(bool isDistanceBased) { _avatarTransitDistanceBased = isDistanceBased; } + Q_INVOKABLE void setAvatarTransitMaxDistance(float maxDistance) { _avatarTransitMaxDistance = maxDistance; } + Q_INVOKABLE void setAvatarTransitFrameCount(int frameCount) { _avatarTransitFrameCount = frameCount; } + Q_INVOKABLE void setAvatarTransitFramePerMeter(int frameCount) { _avatarTransitFramePerMeter = frameCount; } + Q_INVOKABLE bool getAvatarTransitDistanceBased() { return _avatarTransitDistanceBased; } + Q_INVOKABLE float getAvatarTransitMaxDistance() { return _avatarTransitMaxDistance; } + Q_INVOKABLE int getAvatarTransitFrameCount() { return _avatarTransitFrameCount; } + Q_INVOKABLE int getAvatarTransitFramePerMeter() { return _avatarTransitFramePerMeter; } + float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -205,6 +214,7 @@ private: void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; QVector _avatarsToFade; + QVector _avatarsToCopy; using SetOfOtherAvatars = std::set; SetOfOtherAvatars _avatarsToChangeInPhysics; @@ -224,6 +234,14 @@ private: mutable std::mutex _spaceLock; workload::SpacePointer _space; std::vector _spaceProxiesToDelete; + + // Other avatars smooth transit global configuration + + bool _avatarTransitDistanceBased { false }; + float _avatarTransitMaxDistance; + int _avatarTransitFrameCount; + int _avatarTransitFramePerMeter; + }; #endif // hifi_AvatarManager_h diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 4ffccefe61..f0e89fcd7c 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -113,6 +113,43 @@ void Avatar::setShowNamesAboveHeads(bool show) { showNamesAboveHeads = show; } +void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased) { + _startPosition = startPosition; + _endPosition = endPosition; + _step = 0; + if (!isDistanceBased) { + calculateSteps(totalFrames); + } else { + float distance = glm::length(_endPosition - _startPosition); + calculateSteps(framesPerMeter * distance); + } + + _isTransiting = true; +} + +void AvatarTransit::calculateSteps(int stepCount) { + glm::vec3 startPosition = _isTransiting ? _transitSteps[_step] : _startPosition; + _transitSteps.clear(); + glm::vec3 transitLine = _endPosition - _startPosition; + glm::vec3 direction = glm::normalize(transitLine); + glm::vec3 stepVector = (glm::length(transitLine) / stepCount) * direction; + for (auto i = 0; i < stepCount; i++) { + glm::vec3 localStep = _transitSteps.size() > 0 ? _transitSteps[i-1] + stepVector : _startPosition + stepVector; + _transitSteps.push_back(localStep); + } +} + +bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { + int lastIdx = _transitSteps.size() - 1; + _isTransiting = _step < lastIdx; + if (_isTransiting) { + _step++; + nextPosition = _transitSteps[_step]; + _currentPosition = nextPosition; + } + return _isTransiting; +} + Avatar::Avatar(QThread* thread) : _voiceSphereID(GeometryCache::UNKNOWN_ID) { @@ -480,6 +517,7 @@ void Avatar::simulate(float deltaTime, bool inView) { _skeletonModel->simulate(deltaTime, false); } _skeletonModelSimulationRate.increment(); + _lastPosition = _globalPosition; } // update animation for display name fade in/out diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 37c3d08c6c..2d940b8fd9 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -50,6 +50,22 @@ enum ScreenTintLayer { class Texture; +class AvatarTransit { +public: + AvatarTransit() {}; + void start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased); + bool getNextPosition(glm::vec3& nextPosition); + bool isTransiting() { return _isTransiting; }; +private: + void calculateSteps(int stepCount); + bool _isTransiting{ false }; + glm::vec3 _startPosition; + glm::vec3 _endPosition; + glm::vec3 _currentPosition; + std::vector _transitSteps; + int _step{ 0 }; +}; + class Avatar : public AvatarData, public scriptable::ModelProvider { Q_OBJECT @@ -518,6 +534,9 @@ protected: bool _isFading { false }; bool _reconstructSoftEntitiesJointMap { false }; float _modelScale { 1.0f }; + glm::vec3 _lastPosition; + AvatarTransit _transit; + static int _jointConesID; From b9fbcce40314aa882dac6096f0d23117b76d8bfb Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 12 Sep 2018 10:15:00 -0700 Subject: [PATCH 02/17] init frames per meter --- interface/src/avatar/AvatarManager.cpp | 4 +++- interface/src/avatar/AvatarManager.h | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 26b3119c2f..334cdc9608 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -81,9 +81,11 @@ AvatarManager::AvatarManager(QObject* parent) : const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; const int AVATAR_TRANSIT_FRAME_COUNT = 20; + const int AVATAR_TRANSIT_FRAMES_PER_METER = 5; _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; + _avatarTransitFramesPerMeter = AVATAR_TRANSIT_FRAMES_PER_METER; } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -260,7 +262,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { { float oneFrameDistance = glm::length(avatar->_globalPosition - avatar->_lastPosition); if (oneFrameDistance > _avatarTransitMaxDistance) { - avatar->_transit.start(avatar->_lastPosition, avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramePerMeter, _avatarTransitDistanceBased); + avatar->_transit.start(avatar->_lastPosition, avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased); } if (avatar->_transit.isTransiting()) { glm::vec3 nextPosition; diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index dd2c431cec..867c49063f 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -181,11 +181,11 @@ public: Q_INVOKABLE void setAvatarTransitDistanceBased(bool isDistanceBased) { _avatarTransitDistanceBased = isDistanceBased; } Q_INVOKABLE void setAvatarTransitMaxDistance(float maxDistance) { _avatarTransitMaxDistance = maxDistance; } Q_INVOKABLE void setAvatarTransitFrameCount(int frameCount) { _avatarTransitFrameCount = frameCount; } - Q_INVOKABLE void setAvatarTransitFramePerMeter(int frameCount) { _avatarTransitFramePerMeter = frameCount; } + Q_INVOKABLE void setAvatarTransitFramesPerMeter(int frameCount) { _avatarTransitFramesPerMeter = frameCount; } Q_INVOKABLE bool getAvatarTransitDistanceBased() { return _avatarTransitDistanceBased; } Q_INVOKABLE float getAvatarTransitMaxDistance() { return _avatarTransitMaxDistance; } Q_INVOKABLE int getAvatarTransitFrameCount() { return _avatarTransitFrameCount; } - Q_INVOKABLE int getAvatarTransitFramePerMeter() { return _avatarTransitFramePerMeter; } + Q_INVOKABLE int getAvatarTransitFramesPerMeter() { return _avatarTransitFramesPerMeter; } float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -240,7 +240,7 @@ private: bool _avatarTransitDistanceBased { false }; float _avatarTransitMaxDistance; int _avatarTransitFrameCount; - int _avatarTransitFramePerMeter; + int _avatarTransitFramesPerMeter; }; From 889e033048819ce2cf4d7f49fcdb4a512c9377fd Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 12 Sep 2018 11:20:23 -0700 Subject: [PATCH 03/17] fix warnings --- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index f0e89fcd7c..3dae9171a8 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -130,7 +130,7 @@ void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPo void AvatarTransit::calculateSteps(int stepCount) { glm::vec3 startPosition = _isTransiting ? _transitSteps[_step] : _startPosition; _transitSteps.clear(); - glm::vec3 transitLine = _endPosition - _startPosition; + glm::vec3 transitLine = _endPosition - startPosition; glm::vec3 direction = glm::normalize(transitLine); glm::vec3 stepVector = (glm::length(transitLine) / stepCount) * direction; for (auto i = 0; i < stepCount; i++) { @@ -140,7 +140,7 @@ void AvatarTransit::calculateSteps(int stepCount) { } bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { - int lastIdx = _transitSteps.size() - 1; + int lastIdx = (int)_transitSteps.size() - 1; _isTransiting = _step < lastIdx; if (_isTransiting) { _step++; From ff319ebd950778c85b60078e13130e155ff675d9 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 17 Sep 2018 09:47:22 -0700 Subject: [PATCH 04/17] Bypass position updates from mixer --- interface/src/avatar/AvatarManager.cpp | 33 +++++++++++-------- interface/src/avatar/AvatarManager.h | 2 +- interface/src/avatar/MyAvatar.cpp | 11 +++---- .../src/avatars-renderer/Avatar.cpp | 26 +++++++++++++-- .../src/avatars-renderer/Avatar.h | 11 +++++-- libraries/avatars/src/AvatarHashMap.cpp | 3 +- 6 files changed, 61 insertions(+), 25 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 334cdc9608..aa651e9e11 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -81,7 +81,7 @@ AvatarManager::AvatarManager(QObject* parent) : const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; const int AVATAR_TRANSIT_FRAME_COUNT = 20; - const int AVATAR_TRANSIT_FRAMES_PER_METER = 5; + const int AVATAR_TRANSIT_FRAMES_PER_METER = 15; _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; @@ -136,7 +136,23 @@ void AvatarManager::setSpace(workload::SpacePointer& space ) { void AvatarManager::updateMyAvatar(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); - + /* + std::shared_ptr transit = _myAvatar->getTransit(); + bool initTransit = false; + if (!transit->isTransiting()) { + initTransit = transit->update(_myAvatar->getWorldPosition(), _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased, _avatarTransitMaxDistance); + if (initTransit) { + _myAvatar->getSkeletonModel()->getRig().restoreAnimation(); + _myAvatar->getSkeletonModel()->getRig().overrideAnimation("https://hifi-content.s3.amazonaws.com/luis/test_scripts/transit_app/animations/teleport01_warp.fbx", 30, false, 0, 49); + } + } + if (transit->isTransiting()){ + glm::vec3 nextPosition; + if (!transit->getNextPosition(nextPosition)) { + _myAvatar->getSkeletonModel()->getRig().restoreAnimation(); + } + } + */ _myAvatar->update(deltaTime); render::Transaction transaction; _myAvatar->updateRenderItem(transaction); @@ -259,17 +275,8 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { numAvatarsUpdated++; } // smooth other avatars positions - { - float oneFrameDistance = glm::length(avatar->_globalPosition - avatar->_lastPosition); - if (oneFrameDistance > _avatarTransitMaxDistance) { - avatar->_transit.start(avatar->_lastPosition, avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased); - } - if (avatar->_transit.isTransiting()) { - glm::vec3 nextPosition; - if (avatar->_transit.getNextPosition(nextPosition)) { - avatar->setWorldPosition(nextPosition); - } - } + { + avatar->_transit.update(avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased, _avatarTransitMaxDistance); } avatar->simulate(deltaTime, inView); diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 867c49063f..3fc675f9b8 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -237,7 +237,7 @@ private: // Other avatars smooth transit global configuration - bool _avatarTransitDistanceBased { false }; + bool _avatarTransitDistanceBased { true }; float _avatarTransitMaxDistance; int _avatarTransitFrameCount; int _avatarTransitFramesPerMeter; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index c8af792d8f..a6e77f76e9 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -610,7 +610,6 @@ void MyAvatar::updateChildCauterization(SpatiallyNestablePointer object, bool ca void MyAvatar::simulate(float deltaTime) { PerformanceTimer perfTimer("simulate"); - animateScaleChanges(deltaTime); setFlyingEnabled(getFlyingEnabled()); @@ -1012,7 +1011,7 @@ glm::vec3 MyAvatar::worldToJointPoint(const glm::vec3& position, const int joint if (_skeletonModel->getJointPositionInWorldFrame(jointIndex, jointPos)) { _skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot); } else { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } } glm::vec3 modelOffset = position - jointPos; @@ -1034,7 +1033,7 @@ glm::vec3 MyAvatar::worldToJointDirection(const glm::vec3& worldDir, const int j glm::quat MyAvatar::worldToJointRotation(const glm::quat& worldRot, const int jointIndex) const { glm::quat jointRot = getWorldOrientation();//default value if no or invalid joint specified if ((jointIndex != -1) && (!_skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot))) { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } glm::quat jointSpaceRot = glm::inverse(jointRot) * worldRot; return jointSpaceRot; @@ -1048,7 +1047,7 @@ glm::vec3 MyAvatar::jointToWorldPoint(const glm::vec3& jointSpacePos, const int if (_skeletonModel->getJointPositionInWorldFrame(jointIndex, jointPos)) { _skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot); } else { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } } @@ -1061,7 +1060,7 @@ glm::vec3 MyAvatar::jointToWorldPoint(const glm::vec3& jointSpacePos, const int glm::vec3 MyAvatar::jointToWorldDirection(const glm::vec3& jointSpaceDir, const int jointIndex) const { glm::quat jointRot = getWorldOrientation();//default value if no or invalid joint specified if ((jointIndex != -1) && (!_skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot))) { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } glm::vec3 worldDir = jointRot * jointSpaceDir; return worldDir; @@ -1070,7 +1069,7 @@ glm::vec3 MyAvatar::jointToWorldDirection(const glm::vec3& jointSpaceDir, const glm::quat MyAvatar::jointToWorldRotation(const glm::quat& jointSpaceRot, const int jointIndex) const { glm::quat jointRot = getWorldOrientation();//default value if no or invalid joint specified if ((jointIndex != -1) && (!_skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot))) { - qWarning() << "Invalid joint index specified: " << jointIndex; + //qWarning() << "Invalid joint index specified: " << jointIndex; } glm::quat worldRot = jointRot * jointSpaceRot; return worldRot; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 3dae9171a8..9feb9a5983 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -113,6 +113,16 @@ void Avatar::setShowNamesAboveHeads(bool show) { showNamesAboveHeads = show; } +bool AvatarTransit::update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance) { + glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition; + float oneFrameDistance = glm::length(currentPosition - _lastPosition); + if (oneFrameDistance > maxDistance && !_isTransiting) { + start(_lastPosition, currentPosition, totalFrames, framesPerMeter, isDistanceBased); + return true; + } + return false; +} + void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased) { _startPosition = startPosition; _endPosition = endPosition; @@ -140,6 +150,7 @@ void AvatarTransit::calculateSteps(int stepCount) { } bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { + _lastPosition = _currentPosition; int lastIdx = (int)_transitSteps.size() - 1; _isTransiting = _step < lastIdx; if (_isTransiting) { @@ -482,6 +493,18 @@ void Avatar::relayJointDataToChildren() { void Avatar::simulate(float deltaTime, bool inView) { PROFILE_RANGE(simulation, "simulate"); + if (_transit.isTransiting()) { + glm::vec3 nextPosition; + if (_transit.getNextPosition(nextPosition)) { + // setWorldPosition(nextPosition); + _globalPosition = nextPosition; + _globalPositionChanged = usecTimestampNow(); + if (!hasParent()) { + setLocalPosition(nextPosition); + } + } + } + _simulationRate.increment(); if (inView) { _simulationInViewRate.increment(); @@ -492,7 +515,7 @@ void Avatar::simulate(float deltaTime, bool inView) { PROFILE_RANGE(simulation, "updateJoints"); if (inView) { Head* head = getHead(); - if (_hasNewJointData) { + if (true) { _skeletonModel->getRig().copyJointsFromJointData(_jointData); glm::mat4 rootTransform = glm::scale(_skeletonModel->getScale()) * glm::translate(_skeletonModel->getOffset()); _skeletonModel->getRig().computeExternalPoses(rootTransform); @@ -517,7 +540,6 @@ void Avatar::simulate(float deltaTime, bool inView) { _skeletonModel->simulate(deltaTime, false); } _skeletonModelSimulationRate.increment(); - _lastPosition = _globalPosition; } // update animation for display name fade in/out diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 2d940b8fd9..20cac1fcc4 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -53,9 +53,13 @@ class Texture; class AvatarTransit { public: AvatarTransit() {}; + bool update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance); void start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased); bool getNextPosition(glm::vec3& nextPosition); bool isTransiting() { return _isTransiting; }; + glm::vec3 getCurrentPosition() { return _currentPosition; }; + int getCurrentStep() { return _step; }; + private: void calculateSteps(int stepCount); bool _isTransiting{ false }; @@ -63,7 +67,8 @@ private: glm::vec3 _endPosition; glm::vec3 _currentPosition; std::vector _transitSteps; - int _step{ 0 }; + glm::vec3 _lastPosition; + int _step { 0 }; }; class Avatar : public AvatarData, public scriptable::ModelProvider { @@ -377,6 +382,8 @@ public: virtual scriptable::ScriptableModelBase getScriptableModel() override; + std::shared_ptr getTransit() { return std::make_shared(_transit); }; + signals: void targetScaleChanged(float targetScale); @@ -534,7 +541,7 @@ protected: bool _isFading { false }; bool _reconstructSoftEntitiesJointMap { false }; float _modelScale { 1.0f }; - glm::vec3 _lastPosition; + AvatarTransit _transit; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 1383939b8b..424fef0168 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -247,6 +247,7 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointerparseDataFromBuffer(byteArray); message->seek(positionBeforeRead + bytesRead); @@ -297,7 +298,6 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer // In this case, the "sendingNode" is the Avatar Mixer. avatar->processAvatarIdentity(message->getMessage(), identityChanged, displayNameChanged); _replicas.processAvatarIdentity(identityUUID, message->getMessage(), identityChanged, displayNameChanged); - } } @@ -310,6 +310,7 @@ void AvatarHashMap::processBulkAvatarTraits(QSharedPointer mess // grab the avatar so we can ask it to process trait data bool isNewAvatar; auto avatar = newOrExistingAvatar(avatarID, sendingNode, isNewAvatar); + // read the first trait type for this avatar AvatarTraits::TraitType traitType; message->readPrimitive(&traitType); From f339bbdd7f5343a4571296ff147a4830476df156 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 17 Sep 2018 13:29:04 -0700 Subject: [PATCH 05/17] Fix bug while walking --- interface/src/avatar/AvatarManager.cpp | 4 ++-- .../src/avatars-renderer/Avatar.cpp | 22 ++++++++++++------- .../src/avatars-renderer/Avatar.h | 1 + 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index aa651e9e11..cea0ff0f4d 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -80,8 +80,8 @@ AvatarManager::AvatarManager(QObject* parent) : }); const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; - const int AVATAR_TRANSIT_FRAME_COUNT = 20; - const int AVATAR_TRANSIT_FRAMES_PER_METER = 15; + const int AVATAR_TRANSIT_FRAME_COUNT = 11; // Based on testing + const int AVATAR_TRANSIT_FRAMES_PER_METER = 3; // Based on testing _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 9feb9a5983..0fc04febaa 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -119,7 +119,8 @@ bool AvatarTransit::update(const glm::vec3& avatarPosition, int totalFrames, int if (oneFrameDistance > maxDistance && !_isTransiting) { start(_lastPosition, currentPosition, totalFrames, framesPerMeter, isDistanceBased); return true; - } + } + updatePosition(avatarPosition); return false; } @@ -149,15 +150,20 @@ void AvatarTransit::calculateSteps(int stepCount) { } } -bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { - _lastPosition = _currentPosition; - int lastIdx = (int)_transitSteps.size() - 1; - _isTransiting = _step < lastIdx; +void AvatarTransit::updatePosition(const glm::vec3& avatarPosition) { + _lastPosition = _isTransiting ? _currentPosition : avatarPosition; if (_isTransiting) { - _step++; - nextPosition = _transitSteps[_step]; - _currentPosition = nextPosition; + int lastIdx = (int)_transitSteps.size() - 1; + _isTransiting = _step < lastIdx; + if (_isTransiting) { + _step++; + _currentPosition = _transitSteps[_step]; + } } +} + +bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { + nextPosition = _currentPosition; return _isTransiting; } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 20cac1fcc4..22163635ff 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -62,6 +62,7 @@ public: private: void calculateSteps(int stepCount); + void updatePosition(const glm::vec3& avatarPosition); bool _isTransiting{ false }; glm::vec3 _startPosition; glm::vec3 _endPosition; From b39391ca7a5a248394c2955eafd424115d6b6fd8 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 17 Sep 2018 13:53:57 -0700 Subject: [PATCH 06/17] From first frame --- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 0fc04febaa..05d49a9ec0 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -114,14 +114,15 @@ void Avatar::setShowNamesAboveHeads(bool show) { } bool AvatarTransit::update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance) { + bool starting = false; glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition; float oneFrameDistance = glm::length(currentPosition - _lastPosition); if (oneFrameDistance > maxDistance && !_isTransiting) { start(_lastPosition, currentPosition, totalFrames, framesPerMeter, isDistanceBased); - return true; + starting = true; } updatePosition(avatarPosition); - return false; + return starting; } void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased) { From 96e8b060eb60d55de2f79ae79e89ae878b59f0cb Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 18 Sep 2018 12:42:37 -0700 Subject: [PATCH 07/17] Enable transit animations --- interface/src/avatar/AvatarManager.cpp | 88 ++++++++++++++----- interface/src/avatar/AvatarManager.h | 17 +--- .../src/avatars-renderer/Avatar.cpp | 57 ++++++++---- .../src/avatars-renderer/Avatar.h | 46 ++++++++-- 4 files changed, 152 insertions(+), 56 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index cea0ff0f4d..edf9469670 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -79,13 +79,21 @@ AvatarManager::AvatarManager(QObject* parent) : } }); - const float AVATAR_TRANSIT_MAX_DISTANCE = 1.0f; + const float AVATAR_TRANSIT_TRIGGER_DISTANCE = 1.0f; const int AVATAR_TRANSIT_FRAME_COUNT = 11; // Based on testing const int AVATAR_TRANSIT_FRAMES_PER_METER = 3; // Based on testing - _avatarTransitMaxDistance = AVATAR_TRANSIT_MAX_DISTANCE; - _avatarTransitFrameCount = AVATAR_TRANSIT_FRAME_COUNT; - _avatarTransitFramesPerMeter = AVATAR_TRANSIT_FRAMES_PER_METER; + const QString START_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; + const QString MIDDLE_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; + const QString END_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; + + _transitConfig._totalFrames = AVATAR_TRANSIT_FRAME_COUNT; + _transitConfig._triggerDistance = AVATAR_TRANSIT_TRIGGER_DISTANCE; + _transitConfig._framesPerMeter = AVATAR_TRANSIT_FRAMES_PER_METER; + _transitConfig._isDistanceBased = true; + _transitConfig._startTransitAnimation = AvatarTransit::TransitAnimation(START_ANIMATION_URL, 30, 0, 10); + _transitConfig._middleTransitAnimation = AvatarTransit::TransitAnimation(MIDDLE_ANIMATION_URL, 30, 11, 0); + _transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 30, 12, 38); } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -133,26 +141,37 @@ void AvatarManager::setSpace(workload::SpacePointer& space ) { _space = space; } +void AvatarManager::playTransitAnimations(AvatarTransit::Status status) { + auto startAnimation = _transitConfig._startTransitAnimation; + auto middleAnimation = _transitConfig._middleTransitAnimation; + auto endAnimation = _transitConfig._endTransitAnimation; + + switch (status) { + case AvatarTransit::Status::START_FRAME: + _myAvatar->overrideAnimation(startAnimation._animationUrl, startAnimation._fps, false, startAnimation._firstFrame, startAnimation._firstFrame + startAnimation._frameCount); + break; + case AvatarTransit::Status::START_TRANSIT: + _myAvatar->overrideAnimation(middleAnimation._animationUrl, middleAnimation._fps, false, middleAnimation._firstFrame, middleAnimation._firstFrame + middleAnimation._frameCount); + break; + case AvatarTransit::Status::END_TRANSIT: + _myAvatar->overrideAnimation(endAnimation._animationUrl, endAnimation._fps, false, endAnimation._firstFrame, endAnimation._firstFrame + endAnimation._frameCount); + break; + case AvatarTransit::Status::END_FRAME: + _myAvatar->restoreAnimation(); + break; + } +} + void AvatarManager::updateMyAvatar(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); - /* - std::shared_ptr transit = _myAvatar->getTransit(); - bool initTransit = false; - if (!transit->isTransiting()) { - initTransit = transit->update(_myAvatar->getWorldPosition(), _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased, _avatarTransitMaxDistance); - if (initTransit) { - _myAvatar->getSkeletonModel()->getRig().restoreAnimation(); - _myAvatar->getSkeletonModel()->getRig().overrideAnimation("https://hifi-content.s3.amazonaws.com/luis/test_scripts/transit_app/animations/teleport01_warp.fbx", 30, false, 0, 49); - } - } - if (transit->isTransiting()){ - glm::vec3 nextPosition; - if (!transit->getNextPosition(nextPosition)) { - _myAvatar->getSkeletonModel()->getRig().restoreAnimation(); - } + + AvatarTransit::Status status = _myAvatar->updateTransit(_myAvatar->getWorldPosition(), _transitConfig); + + if (_transitConfig._playAnimation) { + playTransitAnimations(status); } - */ + _myAvatar->update(deltaTime); render::Transaction transaction; _myAvatar->updateRenderItem(transaction); @@ -276,7 +295,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { } // smooth other avatars positions { - avatar->_transit.update(avatar->_globalPosition, _avatarTransitFrameCount, _avatarTransitFramesPerMeter, _avatarTransitDistanceBased, _avatarTransitMaxDistance); + avatar->_transit.update(avatar->_globalPosition, _transitConfig); } avatar->simulate(deltaTime, inView); @@ -866,3 +885,30 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV doc.insert("data", palData); return doc.toVariantMap(); } + + QVariantMap AvatarManager::getAvatarTransitData() { + QVariantMap result; + result["frameCount"] = _transitConfig._totalFrames; + result["framesPerMeter"] = _transitConfig._framesPerMeter; + result["isDistanceBased"] = _transitConfig._isDistanceBased; + result["triggerDistance"] = _transitConfig._triggerDistance; + result["playAnimation"] = _transitConfig._playAnimation; + return result; +} + void AvatarManager::setAvatarTransitData(const QVariantMap& data) { + if (data.contains("frameCount")) { + _transitConfig._totalFrames = data["frameCount"].toInt(); + } + if (data.contains("framesPerMeter")) { + _transitConfig._framesPerMeter = data["framesPerMeter"].toInt(); + } + if (data.contains("isDistanceBased")) { + _transitConfig._isDistanceBased = data["isDistanceBased"].toBool(); + } + if (data.contains("triggerDistance")) { + _transitConfig._triggerDistance = data["triggerDistance"].toDouble(); + } + if (data.contains("playAnimation")) { + _transitConfig._playAnimation = data["playAnimation"].toBool(); + } +} \ No newline at end of file diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 3fc675f9b8..e5936154a4 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -178,14 +178,8 @@ public: */ Q_INVOKABLE QVariantMap getPalData(const QList specificAvatarIdentifiers = QList()); - Q_INVOKABLE void setAvatarTransitDistanceBased(bool isDistanceBased) { _avatarTransitDistanceBased = isDistanceBased; } - Q_INVOKABLE void setAvatarTransitMaxDistance(float maxDistance) { _avatarTransitMaxDistance = maxDistance; } - Q_INVOKABLE void setAvatarTransitFrameCount(int frameCount) { _avatarTransitFrameCount = frameCount; } - Q_INVOKABLE void setAvatarTransitFramesPerMeter(int frameCount) { _avatarTransitFramesPerMeter = frameCount; } - Q_INVOKABLE bool getAvatarTransitDistanceBased() { return _avatarTransitDistanceBased; } - Q_INVOKABLE float getAvatarTransitMaxDistance() { return _avatarTransitMaxDistance; } - Q_INVOKABLE int getAvatarTransitFrameCount() { return _avatarTransitFrameCount; } - Q_INVOKABLE int getAvatarTransitFramesPerMeter() { return _avatarTransitFramesPerMeter; } + Q_INVOKABLE QVariantMap getAvatarTransitData(); + Q_INVOKABLE void setAvatarTransitData(const QVariantMap& data); float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -212,6 +206,7 @@ private: AvatarSharedPointer newSharedAvatar() override; void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; + void playTransitAnimations(AvatarTransit::Status status); QVector _avatarsToFade; QVector _avatarsToCopy; @@ -237,11 +232,7 @@ private: // Other avatars smooth transit global configuration - bool _avatarTransitDistanceBased { true }; - float _avatarTransitMaxDistance; - int _avatarTransitFrameCount; - int _avatarTransitFramesPerMeter; - + AvatarTransit::TransitConfig _transitConfig; }; #endif // hifi_AvatarManager_h diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 05d49a9ec0..a3c3286793 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -113,29 +113,27 @@ void Avatar::setShowNamesAboveHeads(bool show) { showNamesAboveHeads = show; } -bool AvatarTransit::update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance) { - bool starting = false; +AvatarTransit::Status AvatarTransit::update(const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition; float oneFrameDistance = glm::length(currentPosition - _lastPosition); - if (oneFrameDistance > maxDistance && !_isTransiting) { - start(_lastPosition, currentPosition, totalFrames, framesPerMeter, isDistanceBased); - starting = true; - } - updatePosition(avatarPosition); - return starting; + if (oneFrameDistance > config._triggerDistance && !_isTransiting) { + start(_lastPosition, currentPosition, config); + } + return updatePosition(avatarPosition); } -void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased) { +void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, const AvatarTransit::TransitConfig& config) { _startPosition = startPosition; _endPosition = endPosition; + _framesBefore = config._startTransitAnimation._frameCount; + _framesAfter = config._endTransitAnimation._frameCount; _step = 0; - if (!isDistanceBased) { - calculateSteps(totalFrames); + if (!config._isDistanceBased) { + calculateSteps(config._totalFrames); } else { float distance = glm::length(_endPosition - _startPosition); - calculateSteps(framesPerMeter * distance); + calculateSteps(config._framesPerMeter * distance); } - _isTransiting = true; } @@ -145,22 +143,42 @@ void AvatarTransit::calculateSteps(int stepCount) { glm::vec3 transitLine = _endPosition - startPosition; glm::vec3 direction = glm::normalize(transitLine); glm::vec3 stepVector = (glm::length(transitLine) / stepCount) * direction; - for (auto i = 0; i < stepCount; i++) { - glm::vec3 localStep = _transitSteps.size() > 0 ? _transitSteps[i-1] + stepVector : _startPosition + stepVector; - _transitSteps.push_back(localStep); + int totalSteps = stepCount + _framesBefore + _framesAfter; + for (auto i = 0; i < totalSteps; i++) { + if (i < _framesBefore) { + _transitSteps.push_back(_startPosition); + } else if (i >= stepCount + _framesBefore) { + _transitSteps.push_back(_endPosition); + } else { + glm::vec3 localStep = _transitSteps.size() > _framesBefore ? _transitSteps[i - 1] + stepVector : _startPosition + stepVector; + _transitSteps.push_back(localStep); + } } } -void AvatarTransit::updatePosition(const glm::vec3& avatarPosition) { +AvatarTransit::Status AvatarTransit::updatePosition(const glm::vec3& avatarPosition) { + Status status = Status::IDLE; _lastPosition = _isTransiting ? _currentPosition : avatarPosition; if (_isTransiting) { int lastIdx = (int)_transitSteps.size() - 1; _isTransiting = _step < lastIdx; if (_isTransiting) { + if (_step == 0) { + status = Status::START_FRAME; + qDebug() << "Transit starting"; + } else if (_step == _framesBefore - 1) { + status = Status::START_TRANSIT; + } else if (_step == (int)_transitSteps.size() - _framesAfter) { + status = Status::END_TRANSIT; + } _step++; _currentPosition = _transitSteps[_step]; + } else { + status = Status::END_FRAME; + qDebug() << "Transit ending"; } } + return status; } bool AvatarTransit::getNextPosition(glm::vec3& nextPosition) { @@ -1936,6 +1954,11 @@ float Avatar::getUnscaledEyeHeightFromSkeleton() const { } } +AvatarTransit::Status Avatar::updateTransit(const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { + std::lock_guard lock(_transitLock); + return _transit.update(avatarPosition, config); +} + void Avatar::addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) { std::lock_guard lock(_materialsLock); _materials[parentMaterialName].push(material); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 22163635ff..b955706861 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -52,21 +52,55 @@ class Texture; class AvatarTransit { public: + enum Status { + IDLE = 0, + START_FRAME, + START_TRANSIT, + TRANSITING, + END_TRANSIT, + END_FRAME + }; + + struct TransitAnimation { + TransitAnimation() {}; + TransitAnimation(const QString& animationUrl, int fps, int firstFrame, int frameCount) : + _firstFrame(firstFrame), _frameCount(frameCount), _animationUrl(animationUrl), _fps(fps) {}; + int _firstFrame; + int _frameCount; + QString _animationUrl; + int _fps; + }; + + struct TransitConfig { + TransitConfig() {}; + int _totalFrames { 0 }; + int _framesPerMeter { 0 }; + bool _isDistanceBased { false }; + float _triggerDistance { 0 }; + bool _playAnimation { false }; + TransitAnimation _startTransitAnimation; + TransitAnimation _middleTransitAnimation; + TransitAnimation _endTransitAnimation; + }; + + AvatarTransit() {}; - bool update(const glm::vec3& avatarPosition, int totalFrames, int framesPerMeter, bool isDistanceBased, float maxDistance); - void start(const glm::vec3& startPosition, const glm::vec3& endPosition, int totalFrames, int framesPerMeter, bool isDistanceBased); - bool getNextPosition(glm::vec3& nextPosition); + Status update(const glm::vec3& avatarPosition, const TransitConfig& config); bool isTransiting() { return _isTransiting; }; glm::vec3 getCurrentPosition() { return _currentPosition; }; + bool getNextPosition(glm::vec3& nextPosition); int getCurrentStep() { return _step; }; private: void calculateSteps(int stepCount); - void updatePosition(const glm::vec3& avatarPosition); + Status updatePosition(const glm::vec3& avatarPosition); + void start(const glm::vec3& startPosition, const glm::vec3& endPosition, const TransitConfig& config); bool _isTransiting{ false }; glm::vec3 _startPosition; glm::vec3 _endPosition; glm::vec3 _currentPosition; + int _framesBefore { 0 }; + int _framesAfter { 0 }; std::vector _transitSteps; glm::vec3 _lastPosition; int _step { 0 }; @@ -385,6 +419,7 @@ public: std::shared_ptr getTransit() { return std::make_shared(_transit); }; + AvatarTransit::Status updateTransit(const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config); signals: void targetScaleChanged(float targetScale); @@ -520,6 +555,7 @@ protected: RateCounter<> _skeletonModelSimulationRate; RateCounter<> _jointDataSimulationRate; + protected: class AvatarEntityDataHash { public: @@ -544,7 +580,7 @@ protected: float _modelScale { 1.0f }; AvatarTransit _transit; - + std::mutex _transitLock; static int _jointConesID; From cad8425c7bf07206f97d5190e36043e1b0ae92ca Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 19 Sep 2018 16:43:45 -0700 Subject: [PATCH 08/17] Time-based frames, max distance and setting animation from script --- interface/src/avatar/AvatarManager.cpp | 62 ++++++++++-- interface/src/avatar/AvatarManager.h | 3 + .../src/avatars-renderer/Avatar.cpp | 98 +++++++++---------- .../src/avatars-renderer/Avatar.h | 30 +++--- 4 files changed, 118 insertions(+), 75 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index edf9469670..4cc3c619b4 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -91,9 +91,11 @@ AvatarManager::AvatarManager(QObject* parent) : _transitConfig._triggerDistance = AVATAR_TRANSIT_TRIGGER_DISTANCE; _transitConfig._framesPerMeter = AVATAR_TRANSIT_FRAMES_PER_METER; _transitConfig._isDistanceBased = true; - _transitConfig._startTransitAnimation = AvatarTransit::TransitAnimation(START_ANIMATION_URL, 30, 0, 10); - _transitConfig._middleTransitAnimation = AvatarTransit::TransitAnimation(MIDDLE_ANIMATION_URL, 30, 11, 0); - _transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 30, 12, 38); + + _transitConfig._startTransitAnimation = AvatarTransit::TransitAnimation(START_ANIMATION_URL, 0, 14); + _transitConfig._middleTransitAnimation = AvatarTransit::TransitAnimation(MIDDLE_ANIMATION_URL, 15, 0); + _transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 16, 38); + } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -145,28 +147,39 @@ void AvatarManager::playTransitAnimations(AvatarTransit::Status status) { auto startAnimation = _transitConfig._startTransitAnimation; auto middleAnimation = _transitConfig._middleTransitAnimation; auto endAnimation = _transitConfig._endTransitAnimation; + + const float REFERENCE_FPS = 30.0f; switch (status) { case AvatarTransit::Status::START_FRAME: - _myAvatar->overrideAnimation(startAnimation._animationUrl, startAnimation._fps, false, startAnimation._firstFrame, startAnimation._firstFrame + startAnimation._frameCount); + qDebug() << "START_FRAME"; + _myAvatar->overrideAnimation(startAnimation._animationUrl, REFERENCE_FPS, false, startAnimation._firstFrame, startAnimation._firstFrame + startAnimation._frameCount); break; case AvatarTransit::Status::START_TRANSIT: - _myAvatar->overrideAnimation(middleAnimation._animationUrl, middleAnimation._fps, false, middleAnimation._firstFrame, middleAnimation._firstFrame + middleAnimation._frameCount); + qDebug() << "START_TRANSIT"; + _myAvatar->overrideAnimation(middleAnimation._animationUrl, REFERENCE_FPS, false, middleAnimation._firstFrame, middleAnimation._firstFrame + middleAnimation._frameCount); break; case AvatarTransit::Status::END_TRANSIT: - _myAvatar->overrideAnimation(endAnimation._animationUrl, endAnimation._fps, false, endAnimation._firstFrame, endAnimation._firstFrame + endAnimation._frameCount); + qDebug() << "END_TRANSIT"; + _myAvatar->overrideAnimation(endAnimation._animationUrl, REFERENCE_FPS, false, endAnimation._firstFrame, endAnimation._firstFrame + endAnimation._frameCount); break; case AvatarTransit::Status::END_FRAME: + qDebug() << "END_FRAME"; _myAvatar->restoreAnimation(); break; + case AvatarTransit::Status::IDLE: + break; + case AvatarTransit::Status::TRANSITING: + break; } + } void AvatarManager::updateMyAvatar(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); - AvatarTransit::Status status = _myAvatar->updateTransit(_myAvatar->getWorldPosition(), _transitConfig); + AvatarTransit::Status status = _myAvatar->updateTransit(deltaTime, _myAvatar->getWorldPosition(), _transitConfig); if (_transitConfig._playAnimation) { playTransitAnimations(status); @@ -295,7 +308,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { } // smooth other avatars positions { - avatar->_transit.update(avatar->_globalPosition, _transitConfig); + avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); } avatar->simulate(deltaTime, inView); @@ -911,4 +924,37 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV if (data.contains("playAnimation")) { _transitConfig._playAnimation = data["playAnimation"].toBool(); } +} + + AvatarTransit::TransitAnimation AvatarManager::getAnimationFromJsonObject(const QJsonObject& object) { + QString animationUrl; + int firstFrame = 0; + int frameCount = 0; + if (object.contains("animationUrl")) { + animationUrl = object["animationUrl"].toString(); + } + if (object.contains("firstFrame")) { + firstFrame = object["firstFrame"].toInt(); + } + if (object.contains("frameCount")) { + frameCount = object["frameCount"].toInt(); + } + return AvatarTransit::TransitAnimation(animationUrl, firstFrame, frameCount); + } + + void AvatarManager::setAvatarTransitAnimationData(const QVariantMap& data) { + AvatarTransit::TransitAnimation startAnimation, middleAnimation, endAnimation; + + if (data.contains("startAnimation")) { + QJsonObject object = data["startAnimation"].toJsonObject(); + _transitConfig._startTransitAnimation = getAnimationFromJsonObject(object); + } + if (data.contains("middleAnimation")) { + QJsonObject object = data["middleAnimation"].toJsonObject(); + _transitConfig._middleTransitAnimation = getAnimationFromJsonObject(object); + } + if (data.contains("endAnimation")) { + QJsonObject object = data["endAnimation"].toJsonObject(); + _transitConfig._endTransitAnimation = getAnimationFromJsonObject(object); + } } \ No newline at end of file diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index e5936154a4..d0fcb13c01 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -180,6 +180,7 @@ public: Q_INVOKABLE QVariantMap getAvatarTransitData(); Q_INVOKABLE void setAvatarTransitData(const QVariantMap& data); + Q_INVOKABLE void setAvatarTransitAnimationData(const QVariantMap& data); float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -208,6 +209,8 @@ private: void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; void playTransitAnimations(AvatarTransit::Status status); + AvatarTransit::TransitAnimation getAnimationFromJsonObject(const QJsonObject& object); + QVector _avatarsToFade; QVector _avatarsToCopy; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index a3c3286793..5098364540 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -113,70 +113,63 @@ void Avatar::setShowNamesAboveHeads(bool show) { showNamesAboveHeads = show; } -AvatarTransit::Status AvatarTransit::update(const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { +AvatarTransit::Status AvatarTransit::update(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition; float oneFrameDistance = glm::length(currentPosition - _lastPosition); - if (oneFrameDistance > config._triggerDistance && !_isTransiting) { - start(_lastPosition, currentPosition, config); + const float MAX_TRANSIT_DISTANCE = 20.0f; + if (oneFrameDistance > config._triggerDistance && oneFrameDistance < MAX_TRANSIT_DISTANCE && !_isTransiting) { + start(deltaTime, _lastPosition, currentPosition, config); } - return updatePosition(avatarPosition); + _lastPosition = currentPosition; + return updatePosition(deltaTime); } -void AvatarTransit::start(const glm::vec3& startPosition, const glm::vec3& endPosition, const AvatarTransit::TransitConfig& config) { +void AvatarTransit::start(float deltaTime, const glm::vec3& startPosition, const glm::vec3& endPosition, const AvatarTransit::TransitConfig& config) { _startPosition = startPosition; _endPosition = endPosition; - _framesBefore = config._startTransitAnimation._frameCount; - _framesAfter = config._endTransitAnimation._frameCount; - _step = 0; - if (!config._isDistanceBased) { - calculateSteps(config._totalFrames); - } else { - float distance = glm::length(_endPosition - _startPosition); - calculateSteps(config._framesPerMeter * distance); - } + + _transitLine = endPosition - startPosition; + _totalDistance = glm::length(_transitLine); + const float REFERENCE_FRAMES_PER_SECOND = 30.0f; + + int framesBefore = config._playAnimation ? config._startTransitAnimation._frameCount : 0; + int framesAfter = config._playAnimation ? config._endTransitAnimation._frameCount : 0; + _timeBefore = (float)framesBefore / REFERENCE_FRAMES_PER_SECOND; + _timeAfter = (float)framesAfter / REFERENCE_FRAMES_PER_SECOND; + + int transitFrames = (!config._isDistanceBased) ? config._totalFrames : config._framesPerMeter * _totalDistance; + _transitTime = (float)transitFrames / REFERENCE_FRAMES_PER_SECOND; + _totalTime = _transitTime + _timeBefore + _timeAfter; + _currentTime = 0.0f; _isTransiting = true; } -void AvatarTransit::calculateSteps(int stepCount) { - glm::vec3 startPosition = _isTransiting ? _transitSteps[_step] : _startPosition; - _transitSteps.clear(); - glm::vec3 transitLine = _endPosition - startPosition; - glm::vec3 direction = glm::normalize(transitLine); - glm::vec3 stepVector = (glm::length(transitLine) / stepCount) * direction; - int totalSteps = stepCount + _framesBefore + _framesAfter; - for (auto i = 0; i < totalSteps; i++) { - if (i < _framesBefore) { - _transitSteps.push_back(_startPosition); - } else if (i >= stepCount + _framesBefore) { - _transitSteps.push_back(_endPosition); - } else { - glm::vec3 localStep = _transitSteps.size() > _framesBefore ? _transitSteps[i - 1] + stepVector : _startPosition + stepVector; - _transitSteps.push_back(localStep); - } - } -} - -AvatarTransit::Status AvatarTransit::updatePosition(const glm::vec3& avatarPosition) { +AvatarTransit::Status AvatarTransit::updatePosition(float deltaTime) { Status status = Status::IDLE; - _lastPosition = _isTransiting ? _currentPosition : avatarPosition; if (_isTransiting) { - int lastIdx = (int)_transitSteps.size() - 1; - _isTransiting = _step < lastIdx; - if (_isTransiting) { - if (_step == 0) { + float nextTime = _currentTime + deltaTime; + glm::vec3 newPosition; + if (nextTime < _timeBefore) { + _currentPosition = _startPosition; + if (_currentTime == 0) { status = Status::START_FRAME; - qDebug() << "Transit starting"; - } else if (_step == _framesBefore - 1) { - status = Status::START_TRANSIT; - } else if (_step == (int)_transitSteps.size() - _framesAfter) { - status = Status::END_TRANSIT; } - _step++; - _currentPosition = _transitSteps[_step]; + } else if (nextTime >= _totalTime - _timeAfter) { + if (_currentTime < _totalTime - _timeAfter) { + status = Status::END_TRANSIT; + } else if (nextTime >= _totalTime) { + status = Status::END_FRAME; + _isTransiting = false; + } + _currentPosition = _endPosition; } else { - status = Status::END_FRAME; - qDebug() << "Transit ending"; - } + if (_currentTime <= _timeBefore) { + status = Status::START_TRANSIT; + } + float percentageIntoTransit = (nextTime - _timeBefore) / _transitTime; + _currentPosition = _startPosition + percentageIntoTransit * _transitLine; + } + _currentTime = nextTime; } return status; } @@ -521,7 +514,6 @@ void Avatar::simulate(float deltaTime, bool inView) { if (_transit.isTransiting()) { glm::vec3 nextPosition; if (_transit.getNextPosition(nextPosition)) { - // setWorldPosition(nextPosition); _globalPosition = nextPosition; _globalPositionChanged = usecTimestampNow(); if (!hasParent()) { @@ -540,7 +532,7 @@ void Avatar::simulate(float deltaTime, bool inView) { PROFILE_RANGE(simulation, "updateJoints"); if (inView) { Head* head = getHead(); - if (true) { + if (_hasNewJointData || _transit.isTransiting()) { _skeletonModel->getRig().copyJointsFromJointData(_jointData); glm::mat4 rootTransform = glm::scale(_skeletonModel->getScale()) * glm::translate(_skeletonModel->getOffset()); _skeletonModel->getRig().computeExternalPoses(rootTransform); @@ -1954,9 +1946,9 @@ float Avatar::getUnscaledEyeHeightFromSkeleton() const { } } -AvatarTransit::Status Avatar::updateTransit(const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { +AvatarTransit::Status Avatar::updateTransit(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { std::lock_guard lock(_transitLock); - return _transit.update(avatarPosition, config); + return _transit.update(deltaTime, avatarPosition, config); } void Avatar::addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index b955706861..28593ff9c0 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -63,12 +63,11 @@ public: struct TransitAnimation { TransitAnimation() {}; - TransitAnimation(const QString& animationUrl, int fps, int firstFrame, int frameCount) : - _firstFrame(firstFrame), _frameCount(frameCount), _animationUrl(animationUrl), _fps(fps) {}; + TransitAnimation(const QString& animationUrl, int firstFrame, int frameCount) : + _firstFrame(firstFrame), _frameCount(frameCount), _animationUrl(animationUrl) {}; int _firstFrame; int _frameCount; QString _animationUrl; - int _fps; }; struct TransitConfig { @@ -83,27 +82,30 @@ public: TransitAnimation _endTransitAnimation; }; - AvatarTransit() {}; - Status update(const glm::vec3& avatarPosition, const TransitConfig& config); + Status update(float deltaTime, const glm::vec3& avatarPosition, const TransitConfig& config); bool isTransiting() { return _isTransiting; }; glm::vec3 getCurrentPosition() { return _currentPosition; }; bool getNextPosition(glm::vec3& nextPosition); - int getCurrentStep() { return _step; }; private: - void calculateSteps(int stepCount); - Status updatePosition(const glm::vec3& avatarPosition); - void start(const glm::vec3& startPosition, const glm::vec3& endPosition, const TransitConfig& config); + Status updatePosition(float deltaTime); + void start(float deltaTime, const glm::vec3& startPosition, const glm::vec3& endPosition, const TransitConfig& config); bool _isTransiting{ false }; + glm::vec3 _startPosition; glm::vec3 _endPosition; glm::vec3 _currentPosition; - int _framesBefore { 0 }; - int _framesAfter { 0 }; - std::vector _transitSteps; + glm::vec3 _lastPosition; - int _step { 0 }; + + glm::vec3 _transitLine; + float _totalDistance { 0.0f }; + float _totalTime { 0.0f }; + float _currentTime { 0.0f }; + float _transitTime { 0.0f }; + float _timeBefore { 0.0f }; + float _timeAfter { 0.0f }; }; class Avatar : public AvatarData, public scriptable::ModelProvider { @@ -419,7 +421,7 @@ public: std::shared_ptr getTransit() { return std::make_shared(_transit); }; - AvatarTransit::Status updateTransit(const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config); + AvatarTransit::Status updateTransit(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config); signals: void targetScaleChanged(float targetScale); From a7a128f1f13196f9bedade485592634769427b58 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 20 Sep 2018 18:37:42 -0700 Subject: [PATCH 09/17] Particle effect and ease movement --- interface/src/avatar/AvatarManager.cpp | 129 +++++++++++++++++- interface/src/avatar/AvatarManager.h | 2 + .../src/avatars-renderer/Avatar.cpp | 24 +++- .../src/avatars-renderer/Avatar.h | 18 ++- 4 files changed, 168 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 4cc3c619b4..1f396be44f 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -180,7 +180,10 @@ void AvatarManager::updateMyAvatar(float deltaTime) { PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); AvatarTransit::Status status = _myAvatar->updateTransit(deltaTime, _myAvatar->getWorldPosition(), _transitConfig); - + if (status != AvatarTransit::Status::IDLE && status != AvatarTransit::Status::TRANSITING) { + QUuid& transitEffectID = _myAvatar->getTransitEffectID(); + //changeAvatarTransitState(status, _myAvatar->getID(), transitEffectID); + } if (_transitConfig._playAnimation) { playTransitAnimations(status); } @@ -308,7 +311,11 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { } // smooth other avatars positions { - avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); + auto status = avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); + if (status != AvatarTransit::Status::IDLE && status != AvatarTransit::Status::TRANSITING) { + QUuid& transitEffectID = avatar->getTransitEffectID(); + changeAvatarTransitState(status, avatar->getID(), transitEffectID); + } } avatar->simulate(deltaTime, inView); @@ -906,6 +913,9 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV result["isDistanceBased"] = _transitConfig._isDistanceBased; result["triggerDistance"] = _transitConfig._triggerDistance; result["playAnimation"] = _transitConfig._playAnimation; + result["easeType"] = (int)_transitConfig._easeType; + result["showEffect"] = _transitConfig._showEffect; + return result; } void AvatarManager::setAvatarTransitData(const QVariantMap& data) { @@ -924,6 +934,12 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV if (data.contains("playAnimation")) { _transitConfig._playAnimation = data["playAnimation"].toBool(); } + if (data.contains("easeType")) { + _transitConfig._easeType = (AvatarTransit::EaseType)data["easeType"].toInt(); + } + if (data.contains("showEffect")) { + _transitConfig._showEffect = data["showEffect"].toBool(); + } } AvatarTransit::TransitAnimation AvatarManager::getAnimationFromJsonObject(const QJsonObject& object) { @@ -957,4 +973,111 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV QJsonObject object = data["endAnimation"].toJsonObject(); _transitConfig._endTransitAnimation = getAnimationFromJsonObject(object); } -} \ No newline at end of file +} + + void AvatarManager::changeAvatarTransitState(AvatarTransit::Status status, const QUuid& avatarID, QUuid& effectID) { + + if (!_transitConfig._showEffect) { + return; + } + EntityItemProperties props = getAvatarTransitEffectProperties(); + props.setParentID(avatarID); + + switch (status) { + case AvatarTransit::Status::IDLE: + case AvatarTransit::Status::TRANSITING: + case AvatarTransit::Status::START_FRAME: + case AvatarTransit::Status::END_FRAME: + break; + case AvatarTransit::Status::START_TRANSIT: + effectID = DependencyManager::get()->addEntity(props); + break; + case AvatarTransit::Status::END_TRANSIT: + props = DependencyManager::get()->getEntityProperties(effectID); + props.setIsEmitting(false); + auto nid = DependencyManager::get()->editEntity(effectID, props); + break; + } + } + + EntityItemProperties AvatarManager::getAvatarTransitEffectProperties() { + EntityItemProperties props; + + props.setIsEmitting(true); + props.setLifetime(5.0f); + props.setLifespan(2.7f); + props.setMaxParticles(200.0f); + props.setEmitRate(200.0); + props.setEmitSpeed(2.8f); + props.setSpeedSpread(0.2f); + props.setLocalPosition(glm::vec3(0.0f, -1.0f, 0.0f)); + props.setEmitDimensions(glm::vec3(0.0f, 0.0f, 0.0f)); + props.setEmitOrientation(Quaternions::X_180); + props.setEmitterShouldTrail(true); + props.setParticleRadius(0.24f); + props.setRadiusSpread(0.0f); + props.setRadiusStart(0.0f); + props.setRadiusFinish(0.21f); + props.setColor(xColor(0.0f, 180.0f, 239.0f)); + props.setColorStart(glm::vec3(200.0f, 200.0f, 200.0f)); + props.setColorFinish(glm::vec3(0.0f, 0.0f, 0.0f)); + props.setEmitAcceleration(glm::vec3(0.0f, 0.0f, 0.0f)); + props.setAlpha(0.15f); + props.setAccelerationSpread(glm::vec3(0.5f, 1.0f, 0.5f)); + props.setAlphaSpread(0.0f); + props.setAlphaStart(0.3f); + props.setAlphaFinish(0.0f); + props.setParticleSpin(4.78f); + props.setParentJointIndex(_myAvatar->getJointIndex("neck")); + props.setType(EntityTypes::ParticleEffect); + props.setTextures("http://hifi-content.s3.amazonaws.com/alexia/Particles/spark.png"); + props.setSpinSpread(0.0f); + props.setSpinStart(-4.57f); + props.setSpinFinish(4.67f); + props.setRotateWithEntity(false); + props.setPolarStart(0.0f); + props.setPolarFinish(0.0f); + props.setAzimuthStart(-3.1415f); + props.setAzimuthFinish(3.1415f); + props.setRotateWithEntity(true); + props.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); + props.setParentJointIndex(_myAvatar->getJointIndex("head")); + /* + props.setIsEmitting(true); + props.setLifespan(0.5); + props.setMaxParticles(50); + props.setEmitRate(50); + props.setEmitSpeed(0.1f); + props.setSpeedSpread(0.1f); + props.setEmitDimensions(glm::vec3(0, 0, 0)); + props.setEmitOrientation(Quaternions::IDENTITY); + props.setEmitterShouldTrail(true); + props.setParticleRadius(0.05f); + props.setRadiusSpread(0); + props.setRadiusStart(0); + props.setRadiusFinish(0.1); + props.setColor(xColor(0, 180, 239)); + props.setColorStart(glm::vec3(200, 200, 200)); + props.setColorFinish(glm::vec3(0, 0, 0)); + props.setEmitAcceleration(glm::vec3(0, 0, 0)); + props.setAlpha(0.3); + props.setAccelerationSpread(glm::vec3(0.5, 1, 0.5)); + props.setAlphaSpread(0.3); + props.setAlphaStart(1); + props.setAlphaFinish(0); + props.setParticleSpin(3.3); + props.setParentJointIndex(_myAvatar->getJointIndex("head")); + props.setType(EntityTypes::ParticleEffect); + props.setTextures("http://hifi-content.s3.amazonaws.com/alexia/Particles/circle.png"); + props.setSpinSpread(2.53); + props.setSpinStart(3.31); + props.setSpinFinish(3.31); + props.setRotateWithEntity(false); + props.setPolarStart(0); + props.setPolarFinish(3.1415); + props.setAzimuthStart(-3.1415); + props.setAzimuthFinish(3.1415); + props.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); + */ + return props; + } \ No newline at end of file diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index d0fcb13c01..9cfff8b086 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -181,6 +181,7 @@ public: Q_INVOKABLE QVariantMap getAvatarTransitData(); Q_INVOKABLE void setAvatarTransitData(const QVariantMap& data); Q_INVOKABLE void setAvatarTransitAnimationData(const QVariantMap& data); + EntityItemProperties getAvatarTransitEffectProperties(); float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -204,6 +205,7 @@ private: explicit AvatarManager(const AvatarManager& other); void simulateAvatarFades(float deltaTime); + void changeAvatarTransitState(AvatarTransit::Status status, const QUuid& avatarID, QUuid& effectID); AvatarSharedPointer newSharedAvatar() override; void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 5098364540..590e7c067e 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -130,6 +130,7 @@ void AvatarTransit::start(float deltaTime, const glm::vec3& startPosition, const _transitLine = endPosition - startPosition; _totalDistance = glm::length(_transitLine); + _easeType = config._easeType; const float REFERENCE_FRAMES_PER_SECOND = 30.0f; int framesBefore = config._playAnimation ? config._startTransitAnimation._frameCount : 0; @@ -144,6 +145,24 @@ void AvatarTransit::start(float deltaTime, const glm::vec3& startPosition, const _isTransiting = true; } +float AvatarTransit::getEaseValue(AvatarTransit::EaseType type, float value) { + switch (type) { + case EaseType::NONE: + return value; + break; + case EaseType::EASE_IN: + return value * value; + break; + case EaseType::EASE_OUT: + return value * (2.0f - value); + break; + case EaseType::EASE_IN_OUT: + return (value < 0.5f) ? 2.0f * value * value : -1.0f + (4.0f - 2.0f * value) * value; + break; + } + return value; +} + AvatarTransit::Status AvatarTransit::updatePosition(float deltaTime) { Status status = Status::IDLE; if (_isTransiting) { @@ -165,9 +184,12 @@ AvatarTransit::Status AvatarTransit::updatePosition(float deltaTime) { } else { if (_currentTime <= _timeBefore) { status = Status::START_TRANSIT; + } else { + status = Status::TRANSITING; } float percentageIntoTransit = (nextTime - _timeBefore) / _transitTime; - _currentPosition = _startPosition + percentageIntoTransit * _transitLine; + + _currentPosition = _startPosition + getEaseValue(_easeType, percentageIntoTransit) * _transitLine; } _currentTime = nextTime; } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 28593ff9c0..7345bf6b53 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -61,6 +61,13 @@ public: END_FRAME }; + enum EaseType { + NONE = 0, + EASE_IN, + EASE_OUT, + EASE_IN_OUT + }; + struct TransitAnimation { TransitAnimation() {}; TransitAnimation(const QString& animationUrl, int firstFrame, int frameCount) : @@ -76,7 +83,9 @@ public: int _framesPerMeter { 0 }; bool _isDistanceBased { false }; float _triggerDistance { 0 }; - bool _playAnimation { false }; + bool _playAnimation { true }; + EaseType _easeType; + bool _showEffect { true }; TransitAnimation _startTransitAnimation; TransitAnimation _middleTransitAnimation; TransitAnimation _endTransitAnimation; @@ -91,6 +100,7 @@ public: private: Status updatePosition(float deltaTime); void start(float deltaTime, const glm::vec3& startPosition, const glm::vec3& endPosition, const TransitConfig& config); + float getEaseValue(AvatarTransit::EaseType type, float value); bool _isTransiting{ false }; glm::vec3 _startPosition; @@ -106,6 +116,8 @@ private: float _transitTime { 0.0f }; float _timeBefore { 0.0f }; float _timeAfter { 0.0f }; + EaseType _easeType { EaseType::EASE_OUT }; + }; class Avatar : public AvatarData, public scriptable::ModelProvider { @@ -422,6 +434,8 @@ public: std::shared_ptr getTransit() { return std::make_shared(_transit); }; AvatarTransit::Status updateTransit(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config); + QUuid& getTransitEffectID() { return _transitEffectID; }; + signals: void targetScaleChanged(float targetScale); @@ -605,6 +619,8 @@ protected: static const float MYAVATAR_LOADING_PRIORITY; static const float OTHERAVATAR_LOADING_PRIORITY; static const float ATTACHMENT_LOADING_PRIORITY; + + QUuid _transitEffectID{ QUuid::createUuid() }; }; #endif // hifi_Avatar_h From 01f87a06455311349bbb76173c270fb90f29e9f9 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Sat, 22 Sep 2018 05:34:17 -0700 Subject: [PATCH 10/17] lerp myavatar --- interface/src/avatar/AvatarManager.cpp | 5 +++-- interface/src/avatar/MyAvatar.cpp | 11 ++++++++++- interface/src/avatar/MyAvatar.h | 4 +++- .../avatars-renderer/src/avatars-renderer/Avatar.h | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 1f396be44f..2422395c0c 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -179,10 +179,10 @@ void AvatarManager::updateMyAvatar(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); - AvatarTransit::Status status = _myAvatar->updateTransit(deltaTime, _myAvatar->getWorldPosition(), _transitConfig); + AvatarTransit::Status status = _myAvatar->updateTransit(deltaTime, _myAvatar->getNextPosition(), _transitConfig); if (status != AvatarTransit::Status::IDLE && status != AvatarTransit::Status::TRANSITING) { QUuid& transitEffectID = _myAvatar->getTransitEffectID(); - //changeAvatarTransitState(status, _myAvatar->getID(), transitEffectID); + changeAvatarTransitState(status, _myAvatar->getID(), transitEffectID); } if (_transitConfig._playAnimation) { playTransitAnimations(status); @@ -316,6 +316,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { QUuid& transitEffectID = avatar->getTransitEffectID(); changeAvatarTransitState(status, avatar->getID(), transitEffectID); } + } avatar->simulate(deltaTime, inView); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index a6e77f76e9..e2471a3155 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -611,7 +611,16 @@ void MyAvatar::updateChildCauterization(SpatiallyNestablePointer object, bool ca void MyAvatar::simulate(float deltaTime) { PerformanceTimer perfTimer("simulate"); animateScaleChanges(deltaTime); - + if (_transit.isTransiting()) { + glm::vec3 nextPosition; + if (_transit.getNextPosition(nextPosition)) { + _globalPosition = nextPosition; + _globalPositionChanged = usecTimestampNow(); + if (!hasParent()) { + setLocalPosition(nextPosition); + } + } + } setFlyingEnabled(getFlyingEnabled()); if (_cauterizationNeedsUpdate) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 5008190c33..760feab265 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1108,6 +1108,8 @@ public: virtual QVariantList getAttachmentsVariant() const override; virtual void setAttachmentsVariant(const QVariantList& variant) override; + glm::vec3 getNextPosition() { return _goToPending ? _goToPosition : getWorldPosition(); }; + public slots: /**jsdoc @@ -1784,7 +1786,7 @@ private: ThreadSafeValueCache _userHeight { DEFAULT_AVATAR_HEIGHT }; void updateChildCauterization(SpatiallyNestablePointer object, bool cauterize); - + void playTransitAnimations(AvatarTransit::Status status); // max unscaled forward movement speed ThreadSafeValueCache _walkSpeed { DEFAULT_AVATAR_MAX_WALKING_SPEED }; ThreadSafeValueCache _walkBackwardSpeed { DEFAULT_AVATAR_MAX_WALKING_BACKWARD_SPEED }; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 7345bf6b53..52aade80d1 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -84,7 +84,7 @@ public: bool _isDistanceBased { false }; float _triggerDistance { 0 }; bool _playAnimation { true }; - EaseType _easeType; + EaseType _easeType { EaseType::EASE_OUT }; bool _showEffect { true }; TransitAnimation _startTransitAnimation; TransitAnimation _middleTransitAnimation; From 012cd207b339711910c49d3eef13dcb98514a51c Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Mon, 24 Sep 2018 11:39:10 -0700 Subject: [PATCH 11/17] No data sent during basic transit --- interface/src/avatar/AvatarActionHold.cpp | 18 ++++++- interface/src/avatar/AvatarActionHold.h | 2 + interface/src/avatar/AvatarManager.cpp | 49 ++++++++++++------- interface/src/avatar/MyAvatar.cpp | 5 +- interface/src/avatar/MyAvatar.h | 4 ++ interface/src/ui/PreferencesDialog.cpp | 9 ++++ .../src/avatars-renderer/Avatar.cpp | 19 +++++-- .../src/avatars-renderer/Avatar.h | 17 ++++--- libraries/avatars/src/AvatarData.cpp | 11 ++++- libraries/avatars/src/AvatarData.h | 3 +- libraries/entities/src/EntityItem.h | 3 ++ libraries/physics/src/EntityMotionState.cpp | 3 ++ 12 files changed, 111 insertions(+), 32 deletions(-) diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index dbc82fd70e..230f8aa64b 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -48,6 +48,10 @@ AvatarActionHold::~AvatarActionHold() { myAvatar->removeHoldAction(this); } } + auto ownerEntity = _ownerEntity.lock(); + if (ownerEntity) { + ownerEntity->setTransitingWithAvatar(false); + } #if WANT_DEBUG qDebug() << "AvatarActionHold::~AvatarActionHold" << (void*)this; @@ -131,6 +135,15 @@ bool AvatarActionHold::getTarget(float deltaTimeStep, glm::quat& rotation, glm:: glm::vec3 palmPosition; glm::quat palmRotation; + bool isTransitingWithAvatar = holdingAvatar->getTransit()->isTransiting(); + if (isTransitingWithAvatar != _isTransitingWithAvatar) { + _isTransitingWithAvatar = isTransitingWithAvatar; + auto ownerEntity = _ownerEntity.lock(); + if (ownerEntity) { + ownerEntity->setTransitingWithAvatar(_isTransitingWithAvatar); + } + } + if (holdingAvatar->isMyAvatar()) { std::shared_ptr myAvatar = avatarManager->getMyAvatar(); @@ -404,11 +417,14 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { _kinematicSetVelocity = kinematicSetVelocity; _ignoreIK = ignoreIK; _active = true; + + auto myAvatar = DependencyManager::get()->getMyAvatar(); auto ownerEntity = _ownerEntity.lock(); if (ownerEntity) { ownerEntity->setDynamicDataDirty(true); - ownerEntity->setDynamicDataNeedsTransmit(true); + ownerEntity->setDynamicDataNeedsTransmit(true); + ownerEntity->setTransitingWithAvatar(myAvatar->getTransit()->isTransiting()); } }); } diff --git a/interface/src/avatar/AvatarActionHold.h b/interface/src/avatar/AvatarActionHold.h index 6acc71b45c..ddc5808d67 100644 --- a/interface/src/avatar/AvatarActionHold.h +++ b/interface/src/avatar/AvatarActionHold.h @@ -59,6 +59,8 @@ private: bool _kinematicSetVelocity { false }; bool _previousSet { false }; bool _ignoreIK { false }; + bool _isTransitingWithAvatar { false }; + glm::vec3 _previousPositionalTarget; glm::quat _previousRotationalTarget; diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 0263cc1c1e..bd0113aadf 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -94,8 +94,7 @@ AvatarManager::AvatarManager(QObject* parent) : _transitConfig._startTransitAnimation = AvatarTransit::TransitAnimation(START_ANIMATION_URL, 0, 14); _transitConfig._middleTransitAnimation = AvatarTransit::TransitAnimation(MIDDLE_ANIMATION_URL, 15, 0); - _transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 16, 38); - + _transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 16, 38); } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -180,14 +179,21 @@ void AvatarManager::updateMyAvatar(float deltaTime) { PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); AvatarTransit::Status status = _myAvatar->updateTransit(deltaTime, _myAvatar->getNextPosition(), _transitConfig); - if (status != AvatarTransit::Status::IDLE && status != AvatarTransit::Status::TRANSITING) { - QUuid& transitEffectID = _myAvatar->getTransitEffectID(); - changeAvatarTransitState(status, _myAvatar->getID(), transitEffectID); - } - if (_transitConfig._playAnimation) { - playTransitAnimations(status); - } + bool sendFirstTransitPackage = (status == AvatarTransit::Status::START_TRANSIT); + bool sendAllTransitPackages = (status == AvatarTransit::Status::TRANSITING && _transitConfig._showAnimation); + bool blockTransitData = (status == AvatarTransit::Status::TRANSITING && !_transitConfig._showAnimation); + if (status != AvatarTransit::Status::IDLE) { + if (_transitConfig._showAnimation) { + blockTransitData = false; + playTransitAnimations(status); + } + if (status != AvatarTransit::Status::TRANSITING) { + QUuid& transitEffectID = _myAvatar->getTransitEffectID(); + changeAvatarTransitState(status, _myAvatar->getID(), transitEffectID); + } + } + _myAvatar->update(deltaTime); render::Transaction transaction; _myAvatar->updateRenderItem(transaction); @@ -196,9 +202,15 @@ void AvatarManager::updateMyAvatar(float deltaTime) { quint64 now = usecTimestampNow(); quint64 dt = now - _lastSendAvatarDataTime; - if (dt > MIN_TIME_BETWEEN_MY_AVATAR_DATA_SENDS && !_myAvatarDataPacketsPaused) { + + if (sendFirstTransitPackage || (dt > MIN_TIME_BETWEEN_MY_AVATAR_DATA_SENDS && !_myAvatarDataPacketsPaused && !blockTransitData)) { // send head/hand data to the avatar mixer and voxel server PerformanceTimer perfTimer("send"); + if (sendFirstTransitPackage) { + _myAvatar->overrideNextPackagePositionData(_myAvatar->getTransit()->getEndPosition()); + } else if (sendAllTransitPackages) { + _myAvatar->overrideNextPackagePositionData(_myAvatar->getTransit()->getCurrentPosition()); + } _myAvatar->sendAvatarDataPacket(); _lastSendAvatarDataTime = now; _myAvatarSendRate.increment(); @@ -315,6 +327,8 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { if (inView && avatar->hasNewJointData()) { numAvatarsUpdated++; } + + // smooth other avatars positions { auto status = avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); @@ -324,6 +338,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { } } + avatar->simulate(deltaTime, inView); avatar->updateRenderItem(renderTransaction); @@ -924,9 +939,9 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV result["framesPerMeter"] = _transitConfig._framesPerMeter; result["isDistanceBased"] = _transitConfig._isDistanceBased; result["triggerDistance"] = _transitConfig._triggerDistance; - result["playAnimation"] = _transitConfig._playAnimation; + result["showAnimation"] = _transitConfig._showAnimation; result["easeType"] = (int)_transitConfig._easeType; - result["showEffect"] = _transitConfig._showEffect; + result["showParticles"] = _transitConfig._showParticles; return result; } @@ -943,14 +958,14 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV if (data.contains("triggerDistance")) { _transitConfig._triggerDistance = data["triggerDistance"].toDouble(); } - if (data.contains("playAnimation")) { - _transitConfig._playAnimation = data["playAnimation"].toBool(); + if (data.contains("showAnimation")) { + _transitConfig._showAnimation = data["showAnimation"].toBool(); } if (data.contains("easeType")) { _transitConfig._easeType = (AvatarTransit::EaseType)data["easeType"].toInt(); } - if (data.contains("showEffect")) { - _transitConfig._showEffect = data["showEffect"].toBool(); + if (data.contains("showParticles")) { + _transitConfig._showParticles = data["showParticles"].toBool(); } } @@ -989,7 +1004,7 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV void AvatarManager::changeAvatarTransitState(AvatarTransit::Status status, const QUuid& avatarID, QUuid& effectID) { - if (!_transitConfig._showEffect) { + if (!_transitConfig._showParticles) { return; } EntityItemProperties props = getAvatarTransitEffectProperties(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index fd463e6b8e..cd64fdb017 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -616,7 +616,9 @@ void MyAvatar::updateChildCauterization(SpatiallyNestablePointer object, bool ca void MyAvatar::simulate(float deltaTime) { PerformanceTimer perfTimer("simulate"); animateScaleChanges(deltaTime); - if (_transit.isTransiting()) { + // CameraMode mode = qApp->getCamera().getMode(); + // bool shouldTransit = (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT); + if (_transit.isTransiting() && _showTransit) { glm::vec3 nextPosition; if (_transit.getNextPosition(nextPosition)) { _globalPosition = nextPosition; @@ -626,6 +628,7 @@ void MyAvatar::simulate(float deltaTime) { } } } + setFlyingEnabled(getFlyingEnabled()); if (_cauterizationNeedsUpdate) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 40683f5848..d7bbe64fb4 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1115,6 +1115,8 @@ public: virtual void setAttachmentsVariant(const QVariantList& variant) override; glm::vec3 getNextPosition() { return _goToPending ? _goToPosition : getWorldPosition(); }; + bool getShowTransit() { return _showTransit; }; + void setShowTransit(bool value) { _showTransit = value; }; public slots: @@ -1796,6 +1798,8 @@ private: void updateChildCauterization(SpatiallyNestablePointer object, bool cauterize); void playTransitAnimations(AvatarTransit::Status status); + + bool _showTransit { false }; // max unscaled forward movement speed ThreadSafeValueCache _walkSpeed { DEFAULT_AVATAR_MAX_WALKING_SPEED }; ThreadSafeValueCache _walkBackwardSpeed { DEFAULT_AVATAR_MAX_WALKING_BACKWARD_SPEED }; diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 951925214c..4b45b32403 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -248,6 +248,15 @@ void setupPreferences() { preference->setItems(items); preferences->addPreference(preference); } + { + auto getter = [myAvatar]()->int { return myAvatar->getShowTransit() ? 0 : 1; }; + auto setter = [myAvatar](int value) { myAvatar->setShowTransit(value == 0); }; + auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Show transit / Hide transit", getter, setter); + QStringList items; + items << "Show transit" << "Hide Transit"; + preference->setItems(items); + preferences->addPreference(preference); + } { auto getter = [=]()->float { return myAvatar->getUserHeight(); }; auto setter = [=](float value) { myAvatar->setUserHeight(value); }; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 9c9eae2cca..80537f84a4 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -121,7 +121,8 @@ AvatarTransit::Status AvatarTransit::update(float deltaTime, const glm::vec3& av start(deltaTime, _lastPosition, currentPosition, config); } _lastPosition = currentPosition; - return updatePosition(deltaTime); + _status = updatePosition(deltaTime); + return _status; } void AvatarTransit::start(float deltaTime, const glm::vec3& startPosition, const glm::vec3& endPosition, const AvatarTransit::TransitConfig& config) { @@ -131,10 +132,12 @@ void AvatarTransit::start(float deltaTime, const glm::vec3& startPosition, const _transitLine = endPosition - startPosition; _totalDistance = glm::length(_transitLine); _easeType = config._easeType; + _showAnimation = config._showAnimation; + _showParticles = config._showParticles; const float REFERENCE_FRAMES_PER_SECOND = 30.0f; - int framesBefore = config._playAnimation ? config._startTransitAnimation._frameCount : 0; - int framesAfter = config._playAnimation ? config._endTransitAnimation._frameCount : 0; + int framesBefore = _showAnimation ? config._startTransitAnimation._frameCount : 0; + int framesAfter = _showAnimation ? config._endTransitAnimation._frameCount : 0; _timeBefore = (float)framesBefore / REFERENCE_FRAMES_PER_SECOND; _timeAfter = (float)framesAfter / REFERENCE_FRAMES_PER_SECOND; @@ -537,7 +540,7 @@ void Avatar::relayJointDataToChildren() { void Avatar::simulate(float deltaTime, bool inView) { PROFILE_RANGE(simulation, "simulate"); - + if (_transit.isTransiting()) { glm::vec3 nextPosition; if (_transit.getNextPosition(nextPosition)) { @@ -548,7 +551,7 @@ void Avatar::simulate(float deltaTime, bool inView) { } } } - + _simulationRate.increment(); if (inView) { _simulationInViewRate.increment(); @@ -1985,6 +1988,12 @@ AvatarTransit::Status Avatar::updateTransit(float deltaTime, const glm::vec3& av return _transit.update(deltaTime, avatarPosition, config); } +void Avatar::overrideNextPackagePositionData(const glm::vec3& position) { + std::lock_guard lock(_transitLock); + _overrideGlobalPosition = true; + _globalPositionOverride = position; +} + void Avatar::addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) { std::lock_guard lock(_materialsLock); _materials[parentMaterialName].push(material); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 1234ab897a..ebb51a8851 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -83,9 +83,9 @@ public: int _framesPerMeter { 0 }; bool _isDistanceBased { false }; float _triggerDistance { 0 }; - bool _playAnimation { true }; + bool _showAnimation { false }; EaseType _easeType { EaseType::EASE_OUT }; - bool _showEffect { true }; + bool _showParticles { false }; TransitAnimation _startTransitAnimation; TransitAnimation _middleTransitAnimation; TransitAnimation _endTransitAnimation; @@ -93,15 +93,17 @@ public: AvatarTransit() {}; Status update(float deltaTime, const glm::vec3& avatarPosition, const TransitConfig& config); - bool isTransiting() { return _isTransiting; }; - glm::vec3 getCurrentPosition() { return _currentPosition; }; + Status getStatus() { return _status; } + bool isTransiting() { return _isTransiting; } + glm::vec3 getCurrentPosition() { return _currentPosition; } bool getNextPosition(glm::vec3& nextPosition); + glm::vec3 getEndPosition() { return _endPosition; } private: Status updatePosition(float deltaTime); void start(float deltaTime, const glm::vec3& startPosition, const glm::vec3& endPosition, const TransitConfig& config); float getEaseValue(AvatarTransit::EaseType type, float value); - bool _isTransiting{ false }; + bool _isTransiting { false }; glm::vec3 _startPosition; glm::vec3 _endPosition; @@ -117,7 +119,9 @@ private: float _timeBefore { 0.0f }; float _timeAfter { 0.0f }; EaseType _easeType { EaseType::EASE_OUT }; - + Status _status { Status::IDLE }; + bool _showAnimation { false }; + bool _showParticles { false }; }; class Avatar : public AvatarData, public scriptable::ModelProvider { @@ -444,6 +448,7 @@ public: AvatarTransit::Status updateTransit(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config); QUuid& getTransitEffectID() { return _transitEffectID; }; + void overrideNextPackagePositionData(const glm::vec3& position); signals: void targetScaleChanged(float targetScale); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index acf5696d65..2168dff1f6 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -369,7 +369,12 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent if (hasAvatarGlobalPosition) { auto startSection = destinationBuffer; - AVATAR_MEMCPY(_globalPosition); + if (_overrideGlobalPosition) { + AVATAR_MEMCPY(_globalPositionOverride); + } else { + AVATAR_MEMCPY(_globalPosition); + } + int numBytes = destinationBuffer - startSection; @@ -2088,6 +2093,10 @@ void AvatarData::sendAvatarDataPacket(bool sendAll) { } } + if (_overrideGlobalPosition) { + _overrideGlobalPosition = false; + } + doneEncoding(cullSmallData); static AvatarDataSequenceNumber sequenceNumber = 0; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 39f0ea34f6..a890482e9a 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -1372,7 +1372,8 @@ protected: // where Entities are located. This is currently only used by the mixer to decide how often to send // updates about one avatar to another. glm::vec3 _globalPosition { 0, 0, 0 }; - + glm::vec3 _globalPositionOverride { 0, 0, 0 }; + bool _overrideGlobalPosition { false }; quint64 _globalPositionChanged { 0 }; quint64 _avatarBoundingBoxChanged { 0 }; diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 490f9b9e6b..15c6f6d75e 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -441,6 +441,8 @@ public: void setDynamicDataNeedsTransmit(bool value) const { _dynamicDataNeedsTransmit = value; } bool dynamicDataNeedsTransmit() const { return _dynamicDataNeedsTransmit; } + void setTransitingWithAvatar(bool value) { _transitingWithAvatar = value; } + bool getTransitingWithAvatar() { return _transitingWithAvatar; } bool shouldSuppressLocationEdits() const; @@ -666,6 +668,7 @@ protected: QUuid _sourceUUID; /// the server node UUID we came from bool _clientOnly { false }; + bool _transitingWithAvatar{ false }; QUuid _owningAvatarID; // physics related changes from the network to suppress any duplicates and make diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index 5478221607..8162bf4e18 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -432,6 +432,9 @@ bool EntityMotionState::shouldSendUpdate(uint32_t simulationStep) { // this case is prevented by setting _ownershipState to UNOWNABLE in EntityMotionState::ctor assert(!(_entity->getClientOnly() && _entity->getOwningAvatarID() != Physics::getSessionUUID())); + if (_entity->getTransitingWithAvatar()) { + return false; + } if (_entity->dynamicDataNeedsTransmit()) { return true; } From 3e2ee119f068dbb92539ffc4d5f9027a406a55a7 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 25 Sep 2018 06:03:29 -0700 Subject: [PATCH 12/17] API to configure animation and particle effect --- interface/src/avatar/AvatarManager.cpp | 444 +++++++++++------- interface/src/avatar/AvatarManager.h | 7 +- interface/src/avatar/MyAvatar.cpp | 1 + interface/src/ui/PreferencesDialog.cpp | 4 +- .../src/avatars-renderer/Avatar.cpp | 10 +- .../src/avatars-renderer/Avatar.h | 5 + 6 files changed, 293 insertions(+), 178 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index bd0113aadf..c0dbca7829 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -81,7 +81,7 @@ AvatarManager::AvatarManager(QObject* parent) : const float AVATAR_TRANSIT_TRIGGER_DISTANCE = 1.0f; const int AVATAR_TRANSIT_FRAME_COUNT = 11; // Based on testing - const int AVATAR_TRANSIT_FRAMES_PER_METER = 3; // Based on testing + const int AVATAR_TRANSIT_FRAMES_PER_METER = 1; // Based on testing const QString START_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; const QString MIDDLE_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; @@ -95,6 +95,8 @@ AvatarManager::AvatarManager(QObject* parent) : _transitConfig._startTransitAnimation = AvatarTransit::TransitAnimation(START_ANIMATION_URL, 0, 14); _transitConfig._middleTransitAnimation = AvatarTransit::TransitAnimation(MIDDLE_ANIMATION_URL, 15, 0); _transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 16, 38); + + setAvatarTransitEffectDefaultProperties(); } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -339,7 +341,6 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { } - avatar->simulate(deltaTime, inView); avatar->updateRenderItem(renderTransaction); avatar->updateSpaceProxy(workloadTransaction); @@ -887,7 +888,7 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV } } - QVariantMap AvatarManager::getPalData(const QList specificAvatarIdentifiers) { +QVariantMap AvatarManager::getPalData(const QList specificAvatarIdentifiers) { QJsonArray palData; auto avatarMap = getHashCopy(); @@ -933,178 +934,277 @@ void AvatarManager::setAvatarSortCoefficient(const QString& name, const QScriptV return doc.toVariantMap(); } - QVariantMap AvatarManager::getAvatarTransitData() { - QVariantMap result; - result["frameCount"] = _transitConfig._totalFrames; - result["framesPerMeter"] = _transitConfig._framesPerMeter; - result["isDistanceBased"] = _transitConfig._isDistanceBased; - result["triggerDistance"] = _transitConfig._triggerDistance; - result["showAnimation"] = _transitConfig._showAnimation; - result["easeType"] = (int)_transitConfig._easeType; - result["showParticles"] = _transitConfig._showParticles; +QVariantMap AvatarManager::getAvatarTransitData() { + QVariantMap result; + result["frameCount"] = _transitConfig._totalFrames; + result["framesPerMeter"] = _transitConfig._framesPerMeter; + result["isDistanceBased"] = _transitConfig._isDistanceBased; + result["triggerDistance"] = _transitConfig._triggerDistance; + result["showAnimation"] = _transitConfig._showAnimation; + result["easeType"] = (int)_transitConfig._easeType; + result["showParticles"] = _transitConfig._showParticles; - return result; -} - void AvatarManager::setAvatarTransitData(const QVariantMap& data) { - if (data.contains("frameCount")) { - _transitConfig._totalFrames = data["frameCount"].toInt(); - } - if (data.contains("framesPerMeter")) { - _transitConfig._framesPerMeter = data["framesPerMeter"].toInt(); - } - if (data.contains("isDistanceBased")) { - _transitConfig._isDistanceBased = data["isDistanceBased"].toBool(); - } - if (data.contains("triggerDistance")) { - _transitConfig._triggerDistance = data["triggerDistance"].toDouble(); - } - if (data.contains("showAnimation")) { - _transitConfig._showAnimation = data["showAnimation"].toBool(); - } - if (data.contains("easeType")) { - _transitConfig._easeType = (AvatarTransit::EaseType)data["easeType"].toInt(); - } - if (data.contains("showParticles")) { - _transitConfig._showParticles = data["showParticles"].toBool(); - } + return result; } - AvatarTransit::TransitAnimation AvatarManager::getAnimationFromJsonObject(const QJsonObject& object) { - QString animationUrl; - int firstFrame = 0; - int frameCount = 0; - if (object.contains("animationUrl")) { - animationUrl = object["animationUrl"].toString(); - } - if (object.contains("firstFrame")) { - firstFrame = object["firstFrame"].toInt(); - } - if (object.contains("frameCount")) { - frameCount = object["frameCount"].toInt(); - } - return AvatarTransit::TransitAnimation(animationUrl, firstFrame, frameCount); - } - - void AvatarManager::setAvatarTransitAnimationData(const QVariantMap& data) { - AvatarTransit::TransitAnimation startAnimation, middleAnimation, endAnimation; - - if (data.contains("startAnimation")) { - QJsonObject object = data["startAnimation"].toJsonObject(); - _transitConfig._startTransitAnimation = getAnimationFromJsonObject(object); - } - if (data.contains("middleAnimation")) { - QJsonObject object = data["middleAnimation"].toJsonObject(); - _transitConfig._middleTransitAnimation = getAnimationFromJsonObject(object); - } - if (data.contains("endAnimation")) { - QJsonObject object = data["endAnimation"].toJsonObject(); - _transitConfig._endTransitAnimation = getAnimationFromJsonObject(object); - } +void AvatarManager::setAvatarTransitData(const QVariantMap& data) { + if (data.contains("frameCount")) { + _transitConfig._totalFrames = data["frameCount"].toInt(); + } + if (data.contains("framesPerMeter")) { + _transitConfig._framesPerMeter = data["framesPerMeter"].toInt(); + } + if (data.contains("isDistanceBased")) { + _transitConfig._isDistanceBased = data["isDistanceBased"].toBool(); + } + if (data.contains("triggerDistance")) { + _transitConfig._triggerDistance = data["triggerDistance"].toDouble(); + } + if (data.contains("showAnimation")) { + _transitConfig._showAnimation = data["showAnimation"].toBool(); + } + if (data.contains("easeType")) { + _transitConfig._easeType = (AvatarTransit::EaseType)data["easeType"].toInt(); + } + if (data.contains("showParticles")) { + _transitConfig._showParticles = data["showParticles"].toBool(); + } } - void AvatarManager::changeAvatarTransitState(AvatarTransit::Status status, const QUuid& avatarID, QUuid& effectID) { - - if (!_transitConfig._showParticles) { - return; - } - EntityItemProperties props = getAvatarTransitEffectProperties(); - props.setParentID(avatarID); - - switch (status) { - case AvatarTransit::Status::IDLE: - case AvatarTransit::Status::TRANSITING: - case AvatarTransit::Status::START_FRAME: - case AvatarTransit::Status::END_FRAME: - break; - case AvatarTransit::Status::START_TRANSIT: - effectID = DependencyManager::get()->addEntity(props); - break; - case AvatarTransit::Status::END_TRANSIT: - props = DependencyManager::get()->getEntityProperties(effectID); - props.setIsEmitting(false); - auto nid = DependencyManager::get()->editEntity(effectID, props); - break; - } - } +AvatarTransit::TransitAnimation AvatarManager::getAnimationFromJsonObject(const QJsonObject& object) { + QString animationUrl; + int firstFrame = 0; + int frameCount = 0; + if (object.contains("animationUrl")) { + animationUrl = object["animationUrl"].toString(); + } + if (object.contains("firstFrame")) { + firstFrame = object["firstFrame"].toInt(); + } + if (object.contains("frameCount")) { + frameCount = object["frameCount"].toInt(); + } + return AvatarTransit::TransitAnimation(animationUrl, firstFrame, frameCount); +} - EntityItemProperties AvatarManager::getAvatarTransitEffectProperties() { - EntityItemProperties props; - - props.setIsEmitting(true); - props.setLifetime(5.0f); - props.setLifespan(2.7f); - props.setMaxParticles(200.0f); - props.setEmitRate(200.0); - props.setEmitSpeed(2.8f); - props.setSpeedSpread(0.2f); - props.setLocalPosition(glm::vec3(0.0f, -1.0f, 0.0f)); - props.setEmitDimensions(glm::vec3(0.0f, 0.0f, 0.0f)); - props.setEmitOrientation(Quaternions::X_180); - props.setEmitterShouldTrail(true); - props.setParticleRadius(0.24f); - props.setRadiusSpread(0.0f); - props.setRadiusStart(0.0f); - props.setRadiusFinish(0.21f); - props.setColor(xColor(0.0f, 180.0f, 239.0f)); - props.setColorStart(glm::vec3(200.0f, 200.0f, 200.0f)); - props.setColorFinish(glm::vec3(0.0f, 0.0f, 0.0f)); - props.setEmitAcceleration(glm::vec3(0.0f, 0.0f, 0.0f)); - props.setAlpha(0.15f); - props.setAccelerationSpread(glm::vec3(0.5f, 1.0f, 0.5f)); - props.setAlphaSpread(0.0f); - props.setAlphaStart(0.3f); - props.setAlphaFinish(0.0f); - props.setParticleSpin(4.78f); - props.setParentJointIndex(_myAvatar->getJointIndex("neck")); - props.setType(EntityTypes::ParticleEffect); - props.setTextures("http://hifi-content.s3.amazonaws.com/alexia/Particles/spark.png"); - props.setSpinSpread(0.0f); - props.setSpinStart(-4.57f); - props.setSpinFinish(4.67f); - props.setRotateWithEntity(false); - props.setPolarStart(0.0f); - props.setPolarFinish(0.0f); - props.setAzimuthStart(-3.1415f); - props.setAzimuthFinish(3.1415f); - props.setRotateWithEntity(true); - props.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); - props.setParentJointIndex(_myAvatar->getJointIndex("head")); - /* - props.setIsEmitting(true); - props.setLifespan(0.5); - props.setMaxParticles(50); - props.setEmitRate(50); - props.setEmitSpeed(0.1f); - props.setSpeedSpread(0.1f); - props.setEmitDimensions(glm::vec3(0, 0, 0)); - props.setEmitOrientation(Quaternions::IDENTITY); - props.setEmitterShouldTrail(true); - props.setParticleRadius(0.05f); - props.setRadiusSpread(0); - props.setRadiusStart(0); - props.setRadiusFinish(0.1); - props.setColor(xColor(0, 180, 239)); - props.setColorStart(glm::vec3(200, 200, 200)); - props.setColorFinish(glm::vec3(0, 0, 0)); - props.setEmitAcceleration(glm::vec3(0, 0, 0)); - props.setAlpha(0.3); - props.setAccelerationSpread(glm::vec3(0.5, 1, 0.5)); - props.setAlphaSpread(0.3); - props.setAlphaStart(1); - props.setAlphaFinish(0); - props.setParticleSpin(3.3); - props.setParentJointIndex(_myAvatar->getJointIndex("head")); - props.setType(EntityTypes::ParticleEffect); - props.setTextures("http://hifi-content.s3.amazonaws.com/alexia/Particles/circle.png"); - props.setSpinSpread(2.53); - props.setSpinStart(3.31); - props.setSpinFinish(3.31); - props.setRotateWithEntity(false); - props.setPolarStart(0); - props.setPolarFinish(3.1415); - props.setAzimuthStart(-3.1415); - props.setAzimuthFinish(3.1415); - props.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); - */ - return props; - } \ No newline at end of file +void AvatarManager::setAvatarTransitAnimationData(const QVariantMap& data) { + AvatarTransit::TransitAnimation startAnimation, middleAnimation, endAnimation; + + if (data.contains("startAnimation")) { + QJsonObject object = data["startAnimation"].toJsonObject(); + _transitConfig._startTransitAnimation = getAnimationFromJsonObject(object); + } + if (data.contains("middleAnimation")) { + QJsonObject object = data["middleAnimation"].toJsonObject(); + _transitConfig._middleTransitAnimation = getAnimationFromJsonObject(object); + } + if (data.contains("endAnimation")) { + QJsonObject object = data["endAnimation"].toJsonObject(); + _transitConfig._endTransitAnimation = getAnimationFromJsonObject(object); + } +} + +void AvatarManager::changeAvatarTransitState(AvatarTransit::Status status, const QUuid& avatarID, QUuid& effectID) { + + if (!_transitConfig._showParticles) { + return; + } + _transitEffectProperties.setParentID(avatarID); + std::shared_ptr avatar; + avatar = (avatarID != _myAvatar->getID()) ? std::static_pointer_cast(getAvatarBySessionID(avatarID)) : _myAvatar; + + _transitEffectProperties.setLifetime(_transitEffectProperties.getLifespan() + avatar->getTransit()->getTransitTime()); + float feetOffset = glm::length(avatar->getWorldPosition() - avatar->getWorldFeetPosition()); + _transitEffectProperties.setLocalPosition(glm::vec3(0.0f, -feetOffset, 0.0f)); + + EntityItemProperties props; + switch (status) { + case AvatarTransit::Status::IDLE: + case AvatarTransit::Status::TRANSITING: + case AvatarTransit::Status::START_FRAME: + case AvatarTransit::Status::END_FRAME: + break; + case AvatarTransit::Status::START_TRANSIT: + effectID = DependencyManager::get()->addEntity(_transitEffectProperties); + break; + case AvatarTransit::Status::END_TRANSIT: + props = DependencyManager::get()->getEntityProperties(effectID); + props.setIsEmitting(false); + auto nid = DependencyManager::get()->editEntity(effectID, props); + break; + } +} + +void AvatarManager::setAvatarTransitEffectData(const QVariantMap& data) { + auto jsonToVector = [](const QJsonObject& object) { + if (object.contains("x") && object.contains("y") && object.contains("z")) { + float x = (float)object["x"].toDouble(); + float y = (float)object["y"].toDouble(); + float z = (float)object["z"].toDouble(); + return glm::vec3(x, y, z); + } + return glm::vec3(0.0f, 0.0f, 0.0f); + }; + + auto jsonToQuat = [jsonToVector](const QJsonObject& object) { + glm::vec3 components = jsonToVector(object); + if (object.contains("w")) { + float w = (float)object["w"].toDouble(); + return glm::quat(components.x, components.y, components.z, w); + } + return Quaternions::IDENTITY; + }; + + auto jsonToColor = [jsonToVector](const QJsonObject& object) { + glm::vec3 components = jsonToVector(object); + return xColor(components.x, components.y, components.z); + }; + + _transitEffectProperties.setType(EntityTypes::ParticleEffect); + + if (data.contains("isEmitting")) { + _transitEffectProperties.setIsEmitting(data["isEmitting"].toBool()); + } + if (data.contains("lifetime")) { + _transitEffectProperties.setLifetime(data["lifetime"].toFloat()); + } + if (data.contains("lifespan")) { + _transitEffectProperties.setLifespan(data["lifespan"].toFloat()); + } + if (data.contains("maxParticles")) { + _transitEffectProperties.setMaxParticles(data["maxParticles"].toFloat()); + } + if (data.contains("emitRate")) { + _transitEffectProperties.setEmitRate(data["emitRate"].toFloat()); + } + if (data.contains("emitSpeed")) { + _transitEffectProperties.setEmitSpeed(data["emitSpeed"].toFloat()); + } + if (data.contains("speedSpread")) { + _transitEffectProperties.setSpeedSpread(data["speedSpread"].toFloat()); + } + if (data.contains("localPosition")) { + _transitEffectProperties.setLocalPosition(jsonToVector(data["localPosition"].toJsonObject())); + } + if (data.contains("emitDimensions")) { + _transitEffectProperties.setEmitDimensions(jsonToVector(data["emitDimensions"].toJsonObject())); + } + if (data.contains("emitOrientation")) { + _transitEffectProperties.setEmitOrientation(jsonToQuat(data["emitOrientation"].toJsonObject())); + } + if (data.contains("emitterShouldTrail")) { + _transitEffectProperties.setEmitterShouldTrail(data["emitterShouldTrail"].toBool()); + } + if (data.contains("particleRadius")) { + _transitEffectProperties.setParticleRadius(data["particleRadius"].toFloat()); + } + if (data.contains("radiusSpread")) { + _transitEffectProperties.setRadiusSpread(data["radiusSpread"].toFloat()); + } + if (data.contains("radiusStart")) { + _transitEffectProperties.setRadiusStart(data["radiusStart"].toFloat()); + } + if (data.contains("radiusFinish")) { + _transitEffectProperties.setRadiusFinish(data["radiusFinish"].toFloat()); + } + if (data.contains("color")) { + _transitEffectProperties.setColor(jsonToColor(data["color"].toJsonObject())); + } + if (data.contains("colorStart")) { + _transitEffectProperties.setColorStart(jsonToVector(data["colorStart"].toJsonObject())); + } + if (data.contains("colorFinish")) { + _transitEffectProperties.setColorFinish(jsonToVector(data["colorFinish"].toJsonObject())); + } + if (data.contains("emitAcceleration")) { + _transitEffectProperties.setEmitAcceleration(jsonToVector(data["emitAcceleration"].toJsonObject())); + } + if (data.contains("alpha")) { + _transitEffectProperties.setAlpha(data["alpha"].toFloat()); + } + if (data.contains("accelerationSpread")) { + _transitEffectProperties.setAccelerationSpread(jsonToVector(data["accelerationSpread"].toJsonObject())); + } + if (data.contains("alphaSpread")) { + _transitEffectProperties.setAlphaSpread(data["alphaSpread"].toFloat()); + } + if (data.contains("alphaStart")) { + _transitEffectProperties.setAlphaStart(data["alphaStart"].toFloat()); + } + if (data.contains("alphaFinish")) { + _transitEffectProperties.setAlphaFinish(data["alphaFinish"].toFloat()); + } + if (data.contains("particleSpin")) { + _transitEffectProperties.setParticleSpin(data["particleSpin"].toFloat()); + } + if (data.contains("textures")) { + _transitEffectProperties.setTextures(data["textures"].toString()); + } + if (data.contains("spinSpread")) { + _transitEffectProperties.setSpinSpread(data["spinSpread"].toFloat()); + } + if (data.contains("spinStart")) { + _transitEffectProperties.setSpinStart(data["spinStart"].toFloat()); + } + if (data.contains("spinFinish")) { + _transitEffectProperties.setSpinFinish(data["spinFinish"].toFloat()); + } + if (data.contains("rotateWithEntity")) { + _transitEffectProperties.setRotateWithEntity(data["rotateWithEntity"].toBool()); + } + if (data.contains("polarStart")) { + _transitEffectProperties.setPolarStart(data["polarStart"].toFloat()); + } + if (data.contains("polarFinish")) { + _transitEffectProperties.setPolarFinish(data["polarFinish"].toFloat()); + } + if (data.contains("azimuthStart")) { + _transitEffectProperties.setAzimuthStart(data["azimuthStart"].toFloat()); + } + if (data.contains("azimuthFinish")) { + _transitEffectProperties.setAzimuthFinish(data["azimuthFinish"].toFloat()); + } + if (data.contains("userData")) { + _transitEffectProperties.setUserData(data["userData"].toString()); + } else { + _transitEffectProperties.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); + } +} + +void AvatarManager::setAvatarTransitEffectDefaultProperties() { + _transitEffectProperties.setIsEmitting(true); + _transitEffectProperties.setLifespan(2.7f); + _transitEffectProperties.setMaxParticles(200.0f); + _transitEffectProperties.setEmitRate(200.0); + _transitEffectProperties.setEmitSpeed(2.8f); + _transitEffectProperties.setSpeedSpread(0.2f); + _transitEffectProperties.setEmitDimensions(glm::vec3(0.0f, 0.0f, 0.0f)); + _transitEffectProperties.setEmitOrientation(Quaternions::X_180); + _transitEffectProperties.setEmitterShouldTrail(true); + _transitEffectProperties.setParticleRadius(0.24f); + _transitEffectProperties.setRadiusSpread(0.0f); + _transitEffectProperties.setRadiusStart(0.0f); + _transitEffectProperties.setRadiusFinish(0.21f); + _transitEffectProperties.setColor(xColor(0.0f, 180.0f, 239.0f)); + _transitEffectProperties.setColorStart(glm::vec3(200.0f, 200.0f, 200.0f)); + _transitEffectProperties.setColorFinish(glm::vec3(0.0f, 0.0f, 0.0f)); + _transitEffectProperties.setEmitAcceleration(glm::vec3(0.0f, 0.0f, 0.0f)); + _transitEffectProperties.setAlpha(0.15f); + _transitEffectProperties.setAccelerationSpread(glm::vec3(0.5f, 1.0f, 0.5f)); + _transitEffectProperties.setAlphaSpread(0.0f); + _transitEffectProperties.setAlphaStart(0.3f); + _transitEffectProperties.setAlphaFinish(0.0f); + _transitEffectProperties.setParticleSpin(4.78f); + _transitEffectProperties.setType(EntityTypes::ParticleEffect); + _transitEffectProperties.setTextures("http://hifi-content.s3.amazonaws.com/alexia/Particles/spark.png"); + _transitEffectProperties.setSpinSpread(0.0f); + _transitEffectProperties.setSpinStart(-4.57f); + _transitEffectProperties.setSpinFinish(4.67f); + _transitEffectProperties.setRotateWithEntity(false); + _transitEffectProperties.setPolarStart(0.0f); + _transitEffectProperties.setPolarFinish(0.0f); + _transitEffectProperties.setAzimuthStart(-3.1415f); + _transitEffectProperties.setAzimuthFinish(3.1415f); + _transitEffectProperties.setRotateWithEntity(true); + _transitEffectProperties.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); +} diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 65a001bf53..73e350ebe5 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,7 @@ #include "MyAvatar.h" #include "OtherAvatar.h" + using SortedAvatar = std::pair>; /**jsdoc @@ -183,7 +185,7 @@ public: Q_INVOKABLE QVariantMap getAvatarTransitData(); Q_INVOKABLE void setAvatarTransitData(const QVariantMap& data); Q_INVOKABLE void setAvatarTransitAnimationData(const QVariantMap& data); - EntityItemProperties getAvatarTransitEffectProperties(); + Q_INVOKABLE void setAvatarTransitEffectData(const QVariantMap& data); float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -214,6 +216,7 @@ private: void playTransitAnimations(AvatarTransit::Status status); AvatarTransit::TransitAnimation getAnimationFromJsonObject(const QJsonObject& object); + void AvatarManager::setAvatarTransitEffectDefaultProperties(); QVector _avatarsToFade; QVector _avatarsToCopy; @@ -239,8 +242,8 @@ private: std::vector _spaceProxiesToDelete; // Other avatars smooth transit global configuration - AvatarTransit::TransitConfig _transitConfig; + EntityItemProperties _transitEffectProperties; }; #endif // hifi_AvatarManager_h diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index cd64fdb017..ee5512c63a 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -916,6 +916,7 @@ void MyAvatar::updateSensorToWorldMatrix() { updateJointFromController(controller::Action::RIGHT_HAND, _controllerRightHandMatrixCache); if (hasSensorToWorldScaleChanged) { + setTransitScale(sensorToWorldScale); emit sensorToWorldScaleChanged(sensorToWorldScale); } diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 4b45b32403..8b0173888e 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -251,9 +251,9 @@ void setupPreferences() { { auto getter = [myAvatar]()->int { return myAvatar->getShowTransit() ? 0 : 1; }; auto setter = [myAvatar](int value) { myAvatar->setShowTransit(value == 0); }; - auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Show transit / Hide transit", getter, setter); + auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Snap teleport / Smooth teleport", getter, setter); QStringList items; - items << "Show transit" << "Hide Transit"; + items << "Snap teleport" << "Smooth teleport"; preference->setItems(items); preferences->addPreference(preference); } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 80537f84a4..e124b533a2 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -116,8 +116,9 @@ void Avatar::setShowNamesAboveHeads(bool show) { AvatarTransit::Status AvatarTransit::update(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config) { glm::vec3 currentPosition = _isTransiting ? _currentPosition : avatarPosition; float oneFrameDistance = glm::length(currentPosition - _lastPosition); - const float MAX_TRANSIT_DISTANCE = 20.0f; - if (oneFrameDistance > config._triggerDistance && oneFrameDistance < MAX_TRANSIT_DISTANCE && !_isTransiting) { + 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); } _lastPosition = currentPosition; @@ -1988,6 +1989,11 @@ AvatarTransit::Status Avatar::updateTransit(float deltaTime, const glm::vec3& av return _transit.update(deltaTime, avatarPosition, config); } +void Avatar::setTransitScale(float scale) { + std::lock_guard lock(_transitLock); + return _transit.setScale(scale); +} + void Avatar::overrideNextPackagePositionData(const glm::vec3& position) { std::lock_guard lock(_transitLock); _overrideGlobalPosition = true; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index ebb51a8851..9de1127391 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -98,6 +98,8 @@ public: glm::vec3 getCurrentPosition() { return _currentPosition; } bool getNextPosition(glm::vec3& nextPosition); glm::vec3 getEndPosition() { return _endPosition; } + float getTransitTime() { return _totalTime; } + void setScale(float scale) { _scale = scale; } private: Status updatePosition(float deltaTime); @@ -122,6 +124,7 @@ private: Status _status { Status::IDLE }; bool _showAnimation { false }; bool _showParticles { false }; + float _scale { 1.0f }; }; class Avatar : public AvatarData, public scriptable::ModelProvider { @@ -447,6 +450,8 @@ public: std::shared_ptr getTransit() { return std::make_shared(_transit); }; AvatarTransit::Status updateTransit(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config); + void setTransitScale(float scale); + QUuid& getTransitEffectID() { return _transitEffectID; }; void overrideNextPackagePositionData(const glm::vec3& position); From 80daf35e771e9627246fd2b0f4539e6a2b24f83a Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 25 Sep 2018 07:17:26 -0700 Subject: [PATCH 13/17] Animation and particles clean up --- interface/src/avatar/AvatarManager.cpp | 311 +----------------- interface/src/avatar/AvatarManager.h | 7 - interface/src/avatar/MyAvatar.cpp | 2 - interface/src/avatar/MyAvatar.h | 1 - .../src/avatars-renderer/Avatar.cpp | 32 +- .../src/avatars-renderer/Avatar.h | 25 +- 6 files changed, 10 insertions(+), 368 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index c0dbca7829..947559d5bd 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -83,20 +83,10 @@ AvatarManager::AvatarManager(QObject* parent) : const int AVATAR_TRANSIT_FRAME_COUNT = 11; // Based on testing const int AVATAR_TRANSIT_FRAMES_PER_METER = 1; // Based on testing - const QString START_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; - const QString MIDDLE_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; - const QString END_ANIMATION_URL = "https://hifi-content.s3.amazonaws.com/luis/test_scripts/transitApp/animations/teleport01_warp.fbx"; - _transitConfig._totalFrames = AVATAR_TRANSIT_FRAME_COUNT; _transitConfig._triggerDistance = AVATAR_TRANSIT_TRIGGER_DISTANCE; _transitConfig._framesPerMeter = AVATAR_TRANSIT_FRAMES_PER_METER; _transitConfig._isDistanceBased = true; - - _transitConfig._startTransitAnimation = AvatarTransit::TransitAnimation(START_ANIMATION_URL, 0, 14); - _transitConfig._middleTransitAnimation = AvatarTransit::TransitAnimation(MIDDLE_ANIMATION_URL, 15, 0); - _transitConfig._endTransitAnimation = AvatarTransit::TransitAnimation(END_ANIMATION_URL, 16, 38); - - setAvatarTransitEffectDefaultProperties(); } AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) { @@ -144,57 +134,13 @@ void AvatarManager::setSpace(workload::SpacePointer& space ) { _space = space; } -void AvatarManager::playTransitAnimations(AvatarTransit::Status status) { - auto startAnimation = _transitConfig._startTransitAnimation; - auto middleAnimation = _transitConfig._middleTransitAnimation; - auto endAnimation = _transitConfig._endTransitAnimation; - - const float REFERENCE_FPS = 30.0f; - - switch (status) { - case AvatarTransit::Status::START_FRAME: - qDebug() << "START_FRAME"; - _myAvatar->overrideAnimation(startAnimation._animationUrl, REFERENCE_FPS, false, startAnimation._firstFrame, startAnimation._firstFrame + startAnimation._frameCount); - break; - case AvatarTransit::Status::START_TRANSIT: - qDebug() << "START_TRANSIT"; - _myAvatar->overrideAnimation(middleAnimation._animationUrl, REFERENCE_FPS, false, middleAnimation._firstFrame, middleAnimation._firstFrame + middleAnimation._frameCount); - break; - case AvatarTransit::Status::END_TRANSIT: - qDebug() << "END_TRANSIT"; - _myAvatar->overrideAnimation(endAnimation._animationUrl, REFERENCE_FPS, false, endAnimation._firstFrame, endAnimation._firstFrame + endAnimation._frameCount); - break; - case AvatarTransit::Status::END_FRAME: - qDebug() << "END_FRAME"; - _myAvatar->restoreAnimation(); - break; - case AvatarTransit::Status::IDLE: - break; - case AvatarTransit::Status::TRANSITING: - break; - } - -} - void AvatarManager::updateMyAvatar(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "AvatarManager::updateMyAvatar()"); AvatarTransit::Status status = _myAvatar->updateTransit(deltaTime, _myAvatar->getNextPosition(), _transitConfig); bool sendFirstTransitPackage = (status == AvatarTransit::Status::START_TRANSIT); - bool sendAllTransitPackages = (status == AvatarTransit::Status::TRANSITING && _transitConfig._showAnimation); - bool blockTransitData = (status == AvatarTransit::Status::TRANSITING && !_transitConfig._showAnimation); - - if (status != AvatarTransit::Status::IDLE) { - if (_transitConfig._showAnimation) { - blockTransitData = false; - playTransitAnimations(status); - } - if (status != AvatarTransit::Status::TRANSITING) { - QUuid& transitEffectID = _myAvatar->getTransitEffectID(); - changeAvatarTransitState(status, _myAvatar->getID(), transitEffectID); - } - } + bool blockTransitData = (status == AvatarTransit::Status::TRANSITING); _myAvatar->update(deltaTime); render::Transaction transaction; @@ -210,9 +156,7 @@ void AvatarManager::updateMyAvatar(float deltaTime) { PerformanceTimer perfTimer("send"); if (sendFirstTransitPackage) { _myAvatar->overrideNextPackagePositionData(_myAvatar->getTransit()->getEndPosition()); - } else if (sendAllTransitPackages) { - _myAvatar->overrideNextPackagePositionData(_myAvatar->getTransit()->getCurrentPosition()); - } + } _myAvatar->sendAvatarDataPacket(); _lastSendAvatarDataTime = now; _myAvatarSendRate.increment(); @@ -334,11 +278,6 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { // smooth other avatars positions { auto status = avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); - if (status != AvatarTransit::Status::IDLE && status != AvatarTransit::Status::TRANSITING) { - QUuid& transitEffectID = avatar->getTransitEffectID(); - changeAvatarTransitState(status, avatar->getID(), transitEffectID); - } - } avatar->simulate(deltaTime, inView); @@ -940,9 +879,7 @@ QVariantMap AvatarManager::getAvatarTransitData() { result["framesPerMeter"] = _transitConfig._framesPerMeter; result["isDistanceBased"] = _transitConfig._isDistanceBased; result["triggerDistance"] = _transitConfig._triggerDistance; - result["showAnimation"] = _transitConfig._showAnimation; result["easeType"] = (int)_transitConfig._easeType; - result["showParticles"] = _transitConfig._showParticles; return result; } @@ -960,251 +897,7 @@ void AvatarManager::setAvatarTransitData(const QVariantMap& data) { if (data.contains("triggerDistance")) { _transitConfig._triggerDistance = data["triggerDistance"].toDouble(); } - if (data.contains("showAnimation")) { - _transitConfig._showAnimation = data["showAnimation"].toBool(); - } if (data.contains("easeType")) { _transitConfig._easeType = (AvatarTransit::EaseType)data["easeType"].toInt(); } - if (data.contains("showParticles")) { - _transitConfig._showParticles = data["showParticles"].toBool(); - } -} - -AvatarTransit::TransitAnimation AvatarManager::getAnimationFromJsonObject(const QJsonObject& object) { - QString animationUrl; - int firstFrame = 0; - int frameCount = 0; - if (object.contains("animationUrl")) { - animationUrl = object["animationUrl"].toString(); - } - if (object.contains("firstFrame")) { - firstFrame = object["firstFrame"].toInt(); - } - if (object.contains("frameCount")) { - frameCount = object["frameCount"].toInt(); - } - return AvatarTransit::TransitAnimation(animationUrl, firstFrame, frameCount); -} - -void AvatarManager::setAvatarTransitAnimationData(const QVariantMap& data) { - AvatarTransit::TransitAnimation startAnimation, middleAnimation, endAnimation; - - if (data.contains("startAnimation")) { - QJsonObject object = data["startAnimation"].toJsonObject(); - _transitConfig._startTransitAnimation = getAnimationFromJsonObject(object); - } - if (data.contains("middleAnimation")) { - QJsonObject object = data["middleAnimation"].toJsonObject(); - _transitConfig._middleTransitAnimation = getAnimationFromJsonObject(object); - } - if (data.contains("endAnimation")) { - QJsonObject object = data["endAnimation"].toJsonObject(); - _transitConfig._endTransitAnimation = getAnimationFromJsonObject(object); - } -} - -void AvatarManager::changeAvatarTransitState(AvatarTransit::Status status, const QUuid& avatarID, QUuid& effectID) { - - if (!_transitConfig._showParticles) { - return; - } - _transitEffectProperties.setParentID(avatarID); - std::shared_ptr avatar; - avatar = (avatarID != _myAvatar->getID()) ? std::static_pointer_cast(getAvatarBySessionID(avatarID)) : _myAvatar; - - _transitEffectProperties.setLifetime(_transitEffectProperties.getLifespan() + avatar->getTransit()->getTransitTime()); - float feetOffset = glm::length(avatar->getWorldPosition() - avatar->getWorldFeetPosition()); - _transitEffectProperties.setLocalPosition(glm::vec3(0.0f, -feetOffset, 0.0f)); - - EntityItemProperties props; - switch (status) { - case AvatarTransit::Status::IDLE: - case AvatarTransit::Status::TRANSITING: - case AvatarTransit::Status::START_FRAME: - case AvatarTransit::Status::END_FRAME: - break; - case AvatarTransit::Status::START_TRANSIT: - effectID = DependencyManager::get()->addEntity(_transitEffectProperties); - break; - case AvatarTransit::Status::END_TRANSIT: - props = DependencyManager::get()->getEntityProperties(effectID); - props.setIsEmitting(false); - auto nid = DependencyManager::get()->editEntity(effectID, props); - break; - } -} - -void AvatarManager::setAvatarTransitEffectData(const QVariantMap& data) { - auto jsonToVector = [](const QJsonObject& object) { - if (object.contains("x") && object.contains("y") && object.contains("z")) { - float x = (float)object["x"].toDouble(); - float y = (float)object["y"].toDouble(); - float z = (float)object["z"].toDouble(); - return glm::vec3(x, y, z); - } - return glm::vec3(0.0f, 0.0f, 0.0f); - }; - - auto jsonToQuat = [jsonToVector](const QJsonObject& object) { - glm::vec3 components = jsonToVector(object); - if (object.contains("w")) { - float w = (float)object["w"].toDouble(); - return glm::quat(components.x, components.y, components.z, w); - } - return Quaternions::IDENTITY; - }; - - auto jsonToColor = [jsonToVector](const QJsonObject& object) { - glm::vec3 components = jsonToVector(object); - return xColor(components.x, components.y, components.z); - }; - - _transitEffectProperties.setType(EntityTypes::ParticleEffect); - - if (data.contains("isEmitting")) { - _transitEffectProperties.setIsEmitting(data["isEmitting"].toBool()); - } - if (data.contains("lifetime")) { - _transitEffectProperties.setLifetime(data["lifetime"].toFloat()); - } - if (data.contains("lifespan")) { - _transitEffectProperties.setLifespan(data["lifespan"].toFloat()); - } - if (data.contains("maxParticles")) { - _transitEffectProperties.setMaxParticles(data["maxParticles"].toFloat()); - } - if (data.contains("emitRate")) { - _transitEffectProperties.setEmitRate(data["emitRate"].toFloat()); - } - if (data.contains("emitSpeed")) { - _transitEffectProperties.setEmitSpeed(data["emitSpeed"].toFloat()); - } - if (data.contains("speedSpread")) { - _transitEffectProperties.setSpeedSpread(data["speedSpread"].toFloat()); - } - if (data.contains("localPosition")) { - _transitEffectProperties.setLocalPosition(jsonToVector(data["localPosition"].toJsonObject())); - } - if (data.contains("emitDimensions")) { - _transitEffectProperties.setEmitDimensions(jsonToVector(data["emitDimensions"].toJsonObject())); - } - if (data.contains("emitOrientation")) { - _transitEffectProperties.setEmitOrientation(jsonToQuat(data["emitOrientation"].toJsonObject())); - } - if (data.contains("emitterShouldTrail")) { - _transitEffectProperties.setEmitterShouldTrail(data["emitterShouldTrail"].toBool()); - } - if (data.contains("particleRadius")) { - _transitEffectProperties.setParticleRadius(data["particleRadius"].toFloat()); - } - if (data.contains("radiusSpread")) { - _transitEffectProperties.setRadiusSpread(data["radiusSpread"].toFloat()); - } - if (data.contains("radiusStart")) { - _transitEffectProperties.setRadiusStart(data["radiusStart"].toFloat()); - } - if (data.contains("radiusFinish")) { - _transitEffectProperties.setRadiusFinish(data["radiusFinish"].toFloat()); - } - if (data.contains("color")) { - _transitEffectProperties.setColor(jsonToColor(data["color"].toJsonObject())); - } - if (data.contains("colorStart")) { - _transitEffectProperties.setColorStart(jsonToVector(data["colorStart"].toJsonObject())); - } - if (data.contains("colorFinish")) { - _transitEffectProperties.setColorFinish(jsonToVector(data["colorFinish"].toJsonObject())); - } - if (data.contains("emitAcceleration")) { - _transitEffectProperties.setEmitAcceleration(jsonToVector(data["emitAcceleration"].toJsonObject())); - } - if (data.contains("alpha")) { - _transitEffectProperties.setAlpha(data["alpha"].toFloat()); - } - if (data.contains("accelerationSpread")) { - _transitEffectProperties.setAccelerationSpread(jsonToVector(data["accelerationSpread"].toJsonObject())); - } - if (data.contains("alphaSpread")) { - _transitEffectProperties.setAlphaSpread(data["alphaSpread"].toFloat()); - } - if (data.contains("alphaStart")) { - _transitEffectProperties.setAlphaStart(data["alphaStart"].toFloat()); - } - if (data.contains("alphaFinish")) { - _transitEffectProperties.setAlphaFinish(data["alphaFinish"].toFloat()); - } - if (data.contains("particleSpin")) { - _transitEffectProperties.setParticleSpin(data["particleSpin"].toFloat()); - } - if (data.contains("textures")) { - _transitEffectProperties.setTextures(data["textures"].toString()); - } - if (data.contains("spinSpread")) { - _transitEffectProperties.setSpinSpread(data["spinSpread"].toFloat()); - } - if (data.contains("spinStart")) { - _transitEffectProperties.setSpinStart(data["spinStart"].toFloat()); - } - if (data.contains("spinFinish")) { - _transitEffectProperties.setSpinFinish(data["spinFinish"].toFloat()); - } - if (data.contains("rotateWithEntity")) { - _transitEffectProperties.setRotateWithEntity(data["rotateWithEntity"].toBool()); - } - if (data.contains("polarStart")) { - _transitEffectProperties.setPolarStart(data["polarStart"].toFloat()); - } - if (data.contains("polarFinish")) { - _transitEffectProperties.setPolarFinish(data["polarFinish"].toFloat()); - } - if (data.contains("azimuthStart")) { - _transitEffectProperties.setAzimuthStart(data["azimuthStart"].toFloat()); - } - if (data.contains("azimuthFinish")) { - _transitEffectProperties.setAzimuthFinish(data["azimuthFinish"].toFloat()); - } - if (data.contains("userData")) { - _transitEffectProperties.setUserData(data["userData"].toString()); - } else { - _transitEffectProperties.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); - } -} - -void AvatarManager::setAvatarTransitEffectDefaultProperties() { - _transitEffectProperties.setIsEmitting(true); - _transitEffectProperties.setLifespan(2.7f); - _transitEffectProperties.setMaxParticles(200.0f); - _transitEffectProperties.setEmitRate(200.0); - _transitEffectProperties.setEmitSpeed(2.8f); - _transitEffectProperties.setSpeedSpread(0.2f); - _transitEffectProperties.setEmitDimensions(glm::vec3(0.0f, 0.0f, 0.0f)); - _transitEffectProperties.setEmitOrientation(Quaternions::X_180); - _transitEffectProperties.setEmitterShouldTrail(true); - _transitEffectProperties.setParticleRadius(0.24f); - _transitEffectProperties.setRadiusSpread(0.0f); - _transitEffectProperties.setRadiusStart(0.0f); - _transitEffectProperties.setRadiusFinish(0.21f); - _transitEffectProperties.setColor(xColor(0.0f, 180.0f, 239.0f)); - _transitEffectProperties.setColorStart(glm::vec3(200.0f, 200.0f, 200.0f)); - _transitEffectProperties.setColorFinish(glm::vec3(0.0f, 0.0f, 0.0f)); - _transitEffectProperties.setEmitAcceleration(glm::vec3(0.0f, 0.0f, 0.0f)); - _transitEffectProperties.setAlpha(0.15f); - _transitEffectProperties.setAccelerationSpread(glm::vec3(0.5f, 1.0f, 0.5f)); - _transitEffectProperties.setAlphaSpread(0.0f); - _transitEffectProperties.setAlphaStart(0.3f); - _transitEffectProperties.setAlphaFinish(0.0f); - _transitEffectProperties.setParticleSpin(4.78f); - _transitEffectProperties.setType(EntityTypes::ParticleEffect); - _transitEffectProperties.setTextures("http://hifi-content.s3.amazonaws.com/alexia/Particles/spark.png"); - _transitEffectProperties.setSpinSpread(0.0f); - _transitEffectProperties.setSpinStart(-4.57f); - _transitEffectProperties.setSpinFinish(4.67f); - _transitEffectProperties.setRotateWithEntity(false); - _transitEffectProperties.setPolarStart(0.0f); - _transitEffectProperties.setPolarFinish(0.0f); - _transitEffectProperties.setAzimuthStart(-3.1415f); - _transitEffectProperties.setAzimuthFinish(3.1415f); - _transitEffectProperties.setRotateWithEntity(true); - _transitEffectProperties.setUserData("{\"grabbableKey\":{\"grabbable\":false}}"); } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 73e350ebe5..9fdc33b096 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -184,8 +184,6 @@ public: Q_INVOKABLE QVariantMap getAvatarTransitData(); Q_INVOKABLE void setAvatarTransitData(const QVariantMap& data); - Q_INVOKABLE void setAvatarTransitAnimationData(const QVariantMap& data); - Q_INVOKABLE void setAvatarTransitEffectData(const QVariantMap& data); float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -209,14 +207,9 @@ private: explicit AvatarManager(const AvatarManager& other); void simulateAvatarFades(float deltaTime); - void changeAvatarTransitState(AvatarTransit::Status status, const QUuid& avatarID, QUuid& effectID); AvatarSharedPointer newSharedAvatar() override; void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; - void playTransitAnimations(AvatarTransit::Status status); - - AvatarTransit::TransitAnimation getAnimationFromJsonObject(const QJsonObject& object); - void AvatarManager::setAvatarTransitEffectDefaultProperties(); QVector _avatarsToFade; QVector _avatarsToCopy; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index ee5512c63a..362fc90a0e 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -616,8 +616,6 @@ void MyAvatar::updateChildCauterization(SpatiallyNestablePointer object, bool ca void MyAvatar::simulate(float deltaTime) { PerformanceTimer perfTimer("simulate"); animateScaleChanges(deltaTime); - // CameraMode mode = qApp->getCamera().getMode(); - // bool shouldTransit = (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT); if (_transit.isTransiting() && _showTransit) { glm::vec3 nextPosition; if (_transit.getNextPosition(nextPosition)) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index d7bbe64fb4..c77f1e781d 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1797,7 +1797,6 @@ private: ThreadSafeValueCache _userHeight { DEFAULT_AVATAR_HEIGHT }; void updateChildCauterization(SpatiallyNestablePointer object, bool cauterize); - void playTransitAnimations(AvatarTransit::Status status); bool _showTransit { false }; // max unscaled forward movement speed diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index e124b533a2..b4b213dc87 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -133,18 +133,10 @@ void AvatarTransit::start(float deltaTime, const glm::vec3& startPosition, const _transitLine = endPosition - startPosition; _totalDistance = glm::length(_transitLine); _easeType = config._easeType; - _showAnimation = config._showAnimation; - _showParticles = config._showParticles; const float REFERENCE_FRAMES_PER_SECOND = 30.0f; - - int framesBefore = _showAnimation ? config._startTransitAnimation._frameCount : 0; - int framesAfter = _showAnimation ? config._endTransitAnimation._frameCount : 0; - _timeBefore = (float)framesBefore / REFERENCE_FRAMES_PER_SECOND; - _timeAfter = (float)framesAfter / REFERENCE_FRAMES_PER_SECOND; int transitFrames = (!config._isDistanceBased) ? config._totalFrames : config._framesPerMeter * _totalDistance; - _transitTime = (float)transitFrames / REFERENCE_FRAMES_PER_SECOND; - _totalTime = _transitTime + _timeBefore + _timeAfter; + _totalTime = (float)transitFrames / REFERENCE_FRAMES_PER_SECOND; _currentTime = 0.0f; _isTransiting = true; } @@ -172,29 +164,19 @@ AvatarTransit::Status AvatarTransit::updatePosition(float deltaTime) { if (_isTransiting) { float nextTime = _currentTime + deltaTime; glm::vec3 newPosition; - if (nextTime < _timeBefore) { - _currentPosition = _startPosition; - if (_currentTime == 0) { - status = Status::START_FRAME; - } - } else if (nextTime >= _totalTime - _timeAfter) { - if (_currentTime < _totalTime - _timeAfter) { - status = Status::END_TRANSIT; - } else if (nextTime >= _totalTime) { - status = Status::END_FRAME; - _isTransiting = false; - } + if (nextTime >= _totalTime) { _currentPosition = _endPosition; + _isTransiting = false; + status = Status::END_TRANSIT; } else { - if (_currentTime <= _timeBefore) { + if (_currentTime == 0) { status = Status::START_TRANSIT; } else { status = Status::TRANSITING; } - float percentageIntoTransit = (nextTime - _timeBefore) / _transitTime; - + float percentageIntoTransit = nextTime / _totalTime; _currentPosition = _startPosition + getEaseValue(_easeType, percentageIntoTransit) * _transitLine; - } + } _currentTime = nextTime; } return status; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 9de1127391..fe5d310812 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -54,11 +54,9 @@ class AvatarTransit { public: enum Status { IDLE = 0, - START_FRAME, START_TRANSIT, TRANSITING, - END_TRANSIT, - END_FRAME + END_TRANSIT }; enum EaseType { @@ -68,27 +66,13 @@ public: EASE_IN_OUT }; - struct TransitAnimation { - TransitAnimation() {}; - TransitAnimation(const QString& animationUrl, int firstFrame, int frameCount) : - _firstFrame(firstFrame), _frameCount(frameCount), _animationUrl(animationUrl) {}; - int _firstFrame; - int _frameCount; - QString _animationUrl; - }; - struct TransitConfig { TransitConfig() {}; int _totalFrames { 0 }; int _framesPerMeter { 0 }; bool _isDistanceBased { false }; float _triggerDistance { 0 }; - bool _showAnimation { false }; EaseType _easeType { EaseType::EASE_OUT }; - bool _showParticles { false }; - TransitAnimation _startTransitAnimation; - TransitAnimation _middleTransitAnimation; - TransitAnimation _endTransitAnimation; }; AvatarTransit() {}; @@ -117,13 +101,8 @@ private: float _totalDistance { 0.0f }; float _totalTime { 0.0f }; float _currentTime { 0.0f }; - float _transitTime { 0.0f }; - float _timeBefore { 0.0f }; - float _timeAfter { 0.0f }; EaseType _easeType { EaseType::EASE_OUT }; Status _status { Status::IDLE }; - bool _showAnimation { false }; - bool _showParticles { false }; float _scale { 1.0f }; }; @@ -452,7 +431,6 @@ public: AvatarTransit::Status updateTransit(float deltaTime, const glm::vec3& avatarPosition, const AvatarTransit::TransitConfig& config); void setTransitScale(float scale); - QUuid& getTransitEffectID() { return _transitEffectID; }; void overrideNextPackagePositionData(const glm::vec3& position); signals: @@ -639,7 +617,6 @@ protected: static const float OTHERAVATAR_LOADING_PRIORITY; static const float ATTACHMENT_LOADING_PRIORITY; - QUuid _transitEffectID{ QUuid::createUuid() }; LoadingStatus _loadingStatus { LoadingStatus::NoModel }; }; From 0676f25e310dd7ed6744b0b0098f110dd3ced9a8 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 25 Sep 2018 07:42:28 -0700 Subject: [PATCH 14/17] Save transit preferences --- interface/src/avatar/MyAvatar.cpp | 12 +++++++----- interface/src/ui/PreferencesDialog.cpp | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 362fc90a0e..93bed8c8c1 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1027,7 +1027,7 @@ glm::vec3 MyAvatar::worldToJointPoint(const glm::vec3& position, const int joint if (_skeletonModel->getJointPositionInWorldFrame(jointIndex, jointPos)) { _skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot); } else { - //qWarning() << "Invalid joint index specified: " << jointIndex; + qWarning() << "Invalid joint index specified: " << jointIndex; } } glm::vec3 modelOffset = position - jointPos; @@ -1049,7 +1049,7 @@ glm::vec3 MyAvatar::worldToJointDirection(const glm::vec3& worldDir, const int j glm::quat MyAvatar::worldToJointRotation(const glm::quat& worldRot, const int jointIndex) const { glm::quat jointRot = getWorldOrientation();//default value if no or invalid joint specified if ((jointIndex != -1) && (!_skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot))) { - //qWarning() << "Invalid joint index specified: " << jointIndex; + qWarning() << "Invalid joint index specified: " << jointIndex; } glm::quat jointSpaceRot = glm::inverse(jointRot) * worldRot; return jointSpaceRot; @@ -1063,7 +1063,7 @@ glm::vec3 MyAvatar::jointToWorldPoint(const glm::vec3& jointSpacePos, const int if (_skeletonModel->getJointPositionInWorldFrame(jointIndex, jointPos)) { _skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot); } else { - //qWarning() << "Invalid joint index specified: " << jointIndex; + qWarning() << "Invalid joint index specified: " << jointIndex; } } @@ -1076,7 +1076,7 @@ glm::vec3 MyAvatar::jointToWorldPoint(const glm::vec3& jointSpacePos, const int glm::vec3 MyAvatar::jointToWorldDirection(const glm::vec3& jointSpaceDir, const int jointIndex) const { glm::quat jointRot = getWorldOrientation();//default value if no or invalid joint specified if ((jointIndex != -1) && (!_skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot))) { - //qWarning() << "Invalid joint index specified: " << jointIndex; + qWarning() << "Invalid joint index specified: " << jointIndex; } glm::vec3 worldDir = jointRot * jointSpaceDir; return worldDir; @@ -1085,7 +1085,7 @@ glm::vec3 MyAvatar::jointToWorldDirection(const glm::vec3& jointSpaceDir, const glm::quat MyAvatar::jointToWorldRotation(const glm::quat& jointSpaceRot, const int jointIndex) const { glm::quat jointRot = getWorldOrientation();//default value if no or invalid joint specified if ((jointIndex != -1) && (!_skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRot))) { - //qWarning() << "Invalid joint index specified: " << jointIndex; + qWarning() << "Invalid joint index specified: " << jointIndex; } glm::quat worldRot = jointRot * jointSpaceRot; return worldRot; @@ -1223,6 +1223,7 @@ void MyAvatar::saveData() { settings.setValue("displayName", _displayName); settings.setValue("collisionSoundURL", _collisionSoundURL); settings.setValue("useSnapTurn", _useSnapTurn); + settings.setValue("showTransit", _showTransit); settings.setValue("userHeight", getUserHeight()); settings.setValue("flyingHMD", getFlyingHMDPref()); @@ -1381,6 +1382,7 @@ void MyAvatar::loadData() { setDisplayName(settings.value("displayName").toString()); setCollisionSoundURL(settings.value("collisionSoundURL", DEFAULT_AVATAR_COLLISION_SOUND_URL).toString()); setSnapTurn(settings.value("useSnapTurn", _useSnapTurn).toBool()); + setShowTransit(settings.value("showTransit", _showTransit).toBool()); setDominantHand(settings.value("dominantHand", _dominantHand).toString().toLower()); setUserHeight(settings.value("userHeight", DEFAULT_AVATAR_HEIGHT).toDouble()); settings.endGroup(); diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 8b0173888e..d3e28f0041 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -249,8 +249,8 @@ void setupPreferences() { preferences->addPreference(preference); } { - auto getter = [myAvatar]()->int { return myAvatar->getShowTransit() ? 0 : 1; }; - auto setter = [myAvatar](int value) { myAvatar->setShowTransit(value == 0); }; + auto getter = [myAvatar]()->int { return myAvatar->getShowTransit() ? 1 : 0; }; + auto setter = [myAvatar](int value) { myAvatar->setShowTransit(value == 1); }; auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Snap teleport / Smooth teleport", getter, setter); QStringList items; items << "Snap teleport" << "Smooth teleport"; From af2935187b60d825dd12c948f52507e57462a965 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 25 Sep 2018 08:32:43 -0700 Subject: [PATCH 15/17] Fix warnings --- interface/src/avatar/AvatarManager.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 947559d5bd..143c99b4c3 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -273,13 +273,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { if (inView && avatar->hasNewJointData()) { numAvatarsUpdated++; } - - - // smooth other avatars positions - { - auto status = avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); - } - + avatar->_transit.update(deltaTime, avatar->_globalPosition, _transitConfig); avatar->simulate(deltaTime, inView); avatar->updateRenderItem(renderTransaction); avatar->updateSpaceProxy(workloadTransaction); From 1e34d3aa3542846810fc2d60f6ae39deae6c36e1 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 25 Sep 2018 09:22:33 -0700 Subject: [PATCH 16/17] Remove not needed code --- interface/src/avatar/AvatarManager.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 9fdc33b096..0cc26bb8ae 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -24,7 +24,6 @@ #include #include #include -#include #include #include @@ -236,7 +235,6 @@ private: // Other avatars smooth transit global configuration AvatarTransit::TransitConfig _transitConfig; - EntityItemProperties _transitEffectProperties; }; #endif // hifi_AvatarManager_h From bbe836ee88916ca1c0bfb3ea82e67abaefa28f06 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 27 Sep 2018 10:38:45 -0700 Subject: [PATCH 17/17] Remove smooth teleport and set/get API methods --- interface/src/avatar/AvatarManager.cpp | 29 -------------------------- interface/src/avatar/AvatarManager.h | 5 ----- interface/src/avatar/MyAvatar.cpp | 12 ----------- interface/src/avatar/MyAvatar.h | 3 --- interface/src/ui/PreferencesDialog.cpp | 9 -------- 5 files changed, 58 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 143c99b4c3..4b3df8936f 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -866,32 +866,3 @@ QVariantMap AvatarManager::getPalData(const QList specificAvatarIdentif doc.insert("data", palData); return doc.toVariantMap(); } - -QVariantMap AvatarManager::getAvatarTransitData() { - QVariantMap result; - result["frameCount"] = _transitConfig._totalFrames; - result["framesPerMeter"] = _transitConfig._framesPerMeter; - result["isDistanceBased"] = _transitConfig._isDistanceBased; - result["triggerDistance"] = _transitConfig._triggerDistance; - result["easeType"] = (int)_transitConfig._easeType; - - return result; -} - -void AvatarManager::setAvatarTransitData(const QVariantMap& data) { - if (data.contains("frameCount")) { - _transitConfig._totalFrames = data["frameCount"].toInt(); - } - if (data.contains("framesPerMeter")) { - _transitConfig._framesPerMeter = data["framesPerMeter"].toInt(); - } - if (data.contains("isDistanceBased")) { - _transitConfig._isDistanceBased = data["isDistanceBased"].toBool(); - } - if (data.contains("triggerDistance")) { - _transitConfig._triggerDistance = data["triggerDistance"].toDouble(); - } - if (data.contains("easeType")) { - _transitConfig._easeType = (AvatarTransit::EaseType)data["easeType"].toInt(); - } -} diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 0cc26bb8ae..d3dc20e9a4 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -181,9 +181,6 @@ public: */ Q_INVOKABLE QVariantMap getPalData(const QList specificAvatarIdentifiers = QList()); - Q_INVOKABLE QVariantMap getAvatarTransitData(); - Q_INVOKABLE void setAvatarTransitData(const QVariantMap& data); - float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } int getIdentityRequestsSent() const { return _identityRequestsSent; } @@ -211,7 +208,6 @@ private: void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; QVector _avatarsToFade; - QVector _avatarsToCopy; using SetOfOtherAvatars = std::set; SetOfOtherAvatars _avatarsToChangeInPhysics; @@ -233,7 +229,6 @@ private: workload::SpacePointer _space; std::vector _spaceProxiesToDelete; - // Other avatars smooth transit global configuration AvatarTransit::TransitConfig _transitConfig; }; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 93bed8c8c1..58dd595c16 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -616,16 +616,6 @@ void MyAvatar::updateChildCauterization(SpatiallyNestablePointer object, bool ca void MyAvatar::simulate(float deltaTime) { PerformanceTimer perfTimer("simulate"); animateScaleChanges(deltaTime); - if (_transit.isTransiting() && _showTransit) { - glm::vec3 nextPosition; - if (_transit.getNextPosition(nextPosition)) { - _globalPosition = nextPosition; - _globalPositionChanged = usecTimestampNow(); - if (!hasParent()) { - setLocalPosition(nextPosition); - } - } - } setFlyingEnabled(getFlyingEnabled()); @@ -1223,7 +1213,6 @@ void MyAvatar::saveData() { settings.setValue("displayName", _displayName); settings.setValue("collisionSoundURL", _collisionSoundURL); settings.setValue("useSnapTurn", _useSnapTurn); - settings.setValue("showTransit", _showTransit); settings.setValue("userHeight", getUserHeight()); settings.setValue("flyingHMD", getFlyingHMDPref()); @@ -1382,7 +1371,6 @@ void MyAvatar::loadData() { setDisplayName(settings.value("displayName").toString()); setCollisionSoundURL(settings.value("collisionSoundURL", DEFAULT_AVATAR_COLLISION_SOUND_URL).toString()); setSnapTurn(settings.value("useSnapTurn", _useSnapTurn).toBool()); - setShowTransit(settings.value("showTransit", _showTransit).toBool()); setDominantHand(settings.value("dominantHand", _dominantHand).toString().toLower()); setUserHeight(settings.value("userHeight", DEFAULT_AVATAR_HEIGHT).toDouble()); settings.endGroup(); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index c77f1e781d..5de79034d2 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1115,8 +1115,6 @@ public: virtual void setAttachmentsVariant(const QVariantList& variant) override; glm::vec3 getNextPosition() { return _goToPending ? _goToPosition : getWorldPosition(); }; - bool getShowTransit() { return _showTransit; }; - void setShowTransit(bool value) { _showTransit = value; }; public slots: @@ -1798,7 +1796,6 @@ private: void updateChildCauterization(SpatiallyNestablePointer object, bool cauterize); - bool _showTransit { false }; // max unscaled forward movement speed ThreadSafeValueCache _walkSpeed { DEFAULT_AVATAR_MAX_WALKING_SPEED }; ThreadSafeValueCache _walkBackwardSpeed { DEFAULT_AVATAR_MAX_WALKING_BACKWARD_SPEED }; diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index d3e28f0041..951925214c 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -248,15 +248,6 @@ void setupPreferences() { preference->setItems(items); preferences->addPreference(preference); } - { - auto getter = [myAvatar]()->int { return myAvatar->getShowTransit() ? 1 : 0; }; - auto setter = [myAvatar](int value) { myAvatar->setShowTransit(value == 1); }; - auto preference = new RadioButtonsPreference(VR_MOVEMENT, "Snap teleport / Smooth teleport", getter, setter); - QStringList items; - items << "Snap teleport" << "Smooth teleport"; - preference->setItems(items); - preferences->addPreference(preference); - } { auto getter = [=]()->float { return myAvatar->getUserHeight(); }; auto setter = [=](float value) { myAvatar->setUserHeight(value); };