From 1d8db13f4123301a51f4919331ee99217501c89b Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 15 Oct 2015 10:56:47 -0700 Subject: [PATCH] switch to low-entity-server traffic hold --- interface/src/avatar/AvatarActionHold.cpp | 128 ++++++++++++++++------ interface/src/avatar/AvatarActionHold.h | 3 +- 2 files changed, 95 insertions(+), 36 deletions(-) diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index 3c57db084b..f12909e809 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -21,7 +21,8 @@ AvatarActionHold::AvatarActionHold(const QUuid& id, EntityItemPointer ownerEntit ObjectActionSpring(id, ownerEntity), _relativePosition(glm::vec3(0.0f)), _relativeRotation(glm::quat()), - _hand("right") + _hand("right"), + _holderID(QUuid()) { _type = ACTION_TYPE_HOLD; #if WANT_DEBUG @@ -39,39 +40,41 @@ void AvatarActionHold::updateActionWorker(float deltaTimeStep) { bool gotLock = false; glm::quat rotation; glm::vec3 position; - glm::vec3 offset; + std::shared_ptr holdingAvatar = nullptr; gotLock = withTryReadLock([&]{ - auto myAvatar = DependencyManager::get()->getMyAvatar(); - glm::vec3 palmPosition; - glm::quat palmRotation; - if (_hand == "right") { - palmPosition = myAvatar->getRightPalmPosition(); - palmRotation = myAvatar->getRightPalmRotation(); - } else { - palmPosition = myAvatar->getLeftPalmPosition(); - palmRotation = myAvatar->getLeftPalmRotation(); - } + QSharedPointer avatarManager = DependencyManager::get(); + AvatarSharedPointer holdingAvatarData = avatarManager->getAvatarBySessionID(_holderID); + holdingAvatar = std::static_pointer_cast(holdingAvatarData); - rotation = palmRotation * _relativeRotation; - offset = rotation * _relativePosition; - position = palmPosition + offset; + if (holdingAvatar) { + glm::vec3 offset; + glm::vec3 palmPosition; + glm::quat palmRotation; + if (_hand == "right") { + palmPosition = holdingAvatar->getRightPalmPosition(); + palmRotation = holdingAvatar->getRightPalmRotation(); + } else { + palmPosition = holdingAvatar->getLeftPalmPosition(); + palmRotation = holdingAvatar->getLeftPalmRotation(); + } + + rotation = palmRotation * _relativeRotation; + offset = rotation * _relativePosition; + position = palmPosition + offset; + } }); - if (gotLock) { - gotLock = withTryWriteLock([&]{ - _positionalTarget = position; - _rotationalTarget = rotation; - _positionalTargetSet = true; - _rotationalTargetSet = true; - auto ownerEntity = _ownerEntity.lock(); - if (ownerEntity) { - ownerEntity->setActionDataDirty(true); - } - }); - } - if (gotLock) { - ObjectActionSpring::updateActionWorker(deltaTimeStep); + if (holdingAvatar) { + if (gotLock) { + gotLock = withTryWriteLock([&]{ + _positionalTarget = position; + _rotationalTarget = rotation; + }); + } + if (gotLock) { + ObjectActionSpring::updateActionWorker(deltaTimeStep); + } } } @@ -115,10 +118,11 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { holderID = myAvatar->getSessionUUID(); if (somethingChanged || - relativePosition != _relativePosition || - relativeRotation != _relativeRotation || - timeScale != _linearTimeScale || - hand != _hand) { + relativePosition != _relativePosition + || relativeRotation != _relativeRotation + || timeScale != _linearTimeScale + || hand != _hand + || holderID != _holderID) { needUpdate = true; } }); @@ -131,6 +135,7 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { _linearTimeScale = glm::max(MIN_TIMESCALE, timeScale); _angularTimeScale = _linearTimeScale; _hand = hand; + _holderID = holderID; _active = true; auto ownerEntity = _ownerEntity.lock(); @@ -147,6 +152,7 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { QVariantMap AvatarActionHold::getArguments() { QVariantMap arguments = ObjectAction::getArguments(); withReadLock([&]{ + arguments["holderID"] = _holderID; arguments["relativePosition"] = glmToQMap(_relativePosition); arguments["relativeRotation"] = glmToQMap(_relativeRotation); arguments["timeScale"] = _linearTimeScale; @@ -156,9 +162,61 @@ QVariantMap AvatarActionHold::getArguments() { } QByteArray AvatarActionHold::serialize() const { - return ObjectActionSpring::serialize(); + QByteArray serializedActionArguments; + QDataStream dataStream(&serializedActionArguments, QIODevice::WriteOnly); + + withReadLock([&]{ + dataStream << ACTION_TYPE_HOLD; + dataStream << getID(); + dataStream << AvatarActionHold::holdVersion; + + dataStream << _holderID; + dataStream << _relativePosition; + dataStream << _relativeRotation; + dataStream << _linearTimeScale; + dataStream << _hand; + + dataStream << _expires; + dataStream << _tag; + }); + + return serializedActionArguments; } void AvatarActionHold::deserialize(QByteArray serializedArguments) { - assert(false); + QDataStream dataStream(serializedArguments); + + EntityActionType type; + dataStream >> type; + assert(type == getType()); + + QUuid id; + dataStream >> id; + assert(id == getID()); + + uint16_t serializationVersion; + dataStream >> serializationVersion; + if (serializationVersion != AvatarActionHold::holdVersion) { + return; + } + + withWriteLock([&]{ + dataStream >> _holderID; + dataStream >> _relativePosition; + dataStream >> _relativeRotation; + dataStream >> _linearTimeScale; + _angularTimeScale = _linearTimeScale; + dataStream >> _hand; + + dataStream >> _expires; + dataStream >> _tag; + + #if WANT_DEBUG + qDebug() << "deserialize AvatarActionHold: " << _holderID + << _relativePosition.x << _relativePosition.y << _relativePosition.z + << _hand << _expires; + #endif + + _active = true; + }); } diff --git a/interface/src/avatar/AvatarActionHold.h b/interface/src/avatar/AvatarActionHold.h index 840ba41c28..3cc70ced09 100644 --- a/interface/src/avatar/AvatarActionHold.h +++ b/interface/src/avatar/AvatarActionHold.h @@ -30,7 +30,7 @@ public: QByteArray serialize() const; virtual void deserialize(QByteArray serializedArguments); - virtual bool shouldSuppressLocationEdits() { return false; } + virtual bool shouldSuppressLocationEdits() { return true; } private: static const uint16_t holdVersion; @@ -38,6 +38,7 @@ private: glm::vec3 _relativePosition; glm::quat _relativeRotation; QString _hand; + QUuid _holderID; }; #endif // hifi_AvatarActionHold_h