void AvatarActionHold::updateActionWorker(float deltaTimeStep) { if (_kinematic) { if (prepareForTractorUpdate(deltaTimeStep)) { doKinematicUpdate(deltaTimeStep); } } else { forceBodyNonStatic(); ObjectActionTractor::updateActionWorker(deltaTimeStep); } }
void AvatarActionHold::updateActionWorker(float deltaTimeStep) { bool gotLock = false; glm::quat rotation; glm::vec3 position; std::shared_ptr<Avatar> holdingAvatar = nullptr; gotLock = withTryReadLock([&] { QSharedPointer<AvatarManager> avatarManager = DependencyManager::get<AvatarManager>(); AvatarSharedPointer holdingAvatarData = avatarManager->getAvatarBySessionID(_holderID); holdingAvatar = std::static_pointer_cast<Avatar>(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; } }); if (holdingAvatar) { if (gotLock) { gotLock = withTryWriteLock([&] { _positionalTarget = position; _rotationalTarget = rotation; _positionalTargetSet = true; _rotationalTargetSet = true; _active = true; }); if (gotLock) { if (_kinematic) { doKinematicUpdate(deltaTimeStep); } else { activateBody(); ObjectActionSpring::updateActionWorker(deltaTimeStep); } } } } }