diff --git a/src/components/grabbable-toggle.js b/src/components/grabbable-toggle.js index 54b62bc574b4a61be7843c4fefda61e165a231b1..55b022b01fb361c7d6441fc5f008f31ae95092e0 100644 --- a/src/components/grabbable-toggle.js +++ b/src/components/grabbable-toggle.js @@ -1,7 +1,7 @@ AFRAME.registerComponent("grabbable-toggle", { schema: { - primaryReleaseEvents: { default: ["hand_release", "action_release"] }, - secondaryReleaseEvents: { default: ["secondary_hand_release", "secondary_action_release"] } + primaryReleaseEvents: { default: ["primary_hand_release"] }, + secondaryReleaseEvents: { default: ["secondary_hand_release"] } }, init() { diff --git a/src/components/tools/pen.js b/src/components/tools/pen.js index 78f09bba1de45fb878f072e8cf8a185b7934aacd..214591f6c7825b8f0b4d3e00ce43f02a9141d673 100644 --- a/src/components/tools/pen.js +++ b/src/components/tools/pen.js @@ -14,12 +14,16 @@ AFRAME.registerComponent("pen", { defaultDirection: { default: { x: 1, y: 0, z: 0 } }, camera: { type: "selector" }, drawing: { type: "string" }, - drawingManager: { type: "string" } + drawingManager: { type: "string" }, + color: { type: "color", default: "#FF0000" }, + availableColors: { + default: ["#FF0033", "FFFF00", "#00FF33", "#0099FF", "#9900FF", "#FFFFFF", "#000000"] + } }, init() { - this.startDraw = this.startDraw.bind(this); - this.endDraw = this.endDraw.bind(this); + this.stateAdded = this.stateAdded.bind(this); + this.stateRemoved = this.stateRemoved.bind(this); this.timeSinceLastDraw = 0; @@ -34,18 +38,22 @@ AFRAME.registerComponent("pen", { this.normal = new THREE.Vector3(); this.worldPosition = new THREE.Vector3(); + + this.el.setAttribute("material", { color: this.data.color }); + + this.colorIndex = 0; }, play() { this.drawingManager = document.querySelector(this.data.drawingManager).components["drawing-manager"]; - this.el.parentNode.addEventListener("activate-start", this.startDraw); - this.el.parentNode.addEventListener("activate-end", this.endDraw); + this.el.parentNode.addEventListener("stateadded", this.stateAdded); + this.el.parentNode.addEventListener("stateremoved", this.stateRemoved); }, pause() { - this.el.parentNode.removeEventListener("activate-start", this.startDraw); - this.el.parentNode.removeEventListener("activate-end", this.endDraw); + this.el.parentNode.removeEventListener("stateadded", this.stateAdded); + this.el.parentNode.removeEventListener("stateremoved", this.stateRemoved); }, tick(t, dt) { @@ -84,13 +92,8 @@ AFRAME.registerComponent("pen", { if (this.currentDrawing) { this.el.object3D.getWorldPosition(this.worldPosition); this.getNormal(this.normal, this.worldPosition, this.direction); - const color = - "#" + - Math.random() - .toString(16) - .slice(2, 8); - this.el.setAttribute("material", { color: color }); - this.currentDrawing.startDraw(this.worldPosition, this.direction, this.normal, color); + + this.currentDrawing.startDraw(this.worldPosition, this.direction, this.normal, this.data.color); } }, @@ -103,5 +106,33 @@ AFRAME.registerComponent("pen", { this.drawingManager.returnDrawing(this); this.currentDrawing = null; } + }, + + changeColor(mod) { + this.colorIndex = (this.colorIndex + mod + this.data.availableColors.length) % this.data.availableColors.length; + this.data.color = this.data.availableColors[this.colorIndex]; + this.el.setAttribute("material", { color: this.data.color }); + }, + + stateAdded(evt) { + switch (evt.detail) { + case "activated": + this.startDraw(); + break; + case "colorNext": + this.changeColor(1); + break; + case "colorPrev": + this.changeColor(-1); + break; + } + }, + + stateRemoved(evt) { + switch (evt.detail) { + case "activated": + this.endDraw(); + break; + } } }); diff --git a/src/hub.html b/src/hub.html index 682ad418ae554f44f2d5661eebc7d1af1ef964b5..4f583366f64a59d527b9be96fe50faccea476d26 100644 --- a/src/hub.html +++ b/src/hub.html @@ -193,8 +193,10 @@ grabbable-toggle grabbable="maxGrabbers: 1; maxGrabBehavior: drop;" hoverable - activatable__hands="buttonStartEvent: secondary_action_grab; buttonEndEvent: secondary_action_release;" - activatable__cursor="buttonStartEvent: secondary-cursor-grab; buttonEndEvent: secondary-cursor-release;" + activatable__drawHand="buttonStartEvent: secondary_hand_grab; buttonEndEvent: secondary_hand_release;" + activatable__drawCursor="buttonStartEvent: secondary-cursor-grab; buttonEndEvent: secondary-cursor-release;" + activatable__colorNext="buttonStartEvent: tertiary_action_north; buttonEndEvent: action_primary_up; activatedState: colorNext;" + activatable__colorPrev="buttonStartEvent: tertiary_action_south; buttonEndEvent: action_primary_up; activatedState: colorPrev;" scale="0.5 0.5 0.5" > <a-sphere @@ -239,14 +241,14 @@ colliderEventProperty: els; colliderEndEvent: collisions; colliderEndEventProperty: clearedEls; - grabStartButtons: hand_grab, secondary_hand_grab; - grabEndButtons: hand_release, secondary_hand_release; - stretchStartButtons: hand_grab, secondary_hand_grab; - stretchEndButtons: hand_release, secondary_hand_release; + grabStartButtons: primary_hand_grab, secondary_hand_grab; + grabEndButtons: primary_hand_release, secondary_hand_release; + stretchStartButtons: primary_hand_grab, secondary_hand_grab; + stretchEndButtons: primary_hand_release, secondary_hand_release; dragDropStartButtons: hand_grab, secondary_hand_grab; dragDropEndButtons: hand_release, secondary_hand_release; - activateStartButtons: secondary_hand_grab, secondary_action_grab; - activateEndButtons: secondary_hand_release, secondary_action_release;" + activateStartButtons: secondary_hand_grab, tertiary_action_north, tertiary_action_south; + activateEndButtons: secondary_hand_release, action_primary_up;" collision-filter="collisionForces: false" physics-collider ></a-mixin> @@ -279,14 +281,14 @@ colliderEventProperty: els; colliderEndEvent: raycaster-intersection-cleared; colliderEndEventProperty: clearedEls; - grabStartButtons: cursor-grab, hand_grab, secondary_hand_grab; - grabEndButtons: cursor-release, hand_release, secondary_hand_release; - stretchStartButtons: cursor-grab, hand_grab, secondary_hand_grab; - stretchEndButtons: cursor-release, hand_release, secondary_hand_release; - dragDropStartButtons: cursor-grab, hand_grab, secondary_hand_grab; - dragDropEndButtons: cursor-release, hand_release, secondary_hand_release; - activateStartButtons: secondary_hand_grab, secondary_action_grab, secondary-cursor-grab; - activateEndButtons: secondary_hand_release, secondary_action_release, secondary-cursor-release;" + grabStartButtons: cursor-grab, primary_hand_grab, secondary_hand_grab; + grabEndButtons: cursor-release, primary_hand_release, secondary_hand_release; + stretchStartButtons: cursor-grab, primary_hand_grab, secondary_hand_grab; + stretchEndButtons: cursor-release, primary_hand_release, secondary_hand_release; + dragDropStartButtons: cursor-grab, primary_hand_grab, secondary_hand_grab; + dragDropEndButtons: cursor-release, primary_hand_release, secondary_hand_release; + activateStartButtons: secondary-cursor-grab, secondary_hand_grab, tertiary_action_north, tertiary_action_south; + activateEndButtons: secondary-cursor-release, secondary_hand_release, action_primary_up;" segments-height="9" segments-width="9" event-repeater="events: raycaster-intersection, raycaster-intersection-cleared; eventSource: #cursor-controller" diff --git a/src/input-mappings.js b/src/input-mappings.js index fa2c39126db95fd69d03a87d7e28b6f470d02844..58f7cdc39608a4787c9678586fd6a93bfbd6b430 100644 --- a/src/input-mappings.js +++ b/src/input-mappings.js @@ -52,28 +52,27 @@ const config = { trackpad_dpad4_pressed_west_down: { right: "snap_rotate_left" }, trackpad_dpad4_pressed_east_down: { right: "snap_rotate_right" }, trackpad_dpad4_pressed_center_down: { right: "action_primary_down" }, - trackpad_dpad4_pressed_north_down: { right: "action_primary_down" }, - trackpad_dpad4_pressed_south_down: { right: "action_primary_down" }, - trackpadup: { right: "action_primary_up" }, + trackpad_dpad4_pressed_north_down: { left: "tertiary_action_north", right: "tertiary_action_north" }, + trackpad_dpad4_pressed_south_down: { left: "tertiary_action_south", right: "tertiary_action_south" }, + trackpadup: { left: "action_primary_up", right: "action_primary_up" }, menudown: "thumb_down", menuup: "thumb_up", - gripdown: ["action_grab", "middle_ring_pinky_down"], - gripup: ["action_release", "middle_ring_pinky_up"], + gripdown: ["primary_action_grab", "middle_ring_pinky_down"], + gripup: ["primary_action_release", "middle_ring_pinky_up"], trackpadtouchstart: "thumb_down", trackpadtouchend: "thumb_up", triggerdown: ["secondary_action_grab", "index_down"], triggerup: ["secondary_action_release", "index_up"], - scroll: { right: "move_duck" } + scroll: { right: "scroll_move" } }, "oculus-touch-controls": { - joystick_dpad4_west: { - right: "snap_rotate_left" - }, - joystick_dpad4_east: { - right: "snap_rotate_right" - }, - gripdown: ["action_grab", "middle_ring_pinky_down"], - gripup: ["action_release", "middle_ring_pinky_up"], + joystick_dpad4_west: { right: "snap_rotate_left" }, + joystick_dpad4_east: { right: "snap_rotate_right" }, + joystick_dpad4_north: { left: "tertiary_action_north", right: "tertiary_action_north" }, + joystick_dpad4_south: { left: "tertiary_action_south", right: "tertiary_action_south" }, + joystick_dpad4_center: { left: "action_primary_up", right: "action_primary_up" }, + gripdown: ["primary_action_grab", "middle_ring_pinky_down"], + gripup: ["primary_action_release", "middle_ring_pinky_up"], abuttontouchstart: "thumb_down", abuttontouchend: "thumb_up", bbuttontouchstart: "thumb_down", @@ -88,7 +87,7 @@ const config = { thumbsticktouchend: "thumb_up", triggerdown: ["secondary_action_grab", "index_down"], triggerup: ["secondary_action_release", "index_up"], - "axismove.reverseY": { left: "move", right: "move_duck" }, + "axismove.reverseY": { left: "move", right: "scroll_move" }, abuttondown: "action_primary_down", abuttonup: "action_primary_up" }, @@ -102,17 +101,19 @@ const config = { "trackpad.pressedmove": { left: "move" }, joystick_dpad4_pressed_west_down: { right: "snap_rotate_left" }, joystick_dpad4_pressed_east_down: { right: "snap_rotate_right" }, + trackpad_dpad4_pressed_north_down: { left: "tertiary_action_north", right: "tertiary_action_north" }, + trackpad_dpad4_pressed_south_down: { left: "tertiary_action_south", right: "tertiary_action_south" }, trackpaddown: { right: "action_primary_down" }, - trackpadup: { right: "action_primary_up" }, + trackpadup: { left: "action_primary_up", right: "action_primary_up" }, menudown: "thumb_down", menuup: "thumb_up", - gripdown: ["action_grab", "middle_ring_pinky_down"], - gripup: ["action_release", "middle_ring_pinky_up"], + gripdown: ["primary_action_grab", "middle_ring_pinky_down"], + gripup: ["primary_action_release", "middle_ring_pinky_up"], trackpadtouchstart: "thumb_down", trackpadtouchend: "thumb_up", triggerdown: ["secondary_action_grab", "index_down"], triggerup: ["secondary_action_release", "index_up"], - axisMoveWithDeadzone: { left: "move", right: "move_duck" } + axisMoveWithDeadzone: { left: "move", right: "scroll_move" } }, "daydream-controls": { trackpad_dpad4_pressed_west_down: "snap_rotate_left", @@ -121,7 +122,7 @@ const config = { trackpad_dpad4_pressed_north_down: ["action_primary_down"], trackpad_dpad4_pressed_south_down: ["action_primary_down"], trackpadup: ["action_primary_up"], - axisMoveWithDeadzone: "move_duck" + axisMoveWithDeadzone: "scroll_move" }, "gearvr-controls": { trackpad_dpad4_pressed_west_down: "snap_rotate_left", @@ -132,7 +133,7 @@ const config = { trackpadup: ["action_primary_up"], triggerdown: ["action_primary_down"], triggerup: ["action_primary_up"], - scroll: "move_duck" + scroll: "scroll_move" }, "oculus-go-controls": { trackpad_dpad4_pressed_west_down: "snap_rotate_left", @@ -143,7 +144,7 @@ const config = { trackpadup: ["action_primary_up"], triggerdown: ["action_secondary_down"], triggerup: ["action_secondary_up"], - scroll: "move_duck" + scroll: "scroll_move" }, keyboard: { m_press: "action_mute", @@ -170,44 +171,6 @@ const config = { arrowright_down: "d_down", arrowright_up: "d_up" } - }, - hud: { - "vive-controls": { - triggerdown: ["action_grab", "index_down"], - triggerup: ["action_release", "index_up"] - }, - "oculus-touch-controls": { - abuttondown: "action_ui_select_down", - abuttonup: "action_ui_select_up", - gripdown: "middle_ring_pinky_down", - gripup: "middle_ring_pinky_up", - abuttontouchstart: "thumb_down", - abuttontouchend: "thumb_up", - bbuttontouchstart: "thumb_down", - bbuttontouchend: "thumb_up", - xbuttontouchstart: "thumb_down", - xbuttontouchend: "thumb_up", - ybuttontouchstart: "thumb_down", - ybuttontouchend: "thumb_up", - surfacetouchstart: "thumb_down", - surfacetouchend: "thumb_up", - thumbsticktouchstart: "thumb_down", - thumbsticktouchend: "thumb_up", - triggertouchstart: "index_down", - triggertouchend: "index_up" - }, - "daydream-controls": { - trackpaddown: { right: "action_ui_select_down" }, - trackpadup: { right: "action_ui_select_up" } - }, - "gearvr-controls": { - trackpaddown: { right: "action_ui_select_down" }, - trackpadup: { right: "action_ui_select_up" } - }, - "oculus-go-controls": { - trackpaddown: { right: "action_ui_select_down" }, - trackpadup: { right: "action_ui_select_up" } - } } } }; diff --git a/src/utils/action-event-handler.js b/src/utils/action-event-handler.js index 8e0676a455e126a86c56ea495eba4d310baae9ff..a5d057a448d3520bd05df0e922d027cea2fe5965 100644 --- a/src/utils/action-event-handler.js +++ b/src/utils/action-event-handler.js @@ -10,26 +10,28 @@ export default class ActionEventHandler { this.onPrimaryDown = this.onPrimaryDown.bind(this); this.onPrimaryUp = this.onPrimaryUp.bind(this); + this.onSecondaryDown = this.onSecondaryDown.bind(this); + this.onSecondaryUp = this.onSecondaryUp.bind(this); this.onPrimaryGrab = this.onPrimaryGrab.bind(this); this.onPrimaryRelease = this.onPrimaryRelease.bind(this); this.onSecondaryGrab = this.onSecondaryGrab.bind(this); this.onSecondaryRelease = this.onSecondaryRelease.bind(this); this.onCardboardButtonDown = this.onCardboardButtonDown.bind(this); this.onCardboardButtonUp = this.onCardboardButtonUp.bind(this); - this.onMoveDuck = this.onMoveDuck.bind(this); + this.onScrollMove = this.onScrollMove.bind(this); this.addEventListeners(); } addEventListeners() { this.scene.addEventListener("action_primary_down", this.onPrimaryDown); this.scene.addEventListener("action_primary_up", this.onPrimaryUp); - this.scene.addEventListener("action_secondary_down", this.onPrimaryDown); - this.scene.addEventListener("action_secondary_up", this.onPrimaryUp); - this.scene.addEventListener("action_grab", this.onPrimaryGrab); - this.scene.addEventListener("action_release", this.onPrimaryRelease); + this.scene.addEventListener("action_secondary_down", this.onSecondaryDown); + this.scene.addEventListener("action_secondary_up", this.onSecondaryUp); + this.scene.addEventListener("primary_action_grab", this.onPrimaryGrab); + this.scene.addEventListener("primary_action_release", this.onPrimaryRelease); this.scene.addEventListener("secondary_action_grab", this.onSecondaryGrab); this.scene.addEventListener("secondary_action_release", this.onSecondaryRelease); - this.scene.addEventListener("move_duck", this.onMoveDuck); + this.scene.addEventListener("scroll", this.onScrollMove); this.scene.addEventListener("cardboardbuttondown", this.onCardboardButtonDown); // TODO: These should be actions this.scene.addEventListener("cardboardbuttonup", this.onCardboardButtonUp); } @@ -37,18 +39,18 @@ export default class ActionEventHandler { tearDown() { this.scene.removeEventListener("action_primary_down", this.onPrimaryDown); this.scene.removeEventListener("action_primary_up", this.onPrimaryUp); - this.scene.removeEventListener("action_secondary_down", this.onPrimaryDown); - this.scene.removeEventListener("action_secondary_up", this.onPrimaryUp); - this.scene.removeEventListener("action_grab", this.onPrimaryGrab); - this.scene.removeEventListener("action_release", this.onPrimaryRelease); + this.scene.removeEventListener("action_secondary_down", this.onSecondaryDown); + this.scene.removeEventListener("action_secondary_up", this.onSecondaryUp); + this.scene.removeEventListener("primary_action_grab", this.onPrimaryGrab); + this.scene.removeEventListener("primary_action_release", this.onPrimaryRelease); this.scene.removeEventListener("secondary_action_grab", this.onSecondaryGrab); this.scene.removeEventListener("secondary_action_release", this.onSecondaryRelease); - this.scene.removeEventListener("move_duck", this.onMoveDuck); + this.scene.removeEventListener("scroll_move", this.onScrollMove); this.scene.removeEventListener("cardboardbuttondown", this.onCardboardButtonDown); this.scene.removeEventListener("cardboardbuttonup", this.onCardboardButtonUp); } - onMoveDuck(e) { + onScrollMove(e) { this.cursor.changeDistanceMod(-e.detail.axis[1] / 8); } @@ -65,11 +67,11 @@ export default class ActionEventHandler { } onGrab(e, event) { + event = event || e.type; const superHand = e.target.components["super-hands"]; const isCursorHand = this.isHandThatAlsoDrivesCursor(e.target); - if (isCursorHand && !this.isCursorInteracting) { - if (superHand.state.has("hover-start")) { + if (superHand.state.has("hover-start") || superHand.state.get("grab-start")) { e.target.emit(event); } else { this.isCursorInteracting = this.cursor.startInteraction(); @@ -82,8 +84,8 @@ export default class ActionEventHandler { } onRelease(e, event) { + event = event || e.type; const isCursorHand = this.isHandThatAlsoDrivesCursor(e.target); - if (this.isCursorInteracting && isCursorHand) { //need to check both grab-start and hover-start in the case that the spawner is being grabbed this frame if (this.isSticky(this.cursorHand.state.get("grab-start") || this.cursorHand.state.get("hover-start"))) { @@ -99,11 +101,11 @@ export default class ActionEventHandler { } onPrimaryGrab(e) { - this.onGrab(e, "hand_grab"); + this.onGrab(e, "primary_hand_grab"); } onPrimaryRelease(e) { - this.onRelease(e, "hand_release"); + this.onRelease(e, "primary_hand_release"); } onSecondaryGrab(e) { @@ -114,8 +116,8 @@ export default class ActionEventHandler { this.onRelease(e, "secondary_hand_release"); } - onPrimaryDown(e) { - this.onGrab(e, "secondary_hand_grab"); + onDown(e, event) { + this.onGrab(e, event); if (this.isHandThatAlsoDrivesCursor(e.target) && !this.isCursorInteracting) { this.cursor.setCursorVisibility(false); @@ -125,7 +127,7 @@ export default class ActionEventHandler { } } - onPrimaryUp(e) { + onUp(e, event) { if (this.isTeleporting && this.isHandThatAlsoDrivesCursor(e.target)) { const superHand = e.target.components["super-hands"]; this.cursor.setCursorVisibility(!superHand.state.has("hover-start")); @@ -133,10 +135,26 @@ export default class ActionEventHandler { e.target.emit(button + "up"); this.isTeleporting = false; } else { - this.onRelease(e, "secondary_hand_release"); + this.onRelease(e, event); } } + onPrimaryDown(e) { + this.onDown(e, "primary_hand_grab"); + } + + onPrimaryUp(e) { + this.onUp(e, "primary_hand_release"); + } + + onSecondaryDown(e) { + this.onDown(e, "secondary_hand_grab"); + } + + onSecondaryUp(e) { + this.onUp(e, "secondary_hand_release"); + } + onCardboardButtonDown(e) { this.isCursorInteracting = this.cursor.startInteraction(); if (this.isCursorInteracting) {