diff --git a/src/systems/userinput/bindings/oculus-touch-user.js b/src/systems/userinput/bindings/oculus-touch-user.js index 7fdf6d03828038568271df7b409e77f9dd6119db..9fb929fbcd524aa086371d57d91792d93ff94066 100644 --- a/src/systems/userinput/bindings/oculus-touch-user.js +++ b/src/systems/userinput/bindings/oculus-touch-user.js @@ -685,19 +685,13 @@ export const oculusTouchUserBindings = addSetsToBindings({ ], [sets.rightHandHoldingInteractable]: [ - { - src: { value: rightButton("grip").pressed }, - dest: { value: paths.actions.rightHand.drop }, - xform: xforms.falling, - priority: 2 - }, { src: { value: rightGripPressed2 }, dest: { value: rightHandDrop2 }, xform: xforms.falling, - priority: 2 + priority: 3 }, { src: [rightHandDrop2], diff --git a/src/systems/userinput/bindings/utils.js b/src/systems/userinput/bindings/utils.js index 67559c1a62afc319a0bafabe9a3e2a7c1c6ab6e6..324190ec0545fbc02a45fc8c8a56d4585ceeccb7 100644 --- a/src/systems/userinput/bindings/utils.js +++ b/src/systems/userinput/bindings/utils.js @@ -2,9 +2,9 @@ export const addSetsToBindings = mapping => { for (const setName in mapping) { for (const binding of mapping[setName]) { if (!binding.sets) { - binding.sets = new Set(); + binding.sets = []; } - binding.sets.add(setName); + binding.sets.push(setName); } } return mapping; diff --git a/src/systems/userinput/devices/app-aware-mouse.js b/src/systems/userinput/devices/app-aware-mouse.js index 4ceb23763baecb2105a08a3aa6fd2baffa965159..837288f7cc3f1768a87ca34fc51f8b122adb410e 100644 --- a/src/systems/userinput/devices/app-aware-mouse.js +++ b/src/systems/userinput/devices/app-aware-mouse.js @@ -2,10 +2,7 @@ import { sets } from "../sets"; import { paths } from "../paths"; import { Pose } from "../pose"; -const calculateCursorPose = function(camera, coords) { - const cursorPose = new Pose(); - const origin = new THREE.Vector3(); - const direction = new THREE.Vector3(); +const calculateCursorPose = function(camera, coords, origin, direction, cursorPose) { origin.setFromMatrixPosition(camera.matrixWorld); direction .set(coords[0], coords[1], 0.5) @@ -20,9 +17,19 @@ export class AppAwareMouseDevice { constructor() { this.prevButtonLeft = false; this.clickedOnAnything = false; + this.cursorPose = new Pose(); + this.prevCursorPose = new Pose(); + this.origin = new THREE.Vector3(); + this.prevOrigin = new THREE.Vector3(); + this.direction = new THREE.Vector3(); + this.prevDirection = new THREE.Vector3(); } write(frame) { + this.prevCursorPose.copy(this.cursorPose); + this.prevOrigin.copy(this.origin); + this.prevDirection.copy(this.prevDirection); + if (!this.cursorController) { this.cursorController = document.querySelector("[cursor-controller]").components["cursor-controller"]; } @@ -56,6 +63,12 @@ export class AppAwareMouseDevice { } const coords = frame[paths.device.mouse.coords]; - frame[paths.device.smartMouse.cursorPose] = calculateCursorPose(this.camera, coords); + frame[paths.device.smartMouse.cursorPose] = calculateCursorPose( + this.camera, + coords, + this.origin, + this.direction, + this.cursorPose + ); } } diff --git a/src/systems/userinput/devices/oculus-touch-controller.js b/src/systems/userinput/devices/oculus-touch-controller.js index 75658748c22e7aadef2832867ceefd1871758a93..7ca3e6d2ec77cd486e499ede22fcc0654bf182e0 100644 --- a/src/systems/userinput/devices/oculus-touch-controller.js +++ b/src/systems/userinput/devices/oculus-touch-controller.js @@ -44,15 +44,17 @@ export class OculusTouchControllerDevice { write(frame) { if (!this.gamepad.connected) return; - this.gamepad.buttons.forEach((button, i) => { + for (let i = 0; i < this.gamepad.buttons.length; i++) { const buttonPath = paths.device.gamepad(this.gamepad.index).button(i); + const button = this.gamepad.buttons[i]; frame[buttonPath.pressed] = !!button.pressed; frame[buttonPath.touched] = !!button.touched; frame[buttonPath.value] = button.value; - }); - this.gamepad.axes.forEach((axis, i) => { + } + for (let i = 0; i < this.gamepad.axes.length; i++) { + const axis = this.gamepad.axes[i]; frame[paths.device.gamepad(this.gamepad.index).axis(i)] = axis; - }); + } this.buttonMap.forEach(button => { const outpath = this.path.button(button.name); diff --git a/src/systems/userinput/pose.js b/src/systems/userinput/pose.js index 3a75b14203adc7c6acc23a7c3efca8c1001eaa58..31db1799940b656ce125ce9a05730065050a004e 100644 --- a/src/systems/userinput/pose.js +++ b/src/systems/userinput/pose.js @@ -19,6 +19,11 @@ export function Pose() { .normalize(); this.fromOriginAndDirection(this.position, this.direction); return this; + }, + copy: function(pose) { + this.position.copy(pose.position); + this.direction.copy(pose.direction); + this.orientation.copy(pose.orientation); } }; } diff --git a/src/systems/userinput/resolve-action-sets.js b/src/systems/userinput/resolve-action-sets.js index ab64095f3f1b826d583a694e361e0171b81a7ec8..4d6e9236c27ec57cb8b47848534b8177229763a4 100644 --- a/src/systems/userinput/resolve-action-sets.js +++ b/src/systems/userinput/resolve-action-sets.js @@ -1,12 +1,20 @@ import { sets } from "./sets"; +let rightHandState; +let leftHandState; +let cursorHand; +let leftTeleporter; +let rightTeleporter; +let cursorController; + export function resolveActionSets() { - const rightHandState = document.querySelector("#player-right-controller").components["super-hands"].state; - const leftHandState = document.querySelector("#player-left-controller").components["super-hands"].state; - const cursorHand = document.querySelector("#cursor").components["super-hands"].state; - const leftTeleporter = document.querySelector("#player-left-controller").components["teleport-controls"]; - const rightTeleporter = document.querySelector("#player-right-controller").components["teleport-controls"]; - const cursorController = document.querySelector("#cursor-controller").components["cursor-controller"]; + rightHandState = rightHandState || document.querySelector("#player-right-controller").components["super-hands"].state; + leftHandState = leftHandState || document.querySelector("#player-left-controller").components["super-hands"].state; + cursorHand = cursorHand || document.querySelector("#cursor").components["super-hands"].state; + leftTeleporter = leftTeleporter || document.querySelector("#player-left-controller").components["teleport-controls"]; + rightTeleporter = + rightTeleporter || document.querySelector("#player-right-controller").components["teleport-controls"]; + cursorController = cursorController || document.querySelector("#cursor-controller").components["cursor-controller"]; const leftHandHoveringOnInteractable = !leftTeleporter.active && diff --git a/src/systems/userinput/userinput-debug.js b/src/systems/userinput/userinput-debug.js index ca2f8eb3e5342888a157bbfc8042eb63be5680b2..967d2d6af37e97308c7be322a18d2b58ffeaa23a 100644 --- a/src/systems/userinput/userinput-debug.js +++ b/src/systems/userinput/userinput-debug.js @@ -11,6 +11,7 @@ AFRAME.registerSystem("userinput-debug", { console.log(userinput); console.log("sorted", userinput.sortedBindings); console.log("actives", userinput.actives); + console.log("masks", userinput.masks); console.log("masked", userinput.masked); console.log("devices", userinput.activeDevices); console.log("activeSets", userinput.activeSets); @@ -25,24 +26,26 @@ AFRAME.registerSystem("userinput-debug", { } } - console.log( - "binding: ", - i, - "\n", - sortedBindings[i], - "\n", - "dest: ", - sortedBindings[i].dest && Object.values(sortedBindings[i].dest), - "\n", - "active: ", - actives[i], - "\n", - "maskedBy: ", - masked[i], - "\n", - sb.join("\n"), - "\n" - ); + if (this.logBindings) { + console.log( + "binding: ", + i, + "\n", + sortedBindings[i], + "\n", + "dest: ", + sortedBindings[i].dest && Object.values(sortedBindings[i].dest), + "\n", + "active: ", + actives[i], + "\n", + "maskedBy: ", + masked[i], + "\n", + sb.join("\n"), + "\n" + ); + } } } } diff --git a/src/systems/userinput/userinput.js b/src/systems/userinput/userinput.js index c7337f028f425666fa811407f46f8299d4455100..4133fd476a711a2813197494f19ac9d5ab9b4a46 100644 --- a/src/systems/userinput/userinput.js +++ b/src/systems/userinput/userinput.js @@ -36,7 +36,12 @@ function intersection(setA, setB) { } const satisfiesPath = (binding, path) => { - return Object.values(binding.dest) && Object.values(binding.dest).indexOf(path) !== -1; + for (const key in binding.dest) { + if (binding.dest[key].indexOf(path) !== -1) { + return true; + } + } + return false; }; const satisfyPath = (bindings, path) => { @@ -99,21 +104,20 @@ function canMask(masker, masked) { function computeMasks(bindings) { const masks = []; - for (const row in bindings) { - for (const col in bindings) { - let ColCanMaskRow = false; + for (let row = 0; row < bindings.length; row++) { + for (let col = 0; col < bindings.length; col++) { + masks[row] = masks[row] || []; if (canMask(bindings[col], bindings[row])) { - ColCanMaskRow = true; + masks[row].push(col); } - masks[Number(row) * bindings.length + Number(col)] = ColCanMaskRow; } } return masks; } function isActive(binding, sets) { - for (const s of binding.sets) { - if (sets.has(s)) { + for (let i = 0; i < binding.sets.length; i++) { + if (sets.has(binding.sets[i])) { return true; } } @@ -127,13 +131,12 @@ function computeExecutionStrategy(sortedBindings, masks, activeSets) { } const masked = []; - for (const row in sortedBindings) { - for (const col in sortedBindings) { - const rowMask = masked[row] || []; - if (masks[Number(row) * sortedBindings.length + Number(col)] && isActive(sortedBindings[col], activeSets)) { - rowMask.push(col); + for (let row = 0; row < sortedBindings.length; row++) { + for (let col = 0; col < sortedBindings.length; col++) { + masked[row] = masked[row] || []; + if (masks[row].indexOf(col) !== -1 && isActive(sortedBindings[col], activeSets)) { + masked[row].push(col); } - masked[row] = rowMask; } } @@ -294,7 +297,7 @@ AFRAME.registerSystem("userinput", { device.write(this.frame); } - for (const i in this.sortedBindings) { + for (let i = 0; i < this.sortedBindings.length; i++) { if (!this.actives[i] || this.masked[i].length > 0) continue; const binding = this.sortedBindings[i];