overte-lubosz/scripts/system/controllers/controllerModules/trackedHandWalk.js

174 lines
6.6 KiB
JavaScript

"use strict";
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
/* global Script, makeRunningValues, enableDispatcherModule, disableDispatcherModule,
makeDispatcherModuleParameters, handsAreTracked, Controller, Vec3
*/
Script.include("/~/system/libraries/controllerDispatcherUtils.js");
Script.include("/~/system/libraries/controllers.js");
(function() {
var controllerStandard = Controller.Standard;
function TrackedHandWalk() {
this.gestureMappingName = 'hand-track-walk-gesture-' + Math.random();
this.inputGestureMapping = Controller.newMapping(this.gestureMappingName);
this.mappingName = 'hand-track-walk-' + Math.random();
this.inputMapping = Controller.newMapping(this.mappingName);
this.leftIndexPos = null;
this.leftThumbPos = null;
this.rightIndexPos = null;
this.rightThumbPos = null;
this.touchOnBelowDistance = 0.016;
this.touchOffAboveDistance = 0.045;
this.walkingForward = false;
this.walkingBackward = false;
this.mappingEnabled = false;
this.parameters = makeDispatcherModuleParameters(
80,
["rightHand", "leftHand"],
[],
100);
this.getControlPoint = function () {
return Vec3.multiply(Vec3.sum(this.leftIndexPos, this.rightIndexPos), 0.5);
};
this.updateWalking = function () {
if (this.leftIndexPos && this.rightIndexPos) {
var indexTipDistance = Vec3.distance(this.leftIndexPos, this.rightIndexPos);
if (indexTipDistance < this.touchOnBelowDistance) {
this.walkingForward = true;
this.controlPoint = this.getControlPoint();
} else if (this.walkingForward && indexTipDistance > this.touchOffAboveDistance) {
this.walkingForward = false;
} // else don't change walkingForward
}
if (this.leftThumbPos && this.rightThumbPos) {
var thumbTipDistance = Vec3.distance(this.leftThumbPos, this.rightThumbPos);
if (thumbTipDistance < this.touchOnBelowDistance) {
this.walkingBackward = true;
this.controlPoint = this.getControlPoint();
} else if (this.walkingBackward && thumbTipDistance > this.touchOffAboveDistance) {
this.walkingBackward = false;
} // else don't change this.walkingBackward
}
if ((this.walkingForward || this.walkingBackward) && !this.mappingEnabled) {
Controller.enableMapping(this.mappingName);
this.mappingEnabled = true;
} else if (!(this.walkingForward || this.walkingBackward) && this.mappingEnabled) {
this.inputMapping.disable();
this.mappingEnabled = false;
} // else don't change mappingEnabled
};
this.leftIndexChanged = function (pose) {
if (pose.valid) {
this.leftIndexPos = pose.translation;
} else {
this.leftIndexPos = null;
}
this.updateWalking();
};
this.leftThumbChanged = function (pose) {
if (pose.valid) {
this.leftThumbPos = pose.translation;
} else {
this.leftThumbPos = null;
}
this.updateWalking();
};
this.rightIndexChanged = function (pose) {
if (pose.valid) {
this.rightIndexPos = pose.translation;
} else {
this.rightIndexPos = null;
}
this.updateWalking();
};
this.rightThumbChanged = function (pose) {
if (pose.valid) {
this.rightThumbPos = pose.translation;
} else {
this.rightThumbPos = null;
}
this.updateWalking();
};
this.isReady = function (controllerData) {
return makeRunningValues(handsAreTracked() && (this.walkingForward || this.walkingBackward), [], []);
};
this.run = function (controllerData) {
return this.isReady(controllerData);
};
this.setup = function () {
var _this = this;
this.inputGestureMapping.from(controllerStandard.LeftHandIndex4).peek().to(function (pose) {
_this.leftIndexChanged(pose);
});
this.inputGestureMapping.from(controllerStandard.LeftHandThumb4).peek().to(function (pose) {
_this.leftThumbChanged(pose);
});
this.inputGestureMapping.from(controllerStandard.RightHandIndex4).peek().to(function (pose) {
_this.rightIndexChanged(pose);
});
this.inputGestureMapping.from(controllerStandard.RightHandThumb4).peek().to(function (pose) {
_this.rightThumbChanged(pose);
});
this.inputMapping.from(function() {
if (_this.walkingForward) {
// var currentPoint = _this.getControlPoint();
// return currentPoint.z - _this.controlPoint.z;
return -0.5;
} else if (_this.walkingBackward) {
// var currentPoint = _this.getControlPoint();
// return currentPoint.z - _this.controlPoint.z;
return 0.5;
} else {
// return Controller.getActionValue(controllerStandard.TranslateZ);
return 0.0;
}
}).to(Controller.Actions.TranslateZ);
// this.inputMapping.from(function() {
// if (_this.walkingForward) {
// var currentPoint = _this.getControlPoint();
// return currentPoint.x - _this.controlPoint.x;
// } else {
// return Controller.getActionValue(controllerStandard.Yaw);
// }
// }).to(Controller.Actions.Yaw);
Controller.enableMapping(this.gestureMappingName);
};
this.cleanUp = function () {
this.inputGestureMapping.disable();
this.inputMapping.disable();
};
}
var trackedHandWalk = new TrackedHandWalk();
trackedHandWalk.setup();
enableDispatcherModule("TrackedHandWalk", trackedHandWalk);
function cleanup() {
trackedHandWalk.cleanUp();
disableDispatcherModule("TrackedHandWalk");
}
Script.scriptEnding.connect(cleanup);
}());