From 0d300c3a47e015275a2627855817cf9a82eb7ec5 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 12 Sep 2016 15:57:57 -0700 Subject: [PATCH] teleport.js drags avatar along --- scripts/system/controllers/teleport.js | 74 ++++++++++++++++---------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index 3d4bf244a5..6c2478bd9d 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -13,7 +13,10 @@ var inTeleportMode = false; var SMOOTH_ARRIVAL_SPACING = 33; -var NUMBER_OF_STEPS = 6; +var NUMBER_OF_STEPS_FOR_TELEPORT = 6; + +var AVATAR_DRAG_SPACING = 33; +var NUMBER_OF_STEPS_FOR_AVATAR_DRAG = 12; var TARGET_MODEL_URL = Script.resolvePath("../assets/models/teleport-destination.fbx"); var TOO_CLOSE_MODEL_URL = Script.resolvePath("../assets/models/teleport-cancel.fbx"); @@ -88,6 +91,8 @@ function Teleporter() { this.cancelOverlay = null; this.updateConnected = null; this.smoothArrivalInterval = null; + this.dragAvatarInterval = null; + this.oldAvatarCollisionsEnabled = MyAvatar.avatarCollisionsEnabled; this.teleportHand = null; this.distance = 0.0; this.teleportMode = "HMDAndAvatarTogether"; @@ -132,6 +137,10 @@ function Teleporter() { if (this.smoothArrivalInterval !== null) { Script.clearInterval(this.smoothArrivalInterval); } + if (this.dragAvatarInterval !== null) { + Script.clearInterval(this.dragAvatarInterval); + MyAvatar.avatarCollisionsEnabled = _this.oldAvatarCollisionsEnabled; + } if (activationTimeout !== null) { Script.clearInterval(activationTimeout); } @@ -524,32 +533,27 @@ function Teleporter() { this.teleportMode = "AvatarOnly"; } this.smoothArrival(); - } - }; - - this.findMidpoint = function(start, end) { - var xy = Vec3.sum(start, end); - var midpoint = Vec3.multiply(0.5, xy); - return midpoint - }; - - this.getArrivalPoints = function(startPoint, endPoint) { - var arrivalPoints = []; - var i; - var lastPoint; - - for (i = 0; i < NUMBER_OF_STEPS; i++) { - if (i === 0) { - lastPoint = startPoint; + if (this.teleportMode === "HMDFirstAvatarWillFollow") { + this.dragAvatarCollisionlessly(); } - var newPoint = _this.findMidpoint(lastPoint, endPoint); - lastPoint = newPoint; - arrivalPoints.push(newPoint); } + }; - arrivalPoints.push(endPoint); + this.getWayPoints = function(startPoint, endPoint, numberOfSteps) { + var travel = Vec3.subtract(endPoint - startPoint); + var distance = Vec3.length(travel); + if (distance > 1.0) { + var base = Math.exp(log(distance + 1.0) / numberOfSteps); + var wayPoints = []; + var i; - return arrivalPoints; + for (i = 0; i < numberOfSteps - 1; i++) { + var backFraction = (1.0 - Math.exp((numberOfSteps - 1 - i) * Math.log(base))) / distance; + wayPoints.push(Vec3.sum(endPoint, Vec3.multiply(backFraction, travel)); + } + } + wayPoints.push(endPoint); + return wayPoints; }; this.teleportTo = function(landingPoint) { @@ -569,25 +573,37 @@ function Teleporter() { } this.smoothArrival = function() { - - _this.arrivalPoints = _this.getArrivalPoints(MyAvatar.position, _this.intersection.intersection); + _this.teleportPoints = _this.getWayPoints(MyAvatar.position, _this.intersection.intersection, NUMBER_OF_STEPS_FOR_TELEPORT); _this.smoothArrivalInterval = Script.setInterval(function() { - if (_this.arrivalPoints.length === 0) { + if (_this.teleportPoints.length === 0) { Script.clearInterval(_this.smoothArrivalInterval); HMD.centerUI(); return; } - var landingPoint = _this.arrivalPoints.shift(); + var landingPoint = _this.teleportPoints.shift(); _this.teleportTo(landingPoint); - if (_this.arrivalPoints.length === 1 || _this.arrivalPoints.length === 0) { + if (_this.teleportPoints.length === 1 || _this.teleportPoints.length === 0) { _this.deleteTargetOverlay(); _this.deleteCancelOverlay(); } }, SMOOTH_ARRIVAL_SPACING); + } - + this.dragAvatarCollisionlessly = function() { + _this.oldAvatarCollisionsEnabled = MyAvatar.avatarCollisionsEnabled; + MyAvatar.avatarCollisionsEnabled = false; + _this.dragPoints = _this.getWayPoints(MyAvatar.position, _this.intersection.intersection, NUMBER_OF_STEPS_FOR_AVATAR_DRAG); + _this.dragAvatarInterval = Script.setInterval(function() { + if (_this.dragPoints.length === 0) { + Script.clearInterval(_this.dragAvatarInterval); + MyAvatar.avatarCollisionsEnabled = _this.oldAvatarCollisionsEnabled; + return; + } + var landingPoint = _this.dragPoints.shift(); + MyAvatar.position = landingPoint; + }, AVATAR_DRAG_SPACING); } }