309 lines
10 KiB
JavaScript
309 lines
10 KiB
JavaScript
//
|
|
// vehicule.js
|
|
//
|
|
// Created by Clement Brisset on 10/26/13
|
|
// 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 Entities, Script, AnimationCache, Settings, MyAvatar, DriveKeys, AvatarList,
|
|
Vec3, HMD, Overlays, Camera, isInEditMode */
|
|
|
|
(function () {
|
|
var STRAFE_LEFT = 0;
|
|
var STRAFE_RIGHT = 0;
|
|
var TURN_LEFT = 0;
|
|
var TURN_RIGHT = 0;
|
|
var MOVE_FORWARD = 0;
|
|
var MOVE_BACWARD = 0;
|
|
var MOVE_UP = 0;
|
|
var MOVE_DOWN = 0;
|
|
|
|
var myEntityID = null;
|
|
var version = 12;
|
|
var controllerMappingName = null;
|
|
|
|
function debug(text) {
|
|
console.log("[TAG " + version + "] " + text);
|
|
}
|
|
debug("Version: " + version);
|
|
|
|
var signals = {
|
|
list: {},
|
|
connect: function(signal, func) {
|
|
debug("Connecting: " + signal.name);
|
|
signal.connect(func);
|
|
signals.list[signal.name] = function() {
|
|
signal.disconnect(func);
|
|
}
|
|
},
|
|
disconnect: function(signal) {
|
|
debug("Disonnecting: " + signal.name);
|
|
signals.list[signal.name]();
|
|
delete signals.list[signal.name];
|
|
},
|
|
disconnectAll: function() {
|
|
for (signalName in signals.list) {
|
|
debug("DisonnectingAll: " + signalName);
|
|
signals.list[signalName]();
|
|
delete signals.list[signalName];
|
|
}
|
|
}
|
|
};
|
|
|
|
this.preload = function (id) {
|
|
myEntityID = id;
|
|
debug("Loading " + myEntityID);
|
|
|
|
controllerMappingName = 'Hifi-VehiculeControl-Mapping-' + Math.random();
|
|
var controllerMapping = Controller.newMapping(controllerMappingName);
|
|
controllerMapping.from(Controller.Hardware.Keyboard.Q).to(function(value) {
|
|
STRAFE_LEFT = value;
|
|
});
|
|
controllerMapping.from(Controller.Hardware.Keyboard.E).to(function(value) {
|
|
STRAFE_RIGHT = value;
|
|
});
|
|
controllerMapping.from(Controller.Hardware.Keyboard.A).to(function(value) {
|
|
TURN_LEFT = value;
|
|
});
|
|
controllerMapping.from(Controller.Hardware.Keyboard.D).to(function(value) {
|
|
TURN_RIGHT = value;
|
|
});
|
|
controllerMapping.from(Controller.Hardware.Keyboard.W).to(function(value) {
|
|
MOVE_FORWARD = value;
|
|
});
|
|
controllerMapping.from(Controller.Hardware.Keyboard.S).to(function(value) {
|
|
MOVE_BACWARD = value;
|
|
});
|
|
controllerMapping.from(Controller.Hardware.Keyboard.R).to(function(value) {
|
|
MOVE_UP = value;
|
|
});
|
|
controllerMapping.from(Controller.Hardware.Keyboard.F).to(function(value) {
|
|
MOVE_DOWN = value;
|
|
});
|
|
};
|
|
this.unload = function () {
|
|
debug("Unloading " + myEntityID);
|
|
if (isIn()) {
|
|
getOut();
|
|
}
|
|
signals.disconnectAll();
|
|
};
|
|
|
|
this.onButtonClicked = function(entityID, args) {
|
|
debug("onButtonClicked: " + entityID + " " + args[0] + " " + args[1]);
|
|
var action = args[0];
|
|
var value = args[1];
|
|
if (value == 0) {
|
|
return;
|
|
}
|
|
switch (action) {
|
|
case "drive":
|
|
if (!isIn()) {
|
|
getIn();
|
|
} else {
|
|
getOut();
|
|
}
|
|
break;
|
|
case "forward":
|
|
MOVE_FORWARD = 1;
|
|
break;
|
|
case "break":
|
|
MOVE_FORWARD = 0;
|
|
MOVE_BACWARD = 0;
|
|
MOVE_UP = 0;
|
|
MOVE_DOWN = 0;
|
|
TURN_LEFT = 0;
|
|
TURN_RIGHT = 0;
|
|
STRAFE_LEFT = 0;
|
|
STRAFE_RIGHT = 0;
|
|
break;
|
|
case "left":
|
|
TURN_LEFT = (TURN_LEFT + 1) % 2;
|
|
break;
|
|
case "right":
|
|
TURN_RIGHT = (TURN_RIGHT + 1) % 2;
|
|
break;
|
|
case "up":
|
|
MOVE_UP = (MOVE_UP + 1) % 2;
|
|
break;
|
|
case "down":
|
|
MOVE_DOWN = (MOVE_DOWN + 1) % 2;
|
|
break;
|
|
default:
|
|
|
|
}
|
|
}
|
|
|
|
function isIn() {
|
|
return MyAvatar.getParentID() == myEntityID;
|
|
}
|
|
function getIn() {
|
|
debug("getIn");
|
|
var props = Entities.getEntityProperties(myEntityID);
|
|
if (Vec3.distance(MyAvatar.position, props.position) > 2) {
|
|
return;
|
|
}
|
|
|
|
// MyAvatar.position = props.position;
|
|
// MyAvatar.orientation = props.rotation;
|
|
// MyAvatar.setCollisionsEnabled(false);
|
|
Controller.enableMapping(controllerMappingName);
|
|
MyAvatar.setParentID(myEntityID);
|
|
signals.connect(Script.update, onUpdate);
|
|
}
|
|
function getOut() {
|
|
debug("getOut");
|
|
signals.disconnect(Script.update);
|
|
MyAvatar.setParentID(Uuid.NULL_ID);
|
|
// MyAvatar.setCollisionsEnabled(true);
|
|
Controller.disableMapping(controllerMappingName);
|
|
|
|
MOVE_FORWARD = 0;
|
|
MOVE_BACWARD = 0;
|
|
MOVE_UP = 0;
|
|
MOVE_DOWN = 0;
|
|
TURN_LEFT = 0;
|
|
TURN_RIGHT = 0;
|
|
STRAFE_LEFT = 0;
|
|
STRAFE_RIGHT = 0;
|
|
MyAvatar.bodyPitch = 0;
|
|
MyAvatar.bodyRoll = 0;
|
|
Entities.editEntity(myEntityID, {
|
|
damping: 0.6,
|
|
angularDamping: 0.6,
|
|
velocity: Vec3.ZERO,
|
|
angularVelocity: Vec3.ZERO
|
|
});
|
|
}
|
|
|
|
var velocity = Vec3.ZERO;
|
|
var angularVelocity = Vec3.ZERO;
|
|
function onUpdate(dt) {
|
|
if (!isIn()) {
|
|
return;
|
|
}
|
|
var properties = Entities.getEntityProperties(myEntityID, ["position", "rotation"]);
|
|
var angles = Quat.safeEulerAngles(properties.rotation);
|
|
|
|
var FORWARD_ACCELERATION = 2;
|
|
var BREAKING_ACCELERATION = 2;
|
|
var MAX_FORWARD_VELOCITY = 6;
|
|
var forwardVelocity = -velocity.z;
|
|
if (MOVE_FORWARD == 1) {
|
|
debug("Move forward");
|
|
if (forwardVelocity < MAX_FORWARD_VELOCITY) {
|
|
forwardVelocity += FORWARD_ACCELERATION * dt;
|
|
}
|
|
} else if (MOVE_BACWARD == 1) {
|
|
debug("Move backward");
|
|
if (forwardVelocity > -MAX_FORWARD_VELOCITY) {
|
|
forwardVelocity -= FORWARD_ACCELERATION * dt;
|
|
}
|
|
} else {
|
|
if (forwardVelocity > BREAKING_ACCELERATION * dt) {
|
|
debug("Break");
|
|
forwardVelocity -= BREAKING_ACCELERATION * dt;
|
|
} else if (forwardVelocity < -BREAKING_ACCELERATION * dt) {
|
|
debug("Break");
|
|
forwardVelocity += BREAKING_ACCELERATION * dt;
|
|
} else {
|
|
forwardVelocity = 0;
|
|
}
|
|
}
|
|
velocity.z = -forwardVelocity;
|
|
|
|
var VERTICAL_ACCELERATION = 0.5;
|
|
var MAX_VERTICAL_VELOCITY = 1;
|
|
var verticalVelocity = velocity.y;
|
|
if (MOVE_UP == 1) {
|
|
debug("Move up");
|
|
if (verticalVelocity < MAX_VERTICAL_VELOCITY) {
|
|
verticalVelocity += VERTICAL_ACCELERATION * dt;
|
|
}
|
|
} else if (MOVE_DOWN == 1) {
|
|
debug("Move down");
|
|
if (verticalVelocity > -MAX_VERTICAL_VELOCITY) {
|
|
verticalVelocity -= VERTICAL_ACCELERATION * dt;
|
|
}
|
|
} else {
|
|
if (verticalVelocity > BREAKING_ACCELERATION * dt) {
|
|
debug("Break");
|
|
verticalVelocity -= BREAKING_ACCELERATION * dt;
|
|
} else if (verticalVelocity < -BREAKING_ACCELERATION * dt) {
|
|
debug("Break");
|
|
verticalVelocity += BREAKING_ACCELERATION * dt;
|
|
} else {
|
|
verticalVelocity = 0;
|
|
}
|
|
}
|
|
velocity.y = verticalVelocity;
|
|
|
|
var SIDEWAYS_ACCELERATION = 0.5;
|
|
var MAX_SIDEWAYS_VELOCITY = 1;
|
|
var sidewaysVelocity = velocity.x;
|
|
if (STRAFE_LEFT == 1) {
|
|
debug("Strafe left");
|
|
if (sidewaysVelocity > -MAX_SIDEWAYS_VELOCITY) {
|
|
sidewaysVelocity -= SIDEWAYS_ACCELERATION * dt;
|
|
}
|
|
} else if (STRAFE_RIGHT == 1) {
|
|
debug("Strafe right");
|
|
if (sidewaysVelocity < MAX_SIDEWAYS_VELOCITY) {
|
|
sidewaysVelocity += SIDEWAYS_ACCELERATION * dt;
|
|
}
|
|
} else {
|
|
if (sidewaysVelocity > SIDEWAYS_ACCELERATION * dt) {
|
|
debug("Break");
|
|
sidewaysVelocity -= SIDEWAYS_ACCELERATION * dt;
|
|
} else if (sidewaysVelocity < -SIDEWAYS_ACCELERATION * dt) {
|
|
debug("Break");
|
|
sidewaysVelocity += SIDEWAYS_ACCELERATION * dt;
|
|
} else {
|
|
sidewaysVelocity = 0;
|
|
}
|
|
}
|
|
velocity.x = sidewaysVelocity;
|
|
|
|
|
|
var ANGULAR_ACCELERATION = 0.1;
|
|
var MAX_ANGULAR_VELOCITY = 0.2;
|
|
var turnVelocity = angularVelocity.y;
|
|
if (TURN_LEFT == 1) {
|
|
debug("Turn left");
|
|
if (turnVelocity < MAX_ANGULAR_VELOCITY) {
|
|
turnVelocity += ANGULAR_ACCELERATION * dt;
|
|
}
|
|
} else if (TURN_RIGHT == 1) {
|
|
debug("Turn right");
|
|
if (turnVelocity > -MAX_ANGULAR_VELOCITY) {
|
|
turnVelocity -= ANGULAR_ACCELERATION * dt;
|
|
}
|
|
} else {
|
|
if (turnVelocity > ANGULAR_ACCELERATION * dt) {
|
|
debug("Break");
|
|
turnVelocity -= ANGULAR_ACCELERATION * dt;
|
|
} else if (turnVelocity < -ANGULAR_ACCELERATION * dt) {
|
|
debug("Break");
|
|
turnVelocity += ANGULAR_ACCELERATION * dt;
|
|
} else {
|
|
turnVelocity = 0;
|
|
}
|
|
}
|
|
angularVelocity.y = turnVelocity;
|
|
|
|
var relativeVelocity = Vec3.multiplyQbyV(properties.rotation, velocity);
|
|
Entities.editEntity(myEntityID, {
|
|
damping: 0,
|
|
angularDamping: 0,
|
|
velocity: relativeVelocity,
|
|
angularVelocity: angularVelocity
|
|
});
|
|
// MyAvatar.bodyYaw = angles.y + angularVelocity.y * dt;
|
|
// if (Vec3.distance(MyAvatar.position, properties.position) > 0.3) {
|
|
// MyAvatar.position = properties.position;
|
|
// }
|
|
}
|
|
});
|