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;
>                         }

Reply via email to