mirror of
https://github.com/overte-org/overte.git
synced 2025-04-26 09:36:18 +02:00
122 lines
4.3 KiB
JavaScript
122 lines
4.3 KiB
JavaScript
"use strict";
|
|
|
|
// controllerDispatcher.js
|
|
//
|
|
// 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, Entities, controllerDispatcherPlugins, Controller, Vec3, getControllerWorldLocation */
|
|
|
|
Script.include("/~/system/libraries/utils.js");
|
|
Script.include("/~/system/libraries/controllers.js");
|
|
|
|
(function() {
|
|
var _this = this;
|
|
|
|
// var LEFT_HAND = 0;
|
|
// var RIGHT_HAND = 1;
|
|
|
|
var NEAR_GRAB_RADIUS = 0.1;
|
|
var DISPATCHER_PROPERTIES = [
|
|
"position",
|
|
"registrationPoint",
|
|
"rotation",
|
|
"gravity",
|
|
"collidesWith",
|
|
"dynamic",
|
|
"collisionless",
|
|
"locked",
|
|
"name",
|
|
"shapeType",
|
|
"parentID",
|
|
"parentJointIndex",
|
|
"density",
|
|
"dimensions",
|
|
"userData"
|
|
];
|
|
|
|
this.runningPluginName = null;
|
|
|
|
this.leftTriggerPress = function(value) {
|
|
_this.leftTriggerValue = value;
|
|
};
|
|
|
|
this.leftTriggerClick = function(value) {
|
|
_this.leftTriggerClicked = value;
|
|
};
|
|
|
|
this.rightTriggerPress = function(value) {
|
|
_this.rightTriggerValue = value;
|
|
};
|
|
|
|
this.rightTriggerClick = function(value) {
|
|
_this.rightTriggerClicked = value;
|
|
};
|
|
|
|
this.update = function () {
|
|
|
|
var leftControllerLocation = getControllerWorldLocation(Controller.Standard.LeftHand, true);
|
|
var rightControllerLocation = getControllerWorldLocation(Controller.Standard.RightHand, true);
|
|
|
|
var leftNearbyEntityIDs = Entities.findEntities(leftControllerLocation, NEAR_GRAB_RADIUS);
|
|
var rightNearbyEntityIDs = Entities.findEntities(rightControllerLocation, NEAR_GRAB_RADIUS);
|
|
|
|
var leftNearbyEntityProperties = {};
|
|
leftNearbyEntityIDs.forEach(function (entityID) {
|
|
var props = Entities.getEntityProperties(entityID, DISPATCHER_PROPERTIES);
|
|
props.id = entityID;
|
|
props.distanceFromController = Vec3.length(Vec3.subtract(leftControllerLocation, props.position));
|
|
leftNearbyEntityProperties.push(props);
|
|
});
|
|
|
|
var rightNearbyEntityProperties = {};
|
|
rightNearbyEntityIDs.forEach(function (entityID) {
|
|
var props = Entities.getEntityProperties(entityID, DISPATCHER_PROPERTIES);
|
|
props.id = entityID;
|
|
props.distanceFromController = Vec3.length(Vec3.subtract(rightControllerLocation, props.position));
|
|
rightNearbyEntityProperties.push(props);
|
|
});
|
|
|
|
|
|
var controllerData = {
|
|
triggerValues: [this.leftTriggerValue, this.rightTriggerValue],
|
|
triggerPresses: [this.leftTriggerPress, this.rightTriggerPress],
|
|
controllerLocations: [ leftControllerLocation, rightControllerLocation ],
|
|
nearbyEntityProperties: [ leftNearbyEntityProperties, rightNearbyEntityProperties ],
|
|
};
|
|
|
|
if (this.runningPluginName) {
|
|
var plugin = controllerDispatcherPlugins[this.runningPluginName];
|
|
if (!plugin || !plugin.run(controllerData)) {
|
|
this.runningPluginName = null;
|
|
}
|
|
} else if (controllerDispatcherPlugins) {
|
|
for (var pluginName in controllerDispatcherPlugins) {
|
|
// TODO sort names by plugin.priority
|
|
if (controllerDispatcherPlugins.hasOwnProperty(pluginName)) {
|
|
var candidatePlugin = controllerDispatcherPlugins[pluginName];
|
|
if (candidatePlugin.isReady(controllerData)) {
|
|
this.runningPluginName = candidatePlugin;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var MAPPING_NAME = "com.highfidelity.controllerDispatcher";
|
|
var mapping = Controller.newMapping(MAPPING_NAME);
|
|
mapping.from([Controller.Standard.RT]).peek().to(this.rightTriggerPress);
|
|
mapping.from([Controller.Standard.RTClick]).peek().to(this.rightTriggerClicked);
|
|
mapping.from([Controller.Standard.LT]).peek().to(this.leftTriggerPress);
|
|
mapping.from([Controller.Standard.LTClick]).peek().to(this.leftTriggerClicked);
|
|
Controller.enableMapping(MAPPING_NAME);
|
|
|
|
this.cleanup = function () {
|
|
Script.update.disconnect(this.update);
|
|
Controller.disableMapping(MAPPING_NAME);
|
|
};
|
|
|
|
Script.scriptEnding.connect(this.cleanup);
|
|
Script.update.connect(this.update);
|
|
}());
|