History

pushing what i coded out loud - it broke the way grabbing works

Wayne Chen committed 8 years ago

Commit 5276d841 parent 1942eaf2 files · +40 −17Browse files

Showing the changes to scripts/system/controllers/controllerModules (1 of 2 files). Show all

Unified · Split

scripts/system/controllers/controllerModules/webSurfaceLaserInput.js+39−17
@@ -5,11 +5,12 @@ · 4 unmodified lines
55 // Distributed under the Apache License, Version 2.0.
66 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
77
8−/* global Script, Entities, Controller, RIGHT_HAND, LEFT_HAND, enableDispatcherModule, disableDispatcherModule,
9− makeRunningValues, Messages, Quat, Vec3, makeDispatcherModuleParameters, Overlays, ZERO_VEC, HMD,
10− INCHES_TO_METERS, DEFAULT_REGISTRATION_POINT, getGrabPointSphereOffset, COLORS_GRAB_SEARCHING_HALF_SQUEEZE,
11− COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, DEFAULT_SEARCH_SPHERE_DISTANCE, TRIGGER_ON_VALUE,
12− TRIGGER_OFF_VALUE, getEnabledModuleByName, PICK_MAX_DISTANCE, ContextOverlay, Picks, makeLaserParams
8+/* global Script, Entities, Controller, RIGHT_HAND, LEFT_HAND, getControllerWorldLocation,
9+ enableDispatcherModule, disableDispatcherModule, makeRunningValues, Messages, Quat, Vec3,
10+ makeDispatcherModuleParameters, Overlays, ZERO_VEC, HMD, INCHES_TO_METERS, DEFAULT_REGISTRATION_POINT,
11+ getGrabPointSphereOffset, COLORS_GRAB_SEARCHING_HALF_SQUEEZE, COLORS_GRAB_SEARCHING_FULL_SQUEEZE,
12+ COLORS_GRAB_DISTANCE_HOLD, DEFAULT_SEARCH_SPHERE_DISTANCE, TRIGGER_ON_VALUE, TRIGGER_OFF_VALUE,
13+ getEnabledModuleByName, PICK_MAX_DISTANCE, ContextOverlay, Picks, makeLaserParams
1314 */
1415
1516 Script.include("/~/system/libraries/controllerDispatcherUtils.js");
@@ -19,6 +20,8 @@ Script.include("/~/system/libraries/controllers.js"); · 3 unmodified lines
1920 function WebSurfaceLaserInput(hand) {
2021 this.hand = hand;
2122 this.otherHand = this.hand === RIGHT_HAND ? LEFT_HAND : RIGHT_HAND;
23+ this.ignoredEntities = [];
24+ this.lastObjectID = null;
2225 this.running = false;
2326
2427 this.parameters = makeDispatcherModuleParameters(
@@ -60,16 +63,20 @@ Script.include("/~/system/libraries/controllers.js"); · 35 unmodified lines
6063 return this.hand === RIGHT_HAND ? leftOverlayLaserInput : rightOverlayLaserInput;
6164 };
6265
63− this.isPointingAtGrabbableEntity = function(controllerData, triggerPressed) {
66+ this.isPointingAtNearGrabbableEntity = function(controllerData, triggerPressed) {
6467 // we are searching for an entity that is not a web entity. We want to be able to
6568 // grab a non-web entity if the ray-pick intersects one.
6669 var intersection = controllerData.rayPicks[this.hand];
6770 if (intersection.type === Picks.INTERSECTED_ENTITY) {
6871 // is pointing at an entity.
69− var entityProperty = Entities.getEntityProperties(intersection.objectID);
70− var entityType = entityProperty.type;
71− var isGrabbable = entityIsGrabbable(entityProperty);
72− return (isGrabbable && triggerPressed && entityType !== "Web");
72+ var entityProperties = Entities.getEntityProperties(intersection.objectID);
73+ var entityType = entityProperties.type;
74+ if (entityIsGrabbable(entityProperties)) {
75+ // check if entity is near grabbable.
76+ var distance = Vec3.distance(entityProperties.position, controllerData.controllerLocations[this.hand].position);
77+ if (distance <= NEAR_GRAB_RADIUS * MyAvatar.sensorToWorldScale)
78+ return (triggerPressed && entityType !== "Web");
79+ }
7380 }
7481 return false;
7582 };
@@ -78,21 +85,30 @@ Script.include("/~/system/libraries/controllers.js"); · 2 unmodified lines
7885 // allow pointing at tablet, unlocked web entities, or web overlays automatically without pressing trigger,
7986 // but for pointing at locked web entities or non-web overlays user must be pressing trigger
8087 var intersection = controllerData.rayPicks[this.hand];
88+ var objectID = intersection.objectID;
8189 if (intersection.type === Picks.INTERSECTED_OVERLAY) {
82− var objectID = intersection.objectID;
8390 if ((HMD.tabletID && objectID === HMD.tabletID) ||
8491 (HMD.tabletScreenID && objectID === HMD.tabletScreenID) ||
8592 (HMD.homeButtonID && objectID === HMD.homeButtonID)) {
93+ this.lastObjectID = objectID;
8694 return true;
8795 } else {
8896 var overlayType = Overlays.getOverlayType(objectID);
97+ this.lastObjectID = objectID;
8998 return overlayType === "web3d" || triggerPressed;
9099 }
91100 } else if (intersection.type === Picks.INTERSECTED_ENTITY) {
92− var entityProperty = Entities.getEntityProperties(intersection.objectID);
93− var entityType = entityProperty.type;
94− var isLocked = entityProperty.locked;
95− return entityType === "Web" && (!isLocked || triggerPressed);
101+ var entityProperty = Entities.getEntityProperties(objectID);
102+ if (entityProperty.type === "Web") {
103+ var isLocked = entityProperty.locked;
104+ this.lastObjectID = objectID;
105+ return (!isLocked || triggerPressed);
106+ } else if (this.ignoredEntities.indexOf(objectID) === -1 && triggerPressed && this.lastObjectID !== objectID) {
107+ // ignore, preserve whether it's running or not.
108+ console.log("I'm here");
109+ Pointers.setIgnoreItems(controllerData.pointers[this.hand], [objectID]);
110+ this.ignoredEntities.push(objectID);
111+ }
96112 }
97113 return false;
98114 };
@@ -110,6 +126,11 @@ Script.include("/~/system/libraries/controllers.js"); · 11 unmodified lines
110126 }
111127 };
112128
129+ this.reAddIgnoredEntities = function(controllerData) {
130+ Pointers.setIncludeItems(controllerData.pointers[this.hand], this.ignoredEntities);
131+ this.ignoredEntities = [];
132+ }
133+
113134 this.updateAllwaysOn = function() {
114135 var PREFER_STYLUS_OVER_LASER = "preferStylusOverLaser";
115136 this.parameters.handLaser.allwaysOn = !Settings.getValue(PREFER_STYLUS_OVER_LASER, false);
@@ -128,7 +149,7 @@ Script.include("/~/system/libraries/controllers.js"); · 12 unmodified lines
128149 controllerData.triggerValues[this.otherHand] <= TRIGGER_OFF_VALUE;
129150 var allowThisModule = !otherModuleRunning || isTriggerPressed;
130151 if (allowThisModule && this.isPointingAtTriggerable(controllerData, isTriggerPressed) &&
131− !this.isPointingAtGrabbableEntity(controllerData, isTriggerPressed)) {
152+ !this.isPointingAtNearGrabbableEntity(controllerData, isTriggerPressed)) {
132153 this.updateAllwaysOn();
133154 if (isTriggerPressed) {
134155 this.dominantHandOverride = true; // Override dominant hand.
@@ -150,11 +171,12 @@ Script.include("/~/system/libraries/controllers.js"); · 15 unmodified lines
150171 var isTriggerPressed = controllerData.triggerValues[this.hand] > TRIGGER_OFF_VALUE;
151172 var laserOn = isTriggerPressed || this.parameters.handLaser.allwaysOn;
152173 if (allowThisModule && (laserOn && this.isPointingAtTriggerable(controllerData, isTriggerPressed)) &&
153− !this.isPointingAtGrabbableEntity(controllerData, isTriggerPressed)) {
174+ !this.isPointingAtNearGrabbableEntity(controllerData, isTriggerPressed)) {
154175 this.running = true;
155176 return makeRunningValues(true, [], []);
156177 }
157178 this.deleteContextOverlay();
179+ this.reAddIgnoredEntities(controllerData);
158180 this.running = false;
159181 this.dominantHandOverride = false;
160182 return makeRunningValues(false, [], []);