diff --git a/interface/resources/icons/tablet-icons/bubble-a.svg b/interface/resources/icons/tablet-icons/bubble-a.svg index 553636bfbb..6f9c75a0c2 100644 --- a/interface/resources/icons/tablet-icons/bubble-a.svg +++ b/interface/resources/icons/tablet-icons/bubble-a.svg @@ -1,96 +1,15 @@ - - - -image/svg+xml \ No newline at end of file + + + + + + + + + diff --git a/interface/resources/icons/tablet-icons/bubble-i.svg b/interface/resources/icons/tablet-icons/bubble-i.svg index d7c8948e01..567a36d7ba 100644 --- a/interface/resources/icons/tablet-icons/bubble-i.svg +++ b/interface/resources/icons/tablet-icons/bubble-i.svg @@ -1,46 +1,19 @@ - - + - - - - - - - - - - - - - - - - + + + + diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index 66184513da..d4fe8574ca 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -31,6 +31,9 @@ AvatarActionHold::AvatarActionHold(const QUuid& id, EntityItemPointer ownerEntit myAvatar->addHoldAction(this); } + _positionalTargetSet = true; + _rotationalTargetSet = true; + #if WANT_DEBUG qDebug() << "AvatarActionHold::AvatarActionHold" << (void*)this; #endif diff --git a/libraries/physics/src/ObjectActionTractor.cpp b/libraries/physics/src/ObjectActionTractor.cpp index ec34023926..03e6533c87 100644 --- a/libraries/physics/src/ObjectActionTractor.cpp +++ b/libraries/physics/src/ObjectActionTractor.cpp @@ -77,13 +77,18 @@ bool ObjectActionTractor::prepareForTractorUpdate(btScalar deltaTimeStep) { return false; } + bool doLinearTraction = _positionalTargetSet && (_linearTimeScale < MAX_TRACTOR_TIMESCALE); + bool doAngularTraction = _rotationalTargetSet && (_angularTimeScale < MAX_TRACTOR_TIMESCALE); + if (!doLinearTraction && !doAngularTraction) { + // nothing to do + return false; + } + glm::quat rotation; glm::vec3 position; glm::vec3 angularVelocity; - bool linearValid = false; int linearTractorCount = 0; - bool angularValid = false; int angularTractorCount = 0; QList tractorDerivedActions; @@ -105,7 +110,6 @@ bool ObjectActionTractor::prepareForTractorUpdate(btScalar deltaTimeStep) { linearTimeScale, angularTimeScale); if (success) { if (angularTimeScale < MAX_TRACTOR_TIMESCALE) { - angularValid = true; angularTractorCount++; angularVelocity += angularVelocityForAction; if (tractorAction.get() == this) { @@ -115,41 +119,40 @@ bool ObjectActionTractor::prepareForTractorUpdate(btScalar deltaTimeStep) { } if (linearTimeScale < MAX_TRACTOR_TIMESCALE) { - linearValid = true; linearTractorCount++; position += positionForAction; } } } - if ((angularValid && angularTractorCount > 0) || (linearValid && linearTractorCount > 0)) { + if (angularTractorCount > 0 || linearTractorCount > 0) { withWriteLock([&]{ - if (linearValid && linearTractorCount > 0) { + if (doLinearTraction && linearTractorCount > 0) { position /= linearTractorCount; - if (_positionalTargetSet) { - _lastPositionTarget = _positionalTarget; - _positionalTarget = position; - if (deltaTimeStep > EPSILON) { + _lastPositionTarget = _positionalTarget; + _positionalTarget = position; + if (deltaTimeStep > EPSILON) { + if (_havePositionTargetHistory) { // blend the new velocity with the old (low-pass filter) glm::vec3 newVelocity = (1.0f / deltaTimeStep) * (_positionalTarget - _lastPositionTarget); const float blend = 0.25f; _linearVelocityTarget = (1.0f - blend) * _linearVelocityTarget + blend * newVelocity; + } else { + _havePositionTargetHistory = true; } } - _positionalTargetSet = true; _active = true; } - if (angularValid && angularTractorCount > 0) { + if (doAngularTraction && angularTractorCount > 0) { angularVelocity /= angularTractorCount; _rotationalTarget = rotation; _angularVelocityTarget = angularVelocity; - _rotationalTargetSet = true; _active = true; } }); } - return linearValid || angularValid; + return true; } @@ -239,7 +242,9 @@ bool ObjectActionTractor::updateArguments(QVariantMap arguments) { // targets are required, tractor-constants are optional bool ok = true; positionalTarget = EntityDynamicInterface::extractVec3Argument("tractor action", arguments, "targetPosition", ok, false); - if (!ok) { + if (ok) { + _positionalTargetSet = true; + } else { positionalTarget = _desiredPositionalTarget; } ok = true; @@ -250,7 +255,9 @@ bool ObjectActionTractor::updateArguments(QVariantMap arguments) { ok = true; rotationalTarget = EntityDynamicInterface::extractQuatArgument("tractor action", arguments, "targetRotation", ok, false); - if (!ok) { + if (ok) { + _rotationalTargetSet = true; + } else { rotationalTarget = _desiredRotationalTarget; } diff --git a/libraries/physics/src/ObjectActionTractor.h b/libraries/physics/src/ObjectActionTractor.h index a17526f5f9..2273a1e720 100644 --- a/libraries/physics/src/ObjectActionTractor.h +++ b/libraries/physics/src/ObjectActionTractor.h @@ -39,6 +39,7 @@ protected: glm::vec3 _lastPositionTarget; float _linearTimeScale; bool _positionalTargetSet; + bool _havePositionTargetHistory { false }; glm::quat _rotationalTarget; glm::quat _desiredRotationalTarget; diff --git a/scripts/system/commerce/wallet.js b/scripts/system/commerce/wallet.js index cef61bdc53..8cf5b72b9a 100644 --- a/scripts/system/commerce/wallet.js +++ b/scripts/system/commerce/wallet.js @@ -636,14 +636,9 @@ openLoginWindow(); break; case 'disableHmdPreview': - isHmdPreviewDisabled = Menu.isOptionChecked("Disable Preview"); - DesktopPreviewProvider.setPreviewDisabledReason("SECURE_SCREEN"); - Menu.setIsOptionChecked("Disable Preview", true); - break; + break; // do nothing here, handled in marketplaces.js case 'maybeEnableHmdPreview': - DesktopPreviewProvider.setPreviewDisabledReason("USER"); - Menu.setIsOptionChecked("Disable Preview", isHmdPreviewDisabled); - break; + break; // do nothing here, handled in marketplaces.js case 'passphraseReset': onButtonClicked(); onButtonClicked(); @@ -731,11 +726,7 @@ // -Called when the TabletScriptingInterface::screenChanged() signal is emitted. The "type" argument can be either the string // value of "Home", "Web", "Menu", "QML", or "Closed". The "url" argument is only valid for Web and QML. function onTabletScreenChanged(type, url) { - var onWalletScreenNow = (type === "QML" && url === WALLET_QML_SOURCE); - if (!onWalletScreenNow && onWalletScreen) { - DesktopPreviewProvider.setPreviewDisabledReason("USER"); - } - onWalletScreen = onWalletScreenNow; + onWalletScreen = (type === "QML" && url === WALLET_QML_SOURCE); wireEventBridge(onWalletScreen); // Change button to active when window is first openend, false otherwise. if (button) { diff --git a/scripts/system/marketplaces/marketplaces.js b/scripts/system/marketplaces/marketplaces.js index f0aef6fffe..cec139faae 100644 --- a/scripts/system/marketplaces/marketplaces.js +++ b/scripts/system/marketplaces/marketplaces.js @@ -112,11 +112,23 @@ var selectionDisplay = null; // for gridTool.js to ignore var referrerURL; // Used for updating Purchases QML var filterText; // Used for updating Purchases QML + + var onWalletScreen = false; function onScreenChanged(type, url) { onMarketplaceScreen = type === "Web" && url.indexOf(MARKETPLACE_URL) !== -1; - onWalletScreen = url.indexOf(MARKETPLACE_WALLET_QML_PATH) !== -1; + var onWalletScreenNow = url.indexOf(MARKETPLACE_WALLET_QML_PATH) !== -1; onCommerceScreen = type === "QML" && (url.indexOf(MARKETPLACE_CHECKOUT_QML_PATH) !== -1 || url === MARKETPLACE_PURCHASES_QML_PATH || url.indexOf(MARKETPLACE_INSPECTIONCERTIFICATE_QML_PATH) !== -1); + + if (!onWalletScreenNow && onWalletScreen) { // exiting wallet screen + if (isHmdPreviewDisabledBySecurity) { + DesktopPreviewProvider.setPreviewDisabledReason("USER"); + Menu.setIsOptionChecked("Disable Preview", false); + isHmdPreviewDisabledBySecurity = false; + } + } + + onWalletScreen = onWalletScreenNow; wireEventBridge(onMarketplaceScreen || onCommerceScreen || onWalletScreen); if (url === MARKETPLACE_PURCHASES_QML_PATH) { @@ -480,7 +492,7 @@ var selectionDisplay = null; // for gridTool.js to ignore // Description: // -Called when a message is received from Checkout.qml. The "message" argument is what is sent from the Checkout QML // in the format "{method, params}", like json-rpc. - var isHmdPreviewDisabled = true; + var isHmdPreviewDisabledBySecurity = false; function fromQml(message) { switch (message.method) { case 'purchases_openWallet': @@ -548,11 +560,19 @@ var selectionDisplay = null; // for gridTool.js to ignore openLoginWindow(); break; case 'disableHmdPreview': - isHmdPreviewDisabled = Menu.isOptionChecked("Disable Preview"); - Menu.setIsOptionChecked("Disable Preview", true); + var isHmdPreviewDisabled = Menu.isOptionChecked("Disable Preview"); + if (!isHmdPreviewDisabled) { + DesktopPreviewProvider.setPreviewDisabledReason("SECURE_SCREEN"); + Menu.setIsOptionChecked("Disable Preview", true); + isHmdPreviewDisabledBySecurity = true; + } break; case 'maybeEnableHmdPreview': - Menu.setIsOptionChecked("Disable Preview", isHmdPreviewDisabled); + if (isHmdPreviewDisabledBySecurity) { + DesktopPreviewProvider.setPreviewDisabledReason("USER"); + Menu.setIsOptionChecked("Disable Preview", false); + isHmdPreviewDisabledBySecurity = false; + } break; case 'purchases_openGoTo': tablet.loadQMLSource("hifi/tablet/TabletAddressDialog.qml");