I beat you to it ;) http://groups.google.com/group/away3d-dev/browse_thread/thread/9989b8bd571245da/ed32dad7f0a713d1?lnk=gst&q=humble+suggestion#ed32dad7f0a713d1
On Apr 14, 10:11 am, ragaes <[email protected]> wrote: > 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; > }
