mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-14 04:17:41 +02:00
parenting near grab works
This commit is contained in:
parent
f0c9f1d120
commit
fcf1dc839a
2 changed files with 63 additions and 49 deletions
|
@ -7,16 +7,21 @@
|
|||
|
||||
/* global Script, Entities, controllerDispatcherPlugins, Controller, Vec3, getControllerWorldLocation */
|
||||
|
||||
controllerDispatcherPlugins = {};
|
||||
|
||||
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 LEFT_HAND = 0;
|
||||
var RIGHT_HAND = 1;
|
||||
|
||||
var NEAR_GRAB_RADIUS = 0.1;
|
||||
var NEAR_GRAB_MAX_DISTANCE = 1.0; // you cannot grab objects that are this far away from your hand
|
||||
|
||||
|
||||
var DISPATCHER_PROPERTIES = [
|
||||
"position",
|
||||
"registrationPoint",
|
||||
|
@ -36,6 +41,11 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
];
|
||||
|
||||
this.runningPluginName = null;
|
||||
this.leftTriggerValue = 0;
|
||||
this.leftTriggerClicked = 0;
|
||||
this.rightTriggerValue = 0;
|
||||
this.rightTriggerClicked = 0;
|
||||
|
||||
|
||||
this.leftTriggerPress = function(value) {
|
||||
_this.leftTriggerValue = value;
|
||||
|
@ -55,40 +65,36 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
|
||||
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 controllerLocations = [getControllerWorldLocation(Controller.Standard.LeftHand, true),
|
||||
getControllerWorldLocation(Controller.Standard.RightHand, true)];
|
||||
|
||||
var nearbyEntityProperties = [[], []];
|
||||
for (var i = LEFT_HAND; i <= RIGHT_HAND; i ++) {
|
||||
// todo: check controllerLocations[i].valid
|
||||
var controllerPosition = controllerLocations[i].position;
|
||||
var nearbyEntityIDs = Entities.findEntities(controllerPosition, NEAR_GRAB_RADIUS);
|
||||
for (var j = 0; j < nearbyEntityIDs.length; j++) {
|
||||
var entityID = nearbyEntityIDs[j];
|
||||
var props = Entities.getEntityProperties(entityID, DISPATCHER_PROPERTIES);
|
||||
props.id = entityID;
|
||||
props.distanceFromController = Vec3.length(Vec3.subtract(controllerPosition, props.position));
|
||||
if (props.distanceFromController < NEAR_GRAB_MAX_DISTANCE) {
|
||||
nearbyEntityProperties[i].push(props);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var controllerData = {
|
||||
triggerValues: [this.leftTriggerValue, this.rightTriggerValue],
|
||||
triggerPresses: [this.leftTriggerPress, this.rightTriggerPress],
|
||||
controllerLocations: [ leftControllerLocation, rightControllerLocation ],
|
||||
nearbyEntityProperties: [ leftNearbyEntityProperties, rightNearbyEntityProperties ],
|
||||
triggerValues: [_this.leftTriggerValue, _this.rightTriggerValue],
|
||||
triggerClicks: [_this.leftTriggerClicked, _this.rightTriggerClicked],
|
||||
controllerLocations: controllerLocations,
|
||||
nearbyEntityProperties: nearbyEntityProperties,
|
||||
};
|
||||
|
||||
if (this.runningPluginName) {
|
||||
var plugin = controllerDispatcherPlugins[this.runningPluginName];
|
||||
if (_this.runningPluginName) {
|
||||
var plugin = controllerDispatcherPlugins[_this.runningPluginName];
|
||||
if (!plugin || !plugin.run(controllerData)) {
|
||||
this.runningPluginName = null;
|
||||
_this.runningPluginName = null;
|
||||
}
|
||||
} else if (controllerDispatcherPlugins) {
|
||||
for (var pluginName in controllerDispatcherPlugins) {
|
||||
|
@ -96,7 +102,7 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
if (controllerDispatcherPlugins.hasOwnProperty(pluginName)) {
|
||||
var candidatePlugin = controllerDispatcherPlugins[pluginName];
|
||||
if (candidatePlugin.isReady(controllerData)) {
|
||||
this.runningPluginName = candidatePlugin;
|
||||
_this.runningPluginName = pluginName;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -107,9 +113,9 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
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.RTClick]).peek().to(this.rightTriggerClick);
|
||||
mapping.from([Controller.Standard.LT]).peek().to(this.leftTriggerPress);
|
||||
mapping.from([Controller.Standard.LTClick]).peek().to(this.leftTriggerClicked);
|
||||
mapping.from([Controller.Standard.LTClick]).peek().to(this.leftTriggerClick);
|
||||
Controller.enableMapping(MAPPING_NAME);
|
||||
|
||||
this.cleanup = function () {
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
"_CAMERA_RELATIVE_CONTROLLER_RIGHTHAND" :
|
||||
"_CAMERA_RELATIVE_CONTROLLER_LEFTHAND");
|
||||
}
|
||||
|
||||
|
||||
return controllerJointIndex;
|
||||
}
|
||||
|
||||
|
@ -52,7 +52,11 @@
|
|||
|
||||
function entityIsGrabbable(props) {
|
||||
var grabbableProps = {};
|
||||
var userDataParsed = JSON.parse(props.userData);
|
||||
var userDataParsed = null;
|
||||
try {
|
||||
userDataParsed = JSON.parse(props.userData);
|
||||
} catch (err) {
|
||||
}
|
||||
if (userDataParsed && userDataParsed.grabbable) {
|
||||
grabbableProps = userDataParsed.grabbable;
|
||||
}
|
||||
|
@ -60,6 +64,7 @@
|
|||
if (grabbableProps.hasOwnProperty("grabbable")) {
|
||||
grabbable = grabbableProps.grabbable;
|
||||
}
|
||||
|
||||
if (!grabbable) {
|
||||
return false;
|
||||
}
|
||||
|
@ -86,6 +91,7 @@
|
|||
this.previouslyUnhooked = {};
|
||||
|
||||
|
||||
// todo: does this change if the avatar changes?
|
||||
this.handJointIndex = MyAvatar.getJointIndex(this.hand === RIGHT_HAND ? "RightHand" : "LeftHand");
|
||||
|
||||
this.thisHandIsParent = function(props) {
|
||||
|
@ -113,8 +119,7 @@
|
|||
return false;
|
||||
};
|
||||
|
||||
this.startNearGrab = function (controllerData) {
|
||||
var grabbedProperties = controllerData.nearbyEntityProperties[this.hand][this.grabbedThingID];
|
||||
this.startNearGrab = function (controllerData, grabbedProperties) {
|
||||
Controller.triggerHapticPulse(HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, this.hand);
|
||||
|
||||
var reparentProps = {
|
||||
|
@ -154,24 +159,27 @@
|
|||
};
|
||||
|
||||
this.isReady = function (controllerData) {
|
||||
if (!controllerData.triggerPresses[this.hand]) {
|
||||
if (controllerData.triggerClicks[this.hand] == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var grabbable = null;
|
||||
var grabbedProperties = null;
|
||||
var bestDistance = 1000;
|
||||
controllerData.nearbyEntityProperties[this.hand].forEach(function(nearbyEntityProperties) {
|
||||
if (entityIsGrabbable(nearbyEntityProperties)) {
|
||||
if (nearbyEntityProperties.distanceFromController < bestDistance) {
|
||||
bestDistance = nearbyEntityProperties.distanceFromController;
|
||||
grabbable = nearbyEntityProperties;
|
||||
var nearbyEntityProperties = controllerData.nearbyEntityProperties[this.hand];
|
||||
|
||||
for (var i = 0; i < nearbyEntityProperties.length; i ++) {
|
||||
var props = nearbyEntityProperties[i];
|
||||
if (entityIsGrabbable(props)) {
|
||||
if (props.distanceFromController < bestDistance) {
|
||||
bestDistance = props.distanceFromController;
|
||||
grabbedProperties = props;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (grabbable) {
|
||||
this.grabbedThingID = grabbable.id;
|
||||
this.startNearGrab();
|
||||
if (grabbedProperties) {
|
||||
this.grabbedThingID = grabbedProperties.id;
|
||||
this.startNearGrab(controllerData, grabbedProperties);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
@ -179,7 +187,7 @@
|
|||
};
|
||||
|
||||
this.run = function (controllerData) {
|
||||
if (!controllerData.triggerPresses[this.hand]) {
|
||||
if (controllerData.triggerClicks[this.hand] == 0) {
|
||||
this.endNearGrab(controllerData);
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue