From 1e7e4576cc322d0cfb5d550a16834d2d3cf16c72 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 20 Jan 2017 00:32:15 +0000 Subject: [PATCH] comparing with ID instead of strings --- .../resources/meshes/tablet-home-button.fbx | Bin 0 -> 43388 bytes .../src/scripting/HMDScriptingInterface.h | 11 +++++ .../src/TabletScriptingInterface.cpp | 1 + .../system/controllers/handControllerGrab.js | 39 +++++++++++++----- scripts/system/libraries/WebTablet.js | 28 +++++++------ scripts/system/tablet-ui/tabletUI.js | 2 + 6 files changed, 58 insertions(+), 23 deletions(-) create mode 100644 interface/resources/meshes/tablet-home-button.fbx diff --git a/interface/resources/meshes/tablet-home-button.fbx b/interface/resources/meshes/tablet-home-button.fbx new file mode 100644 index 0000000000000000000000000000000000000000..df82d9122e4d09cf8ddecfef134b758b99176339 GIT binary patch literal 43388 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∓EsZ@Oa;QE#!KVnZFtk6u7m%mMXin#v0Fpk5rP3 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 literal 0 HcmV?d00001 diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index 9e8e70af25..e242c6eade 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -30,6 +30,9 @@ class HMDScriptingInterface : public AbstractHMDScriptingInterface, public Depen Q_PROPERTY(bool mounted READ isMounted) Q_PROPERTY(bool showTablet READ getShouldShowTablet) Q_PROPERTY(QUuid tabletID READ getCurrentTableUIID WRITE setCurrentTabletUIID) + Q_PROPERTY(unsigned int homeButtonID READ getCurrentHomeButtonUUID WRITE setCurrentHomeButtonUUID) + Q_PROPERTY(QUuid tabletEntityID READ getCurrentTabletEntityID WRITE setCurrentTabletEntityID) + public: Q_INVOKABLE glm::vec3 calculateRayUICollisionPoint(const glm::vec3& position, const glm::vec3& direction) const; @@ -90,9 +93,17 @@ public: void setCurrentTabletUIID(QUuid tabletID) { _tabletUIID = tabletID; } QUuid getCurrentTableUIID() { return _tabletUIID; } + void setCurrentHomeButtonUUID(unsigned int homeButtonID) { _homeButtonID = homeButtonID; } + unsigned int getCurrentHomeButtonUUID() { return _homeButtonID; } + + void setCurrentTabletEntityID(QUuid tabletEntityID) {_tabletEntityID = tabletEntityID; } + QUuid getCurrentTabletEntityID() { return _tabletEntityID; } + private: bool _showTablet { false }; QUuid _tabletUIID; // this is the entityID of the WebEntity which is part of (a child of) the tablet-ui. + unsigned int _homeButtonID; + QUuid _tabletEntityID; // Get the position of the HMD glm::vec3 getPosition() const; diff --git a/libraries/script-engine/src/TabletScriptingInterface.cpp b/libraries/script-engine/src/TabletScriptingInterface.cpp index 7cb52032e3..d874eb8db0 100644 --- a/libraries/script-engine/src/TabletScriptingInterface.cpp +++ b/libraries/script-engine/src/TabletScriptingInterface.cpp @@ -196,6 +196,7 @@ void TabletProxy::gotoHomeScreen() { auto loader = _qmlTabletRoot->findChild("loader"); QObject::connect(loader, SIGNAL(loaded()), this, SLOT(addButtonsToHomeScreen())); QMetaObject::invokeMethod(_qmlTabletRoot, "loadSource", Q_ARG(const QVariant&, QVariant(TABLET_SOURCE_URL))); + QMetaObject::invokeMethod(_qmlTabletRoot, "playButtonClickSound"); _state = State::Home; } } diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index a021c8657b..f3e41ef360 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -1169,7 +1169,7 @@ function MyController(hand) { var nearWeb = false; for (var i = 0; i < candidateEntities.length; i++) { var props = entityPropertiesCache.getProps(candidateEntities[i]); - if (props && (props.type == "Web" || this.isTablet(props))) { + if (props && (props.type == "Web" || this.isTablet(candidateEntities[i]))) { nearWeb = true; break; } @@ -1243,14 +1243,32 @@ function MyController(hand) { }; this.handleStylusOnHomeButton = function(rayPickInfo) { - if (rayPickInfo.entityID) { - var entity = rayPickInfo.entityID; - var name = entityPropertiesCache.getProps(entity).name; - if (name == "homeButton") { + if (rayPickInfo.overlayID) { + var homeButton = rayPickInfo.overlayID; + var hmdHomeButton = HMD.homeButtonID; + if (homeButton === hmdHomeButton) { if (this.homeButtonTouched == false) { this.homeButtonTouched = true; Controller.triggerHapticPulse(1, 20, this.hand); - Messages.sendLocalMessage("home", entity); + Messages.sendLocalMessage("home", homeButton); + } + } else { + this.homeButtonTouched = false; + } + } else { + this.homeButtonTouched = false; + } + }; + + this.handleLaserOnHomeButton = function(rayPickInfo) { + if (rayPickInfo.overlayID && this.triggerSmoothedGrab()) { + var homeButton = rayPickInfo.overlayID; + var hmdHomeButton = HMD.homeButtonID; + if (homeButton === hmdHomeButton) { + if (this.homeButtonTouched == false) { + this.homeButtonTouched = true; + Controller.triggerHapticPulse(1, 20, this.hand); + Messages.sendLocalMessage("home", homeButton); } } else { this.homeButtonTouched = false; @@ -1636,6 +1654,7 @@ function MyController(hand) { } if (rayPickInfo.distance >= WEB_STYLUS_LENGTH / 2.0 + WEB_TOUCH_Y_OFFSET) { + this.handleLaserOnHomeButton(rayPickInfo); if (this.handleLaserOnWebEntity(rayPickInfo)) { return; } @@ -1680,8 +1699,8 @@ function MyController(hand) { Reticle.setVisible(false); }; - this.isTablet = function (props) { - if (props.name == "WebTablet Tablet") { // XXX what's a better way to know this? + this.isTablet = function (entityID) { + if (entityID === HMD.tabletEntityID) { // XXX what's a better way to know this? return true; } return false; @@ -1703,7 +1722,7 @@ function MyController(hand) { id: this.hand + 1, // 0 is reserved for hardware mouse pos2D: projectOntoEntityXYPlane(entity, rayPickInfo.intersection), pos3D: rayPickInfo.intersection, - normal: rayPickInfo.normal, + normal: rayPickInfo.normal, direction: rayPickInfo.searchRay.direction, button: "None" }; @@ -1865,7 +1884,7 @@ function MyController(hand) { Entities.sendHoverOverEntity(entity, pointerEvent); } - if (this.triggerSmoothedGrab() && (!isEditing() || this.isTablet(props))) { + if (this.triggerSmoothedGrab() && (!isEditing() || this.isTablet(entity))) { this.grabbedEntity = entity; this.setState(STATE_ENTITY_LASER_TOUCHING, "begin touching entity '" + name + "'"); return true; diff --git a/scripts/system/libraries/WebTablet.js b/scripts/system/libraries/WebTablet.js index a7800561de..415a99c81b 100644 --- a/scripts/system/libraries/WebTablet.js +++ b/scripts/system/libraries/WebTablet.js @@ -112,24 +112,26 @@ WebTablet = function (url, width, dpi, hand, clientOnly) { showKeyboardFocusHighlight: false }); - var HOME_BUTTON_Y_OFFSET = -0.25; - this.homeButtonEntity = Entities.addEntity({ + var HOME_BUTTON_Y_OFFSET = -0.26; + this.homeButtonEntity = Overlays.addOverlay("model", { name: "homeButton", - type: "Model", - modelURL: HOME_BUTTON_URL, - dimensions: { x: 0.04, y: 0.04, z: 0.02 }, - collisionless: true, - localPosition: {x: 0, y: HOME_BUTTON_Y_OFFSET, z: -0.01}, + url: Script.resourcesPath() + "meshes/tablet-home-button.fbx", + localPosition: {x: 0.0, y: HOME_BUTTON_Y_OFFSET, z: -0.01}, + localRotation: Quat.angleAxis(0, Y_AXIS), + solid: true, + visible: true, + dimensions: { x: 0.04, y: 0.04, z: 0.02}, + drawInFront: false, parentID: this.tabletEntityID, - script: Script.resolvePath("../tablet-ui/HomeButton.js") - }, clientOnly); - - setEntityCustomData('grabbableKey', this.homeButtonEntity, {wantsTrigger: true}); + parentJointIndex: -1 + }); + //setEntityCustomData('grabbableKey', this.homeButtonEntity, {wantsTrigger: true}); this.receive = function (channel, senderID, senderUUID, localOnly) { - if (_this.homeButtonEntity === senderID) { + if (_this.homeButtonEntity === parseInt(senderID)) { var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); tablet.gotoHomeScreen(); + } }; @@ -165,7 +167,7 @@ WebTablet.prototype.getOverlayObject = function () { WebTablet.prototype.destroy = function () { Overlays.deleteOverlay(this.webOverlayID); Entities.deleteEntity(this.tabletEntityID); - Entities.deleteEntity(this.homeButtonEntity); + //Entities.deleteEntity(this.homeButtonEntity); HMD.displayModeChanged.disconnect(this.myOnHmdChanged); }; diff --git a/scripts/system/tablet-ui/tabletUI.js b/scripts/system/tablet-ui/tabletUI.js index 3fac3a1c05..f625b087d5 100644 --- a/scripts/system/tablet-ui/tabletUI.js +++ b/scripts/system/tablet-ui/tabletUI.js @@ -27,6 +27,7 @@ UIWebTablet = new WebTablet("qml/hifi/tablet/TabletRoot.qml", null, null, activeHand, true); UIWebTablet.register(); HMD.tabletID = UIWebTablet.tabletEntityID; + HMD.homeButtonID = UIWebTablet.homeButtonEntity; } function hideTabletUI() { @@ -42,6 +43,7 @@ UIWebTablet.destroy(); UIWebTablet = null; HMD.tabletID = null; + HMD.homeButtonID = null; } }