cancel mode for teleporting

This commit is contained in:
James B. Pollack 2016-08-04 16:08:51 -07:00
parent a1dc9beddb
commit c0cfee371e
4 changed files with 59 additions and 9 deletions

Binary file not shown.

Binary file not shown.

View file

@ -12,7 +12,7 @@ var inTeleportMode = false;
// var NUMBER_OF_STEPS = 0; // var NUMBER_OF_STEPS = 0;
// var SMOOTH_ARRIVAL_SPACING = 0; // var SMOOTH_ARRIVAL_SPACING = 0;
// // slow // // slow n
// var SMOOTH_ARRIVAL_SPACING = 150; // var SMOOTH_ARRIVAL_SPACING = 150;
// var NUMBER_OF_STEPS = 2; // var NUMBER_OF_STEPS = 2;
@ -28,7 +28,8 @@ var NUMBER_OF_STEPS = 6;
// var SMOOTH_ARRIVAL_SPACING = 10; // var SMOOTH_ARRIVAL_SPACING = 10;
// var NUMBER_OF_STEPS = 20; // var NUMBER_OF_STEPS = 20;
var TARGET_MODEL_URL = Script.resolvePath("../assets/models/teleport.fbx"); var TARGET_MODEL_URL = Script.resolvePath("../assets/models/teleport-destination.fbx");
var TOO_CLOSE_MODEL_URL = Script.resolvePath("../assets/models/teleport-cancel.fbx");
var TARGET_MODEL_DIMENSIONS = { var TARGET_MODEL_DIMENSIONS = {
x: 1.15, x: 1.15,
y: 0.5, y: 0.5,
@ -47,7 +48,14 @@ var COLORS_TELEPORT_CANNOT_TELEPORT = {
blue: 141 blue: 141
}; };
var MAX_AVATAR_SPEED = 0.25; var COLORS_TELEPORT_TOO_CLOSE = {
red: 255,
green: 184,
blue: 73
};
var TELEPORT_CANCEL_RANGE = 1.25;
function ThumbPad(hand) { function ThumbPad(hand) {
this.hand = hand; this.hand = hand;
@ -89,6 +97,7 @@ function Teleporter() {
this.updateConnected = null; this.updateConnected = null;
this.smoothArrivalInterval = null; this.smoothArrivalInterval = null;
this.teleportHand = null; this.teleportHand = null;
this.tooClose=false;
this.initialize = function() { this.initialize = function() {
this.createMappings(); this.createMappings();
@ -235,7 +244,12 @@ function Teleporter() {
var rightIntersection = Entities.findRayIntersection(teleporter.rightPickRay, true, [], [this.targetEntity]); var rightIntersection = Entities.findRayIntersection(teleporter.rightPickRay, true, [], [this.targetEntity]);
if (rightIntersection.intersects) { if (rightIntersection.intersects) {
this.rightLineOn(rightPickRay.origin, rightIntersection.intersection, COLORS_TELEPORT_CAN_TELEPORT); if (this.tooClose===true) {
this.rightLineOn(rightPickRay.origin, rightIntersection.intersection, COLORS_TELEPORT_TOO_CLOSE);
} else {
this.rightLineOn(rightPickRay.origin, rightIntersection.intersection, COLORS_TELEPORT_CAN_TELEPORT);
}
if (this.targetOverlay !== null) { if (this.targetOverlay !== null) {
this.updateTargetOverlay(rightIntersection); this.updateTargetOverlay(rightIntersection);
} else { } else {
@ -275,7 +289,14 @@ function Teleporter() {
if (leftIntersection.intersects) { if (leftIntersection.intersects) {
this.leftLineOn(leftPickRay.origin, leftIntersection.intersection, COLORS_TELEPORT_CAN_TELEPORT); if (this.tooClose===true) {
this.leftLineOn(leftPickRay.origin, leftIntersection.intersection, COLORS_TELEPORT_TOO_CLOSE);
} else {
this.leftLineOn(leftPickRay.origin, leftIntersection.intersection, COLORS_TELEPORT_CAN_TELEPORT);
}
if (this.targetOverlay !== null) { if (this.targetOverlay !== null) {
this.updateTargetOverlay(leftIntersection); this.updateTargetOverlay(leftIntersection);
} else { } else {
@ -362,10 +383,23 @@ function Teleporter() {
y: intersection.intersection.y + TARGET_MODEL_DIMENSIONS.y / 2, y: intersection.intersection.y + TARGET_MODEL_DIMENSIONS.y / 2,
z: intersection.intersection.z z: intersection.intersection.z
} }
Overlays.editOverlay(this.targetOverlay, {
position: position, var tooClose = isTooCloseToTeleport(position);
rotation: Quat.fromPitchYawRollDegrees(0, euler.y, 0), this.tooClose=tooClose;
}); if (tooClose === false) {
Overlays.editOverlay(this.targetOverlay, {
url: TARGET_MODEL_URL,
position: position,
rotation: Quat.fromPitchYawRollDegrees(0, euler.y, 0),
});
}
if (tooClose === true) {
Overlays.editOverlay(this.targetOverlay, {
url: TOO_CLOSE_MODEL_URL,
position: position,
rotation: Quat.fromPitchYawRollDegrees(0, euler.y, 0),
});
}
}; };
@ -383,10 +417,17 @@ function Teleporter() {
}; };
this.teleport = function(value) { this.teleport = function(value) {
if (value === undefined) { if (value === undefined) {
this.exitTeleportMode(); this.exitTeleportMode();
} }
if (this.intersection !== null) { if (this.intersection !== null) {
if (isTooCloseToTeleport(this.intersection.intersection)) {
this.deleteTargetOverlay();
this.exitTeleportMode();
return;
}
var offset = getAvatarFootOffset(); var offset = getAvatarFootOffset();
this.intersection.intersection.y += offset; this.intersection.intersection.y += offset;
this.exitTeleportMode(); this.exitTeleportMode();
@ -507,6 +548,15 @@ function isMoving() {
} }
} }
function isTooCloseToTeleport(position) {
var distance = Vec3.distance(MyAvatar.position, position);
if (distance <= TELEPORT_CANCEL_RANGE) {
return true
} else {
return false
}
}
function registerMappings() { function registerMappings() {
mappingName = 'Hifi-Teleporter-Dev-' + Math.random(); mappingName = 'Hifi-Teleporter-Dev-' + Math.random();
teleportMapping = Controller.newMapping(mappingName); teleportMapping = Controller.newMapping(mappingName);