From 8cf9c8708df108fcda953af9fb8dd771a08d139c Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 15 Jun 2017 14:50:34 -0700 Subject: [PATCH 1/6] Allow user to click left thumbstick to switch 'MONITOR SHOWS' --- .../resources/qml/hifi/SpectatorCamera.qml | 3 ++ scripts/system/spectatorCamera.js | 54 +++++++++++++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/hifi/SpectatorCamera.qml b/interface/resources/qml/hifi/SpectatorCamera.qml index 544fc72927..fcbac5e60d 100644 --- a/interface/resources/qml/hifi/SpectatorCamera.qml +++ b/interface/resources/qml/hifi/SpectatorCamera.qml @@ -288,6 +288,9 @@ Rectangle { case 'updateMonitorShowsSwitch': monitorShowsSwitch.checked = message.params; break; + case 'updateControllerMappingCheckbox': + switchViewFromControllerCheckBox.checked = message.params; + break; default: console.log('Unrecognized message from spectatorCamera.js:', JSON.stringify(message)); } diff --git a/scripts/system/spectatorCamera.js b/scripts/system/spectatorCamera.js index 6095a960cd..26fca11305 100644 --- a/scripts/system/spectatorCamera.js +++ b/scripts/system/spectatorCamera.js @@ -18,9 +18,7 @@ // FUNCTION VAR DECLARATIONS // var sendToQml, addOrRemoveButton, onTabletScreenChanged, fromQml, - onTabletButtonClicked, wireEventBridge, startup, shutdown; - - + onTabletButtonClicked, wireEventBridge, startup, shutdown, registerButtonMappings; // // Function Name: inFrontOf() @@ -247,6 +245,7 @@ HMD.displayModeChanged.connect(onHMDChanged); viewFinderOverlay = false; camera = false; + registerButtonMappings(); } // @@ -301,6 +300,52 @@ } } + const SWITCH_VIEW_FROM_CONTROLLER_DEFAULT = false; + var switchViewFromController = !!Settings.getValue('spectatorCamera/switchViewFromController', SWITCH_VIEW_FROM_CONTROLLER_DEFAULT); + function setControllerMappingStatus(status) { + if (status === true) { + controllerMapping.enable(); + } else { + controllerMapping.disable(); + } + } + function setSwitchViewFromController(setting) { + if (setting === switchViewFromController) { + return; + } + switchViewFromController = setting; + setControllerMappingStatus(switchViewFromController); + Settings.setValue('spectatorCamera/switchViewFromController', setting); + } + + // + // Function Name: registerButtonMappings() + // + // Relevant Variables: + // controllerMappingName: The name of the controller mapping + // controllerMapping: The controller mapping itself + // + // Arguments: + // None + // + // Description: + // Updates controller button mappings for Spectator Camera. + // + var controllerMappingName; + var controllerMapping; + function registerButtonMappings() { + controllerMappingName = 'Hifi-SpectatorCamera-Mapping-' + Math.random(); + controllerMapping = Controller.newMapping(controllerMappingName); + controllerMapping.from(Controller.Standard.LS).to(function (value) { + if (value === 1.0) { + setMonitorShowsCameraViewAndSendToQml(!monitorShowsCameraView); + } + return; + }); + setControllerMappingStatus(switchViewFromController); + sendToQml({ method: 'updateControllerMappingCheckbox', params: switchViewFromController }); + } + // // Function Name: onTabletButtonClicked() // @@ -396,7 +441,7 @@ setMonitorShowsCameraView(message.params); break; case 'changeSwitchViewFromControllerPreference': - print('FIXME: Preference is now: ' + message.params); + setSwitchViewFromController(message.params); break; default: print('Unrecognized message from SpectatorCamera.qml:', JSON.stringify(message)); @@ -442,6 +487,7 @@ tablet.screenChanged.disconnect(onTabletScreenChanged); HMD.displayModeChanged.disconnect(onHMDChanged); Controller.keyPressEvent.disconnect(keyPressEvent); + controllerMapping.disable(); } // From 65b910bcf68bca4c70bf0d471d3d80c443ac0534 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 15 Jun 2017 15:15:56 -0700 Subject: [PATCH 2/6] Support Vive --- scripts/system/spectatorCamera.js | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/scripts/system/spectatorCamera.js b/scripts/system/spectatorCamera.js index 26fca11305..744d8501a4 100644 --- a/scripts/system/spectatorCamera.js +++ b/scripts/system/spectatorCamera.js @@ -324,6 +324,7 @@ // Relevant Variables: // controllerMappingName: The name of the controller mapping // controllerMapping: The controller mapping itself + // controllerType: "OculusTouch", "Vive", "Other" // // Arguments: // None @@ -333,15 +334,32 @@ // var controllerMappingName; var controllerMapping; + var controllerType = "Other"; function registerButtonMappings() { + var controllersDeviceNames = Controller.getDeviceNames(); + if (controllersDeviceNames.indexOf("OculusTouch") !== -1) { + controllerType = "OculusTouch"; + } else if (controllerDeviceNames.indexOf("Vive") !== -1) { + controllerType = "Vive"; + } + controllerMappingName = 'Hifi-SpectatorCamera-Mapping-' + Math.random(); controllerMapping = Controller.newMapping(controllerMappingName); - controllerMapping.from(Controller.Standard.LS).to(function (value) { - if (value === 1.0) { - setMonitorShowsCameraViewAndSendToQml(!monitorShowsCameraView); - } - return; - }); + if (controllerType === "OculusTouch") { + controllerMapping.from(Controller.Standard.LS).to(function (value) { + if (value === 1.0) { + setMonitorShowsCameraViewAndSendToQml(!monitorShowsCameraView); + } + return; + }); + } else if (controllerType === "Vive") { + controllerMapping.from(Controller.Standard.LeftPrimaryThumb).to(function (value) { + if (value === 1.0) { + setMonitorShowsCameraViewAndSendToQml(!monitorShowsCameraView); + } + return; + }); + } setControllerMappingStatus(switchViewFromController); sendToQml({ method: 'updateControllerMappingCheckbox', params: switchViewFromController }); } From 3df414df36156f1d66a836f3f7f31e64a8b236c3 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 15 Jun 2017 16:10:05 -0700 Subject: [PATCH 3/6] Bugfixes and language changes --- interface/resources/qml/hifi/SpectatorCamera.qml | 14 ++++++++++++-- scripts/system/spectatorCamera.js | 6 +++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/interface/resources/qml/hifi/SpectatorCamera.qml b/interface/resources/qml/hifi/SpectatorCamera.qml index fcbac5e60d..80b92a9e08 100644 --- a/interface/resources/qml/hifi/SpectatorCamera.qml +++ b/interface/resources/qml/hifi/SpectatorCamera.qml @@ -253,7 +253,7 @@ Rectangle { anchors.left: parent.left; anchors.top: monitorShowsSwitch.bottom; anchors.topMargin: 25; - text: "Pressing Vive's Left Thumbpad Switches Monitor View"; + text: "Pressing Ctrl+0 Switches Monitor View"; boxSize: 24; onClicked: { sendToScript({method: 'changeSwitchViewFromControllerPreference', params: checked}); @@ -289,7 +289,17 @@ Rectangle { monitorShowsSwitch.checked = message.params; break; case 'updateControllerMappingCheckbox': - switchViewFromControllerCheckBox.checked = message.params; + switchViewFromControllerCheckBox.checked = message.setting; + switchViewFromControllerCheckBox.enabled = true; + if (message.controller === "OculusTouch") { + switchViewFromControllerCheckBox.text = "Clicking Left Touch's Thumbstick Switches Monitor View"; + } else if (message.controller === "Vive") { + switchViewFromControllerCheckBox.text = "Clicking Left Thumb Pad Switches Monitor View"; + } else { + switchViewFromControllerCheckBox.text = "Pressing Ctrl+0 Switches Monitor View"; + switchViewFromControllerCheckBox.checked = true; + switchViewFromControllerCheckBox.enabled = false; + } break; default: console.log('Unrecognized message from spectatorCamera.js:', JSON.stringify(message)); diff --git a/scripts/system/spectatorCamera.js b/scripts/system/spectatorCamera.js index 744d8501a4..d6d3f230b2 100644 --- a/scripts/system/spectatorCamera.js +++ b/scripts/system/spectatorCamera.js @@ -361,7 +361,7 @@ }); } setControllerMappingStatus(switchViewFromController); - sendToQml({ method: 'updateControllerMappingCheckbox', params: switchViewFromController }); + sendToQml({ method: 'updateControllerMappingCheckbox', setting: switchViewFromController, controller: controllerType }); } // @@ -389,8 +389,8 @@ tablet.loadQMLSource("../SpectatorCamera.qml"); onSpectatorCameraScreen = true; sendToQml({ method: 'updateSpectatorCameraCheckbox', params: !!camera }); - sendToQml({ method: 'updateMonitorShowsSwitch', params: !!Settings.getValue('spectatorCamera/monitorShowsCameraView', false) }); - setMonitorShowsCameraViewAndSendToQml(monitorShowsCameraView); + sendToQml({ method: 'updateMonitorShowsSwitch', params: monitorShowsCameraView }); + sendToQml({ method: 'updateControllerMappingCheckbox', setting: switchViewFromController, controller: controllerType }); } } From 749dede8b3d12fb8b9fbdb7fc3fc4f3512515b4d Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 15 Jun 2017 16:34:13 -0700 Subject: [PATCH 4/6] Start with empty string for checkbox --- interface/resources/qml/hifi/SpectatorCamera.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/SpectatorCamera.qml b/interface/resources/qml/hifi/SpectatorCamera.qml index 80b92a9e08..6bb25b2958 100644 --- a/interface/resources/qml/hifi/SpectatorCamera.qml +++ b/interface/resources/qml/hifi/SpectatorCamera.qml @@ -253,7 +253,7 @@ Rectangle { anchors.left: parent.left; anchors.top: monitorShowsSwitch.bottom; anchors.topMargin: 25; - text: "Pressing Ctrl+0 Switches Monitor View"; + text: ""; boxSize: 24; onClicked: { sendToScript({method: 'changeSwitchViewFromControllerPreference', params: checked}); From e2c6993ae95f6d4da482a0d19e2a491dde25d95a Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 15 Jun 2017 19:07:10 -0700 Subject: [PATCH 5/6] Fix bug found by Cain with his patch - thank you! --- scripts/system/spectatorCamera.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/system/spectatorCamera.js b/scripts/system/spectatorCamera.js index d6d3f230b2..e8efb98826 100644 --- a/scripts/system/spectatorCamera.js +++ b/scripts/system/spectatorCamera.js @@ -336,11 +336,11 @@ var controllerMapping; var controllerType = "Other"; function registerButtonMappings() { - var controllersDeviceNames = Controller.getDeviceNames(); - if (controllersDeviceNames.indexOf("OculusTouch") !== -1) { - controllerType = "OculusTouch"; - } else if (controllerDeviceNames.indexOf("Vive") !== -1) { + var VRDevices = Controller.getDeviceNames().toString(); + if (VRDevices.includes("Vive")) { controllerType = "Vive"; + } else if (VRDevices.includes("OculusTouch")) { + controllerType = "OculusTouch"; } controllerMappingName = 'Hifi-SpectatorCamera-Mapping-' + Math.random(); From 378d8e80cf8f1b8a22128489c8b20aed7fd51f93 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 16 Jun 2017 09:46:14 -0700 Subject: [PATCH 6/6] Remove random component of button mapping name --- scripts/system/spectatorCamera.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/system/spectatorCamera.js b/scripts/system/spectatorCamera.js index e8efb98826..725de0215c 100644 --- a/scripts/system/spectatorCamera.js +++ b/scripts/system/spectatorCamera.js @@ -303,7 +303,7 @@ const SWITCH_VIEW_FROM_CONTROLLER_DEFAULT = false; var switchViewFromController = !!Settings.getValue('spectatorCamera/switchViewFromController', SWITCH_VIEW_FROM_CONTROLLER_DEFAULT); function setControllerMappingStatus(status) { - if (status === true) { + if (status) { controllerMapping.enable(); } else { controllerMapping.disable(); @@ -343,7 +343,7 @@ controllerType = "OculusTouch"; } - controllerMappingName = 'Hifi-SpectatorCamera-Mapping-' + Math.random(); + controllerMappingName = 'Hifi-SpectatorCamera-Mapping'; controllerMapping = Controller.newMapping(controllerMappingName); if (controllerType === "OculusTouch") { controllerMapping.from(Controller.Standard.LS).to(function (value) {