From 8c15116190895ecfc6e47e5f08f989ee73dd2714 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 6 Apr 2016 11:00:43 -0700 Subject: [PATCH] fix auto-hide logic in depthReticle --- examples/depthReticle.js | 13 ++++++++++++- .../src/display-plugins/CompositorHelper.cpp | 6 ++---- .../src/display-plugins/CompositorHelper.h | 2 +- libraries/entities/src/EntityScriptingInterface.cpp | 13 ++++++++++--- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/examples/depthReticle.js b/examples/depthReticle.js index 90e5db0f1a..10d604f707 100644 --- a/examples/depthReticle.js +++ b/examples/depthReticle.js @@ -98,10 +98,21 @@ function seekToLookAt() { } function autoHideReticle() { + var now = Date.now(); + + // sometimes we don't actually get mouse move messages (for example, if the focus has been set + // to an overlay or web page 'overlay') in but the mouse can still be moving, and we don't want + // to autohide in these cases, so we will take this opportunity to also check if the reticle + // position has changed. + if (lastMouseX != Reticle.position.x || lastMouseY != Reticle.position.y) { + lastMouseMoveOrClick = now; + lastMouseX = Reticle.position.x; + lastMouseY = Reticle.position.y; + } + // if we haven't moved in a long period of time, and we're not pointing at some // system overlay (like a window), then hide the reticle if (Reticle.visible && !Reticle.pointingAtSystemOverlay) { - var now = Date.now(); var timeSinceLastMouseMove = now - lastMouseMoveOrClick; if (timeSinceLastMouseMove > HIDE_STATIC_MOUSE_AFTER) { Reticle.visible = false; diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp index 3e09e96704..b39fd8861d 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.cpp @@ -467,8 +467,6 @@ void CompositorHelper::toggle() { } } - - glm::mat4 CompositorHelper::getReticleTransform(const glm::mat4& eyePose, const glm::vec3& headPosition) const { glm::mat4 result; if (isHMD()) { @@ -487,7 +485,7 @@ glm::mat4 CompositorHelper::getReticleTransform(const glm::mat4& eyePose, const pointerTransform[3] = vec4(cursorRay + headPosition, 1); // Scale up the cursor because of distance reticleScale *= reticleDepth; - } + } glm::mat4 overlayXfm; _modelTransform.getMatrix(overlayXfm); pointerTransform = overlayXfm * pointerTransform; @@ -503,7 +501,7 @@ glm::mat4 CompositorHelper::getReticleTransform(const glm::mat4& eyePose, const mousePosition.y *= -1.0f; vec2 mouseSize = CURSOR_PIXEL_SIZE / canvasSize; - return glm::scale(glm::translate(glm::mat4(), vec3(mousePosition, 0.0f)), vec3(mouseSize, 1.0f)); + result = glm::scale(glm::translate(glm::mat4(), vec3(mousePosition, 0.0f)), vec3(mouseSize, 1.0f)); } return result; } diff --git a/libraries/display-plugins/src/display-plugins/CompositorHelper.h b/libraries/display-plugins/src/display-plugins/CompositorHelper.h index 47433bf419..062e5c1319 100644 --- a/libraries/display-plugins/src/display-plugins/CompositorHelper.h +++ b/libraries/display-plugins/src/display-plugins/CompositorHelper.h @@ -176,7 +176,7 @@ private: bool _reticleOverQml { false }; - bool _allowMouseCapture { true }; + std::atomic _allowMouseCapture { true }; bool _fakeMouseEvent { false }; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index bca27211a8..5e30910575 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -475,13 +475,20 @@ QVector EntityScriptingInterface::findEntitiesInBox(const glm::vec3& corn return result; } -RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking, const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard) { +RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking, + const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard) { + QVector entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude); QVector entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard); - return findRayIntersectionWorker(ray, Octree::TryLock, precisionPicking, entitiesToInclude, entitiesToDiscard); + return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entitiesToInclude, entitiesToDiscard); } -RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionBlocking(const PickRay& ray, bool precisionPicking, const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard) { +// FIXME - we should remove this API and encourage all users to use findRayIntersection() instead. We've changed +// findRayIntersection() to be blocking because it never makes sense for a script to get back a non-answer +RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionBlocking(const PickRay& ray, bool precisionPicking, + const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard) { + + qDebug() << "Entities.findRayIntersectionBlocking() is obsolete, use Entities.findRayIntersection() instead."; const QVector& entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude); const QVector entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard); return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entitiesToInclude, entitiesToDiscard);