mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
finish main handControllerGrab refactoring
This commit is contained in:
parent
ff134b338b
commit
3960ec7d5a
6 changed files with 205 additions and 50 deletions
|
@ -109,6 +109,8 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
this.hand = hand;
|
||||
this.grabbedThingID = null;
|
||||
this.actionID = null; // action this script created...
|
||||
this.entityWithContextOverlay = false;
|
||||
this.contextOverlayTimer = false;
|
||||
|
||||
var ACTION_TTL = 15; // seconds
|
||||
|
||||
|
@ -335,11 +337,11 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
this.grabbedThingID = null;
|
||||
};
|
||||
|
||||
this.pointingAtWebEntity = function(controllerData) {
|
||||
this.notPointingAtEntity = function(controllerData) {
|
||||
var intersection = controllerData.rayPicks[this.hand];
|
||||
var entityProperty = Entities.getEntityProperties(intersection.objectID);
|
||||
var entityType = entityProperty.type;
|
||||
if ((intersection.type === RayPick.INTERSECTED_ENTITY && entityType === "Web") || intersection.objectID === HMD.tabletButtonID) {
|
||||
if ((intersection.type === RayPick.INTERSECTED_ENTITY && entityType === "Web") || intersection.type === RayPick.INTERSECTED_OVERLAY) {
|
||||
return true;
|
||||
}
|
||||
return false
|
||||
|
@ -388,8 +390,15 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
this.previousWorldControllerRotation = worldControllerRotation;
|
||||
};
|
||||
|
||||
this.destroyContextOverlay = function(controllerData) {
|
||||
if (this.entityWithContextOverlay) {
|
||||
ContextOverlay.destroyContextOverlay(this.entityWithContextOverlay);
|
||||
this.entityWithContextOverlay = false;
|
||||
}
|
||||
}
|
||||
|
||||
this.isReady = function (controllerData) {
|
||||
if (this.pointingAtWebEntity(controllerData)) {
|
||||
if (this.notPointingAtEntity(controllerData)) {
|
||||
return makeRunningValues(false, [], []);
|
||||
}
|
||||
|
||||
|
@ -401,17 +410,28 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
this.prepareDistanceRotatingData(controllerData);
|
||||
return makeRunningValues(true, [], []);
|
||||
} else {
|
||||
this.destroyContextOverlay();
|
||||
return makeRunningValues(false, [], []);
|
||||
}
|
||||
};
|
||||
|
||||
this.isPointingAtUI = function(controllerData) {
|
||||
var hudRayPickInfo = controllerData.hudRayPicks[this.hand];
|
||||
var hudPoint2d = HMD.overlayFromWorldPoint(hudRayPickInfo.intersection);
|
||||
}
|
||||
|
||||
this.run = function (controllerData) {
|
||||
if (controllerData.triggerValues[this.hand] < TRIGGER_OFF_VALUE || this.pointingAtWebEntity(controllerData)) {
|
||||
if (controllerData.triggerValues[this.hand] < TRIGGER_OFF_VALUE || this.notPointingAtEntity(controllerData)) {
|
||||
this.endNearGrabAction();
|
||||
this.laserPointerOff();
|
||||
return makeRunningValues(false, [], []);
|
||||
}
|
||||
|
||||
var targetEntity = controllerData.rayPicks[this.hand].objectID;
|
||||
if (targetEntity !== this.entityWithContextOverlay) {
|
||||
this.destroyContextOverlay();
|
||||
}
|
||||
|
||||
// gather up the readiness of the near-grab modules
|
||||
var nearGrabNames = [
|
||||
this.hand === RIGHT_HAND ? "RightNearActionGrabEntity" : "LeftNearActionGrabEntity",
|
||||
|
@ -456,37 +476,58 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
var hudRayPickInfo = controllerData.hudRayPicks[this.hand];
|
||||
var hudPoint2d = HMD.overlayFromWorldPoint(hudRayPickInfo.intersection);
|
||||
if (rayPickInfo.type == RayPick.INTERSECTED_ENTITY) {
|
||||
var entityID = rayPickInfo.objectID;
|
||||
var targetProps = Entities.getEntityProperties(entityID, ["dynamic", "shapeType", "position",
|
||||
"rotation", "dimensions", "density",
|
||||
"userData", "locked", "type"]);
|
||||
if (entityIsDistanceGrabbable(targetProps)) {
|
||||
if (!this.distanceRotating) {
|
||||
this.grabbedThingID = entityID;
|
||||
this.grabbedDistance = rayPickInfo.distance;
|
||||
}
|
||||
var otherModuleName =
|
||||
this.hand == RIGHT_HAND ? "LeftFarActionGrabEntity" : "RightFarActionGrabEntity";
|
||||
var otherFarGrabModule = getEnabledModuleByName(otherModuleName);
|
||||
if (otherFarGrabModule.grabbedThingID == this.grabbedThingID && otherFarGrabModule.distanceHolding) {
|
||||
this.distanceRotate(otherFarGrabModule);
|
||||
} else {
|
||||
this.distanceHolding = true;
|
||||
this.distanceRotating = false;
|
||||
this.startFarGrabAction(controllerData, targetProps);
|
||||
if (controllerData.triggerClicks[this.hand]) {
|
||||
var entityID = rayPickInfo.objectID;
|
||||
var targetProps = Entities.getEntityProperties(entityID, ["dynamic", "shapeType", "position",
|
||||
"rotation", "dimensions", "density",
|
||||
"userData", "locked", "type"]);
|
||||
if (entityIsDistanceGrabbable(targetProps)) {
|
||||
if (!this.distanceRotating) {
|
||||
this.grabbedThingID = entityID;
|
||||
this.grabbedDistance = rayPickInfo.distance;
|
||||
}
|
||||
var otherModuleName =
|
||||
this.hand == RIGHT_HAND ? "LeftFarActionGrabEntity" : "RightFarActionGrabEntity";
|
||||
var otherFarGrabModule = getEnabledModuleByName(otherModuleName);
|
||||
if (otherFarGrabModule.grabbedThingID == this.grabbedThingID && otherFarGrabModule.distanceHolding) {
|
||||
this.distanceRotate(otherFarGrabModule);
|
||||
} else {
|
||||
this.distanceHolding = true;
|
||||
this.distanceRotating = false;
|
||||
this.startFarGrabAction(controllerData, targetProps);
|
||||
}
|
||||
}
|
||||
} else if (!this.entityWithContextOverlay && !this.contextOverlayTimer) {
|
||||
var _this = this;
|
||||
_this.contextOverlayTimer = Script.setTimeout(function () {
|
||||
if (!_this.entityWithContextOverlay && _this.contextOverlayTimer) {
|
||||
var props = Entities.getEntityProperties(rayPickInfo.objectID);
|
||||
var pointerEvent = {
|
||||
type: "Move",
|
||||
id: this.hand + 1, // 0 is reserved for hardware mouse
|
||||
pos2D: projectOntoEntityXYPlane(rayPickInfo.objectID, rayPickInfo.intersection, props),
|
||||
pos3D: rayPickInfo.intersection,
|
||||
normal: rayPickInfo.surfaceNormal,
|
||||
direction: Vec3.subtract(ZERO_VEC, rayPickInfo.surfaceNormal),
|
||||
button: "Secondary"
|
||||
};
|
||||
if (ContextOverlay.createOrDestroyContextOverlay(rayPickInfo.objectID, pointerEvent)) {
|
||||
_this.entityWithContextOverlay = rayPickInfo.objectID;
|
||||
}
|
||||
}
|
||||
_this.contextOverlayTimer = false;
|
||||
}, 500);
|
||||
}
|
||||
} else if (this.distanceRotating) {
|
||||
var otherModuleName =
|
||||
this.hand == RIGHT_HAND ? "LeftFarActionGrabEntity" : "RightFarActionGrabEntity";
|
||||
var otherModuleName =
|
||||
this.hand == RIGHT_HAND ? "LeftFarActionGrabEntity" : "RightFarActionGrabEntity";
|
||||
var otherFarGrabModule = getEnabledModuleByName(otherModuleName);
|
||||
this.distanceRotate(otherFarGrabModule);
|
||||
}
|
||||
/* else if (Reticle.pointingAtSystemOverlay || Overlays.getOverlayAtPoint(hudPoint2d || Reticle.position)) {
|
||||
} else if (Reticle.pointingAtSystemOverlay || Overlays.getOverlayAtPoint(hudPoint2d || Reticle.position)) {
|
||||
this.endNearGrabAction();
|
||||
this.laserPointerOff();
|
||||
return makeRunningValues(false, [], []);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
return makeRunningValues(true, [], []);
|
||||
};
|
||||
|
|
99
scripts/system/controllers/controllerModules/inEditMode.js
Normal file
99
scripts/system/controllers/controllerModules/inEditMode.js
Normal file
|
@ -0,0 +1,99 @@
|
|||
"use strict"
|
||||
|
||||
// inEditMode.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, MyAvatar, Controller, RIGHT_HAND, LEFT_HAND,
|
||||
NULL_UUID, enableDispatcherModule, disableDispatcherModule, makeRunningValues,
|
||||
Messages, Quat, Vec3, getControllerWorldLocation, makeDispatcherModuleParameters, Overlays, ZERO_VEC,
|
||||
AVATAR_SELF_ID, HMD, INCHES_TO_METERS, DEFAULT_REGISTRATION_POINT, Settings, getGrabPointSphereOffset
|
||||
*/
|
||||
|
||||
Script.include("/~/system/controllers/controllerDispatcherUtils.js");
|
||||
Script.include("/~/system/libraries/controllers.js");
|
||||
Script.include("/~/system/libraries/utils.js");
|
||||
|
||||
(function () {
|
||||
|
||||
function InEditMode(hand) {
|
||||
this.hand = hand;
|
||||
|
||||
this.parameters = makeDispatcherModuleParameters(
|
||||
160,
|
||||
this.hand === RIGHT_HAND ? ["rightHand"] : ["leftHand"],
|
||||
100);
|
||||
|
||||
this.nearTablet = function(overlays) {
|
||||
for (var i = 0; i < overlays.length; i++) {
|
||||
if (overlays[i] === HMD.tabletID) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
this.pointingAtTablet = function(objectID) {
|
||||
if (objectID === HMD.tabletScreenID || objectID === HMD.tabletButtonID) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
this.isReady = function(controllerData) {
|
||||
var overlays = controllerData.nearbyOverlayIDs[this.hand];
|
||||
var objectID = controllerData.rayPicks[this.hand].objectID;
|
||||
|
||||
if (isInEditMode()) {
|
||||
return makeRunningValues(true, [], []);
|
||||
}
|
||||
|
||||
return makeRunningValues(false, [], []);
|
||||
};
|
||||
|
||||
this.run = function(controllerData) {
|
||||
var tabletStylusInput = getEnabledModuleByName(this.hand === RIGHT_HAND ? "RightTabletStylusInput" : "LeftTabletStylusInput");
|
||||
if (tabletStylusInput) {
|
||||
var tabletReady = tabletStylusInput.isReady(controllerData);
|
||||
|
||||
if (tabletReady.active) {
|
||||
return makeRunningValues(false, [], []);
|
||||
}
|
||||
}
|
||||
|
||||
var overlayLaser = getEnabledModuleByName(this.hand === RIGHT_HAND ? "RightOverlayLaserInput" : "LeftOverlayLaserInput");
|
||||
if (overlayLaser) {
|
||||
var overlayLaserReady = overlayLaser.isReady(controllerData);
|
||||
|
||||
if (overlayLaserReady.active && this.pointingAtTablet(overlayLaser.target)) {
|
||||
return makeRunningValues(false, [], []);
|
||||
}
|
||||
}
|
||||
|
||||
var nearOverlay = getEnabledModuleByName(this.hand === RIGHT_HAND ? "RightNearParentingGrabOverlay" : "LeftNearParentingGrabOverlay");
|
||||
if (nearOverlay) {
|
||||
var nearOverlayReady = nearOverlay.isReady(controllerData);
|
||||
|
||||
if (nearOverlayReady.active && nearOverlay.grabbedThingID === HMD.tabletID) {
|
||||
return makeRunningValues(false, [], []);
|
||||
}
|
||||
}
|
||||
|
||||
return this.isReady(controllerData);
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
var leftHandInEditMode = new InEditMode(LEFT_HAND);
|
||||
var rightHandInEditMode = new InEditMode(RIGHT_HAND);
|
||||
|
||||
enableDispatcherModule("LeftHandInEditMode", leftHandInEditMode);
|
||||
enableDispatcherModule("RightHandInEditMode", rightHandInEditMode);
|
||||
|
||||
this.cleanup = function() {
|
||||
disableDispatcherModule("LeftHandInEditMode");
|
||||
disableDispatcherModule("RightHandInEditMode");
|
||||
};
|
||||
}());
|
|
@ -28,7 +28,7 @@ var GRAB_RADIUS = 0.35;
|
|||
this.previouslyUnhooked = {};
|
||||
|
||||
this.parameters = makeDispatcherModuleParameters(
|
||||
500,
|
||||
140,
|
||||
this.hand === RIGHT_HAND ? ["rightHand"] : ["leftHand"],
|
||||
[],
|
||||
100);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
"use strict"
|
||||
|
||||
// tabletLaserInput.js
|
||||
// overlayLaserInput.js
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
|
@ -270,7 +270,7 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
return Math.sqrt(dx * dx + dy * dy);
|
||||
}
|
||||
|
||||
function TabletLaserInput(hand) {
|
||||
function OverlayLaserInput(hand) {
|
||||
this.hand = hand;
|
||||
this.active = false;
|
||||
this.previousLaserClikcedTarget = false;
|
||||
|
@ -281,11 +281,12 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
this.laserTarget = null;
|
||||
this.pressEnterLaserTarget = null;
|
||||
this.hover = false;
|
||||
this.target = null;
|
||||
this.lastValidTargetID = this.tabletTargetID;
|
||||
|
||||
|
||||
this.parameters = makeDispatcherModuleParameters(
|
||||
200,
|
||||
120,
|
||||
this.hand === RIGHT_HAND ? ["rightHand"] : ["leftHand"],
|
||||
[],
|
||||
100);
|
||||
|
@ -295,7 +296,7 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
};
|
||||
|
||||
this.getOtherModule = function() {
|
||||
return (this.hand === RIGHT_HAND) ? leftTabletLaserInput : rightTabletLaserInput;
|
||||
return (this.hand === RIGHT_HAND) ? leftOverlayLaserInput : rightOverlayLaserInput;
|
||||
};
|
||||
|
||||
this.handToController = function() {
|
||||
|
@ -313,10 +314,6 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
}
|
||||
};
|
||||
|
||||
this.hasTouchFocus = function(laserTarget) {
|
||||
return (this.laserTargetID === HMD.tabletScreenID);
|
||||
};
|
||||
|
||||
this.relinquishTouchFocus = function() {
|
||||
// send hover leave event.
|
||||
var pointerEvent = { type: "Move", id: this.hand + 1 };
|
||||
|
@ -449,12 +446,28 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
this.active = false;
|
||||
};
|
||||
|
||||
this.deleteContextOverlay = function() {
|
||||
var farGrabModule = getEnabledModuleByName(this.hand === RIGHT_HAND ? "RightFarActionGrabEntity" : "LeftFarActionGrabEntity");
|
||||
if (farGrabModule) {
|
||||
var entityWithContextOverlay = farGrabModule.entityWithContextOverlay;
|
||||
|
||||
if (entityWithContextOverlay) {
|
||||
ContextOverlay.destroyContextOverlay(entityWithContextOverlay);
|
||||
farGrabModule.entityWithContextOverlay = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.isReady = function (controllerData) {
|
||||
this.target = null;
|
||||
var intersection = controllerData.rayPicks[this.hand];
|
||||
if (intersection.type === RayPick.INTERSECTED_OVERLAY) {
|
||||
if (controllerData.triggerValues[this.hand] > TRIGGER_ON_VALUE && !this.getOtherModule().active) {
|
||||
this.target = intersection.objectID;
|
||||
this.active = true;
|
||||
return makeRunningValues(true, [], []);
|
||||
} else {
|
||||
this.deleteContextOverlay();
|
||||
}
|
||||
}
|
||||
this.reset();
|
||||
|
@ -462,12 +475,15 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
};
|
||||
|
||||
this.run = function (controllerData, deltaTime) {
|
||||
|
||||
if (this.shouldExit(controllerData)) {
|
||||
this.exitModule();
|
||||
return makeRunningValues(false, [], []);
|
||||
}
|
||||
|
||||
if (controllerData.triggerValues[this.hand] < TRIGGER_OFF_VALUE) {
|
||||
this.deleteContextOverlay();
|
||||
}
|
||||
|
||||
this.updateLaserTargets(controllerData);
|
||||
this.processControllerTriggers(controllerData);
|
||||
this.updateLaserPointer(controllerData);
|
||||
|
@ -511,17 +527,17 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
LaserPointers.setIgnoreOverlays(this.laserPointer, [HMD.tabletID]);
|
||||
};
|
||||
|
||||
var leftTabletLaserInput = new TabletLaserInput(LEFT_HAND);
|
||||
var rightTabletLaserInput = new TabletLaserInput(RIGHT_HAND);
|
||||
var leftOverlayLaserInput = new OverlayLaserInput(LEFT_HAND);
|
||||
var rightOverlayLaserInput = new OverlayLaserInput(RIGHT_HAND);
|
||||
|
||||
enableDispatcherModule("LeftTabletLaserInput", leftTabletLaserInput);
|
||||
enableDispatcherModule("RightTabletLaserInput", rightTabletLaserInput);
|
||||
enableDispatcherModule("LeftOverlayLaserInput", leftOverlayLaserInput);
|
||||
enableDispatcherModule("RightOverlayLaserInput", rightOverlayLaserInput);
|
||||
|
||||
this.cleanup = function () {
|
||||
leftTabletLaserInput.cleanup();
|
||||
rightTabletLaserInput.cleanup();
|
||||
disableDispatcherModule("LeftTabletLaserInput");
|
||||
disableDispatcherModule("RightTabletLaserInput");
|
||||
leftOverlayLaserInput.cleanup();
|
||||
rightOverlayLaserInput.cleanup();
|
||||
disableDispatcherModule("LeftOverlayLaserInput");
|
||||
disableDispatcherModule("RightOverlayLaserInput");
|
||||
};
|
||||
Script.scriptEnding.connect(this.cleanup);
|
||||
}());
|
|
@ -319,7 +319,7 @@ Script.include("/~/system/libraries/controllers.js");
|
|||
|
||||
|
||||
this.parameters = makeDispatcherModuleParameters(
|
||||
400,
|
||||
100,
|
||||
this.hand === RIGHT_HAND ? ["rightHand"] : ["leftHand"],
|
||||
[],
|
||||
100);
|
||||
|
|
|
@ -12,11 +12,9 @@
|
|||
var CONTOLLER_SCRIPTS = [
|
||||
"squeezeHands.js",
|
||||
"controllerDisplayManager.js",
|
||||
// "handControllerGrab.js",
|
||||
"handControllerPointer.js",
|
||||
// "grab.js",
|
||||
"grab.js",
|
||||
"toggleAdvancedMovementForHandControllers.js",
|
||||
|
||||
"ControllerDispatcher.js",
|
||||
"controllerModules/nearParentGrabEntity.js",
|
||||
"controllerModules/nearParentGrabOverlay.js",
|
||||
|
@ -25,8 +23,9 @@ var CONTOLLER_SCRIPTS = [
|
|||
"controllerModules/tabletStylusInput.js",
|
||||
"controllerModules/equipEntity.js",
|
||||
"controllerModules/nearTrigger.js",
|
||||
"controllerModules/web3DOverlayLaserInput.js",
|
||||
"controllerModules/overlayLaserInput.js",
|
||||
"controllerModules/webEntityLaserInput.js",
|
||||
"controllerModules/inEditMode.js",
|
||||
"teleport.js"
|
||||
];
|
||||
|
||||
|
|
Loading…
Reference in a new issue