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