// // 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; // } } });