port over PR-14464

This commit is contained in:
Seth Alves 2018-12-10 18:08:30 -08:00
parent 6f25c59a0c
commit 70b68294ff
2 changed files with 19 additions and 25 deletions

View file

@ -58,7 +58,8 @@ Script.include("/~/system/libraries/controllers.js");
this.reticleMaxX = 0; this.reticleMaxX = 0;
this.reticleMinY = MARGIN; this.reticleMinY = MARGIN;
this.reticleMaxY = 0; this.reticleMaxY = 0;
this.lastUnexpectedChildrenCheckTime = 0; this.endedGrab = 0;
this.MIN_HAPTIC_PULSE_INTERVAL = 500; // ms
var FAR_GRAB_JOINTS = [65527, 65528]; // FARGRAB_LEFTHAND_INDEX, FARGRAB_RIGHTHAND_INDEX var FAR_GRAB_JOINTS = [65527, 65528]; // FARGRAB_LEFTHAND_INDEX, FARGRAB_RIGHTHAND_INDEX
@ -126,7 +127,12 @@ Script.include("/~/system/libraries/controllers.js");
// compute the mass for the purpose of energy and how quickly to move object // compute the mass for the purpose of energy and how quickly to move object
this.mass = this.getMass(targetProps.dimensions, targetProps.density); this.mass = this.getMass(targetProps.dimensions, targetProps.density);
Controller.triggerHapticPulse(HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, this.hand); // Debounce haptic pules. Can occur as near grab controller module vacillates between being ready or not due to
// changing positions and floating point rounding.
if (Date.now() - this.endedGrab > this.MIN_HAPTIC_PULSE_INTERVAL) {
Controller.triggerHapticPulse(HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, this.hand);
}
unhighlightTargetEntity(this.targetEntityID); unhighlightTargetEntity(this.targetEntityID);
var message = { var message = {
hand: this.hand, hand: this.hand,
@ -237,7 +243,8 @@ Script.include("/~/system/libraries/controllers.js");
this.grabID = null; this.grabID = null;
} }
this.hapticTargetID = null; this.endedGrab = Date.now();
var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID]; var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID];
Entities.callEntityMethod(this.targetEntityID, "releaseGrab", args); Entities.callEntityMethod(this.targetEntityID, "releaseGrab", args);
Messages.sendMessage('Hifi-Object-Manipulation', JSON.stringify({ Messages.sendMessage('Hifi-Object-Manipulation', JSON.stringify({
@ -300,11 +307,6 @@ Script.include("/~/system/libraries/controllers.js");
if (targetEntity) { if (targetEntity) {
var gtProps = Entities.getEntityProperties(targetEntity, DISPATCHER_PROPERTIES); var gtProps = Entities.getEntityProperties(targetEntity, DISPATCHER_PROPERTIES);
if (entityIsGrabbable(gtProps)) { if (entityIsGrabbable(gtProps)) {
// give haptic feedback
if (gtProps.id !== this.hapticTargetID) {
Controller.triggerHapticPulse(HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, this.hand);
this.hapticTargetID = gtProps.id;
}
// if we've attempted to grab a child, roll up to the root of the tree // if we've attempted to grab a child, roll up to the root of the tree
var groupRootProps = findGroupParent(controllerData, gtProps); var groupRootProps = findGroupParent(controllerData, gtProps);
if (entityIsGrabbable(groupRootProps)) { if (entityIsGrabbable(groupRootProps)) {

View file

@ -9,9 +9,9 @@
/* global Script, Entities, MyAvatar, Controller, RIGHT_HAND, LEFT_HAND, getControllerJointIndex, enableDispatcherModule, /* global Script, Entities, MyAvatar, Controller, RIGHT_HAND, LEFT_HAND, getControllerJointIndex, enableDispatcherModule,
disableDispatcherModule, Messages, HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, TRIGGER_OFF_VALUE, TRIGGER_ON_VALUE, disableDispatcherModule, Messages, HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, TRIGGER_OFF_VALUE, TRIGGER_ON_VALUE,
makeDispatcherModuleParameters, entityIsGrabbable, makeRunningValues, NEAR_GRAB_RADIUS, findGroupParent, Vec3, makeDispatcherModuleParameters, entityIsGrabbable, makeRunningValues, NEAR_GRAB_RADIUS, findGroupParent, Vec3,
cloneEntity, entityIsCloneable, HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, BUMPER_ON_VALUE, TEAR_AWAY_DISTANCE, cloneEntity, entityIsCloneable, HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, BUMPER_ON_VALUE,
distanceBetweenPointAndEntityBoundingBox, highlightTargetEntity, unhighlightTargetEntity, getGrabbableData, distanceBetweenPointAndEntityBoundingBox, highlightTargetEntity, unhighlightTargetEntity, getGrabbableData,
DISPATCHER_PROPERTIES, HMD DISPATCHER_PROPERTIES, HMD, NEAR_GRAB_DISTANCE
*/ */
Script.include("/~/system/libraries/controllerDispatcherUtils.js"); Script.include("/~/system/libraries/controllerDispatcherUtils.js");
@ -24,7 +24,6 @@ Script.include("/~/system/libraries/controllers.js");
this.hand = hand; this.hand = hand;
this.targetEntityID = null; this.targetEntityID = null;
this.grabbing = false; this.grabbing = false;
this.hapticTargetID = null;
this.highlightedEntity = null; this.highlightedEntity = null;
this.cloneAllowed = true; this.cloneAllowed = true;
this.grabID = null; this.grabID = null;
@ -81,8 +80,6 @@ Script.include("/~/system/libraries/controllers.js");
this.grabID = null; this.grabID = null;
} }
this.hapticTargetID = null;
var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID]; var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID];
Entities.callEntityMethod(this.targetEntityID, "releaseGrab", args); Entities.callEntityMethod(this.targetEntityID, "releaseGrab", args);
Messages.sendMessage('Hifi-Object-Manipulation', JSON.stringify({ Messages.sendMessage('Hifi-Object-Manipulation', JSON.stringify({
@ -100,21 +97,18 @@ Script.include("/~/system/libraries/controllers.js");
// nearbyEntityProperties is already sorted by length from controller // nearbyEntityProperties is already sorted by length from controller
var nearbyEntityProperties = controllerData.nearbyEntityProperties[this.hand]; var nearbyEntityProperties = controllerData.nearbyEntityProperties[this.hand];
var sensorScaleFactor = MyAvatar.sensorToWorldScale; var sensorScaleFactor = MyAvatar.sensorToWorldScale;
var nearGrabDistance = NEAR_GRAB_DISTANCE * sensorScaleFactor;
var nearGrabRadius = NEAR_GRAB_RADIUS * sensorScaleFactor;
for (var i = 0; i < nearbyEntityProperties.length; i++) { for (var i = 0; i < nearbyEntityProperties.length; i++) {
var props = nearbyEntityProperties[i]; var props = nearbyEntityProperties[i];
var handPosition = controllerData.controllerLocations[this.hand].position; var grabPosition = controllerData.controllerLocations[this.hand].position; // Is offset from hand position.
var dist = distanceBetweenPointAndEntityBoundingBox(handPosition, props); var dist = distanceBetweenPointAndEntityBoundingBox(grabPosition, props);
var distance = Vec3.distance(handPosition, props.position); var distance = Vec3.distance(grabPosition, props.position);
if ((dist > TEAR_AWAY_DISTANCE) || if ((dist > nearGrabDistance) ||
(distance > NEAR_GRAB_RADIUS * sensorScaleFactor)) { (distance > nearGrabRadius)) { // Only smallish entities can be near grabbed.
continue; continue;
} }
if (entityIsGrabbable(props) || entityIsCloneable(props)) { if (entityIsGrabbable(props) || entityIsCloneable(props)) {
// give haptic feedback
if (props.id !== this.hapticTargetID) {
Controller.triggerHapticPulse(HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, this.hand);
this.hapticTargetID = props.id;
}
if (!entityIsCloneable(props)) { if (!entityIsCloneable(props)) {
// if we've attempted to grab a non-cloneable child, roll up to the root of the tree // if we've attempted to grab a non-cloneable child, roll up to the root of the tree
var groupRootProps = findGroupParent(controllerData, props); var groupRootProps = findGroupParent(controllerData, props);
@ -149,7 +143,6 @@ Script.include("/~/system/libraries/controllers.js");
unhighlightTargetEntity(this.highlightedEntity); unhighlightTargetEntity(this.highlightedEntity);
this.highlightedEntity = null; this.highlightedEntity = null;
} }
this.hapticTargetID = null;
return makeRunningValues(false, [], []); return makeRunningValues(false, [], []);
} }
}; };
@ -178,7 +171,6 @@ Script.include("/~/system/libraries/controllers.js");
this.highlightedEntity = null; this.highlightedEntity = null;
this.grabbing = false; this.grabbing = false;
this.targetEntityID = null; this.targetEntityID = null;
this.hapticTargetID = null;
return makeRunningValues(false, [], []); return makeRunningValues(false, [], []);
} }
} }