mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 17:14:59 +02:00
commit
4f8b5b7c8a
1 changed files with 116 additions and 0 deletions
116
scripts/system/controllers/godView.js
Normal file
116
scripts/system/controllers/godView.js
Normal file
|
@ -0,0 +1,116 @@
|
|||
"use strict";
|
||||
//
|
||||
// godView.js
|
||||
// scripts/system/
|
||||
//
|
||||
// Created by Brad Hefta-Gaub on 1 Jun 2017
|
||||
// Copyright 2017 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
|
||||
//
|
||||
/* globals HMD, Script, Menu, Tablet, Camera */
|
||||
/* eslint indent: ["error", 4, { "outerIIFEBody": 0 }] */
|
||||
|
||||
(function() { // BEGIN LOCAL_SCOPE
|
||||
|
||||
var godView = false;
|
||||
|
||||
var GOD_CAMERA_OFFSET = -1; // 1 meter below the avatar
|
||||
var GOD_VIEW_HEIGHT = 300; // 300 meter above the ground
|
||||
var ABOVE_GROUND_DROP = 2;
|
||||
var MOVE_BY = 1;
|
||||
|
||||
function moveTo(position) {
|
||||
if (godView) {
|
||||
MyAvatar.position = position;
|
||||
Camera.position = Vec3.sum(MyAvatar.position, {x:0, y: GOD_CAMERA_OFFSET, z: 0});
|
||||
} else {
|
||||
MyAvatar.position = position;
|
||||
}
|
||||
}
|
||||
|
||||
function keyPressEvent(event) {
|
||||
if (godView) {
|
||||
switch(event.text) {
|
||||
case "UP":
|
||||
moveTo(Vec3.sum(MyAvatar.position, {x:0.0, y: 0, z: -1 * MOVE_BY}));
|
||||
break;
|
||||
case "DOWN":
|
||||
moveTo(Vec3.sum(MyAvatar.position, {x:0, y: 0, z: MOVE_BY}));
|
||||
break;
|
||||
case "LEFT":
|
||||
moveTo(Vec3.sum(MyAvatar.position, {x:-1 * MOVE_BY, y: 0, z: 0}));
|
||||
break;
|
||||
case "RIGHT":
|
||||
moveTo(Vec3.sum(MyAvatar.position, {x:MOVE_BY, y: 0, z: 0}));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function mousePress(event) {
|
||||
if (godView) {
|
||||
var pickRay = Camera.computePickRay(event.x, event.y);
|
||||
var pointingAt = Vec3.sum(pickRay.origin, Vec3.multiply(pickRay.direction,300));
|
||||
var moveToPosition = { x: pointingAt.x, y: MyAvatar.position.y, z: pointingAt.z };
|
||||
moveTo(moveToPosition);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var oldCameraMode = Camera.mode;
|
||||
|
||||
function startGodView() {
|
||||
if (!godView) {
|
||||
oldCameraMode = Camera.mode;
|
||||
MyAvatar.position = Vec3.sum(MyAvatar.position, {x:0, y: GOD_VIEW_HEIGHT, z: 0});
|
||||
Camera.mode = "independent";
|
||||
Camera.position = Vec3.sum(MyAvatar.position, {x:0, y: GOD_CAMERA_OFFSET, z: 0});
|
||||
Camera.orientation = Quat.fromPitchYawRollDegrees(-90,0,0);
|
||||
godView = true;
|
||||
}
|
||||
}
|
||||
|
||||
function endGodView() {
|
||||
if (godView) {
|
||||
Camera.mode = oldCameraMode;
|
||||
MyAvatar.position = Vec3.sum(MyAvatar.position, {x:0, y: (-1 * GOD_VIEW_HEIGHT) + ABOVE_GROUND_DROP, z: 0});
|
||||
godView = false;
|
||||
}
|
||||
}
|
||||
|
||||
var button;
|
||||
var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
||||
|
||||
function onClicked() {
|
||||
if (godView) {
|
||||
endGodView();
|
||||
} else {
|
||||
startGodView();
|
||||
}
|
||||
}
|
||||
|
||||
button = tablet.addButton({
|
||||
icon: "icons/tablet-icons/switch-desk-i.svg", // FIXME - consider a better icon from Alan
|
||||
text: "God View"
|
||||
});
|
||||
|
||||
button.clicked.connect(onClicked);
|
||||
Controller.keyPressEvent.connect(keyPressEvent);
|
||||
Controller.mousePressEvent.connect(mousePress);
|
||||
|
||||
|
||||
Script.scriptEnding.connect(function () {
|
||||
if (godView) {
|
||||
endGodView();
|
||||
}
|
||||
button.clicked.disconnect(onClicked);
|
||||
if (tablet) {
|
||||
tablet.removeButton(button);
|
||||
}
|
||||
Controller.keyPressEvent.disconnect(keyPressEvent);
|
||||
Controller.mousePressEvent.disconnect(mousePress);
|
||||
});
|
||||
|
||||
}()); // END LOCAL_SCOPE
|
Loading…
Reference in a new issue