Andrew Meadowsarchive remaining JS scriptsc0b446c10 years agoHistory
515 lines · 12.6 KB · JavaScript
RawDownload
// //  widgets-example.js//  games //  //  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//var ICONS_URL = 'https://s3.amazonaws.com/hifi-public/marketplace/hificontent/Scripts/planets/images/'; var panelX = 1250;var panelY = 500;var panelWidth = 50;var panelHeight = 210; Script.include('../libraries/uiwidgets.js'); UI.setDefaultVisibility(true); var ICON_WIDTH = 40.0;var ICON_HEIGHT = 40.0;var ICON_COLOR = UI.rgba(45, 45, 45, 0.7);var FOCUSED_COLOR = UI.rgba(250, 250, 250, 1.0); var PANEL_BACKGROUND_COLOR = UI.rgba(120, 120, 120, 0.8); var PANEL_PADDING = 7.0;var PANEL_BORDER = 12.0;var SUBPANEL_GAP = 1.0; var icons = []; function addImage(panel, iconId) {    var icon = panel.add(new UI.Image({        'imageURL': ICONS_URL + iconId + '.svg',        'width': ICON_WIDTH,        'height': ICON_HEIGHT,        'color': ICON_COLOR,        'alpha': ICON_COLOR.a    }));    icons.push(icon);    return icon;}  var panels = []; function addPanel(properties) {    properties.background = properties.background || {};    properties.background.backgroundColor = properties.background.backgroundColor ||        PANEL_BACKGROUND_COLOR;    properties.background.backgroundAlpha = properties.background.backgroundAlpha ||        PANEL_BACKGROUND_COLOR.a;    properties.padding = properties.padding || {        x: PANEL_PADDING,        y: PANEL_PADDING    };    properties.border = properties.border || {        x: PANEL_BORDER,        y: PANEL_BORDER    };     var panel = new UI.WidgetStack(properties);    panels.push(panel);    return panel;} function makeDraggable(panel, target) {    if (!target) {        target = panel;    }    var dragStart = null;    var initialPos = null;     panel.addAction('onDragBegin', function(event) {        dragStart = {            x: event.x,            y: event.y        };        initialPos = {            x: target.position.x,            y: target.position.y        };    });    panel.addAction('onDragUpdate', function(event) {        target.setPosition(            initialPos.x + event.x - dragStart.x,            initialPos.y + event.y - dragStart.y        );        UI.updateLayout();    });    panel.addAction('onDragEnd', function() {        dragStart = dragEnd = null;    });} function setText(text) {    return function() {        demoLabel.setText(text);        UI.updateLayout();    };} function join(obj) {    var s = "{";    var sep = "\n";    for (var k in obj) {        s += sep + k + ": " + ("" + obj[k]).replace("\n", "\n");        sep = ",\n";    }    if (s.length > 1)        return s + " }";    return s + "}";} setText = undefined; var tooltipWidget = new UI.Label({    text: "<tooltip>",    width: 500,    height: 20,    visible: false}); function addTooltip(widget, text) {    widget.addAction('onMouseOver', function(event, widget) {        tooltipWidget.setVisible(true);        tooltipWidget.setPosition(widget.position.x + widget.getWidth() + 20, widget.position.y + 10);        tooltipWidget.setText(text);        UI.updateLayout();    });    widget.addAction('onMouseExit', function() {        tooltipWidget.setVisible(false);        UI.updateLayout();    });} var mainPanel = addPanel({    dir: '+y'});makeDraggable(mainPanel);mainPanel.setPosition(1200, 250);mainPanel.setVisible(true); var systemViewButton = addImage(mainPanel, 'solarsystems');var zoomButton = addImage(mainPanel, 'magnifier');var satelliteButton = addImage(mainPanel, 'satellite');var settingsButton = addImage(mainPanel, 'settings');var stopButton = addImage(mainPanel, 'close'); addTooltip(systemViewButton, "system view");addTooltip(zoomButton, "zoom");addTooltip(satelliteButton, "satelite view");addTooltip(settingsButton, "settings");addTooltip(stopButton, "exit"); var systemViewPanel = addPanel({    dir: '+x',    visible: false});var restartButton = addImage(systemViewPanel, 'refresh');var pauseButton = addImage(systemViewPanel, 'playpause');var rideButton = addImage(systemViewPanel, 'rocket'); var tweening, tweeningPaused;Script.include('https://hifi-staff.s3.amazonaws.com/bridget/tween.js');  pauseButton.addAction('onClick', function() {    if (tweening) {        if (!tweeningPaused) {            tweeningPaused = true;        } else {            tweeningPaused = false;        }        return;    }    if (!paused) {        pause();    } else {        resume();    }}); // Allow to toggle pause with spacebarfunction keyPressEvent(event) {    if (event.text == "SPACE") {        if (!paused) {            pause();        } else {            resume();        }    }} rideButton.addAction('onClick', function() {    if (!paused) {        pause();    }    if (tweening) {        tweening = false;        tweeningPaused = true;        restart();        return;    }    var confirmed = Window.confirm('Ride through the solar system?');    if (confirmed) {        init();        tweening = true;        tweeningPaused = false;    }}); restartButton.addAction('onClick', function() {    restart();    tweening = false;}); var zoomPanel = addPanel({    dir: '+x',    visible: false});var zoomButtons = [];for (var i = 0; i < planets.length; ++i) {    var label = zoomPanel.add(new UI.Label({        text: planets[i].name,        width: 80,        height: 20    }));    zoomButtons.push(label);    UI.updateLayout();}UI.updateLayout();  var zoomView = false;zoomButtons.forEach(function(button, i) {    var planet = planets[i];    button.addAction('onClick', function() {        if (!planets[i].isZoomed) {            planet.zoom();            planet.isZoomed = true;            zoomView = true;        } else {            MyAvatar.position = startingPosition;            Camera.setPosition(cameraStart);            planet.isZoomed = false;            zoomView = false;        }     });});  var settingsPanel = addPanel({    dir: '+y',    visible: false}); function addCheckbox(parent, label, labelWidth, enabled, onValueChanged) {    var layout = parent.add(new UI.WidgetStack({        dir: '+x',        visible: true,        backgroundAlpha: 0.0    }));    var label = layout.add(new UI.Label({        text: label,        width: labelWidth,        height: 20,        backgroundAlpha: 0.0    }));     var defaultColor = UI.rgb(10, 10, 10);     var checkbox = layout.add(new UI.Checkbox({        width: 20,        height: 20,        padding: {            x: 3,            y: 3        },        backgroundColor: defaultColor,        backgroundAlpha: 0.9,        checked: enabled,        onValueChanged: onValueChanged    }));     checkbox.label = label;    checkbox.layout = layout;    checkbox.setValue = function(value) {        checkbox.setChecked(value);    }    return checkbox;} function addSlider(parent, label, labelWidth, defaultValue, min, max, valueChanged) {    var layout = parent.add(new UI.WidgetStack({        dir: '+x',        visible: true    }));    var label = layout.add(new UI.Label({        text: label,        width: labelWidth,        height: 27    }));    var display = layout.add(new UI.Label({        text: " ",        width: 50,        height: 27    }));    var slider = layout.add(new UI.Slider({        value: defaultValue,        maxValue: max,        minValue: min,        width: 300,        height: 20,        backgroundColor: UI.rgb(10, 10, 10),        backgroundAlpha: 1.0,        slider: { // slider knob            width: 30,            height: 18,            backgroundColor: UI.rgb(120, 120, 120),            backgroundAlpha: 1.0        }    }));    slider.addAction('onDoubleClick', function() {        slider.setValue(defaultValue);        UI.updateLayout();    });    display.setText("" + (+slider.getValue().toFixed(2)));    slider.onValueChanged = function(value) {        valueChanged(value);        display.setText("" + (+value.toFixed(2)));        UI.updateLayout();    }    slider.label = label;    slider.layout = layout;    return slider;} settingsPanel.showTrailsButton = addCheckbox(settingsPanel, "show trails", 120, trailsEnabled, function(value) {    trailsEnabled = value;    if (trailsEnabled) {        for (var i = 0; i < planets.length; ++i) {            planets[i].resetTrails();        }        //if trails are off and we've already created trails, remove existing trails    } else {        for (var i = 0; i < planets.length; ++i) {            planets[i].clearTrails();        }    }});var g_multiplier = 1.0;settingsPanel.gravitySlider = addSlider(settingsPanel, "gravity scale ", 200, g_multiplier, 0.0, 5.0, function(value) {    g_multiplier = value;    GRAVITY = REFERENCE_GRAVITY * g_multiplier;}); var period_multiplier = 1.0;var last_alpha = period_multiplier; settingsPanel.periodSlider = addSlider(settingsPanel, "orbital period scale ", 200, period_multiplier, 0.0, 3.0, function(value) {    period_multiplier = value;    changePeriod(period_multiplier);}); function changePeriod(alpha) {    var ratio = last_alpha / alpha;    GRAVITY = Math.pow(ratio, 2.0) * GRAVITY;    for (var i = 0; i < planets.length; ++i) {        planets[i].period = ratio * planets[i].period;        planets[i].velocity = Vec3.multiply(ratio, planets[i].velocity);        planets[i].resetTrails();    }    last_alpha = alpha;} var satelliteGame;satelliteButton.addAction('onClick', function() {    if (satelliteGame && satelliteGame.isActive) {        MyAvatar.position = startingPosition;        satelliteGame.quitGame();        if (paused) {            resume();        }    } else {        pause();        satelliteGame = new SatelliteCreator();        satelliteGame.init();    }});  var subpanels = [systemViewPanel, zoomPanel, settingsPanel]; function hideSubpanelsExcept(panel) {    subpanels.forEach(function(x) {        if (x != panel) {            x.setVisible(false);        }    });} function attachPanel(panel, button) {    button.addAction('onClick', function() {        hideSubpanelsExcept(panel);        panel.setVisible(!panel.isVisible());        UI.updateLayout();    })     UI.addAttachment(panel, button, function(target, rel) {        target.setPosition(            rel.position.x - (target.getWidth() + target.border.x + SUBPANEL_GAP),            rel.position.y - target.border.y        );    });}attachPanel(systemViewPanel, systemViewButton);attachPanel(zoomPanel, zoomButton);attachPanel(settingsPanel, settingsButton);  var addColorToggle = function(widget) {    widget.addAction('onMouseOver', function() {        widget.setColor(FOCUSED_COLOR);    });    widget.addAction('onMouseExit', function() {        widget.setColor(ICON_COLOR);    });}  systemViewPanel.addAction('onMouseOver', function() {    hideSubpanelsExcept(systemViewPanel);    UI.updateLayout();});  zoomButton.addAction('onClick', function() {    if (zoomView) {        restart();    }    hideSubpanelsExcept(zoomPanel);    UI.updateLayout();});UI.updateLayout(); stopButton.addAction('onClick', function() {    teardown();    Script.stop();}); // Panel drag behavior// (click + drag on border to drag)(function() {    var dragged = null;    this.startDrag = function(dragAction) {        dragged = dragAction;    }    this.updateDrag = function(event) {        if (dragged) {            print("Update drag");            dragged.updateDrag(event);        }    }    this.clearDrag = function(event) {        if (dragged)            print("End drag");        dragged = null;    }})(); var buttons = icons; buttons.map(addColorToggle);panels.map(function(panel) {    makeDraggable(panel, mainPanel);}); // Cleanup script resourcesfunction teardown() {    UI.teardown();    if (satelliteGame) {        satelliteGame.quitGame();    }};  UI.debug.setVisible(false); var inputHandler = {    onMouseMove: function(event) {        updateDrag(event);        UI.handleMouseMove(event);    },    onMousePress: function(event) {        UI.handleMousePress(event);    },    onMouseRelease: function(event) {

Lines 1–500 of 515.