bool ObjectActionOffset::updateArguments(QVariantMap arguments) { glm::vec3 pointToOffsetFrom; float linearTimeScale; float linearDistance; bool needUpdate = false; bool somethingChanged = ObjectAction::updateArguments(arguments); withReadLock([&] { bool ok = true; pointToOffsetFrom = EntityActionInterface::extractVec3Argument("offset action", arguments, "pointToOffsetFrom", ok, true); if (!ok) { pointToOffsetFrom = _pointToOffsetFrom; } ok = true; linearTimeScale = EntityActionInterface::extractFloatArgument("offset action", arguments, "linearTimeScale", ok, false); if (!ok) { linearTimeScale = _linearTimeScale; } ok = true; linearDistance = EntityActionInterface::extractFloatArgument("offset action", arguments, "linearDistance", ok, false); if (!ok) { linearDistance = _linearDistance; } // only change stuff if something actually changed if (somethingChanged || _pointToOffsetFrom != pointToOffsetFrom || _linearTimeScale != linearTimeScale || _linearDistance != linearDistance) { needUpdate = true; } }); if (needUpdate) { withWriteLock([&] { _pointToOffsetFrom = pointToOffsetFrom; _linearTimeScale = linearTimeScale; _linearDistance = linearDistance; _positionalTargetSet = true; _active = true; auto ownerEntity = _ownerEntity.lock(); if (ownerEntity) { ownerEntity->setActionDataDirty(true); } }); activateBody(); } return true; }
void AvatarActionHold::updateActionWorker(float deltaTimeStep) { if (!_mine) { // if a local script isn't updating this, then we are just getting spring-action data over the wire. // let the super-class handle it. ObjectActionSpring::updateActionWorker(deltaTimeStep); return; } glm::quat rotation; glm::vec3 position; glm::vec3 offset; bool gotLock = withTryReadLock([&]{ auto myAvatar = DependencyManager::get<AvatarManager>()->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 (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); } }
bool ObjectActionTravelOriented::updateArguments(QVariantMap arguments) { glm::vec3 forward; float angularTimeScale; bool needUpdate = false; bool somethingChanged = ObjectAction::updateArguments(arguments); withReadLock([&]{ bool ok = true; forward = EntityActionInterface::extractVec3Argument("travel oriented action", arguments, "forward", ok, true); if (!ok) { forward = _forward; } ok = true; angularTimeScale = EntityActionInterface::extractFloatArgument("travel oriented action", arguments, "angularTimeScale", ok, false); if (!ok) { angularTimeScale = _angularTimeScale; } if (somethingChanged || forward != _forward || angularTimeScale != _angularTimeScale) { // something changed needUpdate = true; } }); if (needUpdate) { withWriteLock([&] { _forward = forward; _angularTimeScale = glm::max(MIN_TIMESCALE, glm::abs(angularTimeScale)); _active = (_forward != glm::vec3()); auto ownerEntity = _ownerEntity.lock(); if (ownerEntity) { ownerEntity->setActionDataDirty(true); ownerEntity->setActionDataNeedsTransmit(true); } }); activateBody(); } return true; }
void AvatarActionHold::updateActionWorker(float deltaTimeStep) { bool gotLock = false; glm::quat rotation; glm::vec3 position; glm::vec3 offset; gotLock = withTryReadLock([&]{ auto myAvatar = DependencyManager::get<AvatarManager>()->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 (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); } }
bool ObjectActionSpring::updateArguments(QVariantMap arguments) { glm::vec3 positionalTarget; float linearTimeScale; glm::quat rotationalTarget; float angularTimeScale; bool needUpdate = false; bool somethingChanged = ObjectAction::updateArguments(arguments); withReadLock([&]{ // targets are required, spring-constants are optional bool ok = true; positionalTarget = EntityActionInterface::extractVec3Argument("spring action", arguments, "targetPosition", ok, false); if (!ok) { positionalTarget = _positionalTarget; } ok = true; linearTimeScale = EntityActionInterface::extractFloatArgument("spring action", arguments, "linearTimeScale", ok, false); if (!ok || linearTimeScale <= 0.0f) { linearTimeScale = _linearTimeScale; } ok = true; rotationalTarget = EntityActionInterface::extractQuatArgument("spring action", arguments, "targetRotation", ok, false); if (!ok) { rotationalTarget = _rotationalTarget; } ok = true; angularTimeScale = EntityActionInterface::extractFloatArgument("spring action", arguments, "angularTimeScale", ok, false); if (!ok) { angularTimeScale = _angularTimeScale; } if (somethingChanged || positionalTarget != _positionalTarget || linearTimeScale != _linearTimeScale || rotationalTarget != _rotationalTarget || angularTimeScale != _angularTimeScale) { // something changed needUpdate = true; } }); if (needUpdate) { withWriteLock([&] { _positionalTarget = positionalTarget; _linearTimeScale = glm::max(MIN_TIMESCALE, glm::abs(linearTimeScale)); _rotationalTarget = rotationalTarget; _angularTimeScale = glm::max(MIN_TIMESCALE, glm::abs(angularTimeScale)); _active = true; auto ownerEntity = _ownerEntity.lock(); if (ownerEntity) { ownerEntity->setActionDataDirty(true); ownerEntity->setActionDataNeedsTransmit(true); } }); activateBody(); } return true; }
bool AvatarActionHold::updateArguments(QVariantMap arguments) { glm::vec3 relativePosition; glm::quat relativeRotation; float timeScale; QString hand; QUuid holderID; bool kinematic; bool kinematicSetVelocity; bool needUpdate = false; bool somethingChanged = ObjectAction::updateArguments(arguments); withReadLock([&] { bool ok = true; relativePosition = EntityActionInterface::extractVec3Argument("hold", arguments, "relativePosition", ok, false); if (!ok) { relativePosition = _relativePosition; } ok = true; relativeRotation = EntityActionInterface::extractQuatArgument("hold", arguments, "relativeRotation", ok, false); if (!ok) { relativeRotation = _relativeRotation; } 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<AvatarManager>()->getMyAvatar(); holderID = myAvatar->getSessionUUID(); ok = true; kinematic = EntityActionInterface::extractBooleanArgument("hold", arguments, "kinematic", ok, false); if (!ok) { _kinematic = false; } ok = true; kinematicSetVelocity = EntityActionInterface::extractBooleanArgument("hold", arguments, "kinematicSetVelocity", ok, false); if (!ok) { _kinematicSetVelocity = false; } if (somethingChanged || relativePosition != _relativePosition || relativeRotation != _relativeRotation || timeScale != _linearTimeScale || hand != _hand || holderID != _holderID || kinematic != _kinematic || kinematicSetVelocity != _kinematicSetVelocity) { needUpdate = true; } }); if (needUpdate) { withWriteLock([&] { _relativePosition = relativePosition; _relativeRotation = relativeRotation; const float MIN_TIMESCALE = 0.1f; _linearTimeScale = glm::max(MIN_TIMESCALE, timeScale); _angularTimeScale = _linearTimeScale; _hand = hand; _holderID = holderID; _kinematic = kinematic; _kinematicSetVelocity = kinematicSetVelocity; _active = true; auto ownerEntity = _ownerEntity.lock(); if (ownerEntity) { ownerEntity->setActionDataDirty(true); } }); activateBody(); } return true; }