From e883d1dbb7447d67250daffa4b4d3c76d7de9aac Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 17 Dec 2014 21:21:51 +0100 Subject: [PATCH 01/38] 3d mode --- examples/virtualKeyboard.js | 65 +++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/examples/virtualKeyboard.js b/examples/virtualKeyboard.js index ce793c6ea0..a788ccd76c 100644 --- a/examples/virtualKeyboard.js +++ b/examples/virtualKeyboard.js @@ -17,6 +17,9 @@ Script.include("libraries/globals.js"); +// experimental 3dmode +const THREE_D_MODE = true; + const KBD_UPPERCASE_DEFAULT = 0; const KBD_LOWERCASE_DEFAULT = 1; const KBD_UPPERCASE_HOVER = 2; @@ -272,14 +275,28 @@ function KeyboardKey(keyboard, keyProperties) { }; for (var i = 0; i < this.bounds.length; i++) { var newOverlay = Overlays.cloneOverlay(this.keyboard.background); - Overlays.editOverlay(newOverlay, { - x: this.keyboard.getX() + this.bounds[i][BOUND_X] * keyboard.scale, - y: this.keyboard.getY() + this.bounds[i][BOUND_Y] * keyboard.scale, - width: this.bounds[i][BOUND_W] * keyboard.scale, - height: this.bounds[i][BOUND_H] * keyboard.scale, - subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, - alpha: 1 - }); + if (THREE_D_MODE) { + Overlays.editOverlay(newOverlay, { + position: { + x: MyAvatar.position.x,// + this.bounds[i][BOUND_X] * 0.01,// /*+ this.keyboard.getX()*/ + this.bounds[i][BOUND_X] * keyboard.scale, + y: MyAvatar.position.y,// - this.bounds[i][BOUND_Y] * 0.01,// /*+ this.keyboard.getY()*/ + this.bounds[i][BOUND_Y] * keyboard.scale, + z: MyAvatar.position.z + }, + width: this.bounds[i][BOUND_W] * keyboard.scale, + height: this.bounds[i][BOUND_H] * keyboard.scale, + subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, + alpha: 1 + }); + } else { + Overlays.editOverlay(newOverlay, { + x: this.keyboard.getX() + this.bounds[i][BOUND_X] * keyboard.scale, + y: this.keyboard.getY() + this.bounds[i][BOUND_Y] * keyboard.scale, + width: this.bounds[i][BOUND_W] * keyboard.scale, + height: this.bounds[i][BOUND_H] * keyboard.scale, + subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, + alpha: 1 + }); + } this.overlays.push(newOverlay); } } @@ -301,15 +318,29 @@ function Keyboard() { this.getY = function() { return windowDimensions.y - this.height(); }; - this.background = Overlays.addOverlay("image", { - x: this.getX(), - y: this.getY(), - width: this.width(), - height: this.height(), - subImage: {width: KEYBOARD_WIDTH, height: KEYBOARD_HEIGHT, y: KEYBOARD_HEIGHT * KBD_BACKGROUND}, - imageURL: KEYBOARD_URL, - alpha: 1 - }); + if (THREE_D_MODE) { + this.background = Overlays.addOverlay("billboard", { + scale: 1, + position: MyAvatar.position, + rotation: MyAvatar.rotation, + width: this.width(), + height: this.height(), + subImage: {width: KEYBOARD_WIDTH, height: KEYBOARD_HEIGHT, y: KEYBOARD_HEIGHT * KBD_BACKGROUND}, + isFacingAvatar: false, + url: KEYBOARD_URL, + alpha: 1 + }); + } else { + this.background = Overlays.addOverlay("image", { + x: this.getX(), + y: this.getY(), + width: this.width(), + height: this.height(), + subImage: {width: KEYBOARD_WIDTH, height: KEYBOARD_HEIGHT, y: KEYBOARD_HEIGHT * KBD_BACKGROUND}, + imageURL: KEYBOARD_URL, + alpha: 1 + }); + } this.rescale = function() { this.scale = windowDimensions.x / KEYBOARD_WIDTH; Overlays.editOverlay(tthis.background, { From e38aa89418bde960d4132a269e6db27ae66a91de Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 29 Dec 2014 21:11:34 +0100 Subject: [PATCH 02/38] Overwrite keypress of Enter key --- examples/virtualKeyboard.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/examples/virtualKeyboard.js b/examples/virtualKeyboard.js index ce793c6ea0..aede5c69d5 100644 --- a/examples/virtualKeyboard.js +++ b/examples/virtualKeyboard.js @@ -26,6 +26,8 @@ const KBD_BACKGROUND = 4; const KEYBOARD_URL = HIFI_PUBLIC_BUCKET + "images/keyboard.svg"; const CURSOR_URL = HIFI_PUBLIC_BUCKET + "images/cursor.svg"; +const RETURN_CHARCODE = 0x01000004; +const ENTER_CHARCODE = 0x01000005; const SPACEBAR_CHARCODE = 32; const KEYBOARD_WIDTH = 1174.7; @@ -576,7 +578,10 @@ function Cursor() { function keyPressEvent(event) { if (event.key === SPACEBAR_CHARCODE) { keyboard.pressFocussedKey(); + } else if (event.key === ENTER_CHARCODE || event.key === RETURN_CHARCODE) { + print("Enter pressed"); } + } function keyReleaseEvent(event) { @@ -591,7 +596,11 @@ function scriptEnding() { Overlays.deleteOverlay(text); Overlays.deleteOverlay(textSizeMeasureOverlay); Controller.releaseKeyEvents({key: SPACEBAR_CHARCODE}); + Controller.releaseKeyEvents({key: RETURN_CHARCODE}); + Controller.releaseKeyEvents({key: ENTER_CHARCODE}); } +Controller.captureKeyEvents({key: RETURN_CHARCODE}); +Controller.captureKeyEvents({key: ENTER_CHARCODE}); Controller.captureKeyEvents({key: SPACEBAR_CHARCODE}); Controller.keyPressEvent.connect(keyPressEvent); Controller.keyReleaseEvent.connect(keyReleaseEvent); From d299f3f0c5e0bb3acf07e6218b6025a264b0ba66 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 29 Dec 2014 23:10:15 +0100 Subject: [PATCH 03/38] no 3d mode for now --- examples/virtualKeyboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/virtualKeyboard.js b/examples/virtualKeyboard.js index a580bc7bcc..24b6cd39a1 100644 --- a/examples/virtualKeyboard.js +++ b/examples/virtualKeyboard.js @@ -18,7 +18,7 @@ Script.include("libraries/globals.js"); // experimental 3dmode -const THREE_D_MODE = true; +const THREE_D_MODE = false; const KBD_UPPERCASE_DEFAULT = 0; const KBD_LOWERCASE_DEFAULT = 1; From 4eec066d691f83baccc59ef1291c7cabb4663b6a Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 30 Dec 2014 19:51:53 +0100 Subject: [PATCH 04/38] split up virtualKeyboard script in a library and two script that will use it: virtualKeyboardLocation.js - Location through virtual keyboard virtualKeyboardTextEntityExample.js - Initial example for virtual keyboard --- examples/{ => libraries}/virtualKeyboard.js | 202 +++---------------- examples/virtualKeyboardLocation.js | 185 +++++++++++++++++ examples/virtualKeyboardTextEntityExample.js | 177 ++++++++++++++++ 3 files changed, 385 insertions(+), 179 deletions(-) rename examples/{ => libraries}/virtualKeyboard.js (75%) create mode 100644 examples/virtualKeyboardLocation.js create mode 100644 examples/virtualKeyboardTextEntityExample.js diff --git a/examples/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js similarity index 75% rename from examples/virtualKeyboard.js rename to examples/libraries/virtualKeyboard.js index 24b6cd39a1..ba9a30974e 100644 --- a/examples/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -9,8 +9,6 @@ // Usage: Enable VR-mode and go to First person mode, // look at the key that you would like to press, and press the spacebar on your "REAL" keyboard. // -// leased some code from newEditEntities.js for Text Entity example -// // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // @@ -18,26 +16,26 @@ Script.include("libraries/globals.js"); // experimental 3dmode -const THREE_D_MODE = false; +THREE_D_MODE = false; -const KBD_UPPERCASE_DEFAULT = 0; -const KBD_LOWERCASE_DEFAULT = 1; -const KBD_UPPERCASE_HOVER = 2; -const KBD_LOWERCASE_HOVER = 3; -const KBD_BACKGROUND = 4; +KBD_UPPERCASE_DEFAULT = 0; +KBD_LOWERCASE_DEFAULT = 1; +KBD_UPPERCASE_HOVER = 2; +KBD_LOWERCASE_HOVER = 3; +KBD_BACKGROUND = 4; -const KEYBOARD_URL = HIFI_PUBLIC_BUCKET + "images/keyboard.svg"; -const CURSOR_URL = HIFI_PUBLIC_BUCKET + "images/cursor.svg"; +KEYBOARD_URL = HIFI_PUBLIC_BUCKET + "images/keyboard.svg"; +CURSOR_URL = HIFI_PUBLIC_BUCKET + "images/cursor.svg"; -const RETURN_CHARCODE = 0x01000004; -const ENTER_CHARCODE = 0x01000005; -const SPACEBAR_CHARCODE = 32; +RETURN_CHARCODE = 0x01000004; +ENTER_CHARCODE = 0x01000005; +SPACEBAR_CHARCODE = 32; -const KEYBOARD_WIDTH = 1174.7; -const KEYBOARD_HEIGHT = 434.1; +KEYBOARD_WIDTH = 1174.7; +KEYBOARD_HEIGHT = 434.1; -const CURSOR_WIDTH = 33.9; -const CURSOR_HEIGHT = 33.9; +CURSOR_WIDTH = 33.9; +CURSOR_HEIGHT = 33.9; // VIEW_ANGLE can be adjusted to your likings, the smaller the faster movement. // Try setting it to 60 if it goes too fast for you. @@ -52,8 +50,8 @@ const BOUND_Y = 1; const BOUND_W = 2; const BOUND_H = 3; -const KEY_STATE_LOWER = 0; -const KEY_STATE_UPPER = 1; +KEY_STATE_LOWER = 0; +KEY_STATE_UPPER = 1; const TEXT_MARGIN_TOP = 0.15; const TEXT_MARGIN_LEFT = 0.15; @@ -62,131 +60,8 @@ const TEXT_MARGIN_BOTTOM = 0.17; var windowDimensions = Controller.getViewportDimensions(); var cursor = null; -var keyboard = new Keyboard(); -var textFontSize = 9; -var text = null; -var textText = ""; -var textSizeMeasureOverlay = Overlays.addOverlay("text3d", {visible: false}); -function appendChar(char) { - textText += char; - updateTextOverlay(); - Overlays.editOverlay(text, {text: textText}); -} - -function deleteChar() { - if (textText.length > 0) { - textText = textText.substring(0, textText.length - 1); - updateTextOverlay(); - } -} - -function updateTextOverlay() { - var textLines = textText.split("\n"); - var maxLineWidth = 0; - for (textLine in textLines) { - var lineWidth = Overlays.textSize(text, textLines[textLine]).width; - if (lineWidth > maxLineWidth) { - maxLineWidth = lineWidth; - } - } - var suggestedFontSize = (windowDimensions.x / maxLineWidth) * textFontSize * 0.90; - var maxFontSize = 190 / textLines.length; - textFontSize = (suggestedFontSize > maxFontSize) ? maxFontSize : suggestedFontSize; - var topMargin = (250 - (textFontSize * textLines.length)) / 4; - Overlays.editOverlay(text, {text: textText, font: {size: textFontSize}, topMargin: topMargin}); - var maxLineWidth = 0; - for (textLine in textLines) { - var lineWidth = Overlays.textSize(text, textLines[textLine]).width; - if (lineWidth > maxLineWidth) { - maxLineWidth = lineWidth; - } - } - Overlays.editOverlay(text, {leftMargin: (windowDimensions.x - maxLineWidth) / 2}); -} - -keyboard.onKeyPress = function(event) { - if (event.event == 'keypress') { - appendChar(event.char); - } else if (event.event == 'enter') { - appendChar("\n"); - } -}; - -keyboard.onKeyRelease = function(event) { - print("Key release event test"); - // you can cancel a key by releasing its focusing before releasing it - if (event.focus) { - if (event.event == 'delete') { - deleteChar(); - } else if (event.event == 'submit') { - print(textText); - - var position = Vec3.sum(MyAvatar.position, Vec3.multiply(Quat.getFront(MyAvatar.orientation), SPAWN_DISTANCE)); - - var textLines = textText.split("\n"); - var maxLineWidth = 0; - for (textLine in textLines) { - var lineWidth = Overlays.textSize(textSizeMeasureOverlay, textLines[textLine]).width; - if (lineWidth > maxLineWidth) { - maxLineWidth = lineWidth; - } - } - var usernameLine = "--" + GlobalServices.myUsername; - var usernameWidth = Overlays.textSize(textSizeMeasureOverlay, usernameLine).width; - if (maxLineWidth < usernameWidth) { - maxLineWidth = usernameWidth; - } else { - var spaceableWidth = maxLineWidth - usernameWidth; - var spaceWidth = Overlays.textSize(textSizeMeasureOverlay, " ").width; - var numberOfSpaces = Math.floor(spaceableWidth / spaceWidth); - for (var i = 0; i < numberOfSpaces; i++) { - usernameLine = " " + usernameLine; - } - } - var dimension_x = maxLineWidth + TEXT_MARGIN_RIGHT + TEXT_MARGIN_LEFT; - if (position.x > 0 && position.y > 0 && position.z > 0) { - Entities.addEntity({ - type: "Text", - rotation: MyAvatar.orientation, - position: position, - dimensions: { x: dimension_x, y: (textLines.length + 1) * 0.14 + TEXT_MARGIN_TOP + TEXT_MARGIN_BOTTOM, z: DEFAULT_TEXT_DIMENSION_Z }, - backgroundColor: { red: 0, green: 0, blue: 0 }, - textColor: { red: 255, green: 255, blue: 255 }, - text: textText + "\n" + usernameLine - }); - } - textText = ""; - updateTextOverlay(); - } - } -}; - -keyboard.onFullyLoaded = function() { - print("Virtual-keyboard fully loaded."); - var dimensions = Controller.getViewportDimensions(); - text = Overlays.addOverlay("text", { - x: 0, - y: dimensions.y - keyboard.height() - 260, - width: dimensions.x, - height: 250, - backgroundColor: { red: 255, green: 255, blue: 255}, - color: { red: 0, green: 0, blue: 0}, - topMargin: 5, - leftMargin: 0, - font: {size: textFontSize}, - text: "", - alpha: 0.8 - }); - updateTextOverlay(); - // the cursor is being loaded after the keyboard, else it will be on the background of the keyboard - cursor = new Cursor(); - cursor.onUpdate = function(position) { - keyboard.setFocusPosition(position.x, position.y); - }; -}; - -function KeyboardKey(keyboard, keyProperties) { +KeyboardKey = (function(keyboard, keyProperties) { var tthis = this; this._focus = false; this._beingPressed = false; @@ -301,9 +176,9 @@ function KeyboardKey(keyboard, keyProperties) { } this.overlays.push(newOverlay); } -} +}); -function Keyboard() { +Keyboard = (function() { var tthis = this; this.focussed_key = -1; this.scale = windowDimensions.x / KEYBOARD_WIDTH; @@ -548,9 +423,9 @@ function Keyboard() { } }; this.keyboardTextureLoaded_timer = Script.setInterval(this.keyboardTextureLoaded, 250); -} +}); -function Cursor() { +Cursor = (function() { var tthis = this; this.x = windowDimensions.x / 2; this.y = windowDimensions.y / 2; @@ -604,35 +479,4 @@ function Cursor() { } }; Script.update.connect(this.update); -} - -function keyPressEvent(event) { - if (event.key === SPACEBAR_CHARCODE) { - keyboard.pressFocussedKey(); - } else if (event.key === ENTER_CHARCODE || event.key === RETURN_CHARCODE) { - print("Enter pressed"); - } - -} - -function keyReleaseEvent(event) { - if (event.key === SPACEBAR_CHARCODE) { - keyboard.releaseKeys(); - } -} - -function scriptEnding() { - keyboard.remove(); - cursor.remove(); - Overlays.deleteOverlay(text); - Overlays.deleteOverlay(textSizeMeasureOverlay); - Controller.releaseKeyEvents({key: SPACEBAR_CHARCODE}); - Controller.releaseKeyEvents({key: RETURN_CHARCODE}); - Controller.releaseKeyEvents({key: ENTER_CHARCODE}); -} -Controller.captureKeyEvents({key: RETURN_CHARCODE}); -Controller.captureKeyEvents({key: ENTER_CHARCODE}); -Controller.captureKeyEvents({key: SPACEBAR_CHARCODE}); -Controller.keyPressEvent.connect(keyPressEvent); -Controller.keyReleaseEvent.connect(keyReleaseEvent); -Script.scriptEnding.connect(scriptEnding); \ No newline at end of file +}); diff --git a/examples/virtualKeyboardLocation.js b/examples/virtualKeyboardLocation.js new file mode 100644 index 0000000000..a5688c4c34 --- /dev/null +++ b/examples/virtualKeyboardLocation.js @@ -0,0 +1,185 @@ +// +// virtualKeyboardTextEntityExample.js +// examples +// +// Created by Thijs Wenker on 11/18/14. +// Copyright 2014 High Fidelity, Inc. +// +// Control a virtual keyboard using your favorite HMD. +// Usage: Enable VR-mode and go to First person mode, +// look at the key that you would like to press, and press the spacebar on your "REAL" keyboard. +// +// Enter a location URL using your HMD. Press Enter to pop-up the virtual keyboard and location input. +// Press Space on the keyboard or the X button on your gamepad to press a key that you have selected. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +Script.include("libraries/virtualKeyboard.js"); + +const SPAWN_DISTANCE = 1; +const DEFAULT_TEXT_DIMENSION_Z = 0.02; + +const TEXT_MARGIN_TOP = 0.15; +const TEXT_MARGIN_LEFT = 0.15; +const TEXT_MARGIN_RIGHT = 0.17; +const TEXT_MARGIN_BOTTOM = 0.17; + +var windowDimensions = Controller.getViewportDimensions(); +var cursor = null; +var keyboard = new Keyboard(); +var textFontSize = 9; +var text = null; +var textText = ""; +var textSizeMeasureOverlay = Overlays.addOverlay("text3d", {visible: false}); + +function appendChar(char) { + textText += char; + updateTextOverlay(); + Overlays.editOverlay(text, {text: textText}); +} + +function deleteChar() { + if (textText.length > 0) { + textText = textText.substring(0, textText.length - 1); + updateTextOverlay(); + } +} + +function updateTextOverlay() { + var textLines = textText.split("\n"); + var maxLineWidth = 0; + for (textLine in textLines) { + var lineWidth = Overlays.textSize(text, textLines[textLine]).width; + if (lineWidth > maxLineWidth) { + maxLineWidth = lineWidth; + } + } + var suggestedFontSize = (windowDimensions.x / maxLineWidth) * textFontSize * 0.90; + var maxFontSize = 190 / textLines.length; + textFontSize = (suggestedFontSize > maxFontSize) ? maxFontSize : suggestedFontSize; + var topMargin = (250 - (textFontSize * textLines.length)) / 4; + Overlays.editOverlay(text, {text: textText, font: {size: textFontSize}, topMargin: topMargin}); + var maxLineWidth = 0; + for (textLine in textLines) { + var lineWidth = Overlays.textSize(text, textLines[textLine]).width; + if (lineWidth > maxLineWidth) { + maxLineWidth = lineWidth; + } + } + Overlays.editOverlay(text, {leftMargin: (windowDimensions.x - maxLineWidth) / 2}); +} + +keyboard.onKeyPress = function(event) { + if (event.event == 'keypress') { + appendChar(event.char); + } else if (event.event == 'enter') { + appendChar("\n"); + } +}; + +keyboard.onKeyRelease = function(event) { + print("Key release event test"); + // you can cancel a key by releasing its focusing before releasing it + if (event.focus) { + if (event.event == 'delete') { + deleteChar(); + } else if (event.event == 'submit') { + print(textText); + + var position = Vec3.sum(MyAvatar.position, Vec3.multiply(Quat.getFront(MyAvatar.orientation), SPAWN_DISTANCE)); + + var textLines = textText.split("\n"); + var maxLineWidth = 0; + for (textLine in textLines) { + var lineWidth = Overlays.textSize(textSizeMeasureOverlay, textLines[textLine]).width; + if (lineWidth > maxLineWidth) { + maxLineWidth = lineWidth; + } + } + var usernameLine = "--" + GlobalServices.myUsername; + var usernameWidth = Overlays.textSize(textSizeMeasureOverlay, usernameLine).width; + if (maxLineWidth < usernameWidth) { + maxLineWidth = usernameWidth; + } else { + var spaceableWidth = maxLineWidth - usernameWidth; + var spaceWidth = Overlays.textSize(textSizeMeasureOverlay, " ").width; + var numberOfSpaces = Math.floor(spaceableWidth / spaceWidth); + for (var i = 0; i < numberOfSpaces; i++) { + usernameLine = " " + usernameLine; + } + } + var dimension_x = maxLineWidth + TEXT_MARGIN_RIGHT + TEXT_MARGIN_LEFT; + if (position.x > 0 && position.y > 0 && position.z > 0) { + Entities.addEntity({ + type: "Text", + rotation: MyAvatar.orientation, + position: position, + dimensions: { x: dimension_x, y: (textLines.length + 1) * 0.14 + TEXT_MARGIN_TOP + TEXT_MARGIN_BOTTOM, z: DEFAULT_TEXT_DIMENSION_Z }, + backgroundColor: { red: 0, green: 0, blue: 0 }, + textColor: { red: 255, green: 255, blue: 255 }, + text: textText + "\n" + usernameLine + }); + } + textText = ""; + updateTextOverlay(); + } + } +}; + +keyboard.onFullyLoaded = function() { + print("Virtual-keyboard fully loaded."); + var dimensions = Controller.getViewportDimensions(); + text = Overlays.addOverlay("text", { + x: 0, + y: dimensions.y - keyboard.height() - 260, + width: dimensions.x, + height: 250, + backgroundColor: { red: 255, green: 255, blue: 255}, + color: { red: 0, green: 0, blue: 0}, + topMargin: 5, + leftMargin: 0, + font: {size: textFontSize}, + text: "", + alpha: 0.8 + }); + updateTextOverlay(); + // the cursor is being loaded after the keyboard, else it will be on the background of the keyboard + cursor = new Cursor(); + cursor.onUpdate = function(position) { + keyboard.setFocusPosition(position.x, position.y); + }; +}; + +function keyPressEvent(event) { + if (event.key === SPACEBAR_CHARCODE) { + keyboard.pressFocussedKey(); + } else if (event.key === ENTER_CHARCODE || event.key === RETURN_CHARCODE) { + print("Enter pressed"); + } + +} + +function keyReleaseEvent(event) { + if (event.key === SPACEBAR_CHARCODE) { + keyboard.releaseKeys(); + } +} + +function scriptEnding() { + keyboard.remove(); + cursor.remove(); + Overlays.deleteOverlay(text); + Overlays.deleteOverlay(textSizeMeasureOverlay); + Controller.releaseKeyEvents({key: SPACEBAR_CHARCODE}); + Controller.releaseKeyEvents({key: RETURN_CHARCODE}); + Controller.releaseKeyEvents({key: ENTER_CHARCODE}); +} + +Controller.captureKeyEvents({key: RETURN_CHARCODE}); +Controller.captureKeyEvents({key: ENTER_CHARCODE}); +Controller.captureKeyEvents({key: SPACEBAR_CHARCODE}); +Controller.keyPressEvent.connect(keyPressEvent); +Controller.keyReleaseEvent.connect(keyReleaseEvent); +Script.scriptEnding.connect(scriptEnding); diff --git a/examples/virtualKeyboardTextEntityExample.js b/examples/virtualKeyboardTextEntityExample.js new file mode 100644 index 0000000000..830c50ab1e --- /dev/null +++ b/examples/virtualKeyboardTextEntityExample.js @@ -0,0 +1,177 @@ +// +// virtualKeyboardTextEntityExample.js +// examples +// +// Created by Thijs Wenker on 11/18/14. +// Copyright 2014 High Fidelity, Inc. +// +// Control a virtual keyboard using your favorite HMD. +// Usage: Enable VR-mode and go to First person mode, +// look at the key that you would like to press, and press the spacebar on your "REAL" keyboard. +// +// leased some code from newEditEntities.js for Text Entity example +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +Script.include("libraries/virtualKeyboard.js"); + +const SPAWN_DISTANCE = 1; +const DEFAULT_TEXT_DIMENSION_Z = 0.02; + +const TEXT_MARGIN_TOP = 0.15; +const TEXT_MARGIN_LEFT = 0.15; +const TEXT_MARGIN_RIGHT = 0.17; +const TEXT_MARGIN_BOTTOM = 0.17; + +var windowDimensions = Controller.getViewportDimensions(); +var cursor = null; +var keyboard = new Keyboard(); +var textFontSize = 9; +var text = null; +var textText = ""; +var textSizeMeasureOverlay = Overlays.addOverlay("text3d", {visible: false}); + +function appendChar(char) { + textText += char; + updateTextOverlay(); + Overlays.editOverlay(text, {text: textText}); +} + +function deleteChar() { + if (textText.length > 0) { + textText = textText.substring(0, textText.length - 1); + updateTextOverlay(); + } +} + +function updateTextOverlay() { + var textLines = textText.split("\n"); + var maxLineWidth = 0; + for (textLine in textLines) { + var lineWidth = Overlays.textSize(text, textLines[textLine]).width; + if (lineWidth > maxLineWidth) { + maxLineWidth = lineWidth; + } + } + var suggestedFontSize = (windowDimensions.x / maxLineWidth) * textFontSize * 0.90; + var maxFontSize = 190 / textLines.length; + textFontSize = (suggestedFontSize > maxFontSize) ? maxFontSize : suggestedFontSize; + var topMargin = (250 - (textFontSize * textLines.length)) / 4; + Overlays.editOverlay(text, {text: textText, font: {size: textFontSize}, topMargin: topMargin}); + var maxLineWidth = 0; + for (textLine in textLines) { + var lineWidth = Overlays.textSize(text, textLines[textLine]).width; + if (lineWidth > maxLineWidth) { + maxLineWidth = lineWidth; + } + } + Overlays.editOverlay(text, {leftMargin: (windowDimensions.x - maxLineWidth) / 2}); +} + +keyboard.onKeyPress = function(event) { + if (event.event == 'keypress') { + appendChar(event.char); + } else if (event.event == 'enter') { + appendChar("\n"); + } +}; + +keyboard.onKeyRelease = function(event) { + print("Key release event test"); + // you can cancel a key by releasing its focusing before releasing it + if (event.focus) { + if (event.event == 'delete') { + deleteChar(); + } else if (event.event == 'submit') { + print(textText); + + var position = Vec3.sum(MyAvatar.position, Vec3.multiply(Quat.getFront(MyAvatar.orientation), SPAWN_DISTANCE)); + + var textLines = textText.split("\n"); + var maxLineWidth = 0; + for (textLine in textLines) { + var lineWidth = Overlays.textSize(textSizeMeasureOverlay, textLines[textLine]).width; + if (lineWidth > maxLineWidth) { + maxLineWidth = lineWidth; + } + } + var usernameLine = "--" + GlobalServices.myUsername; + var usernameWidth = Overlays.textSize(textSizeMeasureOverlay, usernameLine).width; + if (maxLineWidth < usernameWidth) { + maxLineWidth = usernameWidth; + } else { + var spaceableWidth = maxLineWidth - usernameWidth; + var spaceWidth = Overlays.textSize(textSizeMeasureOverlay, " ").width; + var numberOfSpaces = Math.floor(spaceableWidth / spaceWidth); + for (var i = 0; i < numberOfSpaces; i++) { + usernameLine = " " + usernameLine; + } + } + var dimension_x = maxLineWidth + TEXT_MARGIN_RIGHT + TEXT_MARGIN_LEFT; + if (position.x > 0 && position.y > 0 && position.z > 0) { + Entities.addEntity({ + type: "Text", + rotation: MyAvatar.orientation, + position: position, + dimensions: { x: dimension_x, y: (textLines.length + 1) * 0.14 + TEXT_MARGIN_TOP + TEXT_MARGIN_BOTTOM, z: DEFAULT_TEXT_DIMENSION_Z }, + backgroundColor: { red: 0, green: 0, blue: 0 }, + textColor: { red: 255, green: 255, blue: 255 }, + text: textText + "\n" + usernameLine + }); + } + textText = ""; + updateTextOverlay(); + } + } +}; + +keyboard.onFullyLoaded = function() { + print("Virtual-keyboard fully loaded."); + var dimensions = Controller.getViewportDimensions(); + text = Overlays.addOverlay("text", { + x: 0, + y: dimensions.y - keyboard.height() - 260, + width: dimensions.x, + height: 250, + backgroundColor: { red: 255, green: 255, blue: 255}, + color: { red: 0, green: 0, blue: 0}, + topMargin: 5, + leftMargin: 0, + font: {size: textFontSize}, + text: "", + alpha: 0.8 + }); + updateTextOverlay(); + // the cursor is being loaded after the keyboard, else it will be on the background of the keyboard + cursor = new Cursor(); + cursor.onUpdate = function(position) { + keyboard.setFocusPosition(position.x, position.y); + }; +}; + +function keyPressEvent(event) { + if (event.key === SPACEBAR_CHARCODE) { + keyboard.pressFocussedKey(); + } +} + +function keyReleaseEvent(event) { + if (event.key === SPACEBAR_CHARCODE) { + keyboard.releaseKeys(); + } +} + +function scriptEnding() { + keyboard.remove(); + cursor.remove(); + Overlays.deleteOverlay(text); + Overlays.deleteOverlay(textSizeMeasureOverlay); + Controller.releaseKeyEvents({key: SPACEBAR_CHARCODE}); +} + +Controller.captureKeyEvents({key: SPACEBAR_CHARCODE}); +Controller.keyPressEvent.connect(keyPressEvent); +Controller.keyReleaseEvent.connect(keyReleaseEvent); +Script.scriptEnding.connect(scriptEnding); From a8122e5a85e8927f93b12af9d82d38436a690d86 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 30 Dec 2014 23:30:48 +0100 Subject: [PATCH 05/38] virtualKeyboard.js - scale 50% virtualKeyboardLocation.js - toggle visibility with Enter/Return key virtualKeyboardTextEntityExample.js - attempt to fix character glyphs --- examples/libraries/virtualKeyboard.js | 112 ++++++++++++------- examples/virtualKeyboardLocation.js | 4 +- examples/virtualKeyboardTextEntityExample.js | 24 +--- 3 files changed, 78 insertions(+), 62 deletions(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index ba9a30974e..9e5fd4accb 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -37,6 +37,8 @@ KEYBOARD_HEIGHT = 434.1; CURSOR_WIDTH = 33.9; CURSOR_HEIGHT = 33.9; +KEYBOARD_SCALE_MULTIPLIER = 0.50; + // VIEW_ANGLE can be adjusted to your likings, the smaller the faster movement. // Try setting it to 60 if it goes too fast for you. const VIEW_ANGLE = 40.0; @@ -127,6 +129,11 @@ KeyboardKey = (function(keyboard, keyProperties) { }); } }; + this.updateVisibility = function() { + for (var i = 0; i < tthis.bounds.length; i++) { + Overlays.editOverlay(tthis.overlays[i], {visible: tthis.keyboard.visible}); + } + }; this.rescale = function() { for (var i = 0; i < tthis.bounds.length; i++) { Overlays.editOverlay(tthis.overlays[i], { @@ -153,26 +160,26 @@ KeyboardKey = (function(keyboard, keyProperties) { for (var i = 0; i < this.bounds.length; i++) { var newOverlay = Overlays.cloneOverlay(this.keyboard.background); if (THREE_D_MODE) { - Overlays.editOverlay(newOverlay, { - position: { - x: MyAvatar.position.x,// + this.bounds[i][BOUND_X] * 0.01,// /*+ this.keyboard.getX()*/ + this.bounds[i][BOUND_X] * keyboard.scale, - y: MyAvatar.position.y,// - this.bounds[i][BOUND_Y] * 0.01,// /*+ this.keyboard.getY()*/ + this.bounds[i][BOUND_Y] * keyboard.scale, - z: MyAvatar.position.z - }, - width: this.bounds[i][BOUND_W] * keyboard.scale, - height: this.bounds[i][BOUND_H] * keyboard.scale, - subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, - alpha: 1 - }); + Overlays.editOverlay(newOverlay, { + position: { + x: MyAvatar.position.x,// + this.bounds[i][BOUND_X] * 0.01,// /*+ this.keyboard.getX()*/ + this.bounds[i][BOUND_X] * keyboard.scale, + y: MyAvatar.position.y,// - this.bounds[i][BOUND_Y] * 0.01,// /*+ this.keyboard.getY()*/ + this.bounds[i][BOUND_Y] * keyboard.scale, + z: MyAvatar.position.z + }, + width: this.bounds[i][BOUND_W] * keyboard.scale, + height: this.bounds[i][BOUND_H] * keyboard.scale, + subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, + alpha: 1 + }); } else { - Overlays.editOverlay(newOverlay, { - x: this.keyboard.getX() + this.bounds[i][BOUND_X] * keyboard.scale, - y: this.keyboard.getY() + this.bounds[i][BOUND_Y] * keyboard.scale, - width: this.bounds[i][BOUND_W] * keyboard.scale, - height: this.bounds[i][BOUND_H] * keyboard.scale, - subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, - alpha: 1 - }); + Overlays.editOverlay(newOverlay, { + x: this.keyboard.getX() + this.bounds[i][BOUND_X] * keyboard.scale, + y: this.keyboard.getY() + this.bounds[i][BOUND_Y] * keyboard.scale, + width: this.bounds[i][BOUND_W] * keyboard.scale, + height: this.bounds[i][BOUND_H] * keyboard.scale, + subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, + alpha: 1 + }); } this.overlays.push(newOverlay); } @@ -181,8 +188,9 @@ KeyboardKey = (function(keyboard, keyProperties) { Keyboard = (function() { var tthis = this; this.focussed_key = -1; - this.scale = windowDimensions.x / KEYBOARD_WIDTH; + this.scale = (windowDimensions.x / KEYBOARD_WIDTH) * KEYBOARD_SCALE_MULTIPLIER; this.shift = false; + this.visible = true; this.width = function() { return KEYBOARD_WIDTH * tthis.scale; }; @@ -196,30 +204,30 @@ Keyboard = (function() { return windowDimensions.y - this.height(); }; if (THREE_D_MODE) { - this.background = Overlays.addOverlay("billboard", { - scale: 1, - position: MyAvatar.position, - rotation: MyAvatar.rotation, - width: this.width(), - height: this.height(), - subImage: {width: KEYBOARD_WIDTH, height: KEYBOARD_HEIGHT, y: KEYBOARD_HEIGHT * KBD_BACKGROUND}, - isFacingAvatar: false, - url: KEYBOARD_URL, - alpha: 1 - }); + this.background = Overlays.addOverlay("billboard", { + scale: 1, + position: MyAvatar.position, + rotation: MyAvatar.rotation, + width: this.width(), + height: this.height(), + subImage: {width: KEYBOARD_WIDTH, height: KEYBOARD_HEIGHT, y: KEYBOARD_HEIGHT * KBD_BACKGROUND}, + isFacingAvatar: false, + url: KEYBOARD_URL, + alpha: 1 + }); } else { - this.background = Overlays.addOverlay("image", { - x: this.getX(), - y: this.getY(), - width: this.width(), - height: this.height(), - subImage: {width: KEYBOARD_WIDTH, height: KEYBOARD_HEIGHT, y: KEYBOARD_HEIGHT * KBD_BACKGROUND}, - imageURL: KEYBOARD_URL, - alpha: 1 - }); + this.background = Overlays.addOverlay("image", { + x: this.getX(), + y: this.getY(), + width: this.width(), + height: this.height(), + subImage: {width: KEYBOARD_WIDTH, height: KEYBOARD_HEIGHT, y: KEYBOARD_HEIGHT * KBD_BACKGROUND}, + imageURL: KEYBOARD_URL, + alpha: 1 + }); } this.rescale = function() { - this.scale = windowDimensions.x / KEYBOARD_WIDTH; + this.scale = (windowDimensions.x / KEYBOARD_WIDTH) * KEYBOARD_SCALE_MULTIPLIER; Overlays.editOverlay(tthis.background, { x: this.getX(), y: this.getY(), @@ -312,6 +320,28 @@ Keyboard = (function() { } }; + this.show = function() { + tthis.visible = true; + tthis.updateVisibility(); + }; + + this.hide = function() { + tthis.visible = false; + tthis.updateVisibility(); + }; + + this.toggle = function() { + tthis.visible = !tthis.visible; + tthis.updateVisibility(); + }; + + this.updateVisibility = function() { + Overlays.editOverlay(tthis.background, { visible: tthis.visible }); + for (var i = 0; i < this.keys.length; i++) { + this.keys[i].updateVisibility(); + } + }; + this.onKeyPress = null; this.onKeyRelease = null; this.onSubmit = null; diff --git a/examples/virtualKeyboardLocation.js b/examples/virtualKeyboardLocation.js index a5688c4c34..eae6c982b2 100644 --- a/examples/virtualKeyboardLocation.js +++ b/examples/virtualKeyboardLocation.js @@ -2,7 +2,7 @@ // virtualKeyboardTextEntityExample.js // examples // -// Created by Thijs Wenker on 11/18/14. +// Created by Thijs Wenker on 12/28/14. // Copyright 2014 High Fidelity, Inc. // // Control a virtual keyboard using your favorite HMD. @@ -156,7 +156,7 @@ function keyPressEvent(event) { if (event.key === SPACEBAR_CHARCODE) { keyboard.pressFocussedKey(); } else if (event.key === ENTER_CHARCODE || event.key === RETURN_CHARCODE) { - print("Enter pressed"); + keyboard.toggle(); } } diff --git a/examples/virtualKeyboardTextEntityExample.js b/examples/virtualKeyboardTextEntityExample.js index 830c50ab1e..2d46397831 100644 --- a/examples/virtualKeyboardTextEntityExample.js +++ b/examples/virtualKeyboardTextEntityExample.js @@ -2,7 +2,7 @@ // virtualKeyboardTextEntityExample.js // examples // -// Created by Thijs Wenker on 11/18/14. +// Created by Thijs Wenker on 12/28/14. // Copyright 2014 High Fidelity, Inc. // // Control a virtual keyboard using your favorite HMD. @@ -45,29 +45,15 @@ function deleteChar() { updateTextOverlay(); } } - + function updateTextOverlay() { var textLines = textText.split("\n"); - var maxLineWidth = 0; - for (textLine in textLines) { - var lineWidth = Overlays.textSize(text, textLines[textLine]).width; - if (lineWidth > maxLineWidth) { - maxLineWidth = lineWidth; - } - } - var suggestedFontSize = (windowDimensions.x / maxLineWidth) * textFontSize * 0.90; - var maxFontSize = 190 / textLines.length; + var suggestedFontSize = (windowDimensions.x / Overlays.textSize(text, textLines).width) * textFontSize * 0.90; + var maxFontSize = 170 / textLines.length; textFontSize = (suggestedFontSize > maxFontSize) ? maxFontSize : suggestedFontSize; var topMargin = (250 - (textFontSize * textLines.length)) / 4; Overlays.editOverlay(text, {text: textText, font: {size: textFontSize}, topMargin: topMargin}); - var maxLineWidth = 0; - for (textLine in textLines) { - var lineWidth = Overlays.textSize(text, textLines[textLine]).width; - if (lineWidth > maxLineWidth) { - maxLineWidth = lineWidth; - } - } - Overlays.editOverlay(text, {leftMargin: (windowDimensions.x - maxLineWidth) / 2}); + Overlays.editOverlay(text, {leftMargin: (windowDimensions.x - Overlays.textSize(text, textLines).width) / 2}); } keyboard.onKeyPress = function(event) { From 11d66ae83f81da354603f1f311092572a7d53688 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 31 Dec 2014 00:51:34 +0100 Subject: [PATCH 06/38] fixed text entity height --- examples/virtualKeyboardTextEntityExample.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/examples/virtualKeyboardTextEntityExample.js b/examples/virtualKeyboardTextEntityExample.js index 2d46397831..38beb08277 100644 --- a/examples/virtualKeyboardTextEntityExample.js +++ b/examples/virtualKeyboardTextEntityExample.js @@ -48,7 +48,7 @@ function deleteChar() { function updateTextOverlay() { var textLines = textText.split("\n"); - var suggestedFontSize = (windowDimensions.x / Overlays.textSize(text, textLines).width) * textFontSize * 0.90; + var suggestedFontSize = (windowDimensions.x / Overlays.textSize(text, textText).width) * textFontSize * 0.90; var maxFontSize = 170 / textLines.length; textFontSize = (suggestedFontSize > maxFontSize) ? maxFontSize : suggestedFontSize; var topMargin = (250 - (textFontSize * textLines.length)) / 4; @@ -76,13 +76,7 @@ keyboard.onKeyRelease = function(event) { var position = Vec3.sum(MyAvatar.position, Vec3.multiply(Quat.getFront(MyAvatar.orientation), SPAWN_DISTANCE)); var textLines = textText.split("\n"); - var maxLineWidth = 0; - for (textLine in textLines) { - var lineWidth = Overlays.textSize(textSizeMeasureOverlay, textLines[textLine]).width; - if (lineWidth > maxLineWidth) { - maxLineWidth = lineWidth; - } - } + var maxLineWidth = Overlays.textSize(textSizeMeasureOverlay, textText).width; var usernameLine = "--" + GlobalServices.myUsername; var usernameWidth = Overlays.textSize(textSizeMeasureOverlay, usernameLine).width; if (maxLineWidth < usernameWidth) { @@ -104,7 +98,8 @@ keyboard.onKeyRelease = function(event) { dimensions: { x: dimension_x, y: (textLines.length + 1) * 0.14 + TEXT_MARGIN_TOP + TEXT_MARGIN_BOTTOM, z: DEFAULT_TEXT_DIMENSION_Z }, backgroundColor: { red: 0, green: 0, blue: 0 }, textColor: { red: 255, green: 255, blue: 255 }, - text: textText + "\n" + usernameLine + text: textText + "\n" + usernameLine, + lineHeight: 0.1 }); } textText = ""; From e856d302d38bee8d4ab9d421e78674842d757819 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 31 Dec 2014 01:37:51 +0100 Subject: [PATCH 07/38] - improved keyboard visibility setting - added posibility to teleport to location through hmd --- examples/libraries/virtualKeyboard.js | 19 ++++-- examples/virtualKeyboardLocation.js | 88 +++++---------------------- 2 files changed, 28 insertions(+), 79 deletions(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 9e5fd4accb..7e18ba1b5c 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -169,7 +169,8 @@ KeyboardKey = (function(keyboard, keyProperties) { width: this.bounds[i][BOUND_W] * keyboard.scale, height: this.bounds[i][BOUND_H] * keyboard.scale, subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, - alpha: 1 + alpha: 1, + visible: tthis.keyboard.visible }); } else { Overlays.editOverlay(newOverlay, { @@ -178,19 +179,20 @@ KeyboardKey = (function(keyboard, keyProperties) { width: this.bounds[i][BOUND_W] * keyboard.scale, height: this.bounds[i][BOUND_H] * keyboard.scale, subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, - alpha: 1 + alpha: 1, + visible: tthis.keyboard.visible }); } this.overlays.push(newOverlay); } }); -Keyboard = (function() { +Keyboard = (function(params) { var tthis = this; this.focussed_key = -1; this.scale = (windowDimensions.x / KEYBOARD_WIDTH) * KEYBOARD_SCALE_MULTIPLIER; this.shift = false; - this.visible = true; + this.visible = params.visible != undefined ? params.visible :true; this.width = function() { return KEYBOARD_WIDTH * tthis.scale; }; @@ -213,7 +215,8 @@ Keyboard = (function() { subImage: {width: KEYBOARD_WIDTH, height: KEYBOARD_HEIGHT, y: KEYBOARD_HEIGHT * KBD_BACKGROUND}, isFacingAvatar: false, url: KEYBOARD_URL, - alpha: 1 + alpha: 1, + visible: this.visible }); } else { this.background = Overlays.addOverlay("image", { @@ -223,7 +226,8 @@ Keyboard = (function() { height: this.height(), subImage: {width: KEYBOARD_WIDTH, height: KEYBOARD_HEIGHT, y: KEYBOARD_HEIGHT * KBD_BACKGROUND}, imageURL: KEYBOARD_URL, - alpha: 1 + alpha: 1, + visible: this.visible }); } this.rescale = function() { @@ -265,6 +269,9 @@ Keyboard = (function() { }; this.pressFocussedKey = function() { + if (!tthis.visible) { + return tthis; + } if (tthis.focussed_key != -1) { if (tthis.keys[tthis.focussed_key].event == 'shift') { tthis.toggleShift(); diff --git a/examples/virtualKeyboardLocation.js b/examples/virtualKeyboardLocation.js index eae6c982b2..2ff98c4c43 100644 --- a/examples/virtualKeyboardLocation.js +++ b/examples/virtualKeyboardLocation.js @@ -18,64 +18,40 @@ Script.include("libraries/virtualKeyboard.js"); -const SPAWN_DISTANCE = 1; -const DEFAULT_TEXT_DIMENSION_Z = 0.02; - -const TEXT_MARGIN_TOP = 0.15; -const TEXT_MARGIN_LEFT = 0.15; -const TEXT_MARGIN_RIGHT = 0.17; -const TEXT_MARGIN_BOTTOM = 0.17; - var windowDimensions = Controller.getViewportDimensions(); var cursor = null; -var keyboard = new Keyboard(); +var keyboard = new Keyboard({visible: false}); var textFontSize = 9; var text = null; -var textText = ""; -var textSizeMeasureOverlay = Overlays.addOverlay("text3d", {visible: false}); +var locationURL = ""; function appendChar(char) { - textText += char; + locationURL += char; updateTextOverlay(); - Overlays.editOverlay(text, {text: textText}); + Overlays.editOverlay(text, {text: locationURL}); } function deleteChar() { - if (textText.length > 0) { - textText = textText.substring(0, textText.length - 1); + if (locationURL.length > 0) { + locationURL = locationURL.substring(0, locationURL.length - 1); updateTextOverlay(); } } function updateTextOverlay() { - var textLines = textText.split("\n"); - var maxLineWidth = 0; - for (textLine in textLines) { - var lineWidth = Overlays.textSize(text, textLines[textLine]).width; - if (lineWidth > maxLineWidth) { - maxLineWidth = lineWidth; - } - } + var maxLineWidth = Overlays.textSize(text, locationURL).width; var suggestedFontSize = (windowDimensions.x / maxLineWidth) * textFontSize * 0.90; - var maxFontSize = 190 / textLines.length; + var maxFontSize = 140; textFontSize = (suggestedFontSize > maxFontSize) ? maxFontSize : suggestedFontSize; - var topMargin = (250 - (textFontSize * textLines.length)) / 4; - Overlays.editOverlay(text, {text: textText, font: {size: textFontSize}, topMargin: topMargin}); - var maxLineWidth = 0; - for (textLine in textLines) { - var lineWidth = Overlays.textSize(text, textLines[textLine]).width; - if (lineWidth > maxLineWidth) { - maxLineWidth = lineWidth; - } - } + var topMargin = (250 - textFontSize) / 4; + Overlays.editOverlay(text, {text: locationURL, font: {size: textFontSize}, topMargin: topMargin}); + maxLineWidth = Overlays.textSize(text, locationURL).width; Overlays.editOverlay(text, {leftMargin: (windowDimensions.x - maxLineWidth) / 2}); } keyboard.onKeyPress = function(event) { if (event.event == 'keypress') { appendChar(event.char); - } else if (event.event == 'enter') { - appendChar("\n"); } }; @@ -85,44 +61,10 @@ keyboard.onKeyRelease = function(event) { if (event.focus) { if (event.event == 'delete') { deleteChar(); - } else if (event.event == 'submit') { - print(textText); - - var position = Vec3.sum(MyAvatar.position, Vec3.multiply(Quat.getFront(MyAvatar.orientation), SPAWN_DISTANCE)); - - var textLines = textText.split("\n"); - var maxLineWidth = 0; - for (textLine in textLines) { - var lineWidth = Overlays.textSize(textSizeMeasureOverlay, textLines[textLine]).width; - if (lineWidth > maxLineWidth) { - maxLineWidth = lineWidth; - } - } - var usernameLine = "--" + GlobalServices.myUsername; - var usernameWidth = Overlays.textSize(textSizeMeasureOverlay, usernameLine).width; - if (maxLineWidth < usernameWidth) { - maxLineWidth = usernameWidth; - } else { - var spaceableWidth = maxLineWidth - usernameWidth; - var spaceWidth = Overlays.textSize(textSizeMeasureOverlay, " ").width; - var numberOfSpaces = Math.floor(spaceableWidth / spaceWidth); - for (var i = 0; i < numberOfSpaces; i++) { - usernameLine = " " + usernameLine; - } - } - var dimension_x = maxLineWidth + TEXT_MARGIN_RIGHT + TEXT_MARGIN_LEFT; - if (position.x > 0 && position.y > 0 && position.z > 0) { - Entities.addEntity({ - type: "Text", - rotation: MyAvatar.orientation, - position: position, - dimensions: { x: dimension_x, y: (textLines.length + 1) * 0.14 + TEXT_MARGIN_TOP + TEXT_MARGIN_BOTTOM, z: DEFAULT_TEXT_DIMENSION_Z }, - backgroundColor: { red: 0, green: 0, blue: 0 }, - textColor: { red: 255, green: 255, blue: 255 }, - text: textText + "\n" + usernameLine - }); - } - textText = ""; + } else if (event.event == 'submit' || event.event == 'enter') { + print("going to hifi://" + locationURL); + location = "hifi://" + locationURL; + locationURL = ""; updateTextOverlay(); } } From 1365ecede309a2e774729aeba19a085dc2ca9b6e Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 31 Dec 2014 01:42:19 +0100 Subject: [PATCH 08/38] removed unused variables --- examples/libraries/virtualKeyboard.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 7e18ba1b5c..98d8bdf561 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -44,9 +44,6 @@ KEYBOARD_SCALE_MULTIPLIER = 0.50; const VIEW_ANGLE = 40.0; const VIEW_ANGLE_BY_TWO = VIEW_ANGLE / 2; -const SPAWN_DISTANCE = 1; -const DEFAULT_TEXT_DIMENSION_Z = 0.02; - const BOUND_X = 0; const BOUND_Y = 1; const BOUND_W = 2; @@ -55,13 +52,7 @@ const BOUND_H = 3; KEY_STATE_LOWER = 0; KEY_STATE_UPPER = 1; -const TEXT_MARGIN_TOP = 0.15; -const TEXT_MARGIN_LEFT = 0.15; -const TEXT_MARGIN_RIGHT = 0.17; -const TEXT_MARGIN_BOTTOM = 0.17; - var windowDimensions = Controller.getViewportDimensions(); -var cursor = null; KeyboardKey = (function(keyboard, keyProperties) { var tthis = this; From a0e209276b81c42d51044b9f8bd5a9067075173c Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 31 Dec 2014 01:46:01 +0100 Subject: [PATCH 09/38] textbox visibility --- examples/virtualKeyboardLocation.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/virtualKeyboardLocation.js b/examples/virtualKeyboardLocation.js index 2ff98c4c43..c07877f2f1 100644 --- a/examples/virtualKeyboardLocation.js +++ b/examples/virtualKeyboardLocation.js @@ -84,7 +84,8 @@ keyboard.onFullyLoaded = function() { leftMargin: 0, font: {size: textFontSize}, text: "", - alpha: 0.8 + alpha: 0.8, + visible: keyboard.visible }); updateTextOverlay(); // the cursor is being loaded after the keyboard, else it will be on the background of the keyboard @@ -99,8 +100,8 @@ function keyPressEvent(event) { keyboard.pressFocussedKey(); } else if (event.key === ENTER_CHARCODE || event.key === RETURN_CHARCODE) { keyboard.toggle(); + Overlays.editOverlay(text, {visible: keyboard.visible}); } - } function keyReleaseEvent(event) { From 33a4f8030054cc3c63a0e6f6d8d954fdfadb022f Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 31 Dec 2014 01:49:01 +0100 Subject: [PATCH 10/38] hide keyboard after submit --- examples/virtualKeyboardLocation.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/virtualKeyboardLocation.js b/examples/virtualKeyboardLocation.js index c07877f2f1..839fa6e743 100644 --- a/examples/virtualKeyboardLocation.js +++ b/examples/virtualKeyboardLocation.js @@ -44,7 +44,7 @@ function updateTextOverlay() { var maxFontSize = 140; textFontSize = (suggestedFontSize > maxFontSize) ? maxFontSize : suggestedFontSize; var topMargin = (250 - textFontSize) / 4; - Overlays.editOverlay(text, {text: locationURL, font: {size: textFontSize}, topMargin: topMargin}); + Overlays.editOverlay(text, {text: locationURL, font: {size: textFontSize}, topMargin: topMargin, visible: keyboard.visible}); maxLineWidth = Overlays.textSize(text, locationURL).width; Overlays.editOverlay(text, {leftMargin: (windowDimensions.x - maxLineWidth) / 2}); } @@ -65,6 +65,7 @@ keyboard.onKeyRelease = function(event) { print("going to hifi://" + locationURL); location = "hifi://" + locationURL; locationURL = ""; + keyboard.hide(); updateTextOverlay(); } } From 398e88107cbe9a391f05f46564c4e1f6137d464e Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 31 Dec 2014 01:53:10 +0100 Subject: [PATCH 11/38] renamed virtualKeyboardLocation.js to goTo.js as discussed --- examples/{virtualKeyboardLocation.js => goTo.js} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename examples/{virtualKeyboardLocation.js => goTo.js} (99%) diff --git a/examples/virtualKeyboardLocation.js b/examples/goTo.js similarity index 99% rename from examples/virtualKeyboardLocation.js rename to examples/goTo.js index 839fa6e743..13114024ed 100644 --- a/examples/virtualKeyboardLocation.js +++ b/examples/goTo.js @@ -1,5 +1,5 @@ // -// virtualKeyboardTextEntityExample.js +// goTo.js // examples // // Created by Thijs Wenker on 12/28/14. From c73b496cacaafb995762a1d72fae50b3b3dcb62a Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 31 Dec 2014 02:25:55 +0100 Subject: [PATCH 12/38] press X button with gamepad --- examples/goTo.js | 15 +++++++++++++++ examples/libraries/virtualKeyboard.js | 3 +++ examples/virtualKeyboardTextEntityExample.js | 15 +++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/examples/goTo.js b/examples/goTo.js index 13114024ed..ef93bc9268 100644 --- a/examples/goTo.js +++ b/examples/goTo.js @@ -121,6 +121,21 @@ function scriptEnding() { Controller.releaseKeyEvents({key: ENTER_CHARCODE}); } +function reportButtonValue(button, newValue, oldValue) { + if (button == Joysticks.BUTTON_FACE_LEFT) { + if (newValue) { + keyboard.pressFocussedKey(); + } else { + keyboard.releaseKeys(); + } + } +} + +function addJoystick(gamepad) { + gamepad.buttonStateChanged.connect(reportButtonValue); +} + +Joysticks.joystickAdded.connect(addJoystick); Controller.captureKeyEvents({key: RETURN_CHARCODE}); Controller.captureKeyEvents({key: ENTER_CHARCODE}); Controller.captureKeyEvents({key: SPACEBAR_CHARCODE}); diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 98d8bdf561..492b49a4aa 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -179,6 +179,9 @@ KeyboardKey = (function(keyboard, keyProperties) { }); Keyboard = (function(params) { + if (params === undefined) { + params = {}; + } var tthis = this; this.focussed_key = -1; this.scale = (windowDimensions.x / KEYBOARD_WIDTH) * KEYBOARD_SCALE_MULTIPLIER; diff --git a/examples/virtualKeyboardTextEntityExample.js b/examples/virtualKeyboardTextEntityExample.js index 38beb08277..a6960d209a 100644 --- a/examples/virtualKeyboardTextEntityExample.js +++ b/examples/virtualKeyboardTextEntityExample.js @@ -152,6 +152,21 @@ function scriptEnding() { Controller.releaseKeyEvents({key: SPACEBAR_CHARCODE}); } +function reportButtonValue(button, newValue, oldValue) { + if (button == Joysticks.BUTTON_FACE_LEFT) { + if (newValue) { + keyboard.pressFocussedKey(); + } else { + keyboard.releaseKeys(); + } + } +} + +function addJoystick(gamepad) { + gamepad.buttonStateChanged.connect(reportButtonValue); +} + +Joysticks.joystickAdded.connect(addJoystick); Controller.captureKeyEvents({key: SPACEBAR_CHARCODE}); Controller.keyPressEvent.connect(keyPressEvent); Controller.keyReleaseEvent.connect(keyReleaseEvent); From 19eec811731f5fd7c8e5ccacf8edeb29a4d0d0b0 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 7 Jan 2015 20:46:39 +0100 Subject: [PATCH 13/38] moved goTo.js and virtualKeyboardTextEntityExample.js to the right category folder --- examples/{ => controllers/oculus}/goTo.js | 0 .../{ => controllers/oculus}/virtualKeyboardTextEntityExample.js | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename examples/{ => controllers/oculus}/goTo.js (100%) rename examples/{ => controllers/oculus}/virtualKeyboardTextEntityExample.js (100%) diff --git a/examples/goTo.js b/examples/controllers/oculus/goTo.js similarity index 100% rename from examples/goTo.js rename to examples/controllers/oculus/goTo.js diff --git a/examples/virtualKeyboardTextEntityExample.js b/examples/controllers/oculus/virtualKeyboardTextEntityExample.js similarity index 100% rename from examples/virtualKeyboardTextEntityExample.js rename to examples/controllers/oculus/virtualKeyboardTextEntityExample.js From ff6cae738b5ba26d43b25cb58c54b8c5291fb783 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 7 Jan 2015 20:47:59 +0100 Subject: [PATCH 14/38] fixed library paths --- examples/controllers/oculus/goTo.js | 2 +- examples/controllers/oculus/virtualKeyboardTextEntityExample.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index ef93bc9268..50d44d0a28 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -16,7 +16,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -Script.include("libraries/virtualKeyboard.js"); +Script.include("../../libraries/virtualKeyboard.js"); var windowDimensions = Controller.getViewportDimensions(); var cursor = null; diff --git a/examples/controllers/oculus/virtualKeyboardTextEntityExample.js b/examples/controllers/oculus/virtualKeyboardTextEntityExample.js index a6960d209a..9c5ba6dfe5 100644 --- a/examples/controllers/oculus/virtualKeyboardTextEntityExample.js +++ b/examples/controllers/oculus/virtualKeyboardTextEntityExample.js @@ -15,7 +15,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -Script.include("libraries/virtualKeyboard.js"); +Script.include("../../libraries/virtualKeyboard.js"); const SPAWN_DISTANCE = 1; const DEFAULT_TEXT_DIMENSION_Z = 0.02; From 4fdcdf095c9af35f2f77e22340eb771dbe440860 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 7 Jan 2015 21:27:14 +0100 Subject: [PATCH 15/38] trying to fix url --- examples/libraries/virtualKeyboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 492b49a4aa..aab590e63f 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -13,7 +13,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -Script.include("libraries/globals.js"); +Script.include("globals.js"); // experimental 3dmode THREE_D_MODE = false; From 6771252eab69c000631d82c48ff02a603eb0bb76 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 7 Jan 2015 21:34:34 +0100 Subject: [PATCH 16/38] seems like you need to offset the include from the script that uses it --- examples/libraries/virtualKeyboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index aab590e63f..893ed929d6 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -13,7 +13,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -Script.include("globals.js"); +Script.include("../../libraries/globals.js"); // experimental 3dmode THREE_D_MODE = false; From 527576eebad6a0ec63b1b2bd081afa72d32ae6c1 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 7 Jan 2015 21:38:31 +0100 Subject: [PATCH 17/38] or not... --- examples/libraries/virtualKeyboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 893ed929d6..aab590e63f 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -13,7 +13,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -Script.include("../../libraries/globals.js"); +Script.include("globals.js"); // experimental 3dmode THREE_D_MODE = false; From 40b4a17ba803de674993a1777b27b93564776f35 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 7 Jan 2015 23:14:31 +0100 Subject: [PATCH 18/38] include globals.js from runnable scripts for now. --- examples/controllers/oculus/goTo.js | 1 + examples/controllers/oculus/virtualKeyboardTextEntityExample.js | 1 + examples/libraries/virtualKeyboard.js | 2 -- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index 50d44d0a28..3423716698 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -16,6 +16,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +Script.include("../../libraries/globals.js"); Script.include("../../libraries/virtualKeyboard.js"); var windowDimensions = Controller.getViewportDimensions(); diff --git a/examples/controllers/oculus/virtualKeyboardTextEntityExample.js b/examples/controllers/oculus/virtualKeyboardTextEntityExample.js index 9c5ba6dfe5..a5f5b2bf95 100644 --- a/examples/controllers/oculus/virtualKeyboardTextEntityExample.js +++ b/examples/controllers/oculus/virtualKeyboardTextEntityExample.js @@ -15,6 +15,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +Script.include("../../libraries/globals.js"); Script.include("../../libraries/virtualKeyboard.js"); const SPAWN_DISTANCE = 1; diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index aab590e63f..854ca58d1d 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -13,8 +13,6 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -Script.include("globals.js"); - // experimental 3dmode THREE_D_MODE = false; From c791422fabf1ce844434242967b7e5ef3ab85eef Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 8 Jan 2015 02:22:08 +0100 Subject: [PATCH 19/38] make gamepads and A (select key) and B (delete character) button function --- examples/controllers/oculus/goTo.js | 9 ++++++++- .../oculus/virtualKeyboardTextEntityExample.js | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index 3423716698..ba1ee1eb81 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -123,12 +123,14 @@ function scriptEnding() { } function reportButtonValue(button, newValue, oldValue) { - if (button == Joysticks.BUTTON_FACE_LEFT) { + if (button == Joysticks.BUTTON_FACE_BOTTOM) { if (newValue) { keyboard.pressFocussedKey(); } else { keyboard.releaseKeys(); } + } else if (button == Joysticks.BUTTON_FACE_RIGHT && newValue) { + deleteChar(); } } @@ -136,6 +138,11 @@ function addJoystick(gamepad) { gamepad.buttonStateChanged.connect(reportButtonValue); } +var allJoysticks = Joysticks.getAllJoysticks(); +for (var i = 0; i < allJoysticks.length; i++) { + addJoystick(allJoysticks[i]); +} + Joysticks.joystickAdded.connect(addJoystick); Controller.captureKeyEvents({key: RETURN_CHARCODE}); Controller.captureKeyEvents({key: ENTER_CHARCODE}); diff --git a/examples/controllers/oculus/virtualKeyboardTextEntityExample.js b/examples/controllers/oculus/virtualKeyboardTextEntityExample.js index a5f5b2bf95..794b659bcb 100644 --- a/examples/controllers/oculus/virtualKeyboardTextEntityExample.js +++ b/examples/controllers/oculus/virtualKeyboardTextEntityExample.js @@ -154,12 +154,14 @@ function scriptEnding() { } function reportButtonValue(button, newValue, oldValue) { - if (button == Joysticks.BUTTON_FACE_LEFT) { + if (button == Joysticks.BUTTON_FACE_BOTTOM) { if (newValue) { keyboard.pressFocussedKey(); } else { keyboard.releaseKeys(); } + } else if (button == Joysticks.BUTTON_FACE_RIGHT && newValue) { + deleteChar(); } } @@ -167,6 +169,11 @@ function addJoystick(gamepad) { gamepad.buttonStateChanged.connect(reportButtonValue); } +var allJoysticks = Joysticks.getAllJoysticks(); +for (var i = 0; i < allJoysticks.length; i++) { + addJoystick(allJoysticks[i]); +} + Joysticks.joystickAdded.connect(addJoystick); Controller.captureKeyEvents({key: SPACEBAR_CHARCODE}); Controller.keyPressEvent.connect(keyPressEvent); From 3da5677aafadbb6961951db3118f274412a87257 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Tue, 13 Jan 2015 00:43:16 +0100 Subject: [PATCH 20/38] added HMD interface to toggle magnifier --- interface/src/Application.cpp | 3 ++ .../src/scripting/HMDScriptingInterface.cpp | 17 ++++++++++ .../src/scripting/HMDScriptingInterface.h | 32 +++++++++++++++++++ interface/src/ui/ApplicationOverlay.cpp | 3 +- interface/src/ui/ApplicationOverlay.h | 6 +++- 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 interface/src/scripting/HMDScriptingInterface.cpp create mode 100644 interface/src/scripting/HMDScriptingInterface.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1364e1b05b..6260634e25 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -101,6 +101,7 @@ #include "scripting/AccountScriptingInterface.h" #include "scripting/AudioDeviceScriptingInterface.h" #include "scripting/ClipboardScriptingInterface.h" +#include "scripting/HMDScriptingInterface.h" #include "scripting/JoystickScriptingInterface.h" #include "scripting/GlobalServicesScriptingInterface.h" #include "scripting/LocationScriptingInterface.h" @@ -3445,6 +3446,8 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->registerGlobalObject("UndoStack", &_undoStackScriptingInterface); + scriptEngine->registerGlobalObject("HMD", &HMDScriptingInterface::getInstance()); + #ifdef HAVE_RTMIDI scriptEngine->registerGlobalObject("MIDI", &MIDIManager::getInstance()); #endif diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp new file mode 100644 index 0000000000..b9b9b103e4 --- /dev/null +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -0,0 +1,17 @@ +// +// HMDScriptingInterface.cpp +// interface/src/scripting +// +// Created by Thijs Wenker on 1/12/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "HMDScriptingInterface.h" + +HMDScriptingInterface& HMDScriptingInterface::getInstance() { + static HMDScriptingInterface sharedInstance; + return sharedInstance; +} diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h new file mode 100644 index 0000000000..4852d9ae6e --- /dev/null +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -0,0 +1,32 @@ +// +// HMDScriptingInterface.h +// interface/src/scripting +// +// Created by Thijs Wenker on 1/12/15. +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_HMDScriptingInterface_h +#define hifi_HMDScriptingInterface_h + +#include "Application.h" + +class HMDScriptingInterface : public QObject { + Q_OBJECT + Q_PROPERTY(bool magnifier READ getMagnifier) +public: + static HMDScriptingInterface& getInstance(); + +public slots: + void toggleMagnifier() { Application::getInstance()->getApplicationOverlay().toggleMagnifier(); }; + +private: + HMDScriptingInterface() {}; + bool getMagnifier() const { return Application::getInstance()->getApplicationOverlay().hasMagnifier(); }; + +}; + +#endif // hifi_HMDScriptingInterface_h diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 1d710f29d4..b2bf821af8 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -131,6 +131,7 @@ ApplicationOverlay::ApplicationOverlay() : _alpha(1.0f), _oculusUIRadius(1.0f), _crosshairTexture(0), + _magnifier(true), _previousBorderWidth(-1), _previousBorderHeight(-1), _previousMagnifierBottomLeft(), @@ -555,7 +556,7 @@ void ApplicationOverlay::renderPointers() { _reticlePosition[MOUSE] = position; _reticleActive[MOUSE] = true; - _magActive[MOUSE] = true; + _magActive[MOUSE] = _magnifier; _reticleActive[LEFT_CONTROLLER] = false; _reticleActive[RIGHT_CONTROLLER] = false; } else if (application->getLastMouseMoveWasSimulated() && Menu::getInstance()->isOptionChecked(MenuOption::SixenseMouseInput)) { diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index e2094f2a8e..554dd5152e 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -34,6 +34,9 @@ public: QPoint getPalmClickLocation(const PalmData *palm) const; bool calculateRayUICollisionPoint(const glm::vec3& position, const glm::vec3& direction, glm::vec3& result) const; + bool hasMagnifier() const { return _magnifier; } + void toggleMagnifier() { _magnifier = !_magnifier; } + // Converter from one frame of reference to another. // Frame of reference: // Screen: Position on the screen (x,y) @@ -101,7 +104,8 @@ private: bool _magActive[NUMBER_OF_RETICLES]; float _magSizeMult[NUMBER_OF_RETICLES]; quint64 _lastMouseMove; - + bool _magnifier; + float _alpha; float _oculusUIRadius; float _trailingAudioLoudness; From ca4d493ec9b831c9b816e45b51af5e1a3c19326d Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 14 Jan 2015 00:01:50 +0100 Subject: [PATCH 21/38] added HMD.VRMode to HMDScriptingInterface --- interface/src/scripting/HMDScriptingInterface.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index 4852d9ae6e..e2ffc514cd 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -13,10 +13,12 @@ #define hifi_HMDScriptingInterface_h #include "Application.h" +#include "devices/OculusManager.h" class HMDScriptingInterface : public QObject { Q_OBJECT Q_PROPERTY(bool magnifier READ getMagnifier) + Q_PROPERTY(bool VRMode READ getVRMode) public: static HMDScriptingInterface& getInstance(); @@ -26,6 +28,7 @@ public slots: private: HMDScriptingInterface() {}; bool getMagnifier() const { return Application::getInstance()->getApplicationOverlay().hasMagnifier(); }; + bool getVRMode() const { return OculusManager::isConnected(); } }; From 0f6ad4eba02c55447b7e70332e854d16a24687d1 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 14 Jan 2015 00:07:15 +0100 Subject: [PATCH 22/38] HMD.VRMode -> HMD.active , and hooked it to a function which isn't dependent on HMD type, since there will be more HMD's than Oculus supported in the near future. --- interface/src/scripting/HMDScriptingInterface.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index e2ffc514cd..2c485195e5 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -13,12 +13,11 @@ #define hifi_HMDScriptingInterface_h #include "Application.h" -#include "devices/OculusManager.h" class HMDScriptingInterface : public QObject { Q_OBJECT Q_PROPERTY(bool magnifier READ getMagnifier) - Q_PROPERTY(bool VRMode READ getVRMode) + Q_PROPERTY(bool active READ isHMDMode) public: static HMDScriptingInterface& getInstance(); @@ -28,7 +27,7 @@ public slots: private: HMDScriptingInterface() {}; bool getMagnifier() const { return Application::getInstance()->getApplicationOverlay().hasMagnifier(); }; - bool getVRMode() const { return OculusManager::isConnected(); } + bool isHMDMode() const { return Application::getInstance()->isHMDMode(); } }; From 38d49854cbfa8254fbdf79de0274bdcac7609383 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 14 Jan 2015 01:06:44 +0100 Subject: [PATCH 23/38] hide cursor --- examples/controllers/oculus/goTo.js | 7 +++-- examples/libraries/virtualKeyboard.js | 38 +++++++++++++++++++-------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index ba1ee1eb81..3966c28a5c 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -20,7 +20,7 @@ Script.include("../../libraries/globals.js"); Script.include("../../libraries/virtualKeyboard.js"); var windowDimensions = Controller.getViewportDimensions(); -var cursor = null; +var cursor = new Cursor({visible: false}); var keyboard = new Keyboard({visible: false}); var textFontSize = 9; var text = null; @@ -91,7 +91,7 @@ keyboard.onFullyLoaded = function() { }); updateTextOverlay(); // the cursor is being loaded after the keyboard, else it will be on the background of the keyboard - cursor = new Cursor(); + cursor.updateVisibility(keyboard.visible); cursor.onUpdate = function(position) { keyboard.setFocusPosition(position.x, position.y); }; @@ -102,6 +102,9 @@ function keyPressEvent(event) { keyboard.pressFocussedKey(); } else if (event.key === ENTER_CHARCODE || event.key === RETURN_CHARCODE) { keyboard.toggle(); + if (cursor !== undefined) { + cursor.updateVisibility(keyboard.visible); + } Overlays.editOverlay(text, {visible: keyboard.visible}); } } diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 854ca58d1d..d93e569af5 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -184,7 +184,7 @@ Keyboard = (function(params) { this.focussed_key = -1; this.scale = (windowDimensions.x / KEYBOARD_WIDTH) * KEYBOARD_SCALE_MULTIPLIER; this.shift = false; - this.visible = params.visible != undefined ? params.visible :true; + this.visible = params.visible != undefined ? params.visible : true; this.width = function() { return KEYBOARD_WIDTH * tthis.scale; }; @@ -320,21 +320,19 @@ Keyboard = (function(params) { }; this.show = function() { - tthis.visible = true; - tthis.updateVisibility(); + tthis.updateVisibility(true); }; this.hide = function() { - tthis.visible = false; - tthis.updateVisibility(); + tthis.updateVisibility(false); }; this.toggle = function() { - tthis.visible = !tthis.visible; - tthis.updateVisibility(); + tthis.updateVisibility(!tthis.visible); }; - - this.updateVisibility = function() { + + this.updateVisibility = function(visible) { + tthis.visible = visible; Overlays.editOverlay(tthis.background, { visible: tthis.visible }); for (var i = 0; i < this.keys.length; i++) { this.keys[i].updateVisibility(); @@ -454,8 +452,12 @@ Keyboard = (function(params) { this.keyboardTextureLoaded_timer = Script.setInterval(this.keyboardTextureLoaded, 250); }); -Cursor = (function() { +Cursor = (function(params) { + if (params === undefined) { + params = {}; + } var tthis = this; + this.visible = params.visible != undefined ? params.visible : true; this.x = windowDimensions.x / 2; this.y = windowDimensions.y / 2; this.overlay = Overlays.addOverlay("image", { @@ -464,7 +466,8 @@ Cursor = (function() { width: CURSOR_WIDTH, height: CURSOR_HEIGHT, imageURL: CURSOR_URL, - alpha: 1 + alpha: 1, + visible: this.visible }); this.remove = function() { Overlays.deleteOverlay(this.overlay); @@ -478,6 +481,19 @@ Cursor = (function() { this.getY = function() { return tthis.y; }; + this.show = function() { + tthis.updateVisibility(true); + }; + this.hide = function() { + tthis.updateVisibility(false); + }; + this.toggle = function() { + tthis.updateVisibility(!tthis.visible); + }; + this.updateVisibility = function(visible) { + tthis.visible = visible; + Overlays.editOverlay(this.overlay, { visible: tthis.visible }); + }; this.onUpdate = null; this.update = function() { var newWindowDimensions = Controller.getViewportDimensions(); From e3c55584702da79509f897601bdbb52843e0ddc2 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 14 Jan 2015 01:18:53 +0100 Subject: [PATCH 24/38] toggle magnifier when keyboard visibility changes --- examples/libraries/virtualKeyboard.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index d93e569af5..2671871fac 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -333,6 +333,9 @@ Keyboard = (function(params) { this.updateVisibility = function(visible) { tthis.visible = visible; + if (HMD.magnifier == visible) { + HMD.toggleMagnifier(); + } Overlays.editOverlay(tthis.background, { visible: tthis.visible }); for (var i = 0; i < this.keys.length; i++) { this.keys[i].updateVisibility(); From 12136e5305e9756e1770c6753339b140cb92c7d9 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 15 Jan 2015 22:25:59 +0100 Subject: [PATCH 25/38] cursor follows look at rotation now --- examples/controllers/oculus/goTo.js | 5 +- examples/libraries/virtualKeyboard.js | 134 +++++++++--------- .../src/scripting/HMDScriptingInterface.h | 20 +++ 3 files changed, 91 insertions(+), 68 deletions(-) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index 3966c28a5c..5038253e17 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -20,7 +20,7 @@ Script.include("../../libraries/globals.js"); Script.include("../../libraries/virtualKeyboard.js"); var windowDimensions = Controller.getViewportDimensions(); -var cursor = new Cursor({visible: false}); +var cursor = new Cursor({visible: false});; var keyboard = new Keyboard({visible: false}); var textFontSize = 9; var text = null; @@ -66,7 +66,7 @@ keyboard.onKeyRelease = function(event) { print("going to hifi://" + locationURL); location = "hifi://" + locationURL; locationURL = ""; - keyboard.hide(); + keyboard.hide(); updateTextOverlay(); } } @@ -91,6 +91,7 @@ keyboard.onFullyLoaded = function() { }); updateTextOverlay(); // the cursor is being loaded after the keyboard, else it will be on the background of the keyboard + cursor.initialize(); cursor.updateVisibility(keyboard.visible); cursor.onUpdate = function(position) { keyboard.setFocusPosition(position.x, position.y); diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 2671871fac..8035f9d701 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -460,71 +460,73 @@ Cursor = (function(params) { params = {}; } var tthis = this; - this.visible = params.visible != undefined ? params.visible : true; - this.x = windowDimensions.x / 2; - this.y = windowDimensions.y / 2; - this.overlay = Overlays.addOverlay("image", { - x: this.x, - y: this.y, - width: CURSOR_WIDTH, - height: CURSOR_HEIGHT, - imageURL: CURSOR_URL, - alpha: 1, - visible: this.visible - }); - this.remove = function() { - Overlays.deleteOverlay(this.overlay); + this.initialize = function() { + this.visible = params.visible != undefined ? params.visible : true; + this.x = windowDimensions.x / 2; + this.y = windowDimensions.y / 2; + this.overlay = Overlays.addOverlay("image", { + x: this.x, + y: this.y, + width: CURSOR_WIDTH, + height: CURSOR_HEIGHT, + imageURL: CURSOR_URL, + alpha: 1, + visible: this.visible + }); + this.remove = function() { + Overlays.deleteOverlay(this.overlay); + }; + this.getPosition = function() { + return {x: tthis.getX(), y: tthis.getY()}; + }; + this.getX = function() { + return tthis.x; + }; + this.getY = function() { + return tthis.y; + }; + this.show = function() { + tthis.updateVisibility(true); + }; + this.hide = function() { + tthis.updateVisibility(false); + }; + this.toggle = function() { + tthis.updateVisibility(!tthis.visible); + }; + this.updateVisibility = function(visible) { + tthis.visible = visible; + Overlays.editOverlay(this.overlay, { visible: tthis.visible }); + }; + this.onUpdate = null; + this.update = function() { + var newWindowDimensions = Controller.getViewportDimensions(); + if (newWindowDimensions.x != windowDimensions.x || newWindowDimensions.y != windowDimensions.y) { + windowDimensions = newWindowDimensions; + keyboard.rescale(); + Overlays.editOverlay(text, { + y: windowDimensions.y - keyboard.height() - 260, + width: windowDimensions.x + }); + } + var editobject = {}; + //if (MyAvatar.getHeadFinalYaw() <= VIEW_ANGLE_BY_TWO && MyAvatar.getHeadFinalYaw() >= -1 * VIEW_ANGLE_BY_TWO) { + //angle = ((-1 * MyAvatar.getHeadFinalYaw()) + VIEW_ANGLE_BY_TWO) / VIEW_ANGLE; + tthis.x = HMD.getHUDLookAtPositionX;//angle * windowDimensions.x; + editobject.x = tthis.x - (CURSOR_WIDTH / 2); + // } + // if (MyAvatar.getHeadFinalPitch() <= VIEW_ANGLE_BY_TWO && MyAvatar.getHeadFinalPitch() >= -1 * VIEW_ANGLE_BY_TWO) { + // angle = ((-1 * MyAvatar.getHeadFinalPitch()) + VIEW_ANGLE_BY_TWO) / VIEW_ANGLE; + tthis.y = HMD.getHUDLookAtPositionY;//angle * windowDimensions.y; + editobject.y = tthis.y - (CURSOR_HEIGHT / 2); + // } + if (Object.keys(editobject).length > 0) { + Overlays.editOverlay(tthis.overlay, editobject); + if (tthis.onUpdate != null) { + tthis.onUpdate(tthis.getPosition()); + } + } + }; + Script.update.connect(this.update); }; - this.getPosition = function() { - return {x: tthis.getX(), y: tthis.getY()}; - }; - this.getX = function() { - return tthis.x; - }; - this.getY = function() { - return tthis.y; - }; - this.show = function() { - tthis.updateVisibility(true); - }; - this.hide = function() { - tthis.updateVisibility(false); - }; - this.toggle = function() { - tthis.updateVisibility(!tthis.visible); - }; - this.updateVisibility = function(visible) { - tthis.visible = visible; - Overlays.editOverlay(this.overlay, { visible: tthis.visible }); - }; - this.onUpdate = null; - this.update = function() { - var newWindowDimensions = Controller.getViewportDimensions(); - if (newWindowDimensions.x != windowDimensions.x || newWindowDimensions.y != windowDimensions.y) { - windowDimensions = newWindowDimensions; - keyboard.rescale(); - Overlays.editOverlay(text, { - y: windowDimensions.y - keyboard.height() - 260, - width: windowDimensions.x - }); - } - var editobject = {}; - if (MyAvatar.getHeadFinalYaw() <= VIEW_ANGLE_BY_TWO && MyAvatar.getHeadFinalYaw() >= -1 * VIEW_ANGLE_BY_TWO) { - angle = ((-1 * MyAvatar.getHeadFinalYaw()) + VIEW_ANGLE_BY_TWO) / VIEW_ANGLE; - tthis.x = angle * windowDimensions.x; - editobject.x = tthis.x - (CURSOR_WIDTH / 2); - } - if (MyAvatar.getHeadFinalPitch() <= VIEW_ANGLE_BY_TWO && MyAvatar.getHeadFinalPitch() >= -1 * VIEW_ANGLE_BY_TWO) { - angle = ((-1 * MyAvatar.getHeadFinalPitch()) + VIEW_ANGLE_BY_TWO) / VIEW_ANGLE; - tthis.y = angle * windowDimensions.y; - editobject.y = tthis.y - (CURSOR_HEIGHT / 2); - } - if (Object.keys(editobject).length > 0) { - Overlays.editOverlay(tthis.overlay, editobject); - if (tthis.onUpdate != null) { - tthis.onUpdate(tthis.getPosition()); - } - } - }; - Script.update.connect(this.update); }); diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index 2c485195e5..a4950008eb 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -12,12 +12,17 @@ #ifndef hifi_HMDScriptingInterface_h #define hifi_HMDScriptingInterface_h +#include + #include "Application.h" +#include "devices/OculusManager.h" class HMDScriptingInterface : public QObject { Q_OBJECT Q_PROPERTY(bool magnifier READ getMagnifier) Q_PROPERTY(bool active READ isHMDMode) + Q_PROPERTY(float getHUDLookAtPositionX READ getHUDLookAtPositionX) + Q_PROPERTY(float getHUDLookAtPositionY READ getHUDLookAtPositionY) public: static HMDScriptingInterface& getInstance(); @@ -28,6 +33,21 @@ private: HMDScriptingInterface() {}; bool getMagnifier() const { return Application::getInstance()->getApplicationOverlay().hasMagnifier(); }; bool isHMDMode() const { return Application::getInstance()->isHMDMode(); } + float getHUDLookAtPositionX() const { + float pitch, yaw, roll; + OculusManager::getEulerAngles(yaw, pitch, roll); + glm::vec3 relativePos = OculusManager::getRelativePosition(); + glm::quat rotation = ::rotationBetween(glm::vec3(), relativePos); + glm::vec2 screenPos = Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(yaw, -pitch)); + + return screenPos.x; + } + float getHUDLookAtPositionY() const { + float pitch, yaw, roll; + OculusManager::getEulerAngles(yaw, pitch, roll); + glm::vec2 screenPos = Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(yaw, -pitch)); + return screenPos.y; + } }; From 9e51bece6325c7cc5660fd741bd6fd73ae73c2cc Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 21 Jan 2015 15:07:32 +0100 Subject: [PATCH 26/38] More accurate HMD-cursor on virtual keyboard, thanks Simon and @ctrlaltdavid for the help on this! --- examples/libraries/virtualKeyboard.js | 14 +++++----- interface/src/devices/OculusManager.cpp | 2 +- .../src/scripting/HMDScriptingInterface.cpp | 27 +++++++++++++++++++ .../src/scripting/HMDScriptingInterface.h | 21 +++------------ 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 8035f9d701..0b6ff49d71 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -510,16 +510,14 @@ Cursor = (function(params) { }); } var editobject = {}; - //if (MyAvatar.getHeadFinalYaw() <= VIEW_ANGLE_BY_TWO && MyAvatar.getHeadFinalYaw() >= -1 * VIEW_ANGLE_BY_TWO) { - //angle = ((-1 * MyAvatar.getHeadFinalYaw()) + VIEW_ANGLE_BY_TWO) / VIEW_ANGLE; - tthis.x = HMD.getHUDLookAtPositionX;//angle * windowDimensions.x; + if (tthis.x !== HMD.getHUDLookAtPosition2D.x) { + tthis.x = HMD.getHUDLookAtPosition2D.x; editobject.x = tthis.x - (CURSOR_WIDTH / 2); - // } - // if (MyAvatar.getHeadFinalPitch() <= VIEW_ANGLE_BY_TWO && MyAvatar.getHeadFinalPitch() >= -1 * VIEW_ANGLE_BY_TWO) { - // angle = ((-1 * MyAvatar.getHeadFinalPitch()) + VIEW_ANGLE_BY_TWO) / VIEW_ANGLE; - tthis.y = HMD.getHUDLookAtPositionY;//angle * windowDimensions.y; + } + if (tthis.y !== HMD.getHUDLookAtPosition2D.y) { + tthis.y = HMD.getHUDLookAtPosition2D.y; editobject.y = tthis.y - (CURSOR_HEIGHT / 2); - // } + } if (Object.keys(editobject).length > 0) { Overlays.editOverlay(tthis.overlay, editobject); if (tthis.onUpdate != null) { diff --git a/interface/src/devices/OculusManager.cpp b/interface/src/devices/OculusManager.cpp index 256c09f602..47279a40f9 100644 --- a/interface/src/devices/OculusManager.cpp +++ b/interface/src/devices/OculusManager.cpp @@ -685,7 +685,7 @@ void OculusManager::getEulerAngles(float& yaw, float& pitch, float& roll) { roll = 0.0f; #endif } - + glm::vec3 OculusManager::getRelativePosition() { #if (defined(__APPLE__) || defined(_WIN32)) && HAVE_LIBOVR ovrTrackingState trackingState = ovrHmd_GetTrackingState(_ovrHmd, ovr_GetTimeInSeconds()); diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index b9b9b103e4..caf37e27be 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -15,3 +15,30 @@ HMDScriptingInterface& HMDScriptingInterface::getInstance() { static HMDScriptingInterface sharedInstance; return sharedInstance; } + +glm::vec3 HMDScriptingInterface::getHUDLookAtPosition3D() const { + Camera* camera = Application::getInstance()->getCamera(); + glm::vec3 position = camera->getPosition(); + glm::quat orientation = camera->getOrientation(); + + glm::vec3 direction = orientation * glm::vec3(0.0f, 0.0f, -1.0f); + + ApplicationOverlay& applicationOverlay = Application::getInstance()->getApplicationOverlay(); + + glm::vec3 result; + applicationOverlay.calculateRayUICollisionPoint(position, direction, result); + return result; +} + +glm::vec2 HMDScriptingInterface::getHUDLookAtPosition2D() const { + MyAvatar* myAvatar = Application::getInstance()->getAvatar(); + glm::vec3 sphereCenter = myAvatar->getDefaultEyePosition(); + + glm::vec3 hudIntersection = getHUDLookAtPosition3D(); + + glm::vec3 direction = glm::inverse(myAvatar->getOrientation()) * (hudIntersection - sphereCenter); + glm::quat rotation = ::rotationBetween(glm::vec3(0.0f, 0.0f, -1.0f), direction); + glm::vec3 eulers = ::safeEulerAngles(rotation); + + return Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(eulers.y, -eulers.x));; +} diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index a4950008eb..cc148d5d5d 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -21,8 +21,8 @@ class HMDScriptingInterface : public QObject { Q_OBJECT Q_PROPERTY(bool magnifier READ getMagnifier) Q_PROPERTY(bool active READ isHMDMode) - Q_PROPERTY(float getHUDLookAtPositionX READ getHUDLookAtPositionX) - Q_PROPERTY(float getHUDLookAtPositionY READ getHUDLookAtPositionY) + Q_PROPERTY(glm::vec3 HUDLookAtPosition3D READ getHUDLookAtPosition3D) + Q_PROPERTY(glm::vec2 HUDLookAtPosition2D READ getHUDLookAtPosition2D) public: static HMDScriptingInterface& getInstance(); @@ -33,22 +33,9 @@ private: HMDScriptingInterface() {}; bool getMagnifier() const { return Application::getInstance()->getApplicationOverlay().hasMagnifier(); }; bool isHMDMode() const { return Application::getInstance()->isHMDMode(); } - float getHUDLookAtPositionX() const { - float pitch, yaw, roll; - OculusManager::getEulerAngles(yaw, pitch, roll); - glm::vec3 relativePos = OculusManager::getRelativePosition(); - glm::quat rotation = ::rotationBetween(glm::vec3(), relativePos); - glm::vec2 screenPos = Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(yaw, -pitch)); - - return screenPos.x; - } - float getHUDLookAtPositionY() const { - float pitch, yaw, roll; - OculusManager::getEulerAngles(yaw, pitch, roll); - glm::vec2 screenPos = Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(yaw, -pitch)); - return screenPos.y; - } + glm::vec3 getHUDLookAtPosition3D() const; + glm::vec2 getHUDLookAtPosition2D() const; }; #endif // hifi_HMDScriptingInterface_h From 87b2c362fc02aa6a86a125d865e33f7c34612460 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 21 Jan 2015 17:19:51 +0100 Subject: [PATCH 27/38] style --- interface/src/scripting/HMDScriptingInterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index caf37e27be..e2d150e390 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -40,5 +40,5 @@ glm::vec2 HMDScriptingInterface::getHUDLookAtPosition2D() const { glm::quat rotation = ::rotationBetween(glm::vec3(0.0f, 0.0f, -1.0f), direction); glm::vec3 eulers = ::safeEulerAngles(rotation); - return Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(eulers.y, -eulers.x));; + return Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(eulers.y, -eulers.x)); } From 724b56ed8c1eb63929f7ccdd9826435d6a11eaee Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 22 Jan 2015 01:09:16 +0100 Subject: [PATCH 28/38] HMD.getHUDLookAtPosition2D -> HMD.HUDLookAtPosition2D --- examples/libraries/virtualKeyboard.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 0b6ff49d71..c62498685c 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -510,12 +510,12 @@ Cursor = (function(params) { }); } var editobject = {}; - if (tthis.x !== HMD.getHUDLookAtPosition2D.x) { - tthis.x = HMD.getHUDLookAtPosition2D.x; + if (tthis.x !== HMD.HUDLookAtPosition2D.x) { + tthis.x = HMD.HUDLookAtPosition2D.x; editobject.x = tthis.x - (CURSOR_WIDTH / 2); } - if (tthis.y !== HMD.getHUDLookAtPosition2D.y) { - tthis.y = HMD.getHUDLookAtPosition2D.y; + if (tthis.y !== HMD.HUDLookAtPosition2D.y) { + tthis.y = HMD.HUDLookAtPosition2D.y; editobject.y = tthis.y - (CURSOR_HEIGHT / 2); } if (Object.keys(editobject).length > 0) { From 3e4f4ecc6b97dd050a43c052842daa90bca9e781 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 28 Jan 2015 00:39:19 +0100 Subject: [PATCH 29/38] addOverlay rather than cloneOverlay now that we have a TextureCache for the ImageOverlay --- examples/libraries/virtualKeyboard.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index c62498685c..42185138e3 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -147,9 +147,13 @@ KeyboardKey = (function(keyboard, keyProperties) { return true; }; for (var i = 0; i < this.bounds.length; i++) { - var newOverlay = Overlays.cloneOverlay(this.keyboard.background); if (THREE_D_MODE) { - Overlays.editOverlay(newOverlay, { + this.overlays.push(Overlays.addOverlay("billboard", { + scale: 1, + rotation: MyAvatar.rotation, + isFacingAvatar: false, + url: KEYBOARD_URL, + alpha: 1, position: { x: MyAvatar.position.x,// + this.bounds[i][BOUND_X] * 0.01,// /*+ this.keyboard.getX()*/ + this.bounds[i][BOUND_X] * keyboard.scale, y: MyAvatar.position.y,// - this.bounds[i][BOUND_Y] * 0.01,// /*+ this.keyboard.getY()*/ + this.bounds[i][BOUND_Y] * keyboard.scale, @@ -160,9 +164,10 @@ KeyboardKey = (function(keyboard, keyProperties) { subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, alpha: 1, visible: tthis.keyboard.visible - }); + })); } else { - Overlays.editOverlay(newOverlay, { + this.overlays.push(Overlays.addOverlay("image", { + imageURL: KEYBOARD_URL, x: this.keyboard.getX() + this.bounds[i][BOUND_X] * keyboard.scale, y: this.keyboard.getY() + this.bounds[i][BOUND_Y] * keyboard.scale, width: this.bounds[i][BOUND_W] * keyboard.scale, @@ -170,9 +175,8 @@ KeyboardKey = (function(keyboard, keyProperties) { subImage: {width: this.bounds[i][BOUND_W], height: this.bounds[i][BOUND_H], x: this.bounds[i][BOUND_X], y: (KEYBOARD_HEIGHT * this.keyState) + this.bounds[i][BOUND_Y]}, alpha: 1, visible: tthis.keyboard.visible - }); + })); } - this.overlays.push(newOverlay); } }); @@ -440,13 +444,12 @@ Keyboard = (function(params) { {bounds: [[899, 355, 263, 67]], event: 'submit'} ]; - + for (var i = 0; i < keyProperties.length; i++) { + this.keys.push(new KeyboardKey(this, keyProperties[i])); + } this.keyboardTextureLoaded = function() { if (Overlays.isLoaded(tthis.background)) { Script.clearInterval(tthis.keyboardTextureLoaded_timer); - for (var i = 0; i < keyProperties.length; i++) { - tthis.keys.push(new KeyboardKey(tthis, keyProperties[i])); - } if (keyboard.onFullyLoaded != null) { tthis.onFullyLoaded(); } From d270979f95c373e39cdac000bfabd667da32cb0b Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 4 Feb 2015 23:19:56 +0100 Subject: [PATCH 30/38] Instructions initial --- examples/controllers/oculus/goTo.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index 5038253e17..ea3d12417d 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -19,6 +19,23 @@ Script.include("../../libraries/globals.js"); Script.include("../../libraries/virtualKeyboard.js"); +function Instructions(imageURL) { + this.overlay = Overlays.addOverlay("image", { + imageURL: HIFI_PUBLIC_BUCKET + "images/tutorial-goTo.svg", + x: 0, + y: 0, + alpha: 1, + visible: true + }); + this.remove = function() { + Overlays.deleteOverlay(this.overlay); + }; +}; + +var theInstruction = new Instructions(); + + + var windowDimensions = Controller.getViewportDimensions(); var cursor = new Cursor({visible: false});; var keyboard = new Keyboard({visible: false}); @@ -124,6 +141,7 @@ function scriptEnding() { Controller.releaseKeyEvents({key: SPACEBAR_CHARCODE}); Controller.releaseKeyEvents({key: RETURN_CHARCODE}); Controller.releaseKeyEvents({key: ENTER_CHARCODE}); + theInstruction.remove(); } function reportButtonValue(button, newValue, oldValue) { From 0e663054564016f2ff5d7b0766922b2b6805c07c Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Sat, 7 Feb 2015 13:37:33 +0100 Subject: [PATCH 31/38] changed HMDScriptingInterface MyAvatar to new way of retrieving this object --- interface/src/scripting/HMDScriptingInterface.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index e2d150e390..7b5d4ddac6 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -11,6 +11,8 @@ #include "HMDScriptingInterface.h" +#include + HMDScriptingInterface& HMDScriptingInterface::getInstance() { static HMDScriptingInterface sharedInstance; return sharedInstance; @@ -31,7 +33,7 @@ glm::vec3 HMDScriptingInterface::getHUDLookAtPosition3D() const { } glm::vec2 HMDScriptingInterface::getHUDLookAtPosition2D() const { - MyAvatar* myAvatar = Application::getInstance()->getAvatar(); + MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); glm::vec3 sphereCenter = myAvatar->getDefaultEyePosition(); glm::vec3 hudIntersection = getHUDLookAtPosition3D(); From 0a41033c8568ad4b6f1ca0dc365ae60ee71a81df Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Sat, 7 Feb 2015 13:58:11 +0100 Subject: [PATCH 32/38] - set cursor invisible when virtual-keyboard is shown. - get rid of the invisible cursor/magnifier states when cleaning up keyboard. --- examples/libraries/virtualKeyboard.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 42185138e3..7d7d72ae12 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -321,6 +321,8 @@ Keyboard = (function(params) { for (var i = 0; i < this.keys.length; i++) { this.keys[i].remove(); } + // resets the cursor and magnifier + this.updateVisibility(false); }; this.show = function() { @@ -340,6 +342,7 @@ Keyboard = (function(params) { if (HMD.magnifier == visible) { HMD.toggleMagnifier(); } + Window.cursorVisible = !visible; Overlays.editOverlay(tthis.background, { visible: tthis.visible }); for (var i = 0; i < this.keys.length; i++) { this.keys[i].updateVisibility(); From 8251542b786da7d2e2a908120a496ad061122862 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Sat, 7 Feb 2015 14:35:14 +0100 Subject: [PATCH 33/38] show instructions whenever the first gamepad is plugged since the script is loaded --- examples/controllers/oculus/goTo.js | 30 ++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index ea3d12417d..2d2c80e661 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -20,21 +20,30 @@ Script.include("../../libraries/globals.js"); Script.include("../../libraries/virtualKeyboard.js"); function Instructions(imageURL) { + var tthis = this; + this.visible = false; this.overlay = Overlays.addOverlay("image", { imageURL: HIFI_PUBLIC_BUCKET + "images/tutorial-goTo.svg", x: 0, y: 0, + width: 200, + height: 200, alpha: 1, - visible: true + visible: this.visible }); + this.show = function() { + tthis.visible = true; + Overlays.editOverlay(tthis.overlay, {visible: tthis.visible}); + } this.remove = function() { Overlays.deleteOverlay(this.overlay); + this.visible = false; }; }; var theInstruction = new Instructions(); - +var firstControllerPlugged = false; var windowDimensions = Controller.getViewportDimensions(); var cursor = new Cursor({visible: false});; @@ -84,6 +93,7 @@ keyboard.onKeyRelease = function(event) { location = "hifi://" + locationURL; locationURL = ""; keyboard.hide(); + cursor.hide(); updateTextOverlay(); } } @@ -116,6 +126,9 @@ keyboard.onFullyLoaded = function() { }; function keyPressEvent(event) { + if (theInstruction.visible) { + return; + } if (event.key === SPACEBAR_CHARCODE) { keyboard.pressFocussedKey(); } else if (event.key === ENTER_CHARCODE || event.key === RETURN_CHARCODE) { @@ -128,6 +141,9 @@ function keyPressEvent(event) { } function keyReleaseEvent(event) { + if (theInstruction.visible) { + return; + } if (event.key === SPACEBAR_CHARCODE) { keyboard.releaseKeys(); } @@ -145,7 +161,11 @@ function scriptEnding() { } function reportButtonValue(button, newValue, oldValue) { - if (button == Joysticks.BUTTON_FACE_BOTTOM) { + if (theInstruction.visible) { + if (button == Joysticks.BUTTON_FACE_BOTTOM && newValue) { + theInstruction.remove(); + } + } else if (button == Joysticks.BUTTON_FACE_BOTTOM) { if (newValue) { keyboard.pressFocussedKey(); } else { @@ -158,6 +178,10 @@ function reportButtonValue(button, newValue, oldValue) { function addJoystick(gamepad) { gamepad.buttonStateChanged.connect(reportButtonValue); + if (!firstControllerPlugged) { + firstControllerPlugged = true; + theInstruction.show(); + } } var allJoysticks = Joysticks.getAllJoysticks(); From d810283d5a006550b8d1f380928fdff25d76b6e4 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 9 Feb 2015 16:47:00 +0100 Subject: [PATCH 34/38] just show the instructions the first 2 times --- examples/controllers/oculus/goTo.js | 50 ++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index 2d2c80e661..9f3daaea42 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -19,34 +19,62 @@ Script.include("../../libraries/globals.js"); Script.include("../../libraries/virtualKeyboard.js"); -function Instructions(imageURL) { +const MAX_SHOW_INSTRUCTION_TIMES = 2; +const INSTRUCTIONS_SETTING = "GoToInstructionsShowCounter" + +var windowDimensions = Controller.getViewportDimensions(); + +function Instructions(imageURL, originalWidth, originalHeight) { var tthis = this; + this.originalSize = {w: originalWidth, h: originalHeight}; this.visible = false; this.overlay = Overlays.addOverlay("image", { - imageURL: HIFI_PUBLIC_BUCKET + "images/tutorial-goTo.svg", + imageURL: imageURL, x: 0, y: 0, - width: 200, - height: 200, + width: originalWidth, + height: originalHeight, alpha: 1, visible: this.visible }); + this.show = function() { - tthis.visible = true; - Overlays.editOverlay(tthis.overlay, {visible: tthis.visible}); + var timesShown = Settings.getValue(INSTRUCTIONS_SETTING); + timesShown = timesShown === "" ? 0 : parseInt(timesShown); + print(timesShown); + if (timesShown < MAX_SHOW_INSTRUCTION_TIMES) { + Settings.setValue(INSTRUCTIONS_SETTING, timesShown + 1); + tthis.visible = true; + tthis.rescale(); + Overlays.editOverlay(tthis.overlay, {visible: tthis.visible}); + return; + } + tthis.remove(); } this.remove = function() { - Overlays.deleteOverlay(this.overlay); - this.visible = false; + Overlays.deleteOverlay(tthis.overlay); + tthis.visible = false; }; + this.rescale = function() { + var scale = Math.min(windowDimensions.x / tthis.originalSize.w, windowDimensions.y / tthis.originalSize.h); + var newWidth = tthis.originalSize.w * scale; + var newHeight = tthis.originalSize.h * scale; + Overlays.editOverlay(tthis.overlay, { + x: (windowDimensions.x / 2) - (newWidth / 2), + y: (windowDimensions.y / 2) - (newHeight / 2), + width: newWidth, + height: newHeight + }); + }; + this.rescale(); }; -var theInstruction = new Instructions(); +var theInstruction = new Instructions(HIFI_PUBLIC_BUCKET + "images/tutorial-goTo.svg", 457, 284.1); var firstControllerPlugged = false; -var windowDimensions = Controller.getViewportDimensions(); -var cursor = new Cursor({visible: false});; + +var cursor = new Cursor({visible: false}); var keyboard = new Keyboard({visible: false}); var textFontSize = 9; var text = null; From e53b38e497a5a8547edbedfbee5af5718b065d8f Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 9 Feb 2015 17:16:54 +0100 Subject: [PATCH 35/38] style / make sure the magnifier isn't rendered when we don't want it --- examples/controllers/oculus/goTo.js | 62 +++++++++++++++++-------- interface/src/ui/ApplicationOverlay.cpp | 3 ++ 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index 9f3daaea42..c991d97fda 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -51,10 +51,12 @@ function Instructions(imageURL, originalWidth, originalHeight) { } tthis.remove(); } + this.remove = function() { Overlays.deleteOverlay(tthis.overlay); tthis.visible = false; }; + this.rescale = function() { var scale = Math.min(windowDimensions.x / tthis.originalSize.w, windowDimensions.y / tthis.originalSize.h); var newWidth = tthis.originalSize.w * scale; @@ -115,14 +117,14 @@ keyboard.onKeyRelease = function(event) { // you can cancel a key by releasing its focusing before releasing it if (event.focus) { if (event.event == 'delete') { - deleteChar(); + deleteChar(); } else if (event.event == 'submit' || event.event == 'enter') { - print("going to hifi://" + locationURL); - location = "hifi://" + locationURL; - locationURL = ""; - keyboard.hide(); - cursor.hide(); - updateTextOverlay(); + print("going to hifi://" + locationURL); + location = "hifi://" + locationURL; + locationURL = ""; + keyboard.hide(); + cursor.hide(); + updateTextOverlay(); } } }; @@ -131,18 +133,18 @@ keyboard.onFullyLoaded = function() { print("Virtual-keyboard fully loaded."); var dimensions = Controller.getViewportDimensions(); text = Overlays.addOverlay("text", { - x: 0, - y: dimensions.y - keyboard.height() - 260, - width: dimensions.x, - height: 250, - backgroundColor: { red: 255, green: 255, blue: 255}, - color: { red: 0, green: 0, blue: 0}, - topMargin: 5, - leftMargin: 0, - font: {size: textFontSize}, - text: "", - alpha: 0.8, - visible: keyboard.visible + x: 0, + y: dimensions.y - keyboard.height() - 260, + width: dimensions.x, + height: 250, + backgroundColor: { red: 255, green: 255, blue: 255}, + color: { red: 0, green: 0, blue: 0}, + topMargin: 5, + leftMargin: 0, + font: {size: textFontSize}, + text: "", + alpha: 0.8, + visible: keyboard.visible }); updateTextOverlay(); // the cursor is being loaded after the keyboard, else it will be on the background of the keyboard @@ -189,6 +191,7 @@ function scriptEnding() { } function reportButtonValue(button, newValue, oldValue) { + print(button); if (theInstruction.visible) { if (button == Joysticks.BUTTON_FACE_BOTTOM && newValue) { theInstruction.remove(); @@ -201,6 +204,27 @@ function reportButtonValue(button, newValue, oldValue) { } } else if (button == Joysticks.BUTTON_FACE_RIGHT && newValue) { deleteChar(); + } else if (button == Joysticks.BUTTON_FACE_LEFT && newValue) { + keyboard.hide(); + if (cursor !== undefined) { + cursor.hide(); + } + Overlays.editOverlay(text, {visible: false}); + } else if (button == Joysticks.BUTTON_RIGHT_SHOULDER && newValue) { + if (keyboard.visible) { + print("going to hifi://" + locationURL); + location = "hifi://" + locationURL; + locationURL = ""; + keyboard.hide(); + cursor.hide(); + updateTextOverlay(); + return; + } + keyboard.show(); + if (cursor !== undefined) { + cursor.show(); + } + Overlays.editOverlay(text, {visible: true}); } } diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index f80acf5801..8fc55921e7 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -719,6 +719,9 @@ void ApplicationOverlay::renderPointersOculus(const glm::vec3& eyePos) { //Renders a small magnification of the currently bound texture at the coordinates void ApplicationOverlay::renderMagnifier(glm::vec2 magPos, float sizeMult, bool showBorder) { + if (!_magnifier) { + return; + } auto glCanvas = DependencyManager::get(); const int widgetWidth = glCanvas->width(); From 1d5afba1fac11d7bae4bd8c591cf27ebce5bab51 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Mon, 9 Feb 2015 18:40:36 +0100 Subject: [PATCH 36/38] removed some console noise --- examples/controllers/oculus/goTo.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/controllers/oculus/goTo.js b/examples/controllers/oculus/goTo.js index c991d97fda..91ae8e6141 100644 --- a/examples/controllers/oculus/goTo.js +++ b/examples/controllers/oculus/goTo.js @@ -113,7 +113,6 @@ keyboard.onKeyPress = function(event) { }; keyboard.onKeyRelease = function(event) { - print("Key release event test"); // you can cancel a key by releasing its focusing before releasing it if (event.focus) { if (event.event == 'delete') { @@ -191,7 +190,6 @@ function scriptEnding() { } function reportButtonValue(button, newValue, oldValue) { - print(button); if (theInstruction.visible) { if (button == Joysticks.BUTTON_FACE_BOTTOM && newValue) { theInstruction.remove(); From 2c52c9c3c0d7b3965b98b3624ac8ea83599c02ea Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Wed, 11 Feb 2015 22:57:59 +0100 Subject: [PATCH 37/38] fixes for the virtualKeyboardTextEntityExample --- .../virtualKeyboardTextEntityExample.js | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/examples/controllers/oculus/virtualKeyboardTextEntityExample.js b/examples/controllers/oculus/virtualKeyboardTextEntityExample.js index 794b659bcb..c3cb3c6316 100644 --- a/examples/controllers/oculus/virtualKeyboardTextEntityExample.js +++ b/examples/controllers/oculus/virtualKeyboardTextEntityExample.js @@ -27,7 +27,7 @@ const TEXT_MARGIN_RIGHT = 0.17; const TEXT_MARGIN_BOTTOM = 0.17; var windowDimensions = Controller.getViewportDimensions(); -var cursor = null; +var cursor = new Cursor(); var keyboard = new Keyboard(); var textFontSize = 9; var text = null; @@ -70,7 +70,7 @@ keyboard.onKeyRelease = function(event) { // you can cancel a key by releasing its focusing before releasing it if (event.focus) { if (event.event == 'delete') { - deleteChar(); + deleteChar(); } else if (event.event == 'submit') { print(textText); @@ -83,12 +83,14 @@ keyboard.onKeyRelease = function(event) { if (maxLineWidth < usernameWidth) { maxLineWidth = usernameWidth; } else { - var spaceableWidth = maxLineWidth - usernameWidth; - var spaceWidth = Overlays.textSize(textSizeMeasureOverlay, " ").width; - var numberOfSpaces = Math.floor(spaceableWidth / spaceWidth); - for (var i = 0; i < numberOfSpaces; i++) { - usernameLine = " " + usernameLine; - } + var spaceableWidth = maxLineWidth - usernameWidth; + //TODO: WORKAROUND WARNING BELOW Fix this when spaces are not trimmed out of the textsize calculation anymore + var spaceWidth = Overlays.textSize(textSizeMeasureOverlay, "| |").width + - Overlays.textSize(textSizeMeasureOverlay, "||").width; + var numberOfSpaces = Math.floor(spaceableWidth / spaceWidth); + for (var i = 0; i < numberOfSpaces; i++) { + usernameLine = " " + usernameLine; + } } var dimension_x = maxLineWidth + TEXT_MARGIN_RIGHT + TEXT_MARGIN_LEFT; if (position.x > 0 && position.y > 0 && position.z > 0) { @@ -100,7 +102,7 @@ keyboard.onKeyRelease = function(event) { backgroundColor: { red: 0, green: 0, blue: 0 }, textColor: { red: 255, green: 255, blue: 255 }, text: textText + "\n" + usernameLine, - lineHeight: 0.1 + lineHeight: 0.1 }); } textText = ""; @@ -127,7 +129,7 @@ keyboard.onFullyLoaded = function() { }); updateTextOverlay(); // the cursor is being loaded after the keyboard, else it will be on the background of the keyboard - cursor = new Cursor(); + cursor.initialize(); cursor.onUpdate = function(position) { keyboard.setFocusPosition(position.x, position.y); }; From 062c2cbcee34825cac95aa228c3638c7710b72d0 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 12 Feb 2015 22:55:44 +0100 Subject: [PATCH 38/38] HUD LookAt positions could be NULL now if whenever they're out of range HMD.HUDLookAtPosition2D -> HMD.getHUDLookAtPosition2D() HMD.HUDLookAtPosition3D -> HMD.getHUDLookAtPosition3D() --- examples/libraries/virtualKeyboard.js | 12 +++-- interface/src/Application.cpp | 4 +- .../src/scripting/HMDScriptingInterface.cpp | 44 ++++++++++++------- .../src/scripting/HMDScriptingInterface.h | 9 ++-- libraries/script-engine/src/ScriptEngine.cpp | 6 ++- libraries/script-engine/src/ScriptEngine.h | 2 + 6 files changed, 50 insertions(+), 27 deletions(-) diff --git a/examples/libraries/virtualKeyboard.js b/examples/libraries/virtualKeyboard.js index 7d7d72ae12..a1f952a5eb 100644 --- a/examples/libraries/virtualKeyboard.js +++ b/examples/libraries/virtualKeyboard.js @@ -516,12 +516,16 @@ Cursor = (function(params) { }); } var editobject = {}; - if (tthis.x !== HMD.HUDLookAtPosition2D.x) { - tthis.x = HMD.HUDLookAtPosition2D.x; + var hudLookatPosition = HMD.getHUDLookAtPosition2D(); + if (hudLookatPosition === null) { + return; + } + if (tthis.x !== hudLookatPosition.x) { + tthis.x = hudLookatPosition.x; editobject.x = tthis.x - (CURSOR_WIDTH / 2); } - if (tthis.y !== HMD.HUDLookAtPosition2D.y) { - tthis.y = HMD.HUDLookAtPosition2D.y; + if (tthis.y !== hudLookatPosition.y) { + tthis.y = hudLookatPosition.y; editobject.y = tthis.y - (CURSOR_HEIGHT / 2); } if (Object.keys(editobject).length > 0) { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d9bd5ed807..22e52d8eaa 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3476,7 +3476,9 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->registerGlobalObject("UndoStack", &_undoStackScriptingInterface); - scriptEngine->registerGlobalObject("HMD", &HMDScriptingInterface::getInstance()); + QScriptValue hmdInterface = scriptEngine->registerGlobalObject("HMD", &HMDScriptingInterface::getInstance()); + scriptEngine->registerFunction(hmdInterface, "getHUDLookAtPosition2D", HMDScriptingInterface::getHUDLookAtPosition2D, 0); + scriptEngine->registerFunction(hmdInterface, "getHUDLookAtPosition3D", HMDScriptingInterface::getHUDLookAtPosition3D, 0); #ifdef HAVE_RTMIDI scriptEngine->registerGlobalObject("MIDI", &MIDIManager::getInstance()); diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index 7b5d4ddac6..fe274b6878 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -1,4 +1,4 @@ -// +// // HMDScriptingInterface.cpp // interface/src/scripting // @@ -18,7 +18,7 @@ HMDScriptingInterface& HMDScriptingInterface::getInstance() { return sharedInstance; } -glm::vec3 HMDScriptingInterface::getHUDLookAtPosition3D() const { +bool HMDScriptingInterface::getHUDLookAtPosition3D(glm::vec3& result) const { Camera* camera = Application::getInstance()->getCamera(); glm::vec3 position = camera->getPosition(); glm::quat orientation = camera->getOrientation(); @@ -27,20 +27,30 @@ glm::vec3 HMDScriptingInterface::getHUDLookAtPosition3D() const { ApplicationOverlay& applicationOverlay = Application::getInstance()->getApplicationOverlay(); + return applicationOverlay.calculateRayUICollisionPoint(position, direction, result); +} + +QScriptValue HMDScriptingInterface::getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine) { + + glm::vec3 hudIntersection; + + if ((&HMDScriptingInterface::getInstance())->getHUDLookAtPosition3D(hudIntersection)) { + MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); + glm::vec3 sphereCenter = myAvatar->getDefaultEyePosition(); + glm::vec3 direction = glm::inverse(myAvatar->getOrientation()) * (hudIntersection - sphereCenter); + glm::quat rotation = ::rotationBetween(glm::vec3(0.0f, 0.0f, -1.0f), direction); + glm::vec3 eulers = ::safeEulerAngles(rotation); + return qScriptValueFromValue(engine, Application::getInstance()->getApplicationOverlay() + .sphericalToOverlay(glm::vec2(eulers.y, -eulers.x))); + } + return QScriptValue::NullValue; +} + +QScriptValue HMDScriptingInterface::getHUDLookAtPosition3D(QScriptContext* context, QScriptEngine* engine) { glm::vec3 result; - applicationOverlay.calculateRayUICollisionPoint(position, direction, result); - return result; -} - -glm::vec2 HMDScriptingInterface::getHUDLookAtPosition2D() const { - MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); - glm::vec3 sphereCenter = myAvatar->getDefaultEyePosition(); - - glm::vec3 hudIntersection = getHUDLookAtPosition3D(); - - glm::vec3 direction = glm::inverse(myAvatar->getOrientation()) * (hudIntersection - sphereCenter); - glm::quat rotation = ::rotationBetween(glm::vec3(0.0f, 0.0f, -1.0f), direction); - glm::vec3 eulers = ::safeEulerAngles(rotation); - - return Application::getInstance()->getApplicationOverlay().sphericalToOverlay(glm::vec2(eulers.y, -eulers.x)); + HMDScriptingInterface* hmdInterface = &HMDScriptingInterface::getInstance(); + if ((&HMDScriptingInterface::getInstance())->getHUDLookAtPosition3D(result)) { + return qScriptValueFromValue(engine, result); + } + return QScriptValue::NullValue; } diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index cc148d5d5d..bcd458ca5e 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -21,11 +21,12 @@ class HMDScriptingInterface : public QObject { Q_OBJECT Q_PROPERTY(bool magnifier READ getMagnifier) Q_PROPERTY(bool active READ isHMDMode) - Q_PROPERTY(glm::vec3 HUDLookAtPosition3D READ getHUDLookAtPosition3D) - Q_PROPERTY(glm::vec2 HUDLookAtPosition2D READ getHUDLookAtPosition2D) public: static HMDScriptingInterface& getInstance(); + static QScriptValue getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine); + static QScriptValue getHUDLookAtPosition3D(QScriptContext* context, QScriptEngine* engine); + public slots: void toggleMagnifier() { Application::getInstance()->getApplicationOverlay().toggleMagnifier(); }; @@ -34,8 +35,8 @@ private: bool getMagnifier() const { return Application::getInstance()->getApplicationOverlay().hasMagnifier(); }; bool isHMDMode() const { return Application::getInstance()->isHMDMode(); } - glm::vec3 getHUDLookAtPosition3D() const; - glm::vec2 getHUDLookAtPosition2D() const; + bool getHUDLookAtPosition3D(glm::vec3& result) const; + }; #endif // hifi_HMDScriptingInterface_h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 353e215561..d40d3752d2 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -272,8 +272,12 @@ QScriptValue ScriptEngine::registerGlobalObject(const QString& name, QObject* ob } void ScriptEngine::registerFunction(const QString& name, QScriptEngine::FunctionSignature fun, int numArguments) { + registerFunction(globalObject(), name, fun, numArguments); +} + +void ScriptEngine::registerFunction(QScriptValue parent, const QString& name, QScriptEngine::FunctionSignature fun, int numArguments) { QScriptValue scriptFun = newFunction(fun, numArguments); - globalObject().setProperty(name, scriptFun); + parent.setProperty(name, scriptFun); } void ScriptEngine::registerGetterSetter(const QString& name, QScriptEngine::FunctionSignature getter, diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index f78a14bffa..7cb1fb59db 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -58,6 +58,8 @@ public: void registerGetterSetter(const QString& name, QScriptEngine::FunctionSignature getter, QScriptEngine::FunctionSignature setter, QScriptValue object = QScriptValue::NullValue); void registerFunction(const QString& name, QScriptEngine::FunctionSignature fun, int numArguments = -1); + void registerFunction(QScriptValue parent, const QString& name, QScriptEngine::FunctionSignature fun, + int numArguments = -1); Q_INVOKABLE void setIsAvatar(bool isAvatar); bool isAvatar() const { return _isAvatar; }