From 82a3b73de893a5b077818cb5de1fc13ed0cbcc30 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Tue, 17 Jul 2018 07:06:48 -0700 Subject: [PATCH] Added disable hand touch for entityID --- interface/src/avatar/MyAvatar.cpp | 8 +++++++ interface/src/avatar/MyAvatar.h | 18 +++++++++++++++ scripts/system/controllers/handTouch.js | 29 ++++++++++++++++++++----- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 53d1fc7dca..094db72e0b 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -272,6 +272,14 @@ void MyAvatar::requestEnableHandTouch() { emit shouldDisableHandTouchChanged(_disableHandTouchCount > 0); } +void MyAvatar::disableHandTouchForID(const QString& entityID) { + emit disableHandTouchForIDChanged(entityID, true); +} + +void MyAvatar::enableHandTouchForID(const QString& entityID) { + emit disableHandTouchForIDChanged(entityID, false); +} + void MyAvatar::registerMetaTypes(ScriptEnginePointer engine) { QScriptValue value = engine->newQObject(this, QScriptEngine::QtOwnership, QScriptEngine::ExcludeDeleteLater | QScriptEngine::ExcludeChildObjects); engine->globalObject().setProperty("MyAvatar", value); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index e56d40487a..d125c8c3c5 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -513,6 +513,16 @@ public: * @function MyAvatar.requestDisableHandTouch */ Q_INVOKABLE void requestDisableHandTouch(); + /**jsdoc + * @function MyAvatar.disableHandTouchForID + * @param {string} entityId + */ + Q_INVOKABLE void disableHandTouchForID(const QString& entityId); + /**jsdoc + * @function MyAvatar.enableHandTouchForID + * @param {string} entityId + */ + Q_INVOKABLE void enableHandTouchForID(const QString& entityId); bool useAdvancedMovementControls() const { return _useAdvancedMovementControls.get(); } void setUseAdvancedMovementControls(bool useAdvancedMovementControls) @@ -1406,6 +1416,14 @@ signals: */ void shouldDisableHandTouchChanged(bool shouldDisable); + /**jsdoc + * @function MyAvatar.handTouchForIDChanged + * @param {string} entityID + * @param {boolean} disable + * @returns {Signal} + */ + void disableHandTouchForIDChanged(const QString& entityID, bool disable); + private slots: void leaveDomain(); diff --git a/scripts/system/controllers/handTouch.js b/scripts/system/controllers/handTouch.js index 86cea91d03..db79aa4a77 100644 --- a/scripts/system/controllers/handTouch.js +++ b/scripts/system/controllers/handTouch.js @@ -19,8 +19,9 @@ var handTouchEnabled = true; var MSECONDS_AFTER_LOAD = 2000; var updateFingerWithIndex = 0; - - // Keys to access finger data + var untouchableEntities = []; + + // Keys to access finger data var fingerKeys = ["pinky", "ring", "middle", "index", "thumb"]; // Additionally close the hands to achieve a grabbing effect @@ -623,6 +624,7 @@ RayPick.setPrecisionPicking(rayPicks[side][finger], true); } } + function activateNextRay(side, index) { var nextIndex = (index < fingerKeys.length-1) ? index + 1 : 0; for (var i = 0; i < fingerKeys.length; i++) { @@ -683,7 +685,11 @@ // Update the intersection of only one finger at a time var finger = fingerKeys[updateFingerWithIndex]; - var grabbables = Entities.findEntities(spherePos, dist); + var nearbyEntities = Entities.findEntities(spherePos, dist); + // Filter the entities that are allowed to be touched + var touchableEntities = nearbyEntities.filter(function (id) { + return untouchableEntities.indexOf(id) == -1; + }); var intersection; if (rayPicks[side][finger] !== undefined) { intersection = RayPick.getPrevRayPickResult(rayPicks[side][finger]); @@ -692,8 +698,8 @@ var animationSteps = defaultAnimationSteps; var newFingerData = dataDefault[side][finger]; var isAbleToGrab = false; - if (grabbables.length > 0) { - RayPick.setIncludeItems(rayPicks[side][finger], grabbables); + if (touchableEntities.length > 0) { + RayPick.setIncludeItems(rayPicks[side][finger], touchableEntities); if (intersection === undefined) { return; @@ -864,6 +870,19 @@ handTouchEnabled = !shouldDisable; }); + MyAvatar.disableHandTouchForIDChanged.connect(function (entityID, disable) { + var entityIndex = untouchableEntities.indexOf(entityID); + if (disable) { + if (entityIndex == -1) { + untouchableEntities.push(entityID); + } + } else { + if (entityIndex != -1) { + untouchableEntities.splice(entityIndex, 1); + } + } + }); + MyAvatar.onLoadComplete.connect(function () { // Sometimes the rig is not ready when this signal is trigger console.log("avatar loaded");