From 9f40c7bf8cedca0a36d3d866f4213217d17e315e Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 15 Oct 2015 09:13:06 -0700 Subject: [PATCH] fix up AvatarActionHold --- interface/src/avatar/AvatarActionHold.cpp | 205 +++++++--------------- 1 file changed, 65 insertions(+), 140 deletions(-) diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index f12909e809..22585d962a 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -21,8 +21,7 @@ AvatarActionHold::AvatarActionHold(const QUuid& id, EntityItemPointer ownerEntit ObjectActionSpring(id, ownerEntity), _relativePosition(glm::vec3(0.0f)), _relativeRotation(glm::quat()), - _hand("right"), - _holderID(QUuid()) + _hand("right") { _type = ACTION_TYPE_HOLD; #if WANT_DEBUG @@ -37,122 +36,100 @@ AvatarActionHold::~AvatarActionHold() { } void AvatarActionHold::updateActionWorker(float deltaTimeStep) { - bool gotLock = false; glm::quat rotation; glm::vec3 position; - std::shared_ptr holdingAvatar = nullptr; - - gotLock = withTryReadLock([&]{ - QSharedPointer avatarManager = DependencyManager::get(); - AvatarSharedPointer holdingAvatarData = avatarManager->getAvatarBySessionID(_holderID); - holdingAvatar = std::static_pointer_cast(holdingAvatarData); - - 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; + glm::vec3 offset; + bool 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(); } + + rotation = palmRotation * _relativeRotation; + offset = rotation * _relativePosition; + position = palmPosition + offset; }); - if (holdingAvatar) { - if (gotLock) { - gotLock = withTryWriteLock([&]{ + if (gotLock) { + gotLock = withTryWriteLock([&]{ + if (_positionalTarget != position || _rotationalTarget != rotation) { + auto ownerEntity = _ownerEntity.lock(); + if (ownerEntity) { + ownerEntity->setActionDataDirty(true); + } _positionalTarget = position; _rotationalTarget = rotation; - }); - } - if (gotLock) { - ObjectActionSpring::updateActionWorker(deltaTimeStep); - } + } + }); + } + + if (gotLock) { + ObjectActionSpring::updateActionWorker(deltaTimeStep); } } bool AvatarActionHold::updateArguments(QVariantMap arguments) { - glm::vec3 relativePosition; - glm::quat relativeRotation; - float timeScale; - QString hand; - QUuid holderID; - bool needUpdate = false; + if (!ObjectAction::updateArguments(arguments)) { + return false; + } + bool ok = true; + glm::vec3 relativePosition = + EntityActionInterface::extractVec3Argument("hold", arguments, "relativePosition", ok, false); + if (!ok) { + relativePosition = _relativePosition; + } - bool somethingChanged = ObjectAction::updateArguments(arguments); - withReadLock([&]{ - bool ok = true; - relativePosition = EntityActionInterface::extractVec3Argument("hold", arguments, "relativePosition", ok, false); - if (!ok) { - relativePosition = _relativePosition; - } + ok = true; + glm::quat relativeRotation = + EntityActionInterface::extractQuatArgument("hold", arguments, "relativeRotation", ok, false); + if (!ok) { + relativeRotation = _relativeRotation; + } + + ok = true; + float timeScale = + EntityActionInterface::extractFloatArgument("hold", arguments, "timeScale", ok, false); + if (!ok) { + timeScale = _linearTimeScale; + } - ok = true; - relativeRotation = EntityActionInterface::extractQuatArgument("hold", arguments, "relativeRotation", ok, false); - if (!ok) { - relativeRotation = _relativeRotation; - } + ok = true; + QString hand = + EntityActionInterface::extractStringArgument("hold", arguments, "hand", ok, false); + if (!ok || !(hand == "left" || hand == "right")) { + hand = _hand; + } - ok = true; - timeScale = EntityActionInterface::extractFloatArgument("hold", arguments, "timeScale", ok, false); - if (!ok) { - timeScale = _linearTimeScale; - } - - ok = true; - hand = EntityActionInterface::extractStringArgument("hold", arguments, "hand", ok, false); - if (!ok || !(hand == "left" || hand == "right")) { - hand = _hand; - } - - ok = true; - auto myAvatar = DependencyManager::get()->getMyAvatar(); - holderID = myAvatar->getSessionUUID(); - - if (somethingChanged || - relativePosition != _relativePosition + if (relativePosition != _relativePosition || relativeRotation != _relativeRotation || timeScale != _linearTimeScale - || hand != _hand - || holderID != _holderID) { - needUpdate = true; - } - }); - - if (needUpdate) { + || hand != _hand) { withWriteLock([&] { _relativePosition = relativePosition; _relativeRotation = relativeRotation; const float MIN_TIMESCALE = 0.1f; - _linearTimeScale = glm::max(MIN_TIMESCALE, timeScale); + _linearTimeScale = glm::min(MIN_TIMESCALE, timeScale); _angularTimeScale = _linearTimeScale; _hand = hand; - _holderID = holderID; + _active = true; - - auto ownerEntity = _ownerEntity.lock(); - if (ownerEntity) { - ownerEntity->setActionDataDirty(true); - } + activateBody(); }); - activateBody(); } - return true; } + QVariantMap AvatarActionHold::getArguments() { QVariantMap arguments = ObjectAction::getArguments(); withReadLock([&]{ - arguments["holderID"] = _holderID; arguments["relativePosition"] = glmToQMap(_relativePosition); arguments["relativeRotation"] = glmToQMap(_relativeRotation); arguments["timeScale"] = _linearTimeScale; @@ -162,61 +139,9 @@ QVariantMap AvatarActionHold::getArguments() { } QByteArray AvatarActionHold::serialize() const { - 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; + return ObjectActionSpring::serialize(); } void AvatarActionHold::deserialize(QByteArray serializedArguments) { - 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; - }); + assert(false); }