overte/scripts/system/libraries/Trigger.js

88 lines
2.9 KiB
JavaScript

"use strict";
/*jslint vars: true, plusplus: true*/
/*globals Script, Overlays, Controller, Reticle, HMD, Camera, Entities, MyAvatar, Settings, Menu, ScriptDiscoveryService, Window, Vec3, Quat, print*/
Trigger = function(properties) {
properties = properties || {};
var that = this;
var controllerStandard = Controller.Standard;
that.label = properties.label || Math.random();
that.SMOOTH_RATIO = properties.smooth || 0.1; // Time averaging of trigger - 0.0 disables smoothing
that.DEADZONE = properties.deadzone || 0.10; // Once pressed, a trigger must fall below the deadzone to be considered un-pressed once pressed.
that.HYSTERESIS = properties.hystersis || 0.05; // If not pressed, a trigger must go above DEADZONE + HYSTERSIS to be considered pressed
that.value = 0;
that.pressed = false;
that.clicked = false;
// Handlers
that.onPress = properties.onPress || function(){
print("Pressed trigger " + that.label)
};
that.onRelease = properties.onRelease || function(){
print("Released trigger " + that.label)
};
that.onClick = properties.onClick || function(){
print("Clicked trigger " + that.label)
};
that.onUnclick = properties.onUnclick || function(){
print("Unclicked trigger " + that.label)
};
// Getters
that.isPressed = function() {
return that.pressed;
}
that.isClicked = function() {
return that.clicked;
}
that.getValue = function() {
return that.value;
}
// Private values
var controller = properties.controller || controllerStandard.LT;
var controllerClick = properties.controllerClick || controllerStandard.LTClick;
that.mapping = Controller.newMapping('com.highfidelity.controller.trigger.' + controller + '-' + controllerClick + '.' + that.label + Math.random());
Script.scriptEnding.connect(that.mapping.disable);
// Setup mapping,
that.mapping.from(controller).peek().to(function(value) {
that.value = (that.value * that.SMOOTH_RATIO) +
(value * (1.0 - that.SMOOTH_RATIO));
var oldPressed = that.pressed;
if (!that.pressed && that.value >= (that.DEADZONE + that.HYSTERESIS)) {
that.pressed = true;
that.onPress();
}
if (that.pressed && that.value < that.HYSTERESIS) {
that.pressed = false;
that.onRelease();
}
});
that.mapping.from(controllerClick).peek().to(function(value){
if (!that.clicked && value > 0.0) {
that.clicked = true;
that.onClick();
}
if (that.clicked && value == 0.0) {
that.clicked = false;
that.onUnclick();
}
});
that.enable = function() {
that.mapping.enable();
}
that.disable = function() {
that.mapping.disable();
}
}