256 lines · 8.3 KB · JavaScript
RawDownload
////  goTo.js//  examples////  Created by Thijs Wenker on 12/28/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/globals.js");Script.include("../../libraries/virtualKeyboard.js");Script.include("../../libraries/soundArray.js"); 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: imageURL,                x: 0,                y: 0,                width: originalWidth,                height: originalHeight,                alpha: 1,                visible: this.visible    });     this.show = function() {        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(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(OVERTE_PUBLIC_CDN + "images/tutorial-goTo.svg", 457, 284.1); var firstControllerPlugged = false;  var cursor = new Cursor({visible: false});var keyboard = new Keyboard({visible: false});var textFontSize = 9;var text = null;var locationURL = ""; var randomSounds = new SoundArray({}, true);var numberOfSounds = 7;for (var i = 1; i <= numberOfSounds; i++) {    randomSounds.addSound(OVERTE_PUBLIC_CDN + "sounds/UI/virtualKeyboard-press" + i + ".raw");} function appendChar(char) {    locationURL += char;    updateTextOverlay();    Overlays.editOverlay(text, {text: locationURL});} function deleteChar() {    if (locationURL.length > 0) {        locationURL = locationURL.substring(0, locationURL.length - 1);        updateTextOverlay();    }} function updateTextOverlay() {    var maxLineWidth = Overlays.textSize(text, locationURL).width;    var suggestedFontSize = (windowDimensions.x / maxLineWidth) * textFontSize * 0.90;    var maxFontSize = 140;    textFontSize = (suggestedFontSize > maxFontSize) ? maxFontSize : suggestedFontSize;    var topMargin = (250 - textFontSize) / 4;    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});} keyboard.onKeyPress = function(event) {    randomSounds.playRandom();    if (event.event == 'keypress') {        appendChar(event.char);    }}; keyboard.onKeyRelease = function(event) {    // 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' || event.event == 'enter') {            print("going to hifi://" + locationURL);            location = "hifi://" + locationURL;            locationURL = "";            keyboard.hide();            cursor.hide();            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,            visible: keyboard.visible    });    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);    };}; function keyPressEvent(event) {    if (theInstruction.visible) {        return;    }    if (event.key === SPACEBAR_CHARCODE) {        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});    }} function keyReleaseEvent(event) {    if (theInstruction.visible) {        return;    }    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});    theInstruction.remove();} function reportButtonValue(button, newValue, oldValue) {    if (theInstruction.visible) {        if (button == Joysticks.BUTTON_FACE_BOTTOM && newValue) {            theInstruction.remove();        }    } else if (button == Joysticks.BUTTON_FACE_BOTTOM) {        if (newValue) {            keyboard.pressFocussedKey();        } else {            keyboard.releaseKeys();        }    } 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});                }} function addJoystick(gamepad) {    gamepad.buttonStateChanged.connect(reportButtonValue);    if (!firstControllerPlugged) {        firstControllerPlugged = true;        theInstruction.show();    }} 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});Controller.captureKeyEvents({key: SPACEBAR_CHARCODE});Controller.keyPressEvent.connect(keyPressEvent);Controller.keyReleaseEvent.connect(keyReleaseEvent);Script.scriptEnding.connect(scriptEnding);