From 55b7c2d767f08d674eba5fc8eaa823e237b991b2 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 5 Jul 2017 15:50:05 -0700 Subject: [PATCH] avoid doing a lot of work during mouse-move event-handlers --- scripts/system/controllers/grab.js | 27 +++++++++++++------------- scripts/system/libraries/WebTablet.js | 28 +++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/scripts/system/controllers/grab.js b/scripts/system/controllers/grab.js index 9f06aac3a6..da8add5117 100644 --- a/scripts/system/controllers/grab.js +++ b/scripts/system/controllers/grab.js @@ -447,15 +447,7 @@ Grabber.prototype.releaseEvent = function(event) { } }; -Grabber.prototype.moveEvent = function(event) { - // during the handling of the event, do as little as possible. We save the updated mouse position, - // and start a timer to react to the change. If more changes arrive before the timer fires, only - // the last update will be considered. This is done to avoid backing-up Qt's event queue. - if (!this.isGrabbing) { - return; - } - mouse.updateDrag(event); - +Grabber.prototype.scheduleMouseMoveProcessor = function(event) { var _this = this; if (!this.moveEventTimer) { this.moveEventTimer = Script.setTimeout(function() { @@ -464,7 +456,19 @@ Grabber.prototype.moveEvent = function(event) { } }; +Grabber.prototype.moveEvent = function(event) { + // during the handling of the event, do as little as possible. We save the updated mouse position, + // and start a timer to react to the change. If more changes arrive before the timer fires, only + // the last update will be considered. This is done to avoid backing-up Qt's event queue. + if (!this.isGrabbing) { + return; + } + mouse.updateDrag(event); + this.scheduleMouseMoveProcessor(); +}; + Grabber.prototype.moveEventProcess = function() { + this.moveEventTimer = null; // see if something added/restored gravity var entityProperties = Entities.getEntityProperties(this.entityID); if (!entityProperties || !entityProperties.gravity) { @@ -559,10 +563,7 @@ Grabber.prototype.moveEventProcess = function() { Entities.updateAction(this.entityID, this.actionID, actionArgs); } - var _this = this; - this.moveEventTimer = Script.setTimeout(function() { - _this.moveEventProcess(); - }, DELAY_FOR_30HZ); + this.scheduleMouseMoveProcessor(); }; Grabber.prototype.keyReleaseEvent = function(event) { diff --git a/scripts/system/libraries/WebTablet.js b/scripts/system/libraries/WebTablet.js index b429a9f3ae..142ed6e7b6 100644 --- a/scripts/system/libraries/WebTablet.js +++ b/scripts/system/libraries/WebTablet.js @@ -14,8 +14,6 @@ Script.include(Script.resolvePath("../libraries/utils.js")); Script.include(Script.resolvePath("../libraries/controllers.js")); Script.include(Script.resolvePath("../libraries/Xform.js")); -var VEC3_ZERO = {x: 0, y: 0, z: 0}; -var X_AXIS = {x: 1, y: 0, z: 0}; var Y_AXIS = {x: 0, y: 1, z: 0}; var DEFAULT_DPI = 34; var DEFAULT_WIDTH = 0.4375; @@ -25,12 +23,13 @@ var CAMERA_MATRIX = -7; var ROT_Y_180 = {x: 0.0, y: 1.0, z: 0, w: 0}; var ROT_LANDSCAPE = {x: 1.0, y: 1.0, z: 0, w: 0}; var ROT_LANDSCAPE_WINDOW = {x: 0.0, y: 0.0, z: 0.0, w: 0}; -var ROT_IDENT = {x: 0, y: 0, z: 0, w: 1}; var TABLET_TEXTURE_RESOLUTION = { x: 480, y: 706 }; var INCHES_TO_METERS = 1 / 39.3701; var AVATAR_SELF_ID = "{00000000-0000-0000-0000-000000000001}"; var NO_HANDS = -1; +var DELAY_FOR_30HZ = 33; // milliseconds + // will need to be recaclulated if dimensions of fbx model change. var TABLET_NATURAL_DIMENSIONS = {x: 33.797, y: 50.129, z: 2.269}; @@ -561,9 +560,29 @@ function rayIntersectPlane(planePosition, planeNormal, rayStart, rayDirection) { } } +WebTablet.prototype.scheduleMouseMoveProcessor = function() { + var _this = this; + if (!this.moveEventTimer) { + this.moveEventTimer = Script.setTimeout(function() { + _this.mouseMoveProcessor(); + }, DELAY_FOR_30HZ); + } +}; + WebTablet.prototype.mouseMoveEvent = function (event) { if (this.dragging) { - var pickRay = Camera.computePickRay(event.x, event.y); + this.currentMouse = { + x: event.x, + y: event.y + }; + this.scheduleMouseMoveProcessor(); + } +}; + +WebTablet.prototype.mouseMoveProcessor = function () { + this.moveEventTimer = null; + if (this.dragging) { + var pickRay = Camera.computePickRay(this.currentMouse.x, this.currentMouse.y); // transform pickRay into camera local coordinates var invCameraXform = new Xform(Camera.orientation, Camera.position).inv(); @@ -582,6 +601,7 @@ WebTablet.prototype.mouseMoveEvent = function (event) { localPosition: localPosition }); } + this.scheduleMouseMoveProcessor(); } };