From e806348eeb15abf2d1baa85b72740accbdddb1f6 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 14 Jun 2018 12:20:57 -0700 Subject: [PATCH] MS15916: Fix multiple issues with Spectator Camera --- .../spectator-camera/SpectatorCamera.qml | 65 ++++++++-- .../marketplace/spectator-camera/flashOff.wav | Bin 0 -> 17764 bytes .../marketplace/spectator-camera/flashOn.wav | Bin 0 -> 14220 bytes .../spectator-camera/spectatorCamera.app.json | 4 +- .../spectator-camera/spectatorCamera.js | 113 ++++++++++++++---- 5 files changed, 147 insertions(+), 35 deletions(-) create mode 100644 unpublishedScripts/marketplace/spectator-camera/flashOff.wav create mode 100644 unpublishedScripts/marketplace/spectator-camera/flashOn.wav diff --git a/unpublishedScripts/marketplace/spectator-camera/SpectatorCamera.qml b/unpublishedScripts/marketplace/spectator-camera/SpectatorCamera.qml index e0a503fcc8..45872be592 100644 --- a/unpublishedScripts/marketplace/spectator-camera/SpectatorCamera.qml +++ b/unpublishedScripts/marketplace/spectator-camera/SpectatorCamera.qml @@ -25,6 +25,8 @@ Rectangle { HifiStylesUit.HifiConstants { id: hifi; } id: root; + property bool uiReady: false; + property bool processingStillSnapshot: false; property bool processing360Snapshot: false; // Style color: "#404040"; @@ -58,7 +60,7 @@ Rectangle { // "Spectator" text HifiStylesUit.RalewaySemiBold { id: titleBarText; - text: "Spectator Camera"; + text: "Spectator Camera 2.2"; // Anchors anchors.left: parent.left; anchors.leftMargin: 30; @@ -91,13 +93,16 @@ Rectangle { } onClicked: { + if (!checked) { + flashCheckBox.checked = false; + } sendToScript({method: (checked ? 'spectatorCameraOn' : 'spectatorCameraOff')}); sendToScript({method: 'updateCameravFoV', vFoV: fieldOfViewSlider.value}); } background: Rectangle { color: parent.checked ? "#1FC6A6" : hifi.colors.white; - implicitWidth: masterSwitch.switchWidth; + implicitWidth: masterSwitch.width; implicitHeight: masterSwitch.height; radius: height/2; } @@ -127,7 +132,7 @@ Rectangle { z: 999; id: processingSnapshot; anchors.fill: parent; - visible: root.processing360Snapshot; + visible: root.processing360Snapshot || !root.uiReady; color: Qt.rgba(0.0, 0.0, 0.0, 0.85); // This object is always used in a popup. @@ -149,7 +154,7 @@ Rectangle { } HifiStylesUit.RalewaySemiBold { - text: "Processing..."; + text: root.uiReady ? "Processing..." : ""; // Anchors anchors.top: processingImage.bottom; anchors.topMargin: 4; @@ -202,10 +207,20 @@ Rectangle { verticalAlignment: Text.AlignVCenter; } + HifiStylesUit.FiraSansRegular { + text: ":)"; + size: 28; + color: hifi.colors.white; + visible: root.processing360Snapshot || root.processingStillSnapshot; + anchors.fill: parent; + horizontalAlignment: Text.AlignHCenter; + verticalAlignment: Text.AlignVCenter; + } + // Spectator Camera Preview Hifi.ResourceImageItem { id: spectatorCameraPreview; - visible: masterSwitch.checked && !root.processing360Snapshot; + visible: masterSwitch.checked && !root.processing360Snapshot && !root.processingStillSnapshot; url: showCameraView.checked || !HMD.active ? "resource://spectatorCameraFrame" : "resource://hmdPreviewFrame"; ready: masterSwitch.checked; mirrorVertically: true; @@ -311,7 +326,30 @@ Rectangle { } } } - + + HifiStylesUit.HiFiGlyphs { + id: flashGlyph; + visible: flashCheckBox.visible; + text: hifi.glyphs.lightning; + size: 26; + color: hifi.colors.white; + anchors.verticalCenter: flashCheckBox.verticalCenter; + anchors.right: flashCheckBox.left; + anchors.rightMargin: -2; + } + HifiControlsUit.CheckBox { + id: flashCheckBox; + visible: masterSwitch.checked; + color: hifi.colors.white; + colorScheme: hifi.colorSchemes.dark; + anchors.right: takeSnapshotButton.left; + anchors.rightMargin: -8; + anchors.verticalCenter: takeSnapshotButton.verticalCenter; + boxSize: 22; + onClicked: { + sendToScript({method: 'setFlashStatus', enabled: checked}); + } + } HifiControlsUit.Button { id: takeSnapshotButton; enabled: masterSwitch.checked; @@ -325,6 +363,7 @@ Rectangle { width: 135; height: 35; onClicked: { + root.processingStillSnapshot = true; sendToScript({method: 'takeSecondaryCameraSnapshot'}); } } @@ -582,8 +621,12 @@ Rectangle { // function fromScript(message) { switch (message.method) { - case 'updateSpectatorCameraCheckbox': - masterSwitch.checked = message.params; + case 'initializeUI': + masterSwitch.checked = message.masterSwitchOn; + flashCheckBox.checked = message.flashCheckboxChecked; + showCameraView.checked = message.monitorShowsCamView; + showHmdPreview.checked = !message.monitorShowsCamView; + root.uiReady = true; break; case 'updateMonitorShowsSwitch': showCameraView.checked = message.params; @@ -611,6 +654,12 @@ Rectangle { case 'finishedProcessing360Snapshot': root.processing360Snapshot = false; break; + case 'startedProcessingStillSnapshot': + root.processingStillSnapshot = true; + break; + case 'finishedProcessingStillSnapshot': + root.processingStillSnapshot = false; + break; default: console.log('Unrecognized message from spectatorCamera.js:', JSON.stringify(message)); } diff --git a/unpublishedScripts/marketplace/spectator-camera/flashOff.wav b/unpublishedScripts/marketplace/spectator-camera/flashOff.wav new file mode 100644 index 0000000000000000000000000000000000000000..fef7668de866e75ad4e9fb7c5a3a91dcd5f53d0e GIT binary patch literal 17764 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 literal 0 HcmV?d00001 diff --git a/unpublishedScripts/marketplace/spectator-camera/spectatorCamera.app.json b/unpublishedScripts/marketplace/spectator-camera/spectatorCamera.app.json index e71c657581..6370454f97 100644 --- a/unpublishedScripts/marketplace/spectator-camera/spectatorCamera.app.json +++ b/unpublishedScripts/marketplace/spectator-camera/spectatorCamera.app.json @@ -1,4 +1,4 @@ { - "scriptURL": "http://mpassets-staging.highfidelity.com/26156ea5-cdff-43c2-9581-d6b0fa5e00ef-v1/spectatorCamera.js", - "homeURL": "http://mpassets-staging.highfidelity.com/26156ea5-cdff-43c2-9581-d6b0fa5e00ef-v1/SpectatorCamera.qml" + "scriptURL": "http://mpassets.highfidelity.com/80d02930-f409-4f1a-824f-ae0109da32d6-v1/spectatorCamera.js", + "homeURL": "http://mpassets.highfidelity.com/80d02930-f409-4f1a-824f-ae0109da32d6-v1/SpectatorCamera.qml" } \ No newline at end of file diff --git a/unpublishedScripts/marketplace/spectator-camera/spectatorCamera.js b/unpublishedScripts/marketplace/spectator-camera/spectatorCamera.js index df4cdfb385..3e749e38a2 100644 --- a/unpublishedScripts/marketplace/spectator-camera/spectatorCamera.js +++ b/unpublishedScripts/marketplace/spectator-camera/spectatorCamera.js @@ -97,7 +97,7 @@ if (button) { button.editProperties({ isActive: onSpectatorCameraScreen || camera }); } - Audio.playSound(CAMERA_ON_SOUND, { + Audio.playSound(SOUND_CAMERA_ON, { volume: 0.15, position: cameraPosition, localOnly: true @@ -113,8 +113,14 @@ var WAIT_AFTER_DOMAIN_SWITCH_BEFORE_CAMERA_DELETE_MS = 1 * 1000; function spectatorCameraOff(isChangingDomains) { function deleteCamera() { - Entities.deleteEntity(camera); - camera = false; + if (flash) { + Entities.deleteEntity(flash); + flash = false; + } + if (camera) { + Entities.deleteEntity(camera); + camera = false; + } if (button) { // Change button to active when window is first openend OR if the camera is on, false otherwise. button.editProperties({ isActive: onSpectatorCameraScreen || camera }); @@ -391,21 +397,81 @@ } var takeSnapshotControllerMapping; var takeSnapshotControllerMappingName = 'Hifi-SpectatorCamera-Mapping-TakeSnapshot'; + + var flash = false; + function setFlashStatus(enabled) { + var cameraPosition = Entities.getEntityProperties(camera, ["positon"]).position; + if (enabled) { + if (camera) { + Audio.playSound(SOUND_FLASH_ON, { + position: cameraPosition, + localOnly: true, + volume: 0.8 + }); + flash = Entities.addEntity({ + "collidesWith": "", + "collisionMask": 0, + "color": { + "blue": 173, + "green": 252, + "red": 255 + }, + "cutoff": 90, + "dimensions": { + "x": 4, + "y": 4, + "z": 4 + }, + "dynamic": false, + "falloffRadius": 0.20000000298023224, + "intensity": 37, + "isSpotlight": true, + "localRotation": { w: 1, x: 0, y: 0, z: 0 }, + "localPosition": { x: 0, y: -0.005, z: -0.08 }, + "name": "Camera Flash", + "type": "Light", + "parentID": camera, + }, true); + } + } else { + if (flash) { + Audio.playSound(SOUND_FLASH_OFF, { + position: cameraPosition, + localOnly: true, + volume: 0.8 + }); + Entities.deleteEntity(flash); + flash = false; + } + } + } + function onStillSnapshotTaken() { Render.getConfig("SecondaryCameraJob.ToneMapping").curve = 1; + sendToQml({ + method: 'finishedProcessingStillSnapshot' + }); } function maybeTakeSnapshot() { if (camera) { + sendToQml({ + method: 'startedProcessingStillSnapshot' + }); + Render.getConfig("SecondaryCameraJob.ToneMapping").curve = 0; // Wait a moment before taking the snapshot for the tonemapping curve to update Script.setTimeout(function () { - Audio.playSound(SNAPSHOT_SOUND, { + Audio.playSound(SOUND_SNAPSHOT, { position: { x: MyAvatar.position.x, y: MyAvatar.position.y, z: MyAvatar.position.z }, localOnly: true, volume: 1.0 }); Window.takeSecondaryCameraSnapshot(); }, 250); + } else { + sendToQml({ + method: 'finishedProcessingStillSnapshot' + }); } } function on360SnapshotTaken() { @@ -418,7 +484,7 @@ } function maybeTake360Snapshot() { if (camera) { - Audio.playSound(SNAPSHOT_SOUND, { + Audio.playSound(SOUND_SNAPSHOT, { position: { x: MyAvatar.position.x, y: MyAvatar.position.y, z: MyAvatar.position.z }, localOnly: true, volume: 1.0 @@ -508,18 +574,8 @@ } function updateSpectatorCameraQML() { - sendToQml({ method: 'updateSpectatorCameraCheckbox', params: !!camera }); - sendToQml({ method: 'updateMonitorShowsSwitch', params: monitorShowsCameraView }); - if (!switchViewControllerMapping || !takeSnapshotControllerMapping) { - registerButtonMappings(); - } else { - sendToQml({ - method: 'updateControllerMappingCheckbox', - switchViewSetting: switchViewFromController, - takeSnapshotSetting: takeSnapshotFromController, - controller: controllerType - }); - } + sendToQml({ method: 'initializeUI', masterSwitchOn: !!camera, flashCheckboxChecked: !!flash, monitorShowsCamView: monitorShowsCameraView }); + registerButtonMappings(); Menu.setIsOptionChecked("Disable Preview", false); Menu.setIsOptionChecked("Mono Preview", true); } @@ -537,9 +593,13 @@ button.editProperties({ isActive: onSpectatorCameraScreen || camera }); } - if (onSpectatorCameraScreen) { - updateSpectatorCameraQML(); - } + // In the case of a remote QML app, it takes a bit of time + // for the event bridge to actually connect, so we have to wait... + Script.setTimeout(function () { + if (onSpectatorCameraScreen) { + updateSpectatorCameraQML(); + } + }, 700); } // Function Name: sendToQml() @@ -576,6 +636,9 @@ case 'updateCameravFoV': spectatorCameraConfig.vFoV = message.vFoV; break; + case 'setFlashStatus': + setFlashStatus(message.enabled); + break; case 'takeSecondaryCameraSnapshot': maybeTakeSnapshot(); break; @@ -600,9 +663,7 @@ // Description: // -Called from C++ when HMD mode is changed. The argument "isHMDMode" is true if HMD is on; false otherwise. function onHMDChanged(isHMDMode) { - if (!switchViewControllerMapping || !takeSnapshotControllerMapping) { - registerButtonMappings(); - } + registerButtonMappings(); if (!isHMDMode) { setMonitorShowsCameraView(false); } else { @@ -646,8 +707,10 @@ } // These functions will be called when the script is loaded. - var CAMERA_ON_SOUND = SoundCache.getSound(Script.resolvePath("cameraOn.wav")); - var SNAPSHOT_SOUND = SoundCache.getSound(Script.resourcesPath() + "sounds/snapshot/snap.wav"); + var SOUND_CAMERA_ON = SoundCache.getSound(Script.resolvePath("cameraOn.wav")); + var SOUND_SNAPSHOT = SoundCache.getSound(Script.resolvePath("snap.wav")); + var SOUND_FLASH_ON = SoundCache.getSound(Script.resolvePath("flashOn.wav")); + var SOUND_FLASH_OFF = SoundCache.getSound(Script.resolvePath("flashOff.wav")); startup(); Script.scriptEnding.connect(shutdown);