From c7eaf2ac36ba18560814f583b3f0481ec59b4ac2 Mon Sep 17 00:00:00 2001 From: johnshaughnessy <johnfshaughnessy@gmail.com> Date: Tue, 13 Nov 2018 14:16:16 -0800 Subject: [PATCH] Modest perf improvements --- .../userinput/bindings/oculus-touch-user.js | 8 +--- src/systems/userinput/bindings/utils.js | 4 +- .../userinput/devices/app-aware-mouse.js | 23 ++++++++--- .../devices/oculus-touch-controller.js | 10 +++-- src/systems/userinput/pose.js | 5 +++ src/systems/userinput/resolve-action-sets.js | 20 +++++++--- src/systems/userinput/userinput-debug.js | 39 ++++++++++--------- src/systems/userinput/userinput.js | 33 +++++++++------- 8 files changed, 85 insertions(+), 57 deletions(-) diff --git a/src/systems/userinput/bindings/oculus-touch-user.js b/src/systems/userinput/bindings/oculus-touch-user.js index 7fdf6d038..9fb929fbc 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 67559c1a6..324190ec0 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 4ceb23763..837288f7c 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 75658748c..7ca3e6d2e 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 3a75b1420..31db17999 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 ab64095f3..4d6e9236c 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 ca2f8eb3e..967d2d6af 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 c7337f028..4133fd476 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]; -- GitLab