Hello,

This post is for sharing a patch to fix the Mouse3DManager class in
Broomstick.

Solves wrong mouse hit test when View3D not covering the whole stage.

It also checks if within view bounds before performing the hit test.


Index: src/away3d/core/managers/Mouse3DManager.as
===============================================

--- src/away3d/core/managers/Mouse3DManager.as  (revision 3149)
+++ src/away3d/core/managers/Mouse3DManager.as  (working copy)
@@ -6,11 +6,12 @@
        import away3d.core.base.Object3D;
        import away3d.core.render.HitTestRenderer;
        import away3d.core.traverse.EntityCollector;
+       import away3d.entities.Entity;
        import away3d.events.MouseEvent3D;
-       import away3d.entities.Entity;
-
+
        import flash.display.Stage;
        import flash.events.MouseEvent;
+       import flash.geom.Rectangle;
        import flash.geom.Vector3D;

        use namespace arcane;
@@ -28,6 +29,7 @@
                private var _activeRenderable : IRenderable;

                private var _stage : Stage;
+
                private var _hitTestRenderer : HitTestRenderer;
                private var _view : View3D;

@@ -51,6 +53,7 @@
                {
                        _view = view;
                        _stage = view.stage;
+
                        _hitTestRenderer = hitTestRenderer;

                        // to do: add invisible container?
@@ -80,6 +83,9 @@
                 */
                private function onClick(event : MouseEvent) : void
                {
+                       var r : Rectangle = new Rectangle(0, 0, _view.width,
_view.height);
+                       if(!r.contains(_view.mouseX, _view.mouseY)) return;
+
                        // todo: implement invalidation and only rerender if 
view is
invalid?
                        getObjectHitData();
                        if (_activeRenderable) dispatch(_mouseClick, event,
_activeRenderable);
@@ -90,6 +96,9 @@
                 */
                private function onDoubleClick(event : MouseEvent) : void
                {
+                       var r : Rectangle = new Rectangle(0, 0, _view.width,
_view.height);
+                       if(!r.contains(_view.mouseX, _view.mouseY)) return;
+
                        getObjectHitData();
                        if (_activeRenderable) dispatch(_mouseDoubleClick, 
event,
_activeRenderable);
                }
@@ -99,6 +108,9 @@
                 */
                private function onMouseDown(event : MouseEvent) : void
                {
+                       var r : Rectangle = new Rectangle(0, 0, _view.width,
_view.height);
+                       if(!r.contains(_view.mouseX, _view.mouseY)) return;
+
                        getObjectHitData();
                        if (_activeRenderable) dispatch(_mouseDown, event,
_activeRenderable);
                }
@@ -108,6 +120,9 @@
                 */
                private function onMouseMove(event : MouseEvent) : void
                {
+                       var r : Rectangle = new Rectangle(0, 0, _view.width,
_view.height);
+                       if(!r.contains(_view.mouseX, _view.mouseY)) return;
+
                        getObjectHitData();

                        if (_activeObject == _previousActiveObject) {
@@ -124,6 +139,9 @@
                 */
                private function onMouseUp(event : MouseEvent) : void
                {
+                       var r : Rectangle = new Rectangle(0, 0, _view.width,
_view.height);
+                       if(!r.contains(_view.mouseX, _view.mouseY)) return;
+
                        getObjectHitData();
                        dispatch(_mouseUp, event, _activeRenderable);
                }
@@ -133,6 +151,9 @@
                 */
                private function onMouseWheel(event : MouseEvent) : void
                {
+                       var r : Rectangle = new Rectangle(0, 0, _view.width,
_view.height);
+                       if(!r.contains(_view.mouseX, _view.mouseY)) return;
+
                        getObjectHitData();
                        if (_activeRenderable) dispatch(_mouseWheel, event,
_activeRenderable);
                }
@@ -150,7 +171,7 @@
                        // todo: would it be faster to run a custom 
ray-intersect
collector instead of using entity collector's data?
                        // todo: shouldn't render it every time, only when 
invalidated (on
move or view render)
                        if (collector.numMouseEnableds > 0) {
-                               
_hitTestRenderer.update(_stage.mouseX/_stage.stageWidth,
_stage.mouseY/_stage.stageHeight, collector);
+                               
_hitTestRenderer.update(_view.mouseX/_view.width, _view.mouseY/
_view.height, collector);
                                _activeRenderable = 
_hitTestRenderer.hitRenderable;
                                _activeObject = (_activeRenderable &&
_activeRenderable.mouseEnabled)? _activeRenderable.sourceEntity :
null;
                        }

Reply via email to