131 lines
4.6 KiB
JavaScript
131 lines
4.6 KiB
JavaScript
(function () {
|
|
var CONTROLLER_MAPPING_LEFT = "com.highfidelity.scaleAvatarLeft",
|
|
CONTROLLER_MAPPING_RIGHT = "com.highfidelity.scaleAvatarRight";
|
|
|
|
var isRightPressed = false;
|
|
var isLeftPressed = false;
|
|
var PRESSED_MIN_VALUE = 0.8;
|
|
|
|
var DEBUG = true;
|
|
|
|
function rightOnGripPress(value) {
|
|
if (!isRightPressed && value >= PRESSED_MIN_VALUE) { // not already pressed and value > 0.8
|
|
isRightPressed = true;
|
|
if (DEBUG) {
|
|
print("right pressed!");
|
|
}
|
|
} else if (isRightPressed && value < PRESSED_MIN_VALUE) {
|
|
isRightPressed = false;
|
|
}
|
|
handleBothGripPressed();
|
|
}
|
|
|
|
|
|
function leftOnGripPress(value) {
|
|
if (!isLeftPressed && value >= PRESSED_MIN_VALUE) { // not already pressed and value > 0.8
|
|
isLeftPressed = true;
|
|
if (DEBUG) {
|
|
print("left pressed!");
|
|
}
|
|
} else if (isLeftPressed && value < PRESSED_MIN_VALUE) {
|
|
isLeftPressed = false;
|
|
}
|
|
handleBothGripPressed();
|
|
}
|
|
|
|
|
|
var SCALE_BUFFER = 1.5; // increase/decrease the sensitivity of scaling
|
|
var PRESSED_INTERVAL_MS = 50;
|
|
var isPressed = false;
|
|
var initialDistance = null;
|
|
var initialScale = null;
|
|
var pressedInterval = null;
|
|
function handleBothGripPressed() {
|
|
if (isRightPressed && isLeftPressed && isPressed) {
|
|
// setup done, do not need to continue
|
|
// or either left or right is not pressed
|
|
return;
|
|
}
|
|
|
|
if (isRightPressed && isLeftPressed) {
|
|
if (!isPressed) {
|
|
// Both pressed initially
|
|
initialDistance = distanceBetweenHands();
|
|
isPressed = true;
|
|
initialScale = MyAvatar.scale;
|
|
|
|
// Setup pressed interval
|
|
pressedInterval = Script.setInterval(function() {
|
|
if (isPressed) {
|
|
if (DEBUG) {
|
|
print("init" + JSON.stringify(initialDistance));
|
|
print("distance" + JSON.stringify(distanceBetweenHands()));
|
|
}
|
|
|
|
var currentDistance = distanceBetweenHands();
|
|
var deltaDistance = currentDistance - initialDistance;
|
|
MyAvatar.scale = initialScale + deltaDistance * SCALE_BUFFER;
|
|
}
|
|
}, PRESSED_INTERVAL_MS);
|
|
}
|
|
} else {
|
|
// remove pressed interval
|
|
if (pressedInterval) {
|
|
if (DEBUG) {
|
|
print("CLEAR INTERVAL");
|
|
}
|
|
Script.clearInterval(pressedInterval);
|
|
pressedInterval = null;
|
|
isPressed = false;
|
|
initialDistance = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Get the distance between the avatar's hands
|
|
function distanceBetweenHands() {
|
|
// var leftPosition = Controller.getPoseValue(Controller.Standard.leftGrip);
|
|
// var rightPosition = Controller.getPoseValue(Controller.Standard.RightGrip).translation;
|
|
|
|
// print(JSON.stringify(leftPosition));
|
|
// var distance = Vec3.distance(leftPosition, rightPosition);
|
|
|
|
var leftHandPosition = MyAvatar.getJointPosition("LeftHandMiddle2");
|
|
if (!leftHandPosition) {
|
|
leftHandPosition = MyAvatar.getJointPosition("LeftHand");
|
|
}
|
|
var rightHandPosition = MyAvatar.getJointPosition("RightHandMiddle2");
|
|
if (!rightHandPosition) {
|
|
rightHandPosition = MyAvatar.getJointPosition("RightHand");
|
|
}
|
|
|
|
var distance = Vec3.distance(leftHandPosition, rightHandPosition);
|
|
|
|
return distance;
|
|
}
|
|
|
|
|
|
function setupBothControllerMappings() {
|
|
var controllerMapping = Controller.newMapping(CONTROLLER_MAPPING_LEFT);
|
|
controllerMapping.from(Controller.Standard.LeftGrip).to(leftOnGripPress);
|
|
Controller.enableMapping(CONTROLLER_MAPPING_LEFT);
|
|
|
|
controllerMapping = Controller.newMapping(CONTROLLER_MAPPING_RIGHT);
|
|
controllerMapping.from(Controller.Standard.RightGrip).to(rightOnGripPress);
|
|
Controller.enableMapping(CONTROLLER_MAPPING_RIGHT);
|
|
}
|
|
|
|
|
|
function unload() {
|
|
Controller.disableMapping(CONTROLLER_MAPPING_LEFT);
|
|
Controller.disableMapping(CONTROLLER_MAPPING_RIGHT);
|
|
|
|
if (pressedInterval) {
|
|
Script.clearInterval(pressedInterval);
|
|
}
|
|
}
|
|
|
|
setupBothControllerMappings();
|
|
Script.scriptEnding.connect(unload);
|
|
})();
|