Needs a lot of cleanup. Data has been de-duplicated, and where identical copies existed, one of them has been replaced with a symlink. Some files have been excluded, such as binaries, installers and debug dumps. Some of that may still be present.
200 lines
No EOL
7.3 KiB
JavaScript
200 lines
No EOL
7.3 KiB
JavaScript
//
|
|
// mouseLook.js
|
|
// examples
|
|
//
|
|
// Created by Sam Gondelman on 6/16/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
|
|
//
|
|
|
|
var lastX = Reticle.getPosition().x;
|
|
var lastY = Reticle.getPosition().y;
|
|
var yawFromMouse = 0;
|
|
var pitchFromMouse = 0;
|
|
|
|
var yawSpeed = 0;
|
|
var pitchSpeed = 0;
|
|
|
|
var DEFAULT_PARAMETERS = {
|
|
MOUSE_YAW_SCALE: -0.125,
|
|
MOUSE_PITCH_SCALE: -0.125,
|
|
MOUSE_SENSITIVITY: 0.5,
|
|
|
|
// Damping frequency, adjust to change mouse look behavior
|
|
W: 10,
|
|
}
|
|
|
|
var movementParameters = DEFAULT_PARAMETERS;
|
|
|
|
var mouseLook = (function () {
|
|
|
|
var BUTTON_WIDTH = 50,
|
|
BUTTON_HEIGHT = 50,
|
|
BUTTON_ALPHA = 0.9,
|
|
BUTTON_MARGIN = 8,
|
|
active = false,
|
|
keyboardID = 0;
|
|
|
|
function onKeyPressEvent(event) {
|
|
if (event.text == 'm') {
|
|
active = !active;
|
|
updateMapping();
|
|
}
|
|
}
|
|
|
|
function findInput(name) {
|
|
var availableInputs = Controller.getAvailableInputs(keyboardID);
|
|
for (i = 0; i < availableInputs.length; i++) {
|
|
if (availableInputs[i].inputName == name) {
|
|
return availableInputs[i].input;
|
|
}
|
|
}
|
|
// If the input isn't found, it will default to the first available input
|
|
return availableInputs[0].input;
|
|
}
|
|
|
|
function findAction(name) {
|
|
var actions = Controller.getAllActions();
|
|
for (var i = 0; i < actions.length; i++) {
|
|
if (actions[i].actionName == name) {
|
|
return i;
|
|
}
|
|
}
|
|
// If the action isn't found, it will default to the first available action
|
|
return 0;
|
|
}
|
|
|
|
function updateMapping() {
|
|
if (keyboardID != 0) {
|
|
if (active) {
|
|
// Turn mouselook on
|
|
yawFromMouse = 0;
|
|
pitchFromMouse = 0;
|
|
yawSpeed = 0;
|
|
pitchSpeed = 0;
|
|
|
|
var a = findInput("A").channel;
|
|
var d = findInput("D").channel;
|
|
var left = findInput("Left").channel;
|
|
var right = findInput("Right").channel;
|
|
var shift = findInput("Shift").channel;
|
|
|
|
for (var i = findAction("YAW_LEFT"); i <= findAction("YAW_RIGHT"); i++) {
|
|
var inputChannels = Controller.getAllActions()[i].inputChannels;
|
|
for (var j = 0; j < inputChannels.length; j++) {
|
|
var inputChannel = inputChannels[j];
|
|
// make a, d, left, and right strafe
|
|
if ((inputChannel.input.channel == a || inputChannel.input.channel == left) && inputChannel.modifier.device == 0) {
|
|
Controller.removeInputChannel(inputChannel);
|
|
inputChannel.action = findAction("LATERAL_LEFT");
|
|
Controller.addInputChannel(inputChannel);
|
|
} else if ((inputChannel.input.channel == d || inputChannel.input.channel == right) && inputChannel.modifier.device == 0) {
|
|
Controller.removeInputChannel(inputChannel);
|
|
inputChannel.action = findAction("LATERAL_RIGHT");
|
|
Controller.addInputChannel(inputChannel);
|
|
}
|
|
}
|
|
}
|
|
for (var i = findAction("LATERAL_LEFT"); i <= findAction("LATERAL_RIGHT"); i++) {
|
|
var inputChannels = Controller.getAllActions()[i].inputChannels;
|
|
for (var j = 0; j < inputChannels.length; j++) {
|
|
var inputChannel = inputChannels[j];
|
|
// make shift + a/d/left/right change yaw/pitch
|
|
if ((inputChannel.input.channel == a || inputChannel.input.channel == left) && inputChannel.modifier.channel == shift) {
|
|
Controller.removeInputChannel(inputChannel);
|
|
inputChannel.action = findAction("YAW_LEFT");
|
|
Controller.addInputChannel(inputChannel);
|
|
} else if ((inputChannel.input.channel == d || inputChannel.input.channel == right) && inputChannel.modifier.channel == shift) {
|
|
Controller.removeInputChannel(inputChannel);
|
|
inputChannel.action = findAction("YAW_RIGHT");
|
|
Controller.addInputChannel(inputChannel);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
Controller.resetDevice(keyboardID);
|
|
}
|
|
}
|
|
}
|
|
|
|
function onScriptUpdate(dt) {
|
|
if (active && Window.hasFocus()) {
|
|
var x = Reticle.getPosition().x;
|
|
// I'm not sure why this + 0.5 is necessary?
|
|
var y = Reticle.getPosition().y; + 0.5;
|
|
|
|
yawFromMouse += ((x - lastX) * movementParameters.MOUSE_YAW_SCALE * movementParameters.MOUSE_SENSITIVITY);
|
|
pitchFromMouse += ((y - lastY) * movementParameters.MOUSE_PITCH_SCALE * movementParameters.MOUSE_SENSITIVITY);
|
|
pitchFromMouse = Math.max(-180, Math.min(180, pitchFromMouse));
|
|
|
|
resetCursorPosition();
|
|
|
|
// Here we use a linear damping model - http://en.wikipedia.org/wiki/Damping#Linear_damping
|
|
// Because we are using a critically damped model (no oscillation), ζ = 1 and
|
|
// so we derive the formula: acceleration = -(2 * w0 * v) - (w0^2 * x)
|
|
var W = movementParameters.W;
|
|
yawAccel = (W * W * yawFromMouse) - (2 * W * yawSpeed);
|
|
pitchAccel = (W * W * pitchFromMouse) - (2 * W * pitchSpeed);
|
|
|
|
yawSpeed += yawAccel * dt;
|
|
var yawMove = yawSpeed * dt;
|
|
var newOrientation = Quat.multiply(MyAvatar.orientation, Quat.fromVec3Degrees( { x: 0, y: yawMove, z: 0 } ));
|
|
MyAvatar.orientation = newOrientation;
|
|
yawFromMouse -= yawMove;
|
|
|
|
pitchSpeed += pitchAccel * dt;
|
|
var pitchMove = pitchSpeed * dt;
|
|
var newPitch = MyAvatar.headPitch + pitchMove;
|
|
MyAvatar.headPitch = newPitch;
|
|
pitchFromMouse -= pitchMove;
|
|
}
|
|
}
|
|
|
|
function resetCursorPosition() {
|
|
var newX = Window.x + Window.innerWidth / 2.0;
|
|
var newY = Window.y + Window.innerHeight / 2.0;
|
|
Reticle.setPosition({ x: newX, y: newY});
|
|
lastX = newX;
|
|
lastY = newY;
|
|
}
|
|
|
|
function setUp() {
|
|
keyboardID = Controller.findDevice("Keyboard");
|
|
|
|
Controller.keyPressEvent.connect(onKeyPressEvent);
|
|
|
|
Menu.menuItemEvent.connect(handleMenuEvent);
|
|
|
|
Script.update.connect(onScriptUpdate);
|
|
}
|
|
|
|
function setupMenu() {
|
|
Menu.addMenuItem({ menuName: "View", menuItemName: "Mouselook Mode", shortcutKey: "SHIFT+M",
|
|
afterItem: "Mirror", isCheckable: true, isChecked: false });
|
|
}
|
|
|
|
setupMenu();
|
|
|
|
function cleanupMenu() {
|
|
Menu.removeMenuItem("View", "Mouselook Mode");
|
|
}
|
|
|
|
function handleMenuEvent(menuItem) {
|
|
if (menuItem == "Mouselook Mode") {
|
|
active = !active;
|
|
updateMapping();
|
|
}
|
|
}
|
|
|
|
function tearDown() {
|
|
if (keyboardID != 0) {
|
|
Controller.resetDevice(keyboardID);
|
|
}
|
|
cleanupMenu();
|
|
}
|
|
|
|
setUp();
|
|
Script.scriptEnding.connect(tearDown);
|
|
}()); |