diff --git a/src/hub.html b/src/hub.html index 5af532ed669a0578a279f7b6edc84e3307b6bd01..cebb916097781d9c110270019725d7ae69c2106c 100644 --- a/src/hub.html +++ b/src/hub.html @@ -165,7 +165,7 @@ class="pen interactable toggle" super-networked-interactable="counter: #pen-counter;" body="type: dynamic; shape: none; mass: 1;" - grabbable + grabbable="maxGrabbers: 1" sticky-object="autoLockOnRelease: true; autoLockOnLoad: true;" hoverable scale="0.5 0.5 0.5" diff --git a/src/systems/userinput/bindings/vive-user.js b/src/systems/userinput/bindings/vive-user.js index 1a94b245f848417411b5ad9cd4d9cc81086afe7f..1da37128181c77e59a3fbd8c63e836977c032b73 100644 --- a/src/systems/userinput/bindings/vive-user.js +++ b/src/systems/userinput/bindings/vive-user.js @@ -21,6 +21,9 @@ const lDpadEast = v("left/dpad/east"); const lDpadWest = v("left/dpad/west"); const lDpadCenter = v("left/dpad/center"); const lTriggerFalling = v("left/trigger/falling"); +const lTriggerFallingStopDrawing = v("left/trigger/falling/stopDrawing"); +const lGripFallingStopDrawing = v("left/grip/falling/stopDrawing"); + const lTriggerRising = v("left/trigger/rising"); const lTriggerRisingGrab = v("right/trigger/rising/grab"); const lGripRisingGrab = v("right/grab/rising/grab"); @@ -78,6 +81,51 @@ const keyboardSnapLeft = k("snap-left"); const keyboardCharacterAcceleration = k("characterAcceleration"); const keyboardBoost = k("boost"); +const teleportLeft = [ + { + src: { value: lButton("trigger").pressed }, + dest: { value: lTriggerStartTeleport }, + xform: xforms.rising, + root: lTriggerRising, + priority: 100 + }, + { + src: { + bool: lTouchpadRising, + value: lDpadCenter + }, + dest: { value: lDpadCenterStartTeleport }, + xform: xforms.copyIfTrue + }, + { + src: [lTriggerStartTeleport, lDpadCenterStartTeleport], + dest: { value: paths.actions.leftHand.startTeleport }, + xform: xforms.any + } +]; +const teleportRight = [ + { + src: { value: rButton("trigger").pressed }, + dest: { value: rTriggerStartTeleport }, + xform: xforms.rising, + root: rTriggerRising, + priority: 100 + }, + { + src: { + bool: rTouchpadRising, + value: rDpadCenter + }, + dest: { value: rDpadCenterStartTeleport }, + xform: xforms.copyIfTrue + }, + { + src: [rTriggerStartTeleport, rDpadCenterStartTeleport], + dest: { value: paths.actions.rightHand.startTeleport }, + xform: xforms.any + } +]; + export const viveUserBindings = { [sets.global]: [ { @@ -110,7 +158,16 @@ export const viveUserBindings = { west: lDpadWest, center: lDpadCenter }, - xform: xforms.vec2dpad(0.2, false, true) + xform: xforms.vec2dpad(0.35) + }, + { + src: { + value: lButton("touchpad").pressed + }, + dest: { + value: lTouchpadRising + }, + xform: xforms.rising }, { src: { @@ -133,7 +190,7 @@ export const viveUserBindings = { west: rDpadWest, center: rDpadCenter }, - xform: xforms.vec2dpad(0.2) + xform: xforms.vec2dpad(0.35) }, { src: { @@ -283,13 +340,6 @@ export const viveUserBindings = { src: { value: lPose }, dest: { value: paths.actions.leftHand.pose }, xform: xforms.copy - }, - { - src: { value: lButton("trigger").pressed }, - dest: { value: paths.actions.leftHand.stopTeleport }, - xform: xforms.falling, - root: lTriggerFalling, - priority: 100 } ], [sets.rightHandTeleporting]: [ @@ -311,28 +361,8 @@ export const viveUserBindings = { xform: xforms.any } ], - [sets.leftHandHoveringOnNothing]: [ - { - src: { value: lButton("trigger").pressed }, - dest: { value: lTriggerStartTeleport }, - xform: xforms.rising, - root: lTriggerRising, - priority: 100 - }, - { - src: { - bool: lTouchpadRising, - value: lDpadCenter - }, - dest: { value: lDpadCenterStartTeleport }, - xform: xforms.copyIfTrue - }, - { - src: [lTriggerStartTeleport, lDpadCenterStartTeleport], - dest: { value: paths.actions.leftHand.startTeleport }, - xform: xforms.any - } - ], + [sets.leftHandHoveringOnNothing]: [...teleportLeft], + [sets.leftHandTeleporting]: [ { src: { value: lButton("trigger").pressed }, @@ -353,28 +383,7 @@ export const viveUserBindings = { } ], - [sets.rightHandHoveringOnNothing]: [ - { - src: { value: rButton("trigger").pressed }, - dest: { value: rTriggerStartTeleport }, - xform: xforms.rising, - root: rTriggerRising, - priority: 100 - }, - { - src: { - bool: rTouchpadRising, - value: rDpadCenter - }, - dest: { value: rDpadCenterStartTeleport }, - xform: xforms.copyIfTrue - }, - { - src: [rTriggerStartTeleport, rDpadCenterStartTeleport], - dest: { value: paths.actions.rightHand.startTeleport }, - xform: xforms.any - } - ], + [sets.rightHandHoveringOnNothing]: [...teleportRight], [sets.cursorHoveringOnNothing]: [], @@ -422,6 +431,14 @@ export const viveUserBindings = { [sets.leftHandHoveringOnPen]: [], [sets.leftHandHoldingPen]: [ + { + src: { + bool: lTouchpadRising, + value: lDpadCenter + }, + dest: { value: paths.actions.leftHand.startTeleport }, + xform: xforms.copyIfTrue + }, { src: { value: lButton("trigger").pressed }, dest: { value: paths.actions.leftHand.startDrawing }, @@ -429,40 +446,41 @@ export const viveUserBindings = { }, { src: { value: lButton("trigger").pressed }, - dest: { value: paths.actions.leftHand.stopDrawing }, + dest: { value: lTriggerFallingStopDrawing }, xform: xforms.falling }, { - src: { - value: lButton("touchpad").pressed - }, - dest: { - value: lTouchpadRising - }, - xform: xforms.rising + src: { value: lButton("grip").pressed }, + dest: { value: lGripFallingStopDrawing }, + xform: xforms.falling + }, + { + src: [lTriggerFallingStopDrawing, lGripFallingStopDrawing], + dest: { value: paths.actions.leftHand.stopDrawing }, + xform: xforms.any }, { src: { bool: lTouchpadRising, - value: lDpadEast + value: lDpadNorth }, dest: { value: paths.actions.leftHand.penNextColor }, xform: xforms.copyIfTrue, - root: lDpadEast, + root: lDpadNorth, priority: 200 }, { src: { bool: lTouchpadRising, - value: lDpadWest + value: lDpadSouth }, dest: { value: paths.actions.leftHand.penPrevColor }, xform: xforms.copyIfTrue, - root: lDpadWest, + root: lDpadSouth, priority: 200 }, { @@ -532,6 +550,14 @@ export const viveUserBindings = { [sets.cursorHoveringOnPen]: [], [sets.cursorHoldingPen]: [ + { + src: { + bool: rTouchpadRising, + value: rDpadCenter + }, + dest: { value: paths.actions.rightHand.startTeleport }, + xform: xforms.copyIfTrue + }, { src: { value: rButton("trigger").pressed }, dest: { value: paths.actions.cursor.startDrawing }, @@ -550,7 +576,31 @@ export const viveUserBindings = { touching: rButton("touchpad").touched }, dest: { value: paths.actions.cursor.scalePenTip }, - xform: xforms.touch_axis_scroll(-0.1) + xform: xforms.touch_axis_scroll(0.1) + }, + { + src: { + bool: rTouchpadRising, + value: rDpadNorth + }, + dest: { + value: paths.actions.cursor.penNextColor + }, + xform: xforms.copyIfTrue, + root: rDpadNorth, + priority: 200 + }, + { + src: { + bool: rTouchpadRising, + value: rDpadSouth + }, + dest: { + value: paths.actions.cursor.penPrevColor + }, + xform: xforms.copyIfTrue, + root: rDpadSouth, + priority: 200 } ], @@ -601,6 +651,14 @@ export const viveUserBindings = { ], [sets.rightHandHoveringOnPen]: [], [sets.rightHandHoldingPen]: [ + { + src: { + bool: rTouchpadRising, + value: rDpadCenter + }, + dest: { value: paths.actions.rightHand.startTeleport }, + xform: xforms.copyIfTrue + }, { src: { value: rButton("trigger").pressed }, dest: { value: paths.actions.rightHand.startDrawing }, @@ -613,37 +671,28 @@ export const viveUserBindings = { root: rTriggerFalling, priority: 300 }, - { - src: { - value: rButton("touchpad").pressed - }, - dest: { - value: rTouchpadRising - }, - xform: xforms.rising - }, { src: { bool: rTouchpadRising, - value: rDpadEast + value: rDpadNorth }, dest: { value: paths.actions.rightHand.penNextColor }, xform: xforms.copyIfTrue, - root: rDpadEast, + root: rDpadNorth, priority: 200 }, { src: { bool: rTouchpadRising, - value: rDpadWest + value: rDpadSouth }, dest: { value: paths.actions.rightHand.penPrevColor }, xform: xforms.copyIfTrue, - root: rDpadWest, + root: rDpadSouth, priority: 200 }, { diff --git a/src/systems/userinput/resolve-action-sets.js b/src/systems/userinput/resolve-action-sets.js index 0892d347e96cebc2e54960961f0ee51f395e0b06..18a945daaf7a41e4230394a8178e150a78696787 100644 --- a/src/systems/userinput/resolve-action-sets.js +++ b/src/systems/userinput/resolve-action-sets.js @@ -34,6 +34,7 @@ export function updateActionSetsBasedOnSuperhands() { leftHandState.get("grab-start").matches(".icamera, .icamera *"); const leftHandHovering = !leftTeleporter.active && leftHandState.has("hover-start"); const leftHandHoveringOnNothing = !leftHandHovering && !leftHandState.has("grab-start"); + const leftHandTeleporting = leftTeleporter.active; const cursorGrabbing = cursorHand.has("grab-start"); @@ -135,6 +136,7 @@ export function updateActionSetsBasedOnSuperhands() { userinput.toggleActive(sets.leftHandHoldingPen, leftHandHoldingPen); userinput.toggleActive(sets.leftHandHoldingInteractable, leftHandHoldingInteractable); userinput.toggleActive(sets.leftHandHoldingCamera, leftHandHoldingCamera); + userinput.toggleActive(sets.leftHandTeleporting, leftHandTeleporting); userinput.toggleActive(sets.rightHandHoveringOnInteractable, rightHandHoveringOnInteractable); userinput.toggleActive(sets.rightHandHoveringOnPen, rightHandHoveringOnPen); diff --git a/src/systems/userinput/sets.js b/src/systems/userinput/sets.js index e896e2c5f8dd97c9f78c5297b61ec9ab65c2c773..c764b47cfaddd0a0ea635bfff267031a033ee1c5 100644 --- a/src/systems/userinput/sets.js +++ b/src/systems/userinput/sets.js @@ -16,6 +16,7 @@ sets.rightHandHoveringOnNothing = "rightHandHoveringOnNothing"; sets.rightHandHoldingPen = "rightHandHoldingPen"; sets.rightHandHoldingCamera = "rightHandHoldingCamera"; sets.rightHandHoldingInteractable = "rightHandHoldingInteractable"; +sets.leftHandTeleporting = "leftHandTeleporting"; sets.leftHandHoveringOnPen = "leftHandHoveringOnPen"; sets.leftHandHoveringOnCamera = "leftHandHoveringOnCamera"; sets.leftHandHoveringOnInteractable = "leftHandHoveringOnInteractable";