Fix cleanup of controller in tutorial

This commit is contained in:
Ryan Huffman 2016-09-21 16:47:25 -07:00
parent 1e0772d613
commit 2ea71f5e0b
4 changed files with 134 additions and 102 deletions

View file

@ -175,6 +175,7 @@ ControllerDisplay = function() {
}; };
deleteControllerDisplay = function(controllerDisplay) { deleteControllerDisplay = function(controllerDisplay) {
print("Deleting controller display");
for (var i = 0; i < controllerDisplay.overlays.length; ++i) { for (var i = 0; i < controllerDisplay.overlays.length; ++i) {
Overlays.deleteOverlay(controllerDisplay.overlays[i]); Overlays.deleteOverlay(controllerDisplay.overlays[i]);
} }

View file

@ -44,14 +44,14 @@ if (!Function.prototype.bind) {
var DEBUG = false; var DEBUG = false;
function debug() { function debug() {
if (DEBUG) { if (DEBUG) {
print.apply(self, arguments); print.apply(this, arguments);
} }
} }
var INFO = true; var INFO = true;
function info() { function info() {
if (INFO) { if (INFO) {
print.apply(self, arguments); print.apply(this, arguments);
} }
} }
@ -247,7 +247,8 @@ var stepDisableControllers = function(name) {
} }
stepDisableControllers.prototype = { stepDisableControllers.prototype = {
start: function(onFinish) { start: function(onFinish) {
editEntitiesWithTag('door', { visible: true }); controllerDisplayManager = new ControllerDisplayManager();
editEntitiesWithTag('door', { visible: true, collisionless: false });
Menu.setIsOptionChecked("Overlays", false); Menu.setIsOptionChecked("Overlays", false);
Controller.disableMapping('handControllerPointer-click'); Controller.disableMapping('handControllerPointer-click');
Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'disable'); Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'disable');
@ -268,24 +269,39 @@ stepDisableControllers.prototype = {
} }
}; };
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// //
// STEP: ENABLE CONTROLLERS //
// //
///////////////////////////////////////////////////////////////////////////////
function reenableEverything() {
editEntitiesWithTag('door', { visible: false, collisionless: true });
Menu.setIsOptionChecked("Overlays", true);
Controller.enableMapping('handControllerPointer-click');
Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'enable');
Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none');
Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({
nearGrabEnabled: true,
holdEnabled: true,
farGrabEnabled: true,
}));
setControllerPartLayer('touchpad', 'blank');
setControllerPartLayer('tips', 'blank');
MyAvatar.shouldRenderLocally = true;
if (controllerDisplayManager) {
controllerDisplayManager.destroy();
controllerDisplayManager = null;
}
}
var stepEnableControllers = function(name) { var stepEnableControllers = function(name) {
this.tag = name; this.tag = name;
this.shouldLog = false; this.shouldLog = false;
} }
stepEnableControllers.prototype = { stepEnableControllers.prototype = {
start: function(onFinish) { start: function(onFinish) {
editEntitiesWithTag('door', { visible: false }); reenableEverything();
Menu.setIsOptionChecked("Overlays", true);
Controller.enableMapping('handControllerPointer-click');
Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'enable');
Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none');
Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({
nearGrabEnabled: true,
holdEnabled: true,
farGrabEnabled: true,
}));
setControllerPartLayer('touchpad', 'blank');
setControllerPartLayer('tips', 'blank');
onFinish(); onFinish();
}, },
cleanup: function() { cleanup: function() {
@ -433,6 +449,11 @@ stepRaiseAboveHead.prototype = {
start: function(onFinish) { start: function(onFinish) {
var tag = this.tag; var tag = this.tag;
var STATE_START = 0;
var STATE_HANDS_DOWN = 1;
var STATE_HANDS_UP = 2;
this.state = STATE_START;
var defaultTransform = { var defaultTransform = {
position: { position: {
x: 0.2459, x: 0.2459,
@ -451,19 +472,24 @@ stepRaiseAboveHead.prototype = {
editEntitiesWithTag(this.tag, { visible: true }); editEntitiesWithTag(this.tag, { visible: true });
// Wait 2 seconds before starting to check for hands // Wait 2 seconds before starting to check for hands
this.waitTimeoutID = Script.setTimeout(function() { this.checkIntervalID = null;
this.checkIntervalID = null; function checkForHandsAboveHead() {
function checkForHandsAboveHead() { debug("Raise above head: Checking hands...");
debug("Raise above head: Checking for hands above head..."); if (this.state == STATE_START) {
if (MyAvatar.getLeftPalmPosition().y < (MyAvatar.getHeadPosition().y - 0.1)) {
this.state = STATE_HANDS_DOWN;
}
} else if (this.state == STATE_HANDS_DOWN) {
if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) {
this.state = STATE_HANDS_UP;
Script.clearInterval(this.checkIntervalID); Script.clearInterval(this.checkIntervalID);
this.checkIntervalID = null; this.checkIntervalID = null;
playSuccessSound(); playSuccessSound();
onFinish(); onFinish();
} }
} }
this.checkIntervalID = Script.setInterval(checkForHandsAboveHead.bind(this), 500); }
}.bind(this), 2000); this.checkIntervalID = Script.setInterval(checkForHandsAboveHead.bind(this), 500);
}, },
cleanup: function() { cleanup: function() {
if (this.checkIntervalID) { if (this.checkIntervalID) {
@ -675,7 +701,8 @@ var stepEquip = function(name) {
this.tempTag = name + "-temporary"; this.tempTag = name + "-temporary";
this.PART1 = 0; this.PART1 = 0;
this.PART2 = 1; this.PART2 = 1;
this.COMPLETE = 2; this.PART3 = 2;
this.COMPLETE = 3;
Messages.subscribe('Tutorial-Spinner'); Messages.subscribe('Tutorial-Spinner');
Messages.messageReceived.connect(this.onMessage.bind(this)); Messages.messageReceived.connect(this.onMessage.bind(this));
@ -745,6 +772,7 @@ stepEquip.prototype = {
if (this.currentPart == this.PART1 && message == "wasLit") { if (this.currentPart == this.PART1 && message == "wasLit") {
this.currentPart = this.PART2; this.currentPart = this.PART2;
Script.setTimeout(function() { Script.setTimeout(function() {
this.currentPart = this.PART3;
hideEntitiesWithTag(this.tagPart1); hideEntitiesWithTag(this.tagPart1);
showEntitiesWithTag(this.tagPart2); showEntitiesWithTag(this.tagPart2);
setControllerPartLayer('tips', 'grip'); setControllerPartLayer('tips', 'grip');
@ -752,7 +780,7 @@ stepEquip.prototype = {
}.bind(this), 9000); }.bind(this), 9000);
} }
} else if (channel == "Hifi-Object-Manipulation") { } else if (channel == "Hifi-Object-Manipulation") {
if (this.currentPart == this.PART2) { if (this.currentPart == this.PART3) {
var data = parseJSON(message); var data = parseJSON(message);
if (data.action == 'release' && data.grabbedEntity == this.gunID) { if (data.action == 'release' && data.grabbedEntity == this.gunID) {
info("got release"); info("got release");
@ -930,7 +958,7 @@ var stepFinish = function(name) {
} }
stepFinish.prototype = { stepFinish.prototype = {
start: function(onFinish) { start: function(onFinish) {
editEntitiesWithTag('door', { visible: false }); editEntitiesWithTag('door', { visible: false, collisonless: true });
showEntitiesWithTag(this.tag); showEntitiesWithTag(this.tag);
Settings.setValue("tutorialComplete", true); Settings.setValue("tutorialComplete", true);
onFinish(); onFinish();
@ -956,9 +984,6 @@ stepCleanupFinish.prototype = {
function showEntitiesWithTag(tag) { function showEntitiesWithTag(tag) {
editEntitiesWithTag(tag, function(entityID) { editEntitiesWithTag(tag, function(entityID) {
var userData = Entities.getEntityProperties(entityID, "userData").userData; var userData = Entities.getEntityProperties(entityID, "userData").userData;
@ -975,7 +1000,6 @@ function showEntitiesWithTag(tag) {
visible: data.visible == false ? false : true, visible: data.visible == false ? false : true,
collisionless: collisionless, collisionless: collisionless,
userData: JSON.stringify(data), userData: JSON.stringify(data),
//collisionless: data.collisionless == true ? true : false,
}; };
Entities.editEntity(entityID, newProperties); Entities.editEntity(entityID, newProperties);
}); });
@ -1029,8 +1053,6 @@ TutorialManager = function() {
for (var i = 0; i < STEPS.length; ++i) { for (var i = 0; i < STEPS.length; ++i) {
STEPS[i].cleanup(); STEPS[i].cleanup();
} }
//location = "/tutorial_begin";
//location = "/tutorial";
MyAvatar.shouldRenderLocally = false; MyAvatar.shouldRenderLocally = false;
this.startNextStep(); this.startNextStep();
} }
@ -1078,7 +1100,12 @@ TutorialManager = function() {
if (currentStep) { if (currentStep) {
currentStep.cleanup(); currentStep.cleanup();
} }
reenableEverything();
currentStepNum = -1; currentStepNum = -1;
currentStep = null; currentStep = null;
} }
} }
var tutorialManager = new TutorialManager();
tutorialManager.startTutorial();

View file

@ -48,8 +48,8 @@ if (!Function.prototype.bind) {
} }
(function() { (function() {
Script.include("file:///C:/Users/Ryan/dev/hifi/tutorial/ownershipToken.js"); Script.include("ownershipToken.js");
Script.include("file:///C:/Users/Ryan/dev/hifi/tutorial/tutorial.js"); Script.include("tutorial.js");
var TutorialZone = function() { var TutorialZone = function() {
this.token = null; this.token = null;

View file

@ -14,91 +14,101 @@ var zeroRotation = { x: 0, y: 0, z: 0, w: 1 };
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Management of controller display // // Management of controller display //
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
ControllerDisplayManager = function() {
var controllerDisplay = null;
var activeController = null;
var controllerCheckerIntervalID = null;
var controllerDisplay = null; function updateControllers() {
var activeController = null; if (HMD.active) {
var controllerCheckerIntervalID = null; if ("Vive" in Controller.Hardware) {
if (!activeController) {
function updateControllers() { debug("Found vive!");
if (HMD.active) { activeController = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION);
if ("Vive" in Controller.Hardware) { }
if (!activeController) { // We've found the controllers, we no longer need to look for active controllers
debug("Found vive!"); if (controllerCheckerIntervalID) {
activeController = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION); Script.clearInterval(controllerCheckerIntervalID);
controllerCheckerIntervalID = null;
}
} else {
debug("HMD active, but no controllers found");
if (activeController) {
deleteControllerDisplay(activeController);
activeController = null;
}
if (controllerCheckerIntervalID == null) {
controllerCheckerIntervalID = Script.setInterval(updateControllers, 1000);
}
} }
// We've found the controllers, we no longer need to look for active controllers } else {
debug("HMD inactive");
// We aren't in HMD mode, we no longer need to look for active controllers
if (controllerCheckerIntervalID) { if (controllerCheckerIntervalID) {
debug("Clearing controller checker interval");
Script.clearInterval(controllerCheckerIntervalID); Script.clearInterval(controllerCheckerIntervalID);
controllerCheckerIntervalID = null; controllerCheckerIntervalID = null;
} }
} else {
debug("HMD active, but no controllers found");
if (activeController) { if (activeController) {
debug("Deleting controller");
deleteControllerDisplay(activeController); deleteControllerDisplay(activeController);
activeController = null; activeController = null;
} }
if (controllerCheckerIntervalID == null) {
controllerCheckerIntervalID = Script.setInterval(updateControllers, 1000);
}
}
} else {
debug("HMD inactive");
// We aren't in HMD mode, we no longer need to look for active controllers
if (controllerCheckerIntervalID) {
debug("Clearing controller checker interval");
Script.clearInterval(controllerCheckerIntervalID);
controllerCheckerIntervalID = null;
}
if (activeController) {
debug("Deleting controller");
deleteControllerDisplay(activeController);
activeController = null;
} }
} }
}
HMD.displayModeChanged.connect(updateControllers); HMD.displayModeChanged.connect(updateControllers);
updateControllers(); updateControllers();
Messages.subscribe('Controller-Display'); Messages.subscribe('Controller-Display');
var handleMessages = function(channel, message, sender) { var handleMessages = function(channel, message, sender) {
if (!activeController) { if (!activeController) {
return; return;
} }
if (sender === MyAvatar.sessionUUID) { if (sender === MyAvatar.sessionUUID) {
if (channel === 'Controller-Display') { if (channel === 'Controller-Display') {
debug('here'); debug('here');
var data = JSON.parse(message); var data = JSON.parse(message);
var name = data.name; var name = data.name;
var visible = data.visible; var visible = data.visible;
//c.setDisplayAnnotation(name, visible); //c.setDisplayAnnotation(name, visible);
if (name in activeController.annotations) { if (name in activeController.annotations) {
debug("hiding"); debug("hiding");
for (var i = 0; i < activeController.annotations[name].length; ++i) { for (var i = 0; i < activeController.annotations[name].length; ++i) {
debug("hiding", i); debug("hiding", i);
Overlays.editOverlay(activeController.annotations[name][i], { visible: visible }); Overlays.editOverlay(activeController.annotations[name][i], { visible: visible });
}
}
} else if (channel === 'Controller-Display-Parts') {
debug('here part');
var data = JSON.parse(message);
for (var name in data) {
var visible = data[name];
activeController.setPartVisible(name, visible);
}
} else if (channel === 'Controller-Set-Part-Layer') {
var data = JSON.parse(message);
for (var name in data) {
var layer = data[name];
activeController.setLayerForPart(name, layer);
} }
} }
} else if (channel === 'Controller-Display-Parts') {
debug('here part');
var data = JSON.parse(message);
for (var name in data) {
var visible = data[name];
activeController.setPartVisible(name, visible);
}
} else if (channel === 'Controller-Set-Part-Layer') {
var data = JSON.parse(message);
for (var name in data) {
var layer = data[name];
activeController.setLayerForPart(name, layer);
}
} }
} }
}
Messages.messageReceived.connect(handleMessages); Messages.messageReceived.connect(handleMessages);
this.destroy = function() {
print("Destroying controller display");
Messages.messageReceived.disconnect(handleMessages);
if (activeController) {
deleteControllerDisplay(activeController);
}
};
}
//var c = setupController(TOUCH_CONTROLLER_CONFIGURATION); //var c = setupController(TOUCH_CONTROLLER_CONFIGURATION);
//var c = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION); //var c = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION);
@ -112,9 +122,3 @@ Messages.messageReceived.connect(handleMessages);
// c.setLayerForPart("touchpad", layers[num]); // c.setLayerForPart("touchpad", layers[num]);
//}, 2000); //}, 2000);
// //
Script.scriptEnding.connect(function() {
if (activeController) {
deleteControllerDisplay(activeController);
}
//MyAvatar.shouldRenderLocally = true;
});