diff --git a/src/alternativa/engine3d/core/Camera3D.as b/src/alternativa/engine3d/core/Camera3D.as index 0c97c41..9e299db 100644 --- a/src/alternativa/engine3d/core/Camera3D.as +++ b/src/alternativa/engine3d/core/Camera3D.as @@ -323,7 +323,10 @@ public class Camera3D extends Object3D { if (lightsLength > 0) sortLights(0, lightsLength - 1); // Calculating the rays of mouse events - view.calculateRays(this, (globalMouseHandlingType & Object3D.MOUSE_HANDLING_MOVING) != 0, (globalMouseHandlingType & Object3D.MOUSE_HANDLING_PRESSING) != 0, (globalMouseHandlingType & Object3D.MOUSE_HANDLING_WHEEL) != 0); + view.calculateRays(this, (globalMouseHandlingType & Object3D.MOUSE_HANDLING_MOVING) != 0, + (globalMouseHandlingType & Object3D.MOUSE_HANDLING_PRESSING) != 0, + (globalMouseHandlingType & Object3D.MOUSE_HANDLING_WHEEL) != 0, + (globalMouseHandlingType & Object3D.MOUSE_HANDLING_MIDDLE_BUTTON) != 0); for (i = origins.length; i < view.raysLength; i++) { origins[i] = new Vector3D(); directions[i] = new Vector3D(); diff --git a/src/alternativa/engine3d/core/Object3D.as b/src/alternativa/engine3d/core/Object3D.as index 42720c1..0b4fbf2 100644 --- a/src/alternativa/engine3d/core/Object3D.as +++ b/src/alternativa/engine3d/core/Object3D.as @@ -64,18 +64,53 @@ package alternativa.engine3d.core { */ [Event (name="doubleClick", type="alternativa.engine3d.core.events.MouseEvent3D")] + /** + * Dispatched when a user presses and releases the middle button + * of the user's pointing device over the same Object3D. + * Any other evens can occur between pressing and releasing the button. + * + * @eventType alternativa.engine3d.events.MouseEvent3D.CLICK + */ + [Event (name="middleClick", type="alternativa.engine3d.core.events.MouseEvent3D")] + + /** + * Dispatched when a user presses the middle pointing device button over an Object3D instance. + * Any other evens can occur between pressing and releasing the button. + * + * @eventType alternativa.engine3d.events.MouseEvent3D.CLICK + */ + [Event (name="middleMouseDown", type="alternativa.engine3d.core.events.MouseEvent3D")] + + /** + * Dispatched when a user releases the pointing device button over an Object3D instance. + * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_UP + */ + [Event (name="middleMouseUp", type="alternativa.engine3d.core.events.MouseEvent3D")] + /** * Dispatched when a user presses the pointing device button over an Object3D instance. * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_DOWN */ [Event (name="mouseDown", type="alternativa.engine3d.core.events.MouseEvent3D")] + /** + * Dispatched when a user moves the pointing device while it is over an Object3D. + * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_MOVE + */ + [Event (name="mouseMove", type="alternativa.engine3d.core.events.MouseEvent3D")] + /** * Dispatched when a user releases the pointing device button over an Object3D instance. * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_UP */ [Event (name="mouseUp", type="alternativa.engine3d.core.events.MouseEvent3D")] + /** + * Dispatched when the user moves a pointing device away from an Object3D instance. + * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_OUT + */ + [Event (name="mouseOut", type="alternativa.engine3d.core.events.MouseEvent3D")] + /** * Dispatched when the user moves a pointing device over an Object3D instance. * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_OVER @@ -83,10 +118,33 @@ package alternativa.engine3d.core { [Event (name="mouseOver", type="alternativa.engine3d.core.events.MouseEvent3D")] /** - * Dispatched when the user moves a pointing device away from an Object3D instance. - * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_OUT + * Dispatched when a mouse wheel is spun over an Object3D instance. + * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_WHEEL */ - [Event (name="mouseOut", type="alternativa.engine3d.core.events.MouseEvent3D")] + [Event (name="mouseWheel", type="alternativa.engine3d.core.events.MouseEvent3D")] + + /** + * Dispatched when a user presses and releases the right button + * of the user's pointing device over the same Object3D. + * Any other evens can occur between pressing and releasing the button. + * + * @eventType alternativa.engine3d.events.MouseEvent3D.CLICK + */ + [Event (name="rightClick", type="alternativa.engine3d.core.events.MouseEvent3D")] + + /** + * Dispatched when a user presses the right pointing device button over an Object3D instance. + * Any other evens can occur between pressing and releasing the button. + * + * @eventType alternativa.engine3d.events.MouseEvent3D.CLICK + */ + [Event (name="rightMouseDown", type="alternativa.engine3d.core.events.MouseEvent3D")] + + /** + * Dispatched when a user releases the pointing device button over an Object3D instance. + * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_UP + */ + [Event (name="rightMouseUp", type="alternativa.engine3d.core.events.MouseEvent3D")] /** * Dispatched when the user moves a pointing device over an Object3D instance. @@ -100,18 +158,6 @@ package alternativa.engine3d.core { */ [Event (name="rollOut", type="alternativa.engine3d.core.events.MouseEvent3D")] - /** - * Dispatched when a user moves the pointing device while it is over an Object3D. - * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_MOVE - */ - [Event (name="mouseMove", type="alternativa.engine3d.core.events.MouseEvent3D")] - - /** - * Dispatched when a mouse wheel is spun over an Object3D instance. - * @eventType alternativa.engine3d.events.MouseEvent3D.MOUSE_WHEEL - */ - [Event (name="mouseWheel", type="alternativa.engine3d.core.events.MouseEvent3D")] - /** * Object3D class ia a base class for all 3D objects. Any Object3D has a property * of transformation that defines its position in space, the property boundBox, @@ -138,6 +184,10 @@ package alternativa.engine3d.core { * @private */ alternativa3d static const MOUSE_HANDLING_WHEEL:uint = 4; + /** + * @private + */ + alternativa3d static const MOUSE_HANDLING_MIDDLE_BUTTON:uint = 8; /** * Custom data available to store within Object3D by user. @@ -694,6 +744,9 @@ package alternativa.engine3d.core { if (type == MouseEvent3D.MOUSE_WHEEL) { mouseHandlingType |= MOUSE_HANDLING_WHEEL; } + if (type == MouseEvent3D.MIDDLE_CLICK || type == MouseEvent3D.MIDDLE_MOUSE_DOWN || type == MouseEvent3D.MIDDLE_MOUSE_UP) { + mouseHandlingType |= MOUSE_HANDLING_MIDDLE_BUTTON; + } } if (vector.indexOf(listener) < 0) { vector.push(listener); @@ -740,6 +793,9 @@ package alternativa.engine3d.core { if (type == MouseEvent3D.MOUSE_WHEEL) { mouseHandlingType &= ~MOUSE_HANDLING_WHEEL; } + if (type == MouseEvent3D.MIDDLE_CLICK || type == MouseEvent3D.MIDDLE_MOUSE_DOWN || type == MouseEvent3D.MIDDLE_MOUSE_UP) { + mouseHandlingType &= ~MOUSE_HANDLING_MIDDLE_BUTTON; + } } } } diff --git a/src/alternativa/engine3d/core/View.as b/src/alternativa/engine3d/core/View.as index df99575..f8b335d 100644 --- a/src/alternativa/engine3d/core/View.as +++ b/src/alternativa/engine3d/core/View.as @@ -156,6 +156,7 @@ package alternativa.engine3d.core { private var targetSurface:Surface; private var targetDepth:Number; private var pressedTarget:Object3D; + private var pressedMiddleTarget:Object3D; private var clickedTarget:Object3D; private var overedTarget:Object3D; private var overedTargetSurface:Surface; @@ -295,10 +296,10 @@ package alternativa.engine3d.core { // Listeners addEventListener(MouseEvent.MOUSE_DOWN, onMouse); addEventListener(MouseEvent.CLICK, onMouse); - addEventListener(MouseEvent.RIGHT_MOUSE_DOWN, onMouse); - addEventListener(MouseEvent.RIGHT_CLICK, onMouse); - addEventListener(MouseEvent.MIDDLE_MOUSE_DOWN, onMouse); - addEventListener(MouseEvent.MIDDLE_CLICK, onMouse); +// addEventListener("rightMouseDown", onMouse); +// addEventListener("rightClick", onMouse); + addEventListener("middleMouseDown", onMouse); + addEventListener("middleClick", onMouse); addEventListener(MouseEvent.DOUBLE_CLICK, onMouse); addEventListener(MouseEvent.MOUSE_MOVE, onMouse); addEventListener(MouseEvent.MOUSE_OVER, onMouse); @@ -374,7 +375,7 @@ package alternativa.engine3d.core { /** * @private */ - alternativa3d function calculateRays(camera:Camera3D, processMoving:Boolean, processPressing:Boolean, processMouseWheel:Boolean):void { + alternativa3d function calculateRays(camera:Camera3D, processMoving:Boolean, processPressing:Boolean, processMouseWheel:Boolean, processMiddleButton:Boolean):void { var i:int; var mouseEvent:MouseEvent; // Case of last coordinates fits in the view. @@ -410,6 +411,9 @@ package alternativa.engine3d.core { pressedTarget = null; clickedTarget = null; } + if (!processMiddleButton) { + pressedMiddleTarget = null; + } // Creation of exclusive rays var mouseX:Number = 1e+22; @@ -427,6 +431,9 @@ package alternativa.engine3d.core { if (!processMouseWheel && mouseEvent.type == MouseEvent.MOUSE_WHEEL) { continue; } + if (!processMiddleButton && (mouseEvent.type == "middleMouseDown" || mouseEvent.type == "middleClick")) { + continue; + } if (mouseEvent.type != "mouseOut") { // Calculation of ray within the camera @@ -606,12 +613,6 @@ package alternativa.engine3d.core { } pressedTarget = target; break; - case "mouseWheel": - defineTarget(index); - if (target != null) { - propagateEvent(MouseEvent3D.MOUSE_WHEEL, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); - } - break; case "click": defineTarget(index); if (target != null) { @@ -623,42 +624,6 @@ package alternativa.engine3d.core { } pressedTarget = null; break; - case "middleMouseDown": - defineTarget(index); - if (target != null) { - propagateEvent(MouseEvent3D.MIDDLE_MOUSE_DOWN, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); - } - pressedTarget = target; - break; - case "middleClick": - defineTarget(index); - if (target != null) { - propagateEvent(MouseEvent3D.MIDDLE_MOUSE_UP, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); - if (pressedTarget == target) { - clickedTarget = target; - propagateEvent(MouseEvent3D.MIDDLE_CLICK, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); - } - } - pressedTarget = null; - break; - case "rightMouseDown": - defineTarget(index); - if (target != null) { - propagateEvent(MouseEvent3D.RIGHT_MOUSE_DOWN, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); - } - pressedTarget = target; - break; - case "rightClick": - defineTarget(index); - if (target != null) { - propagateEvent(MouseEvent3D.RIGHT_MOUSE_UP, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); - if (pressedTarget == target) { - clickedTarget = target; - propagateEvent(MouseEvent3D.RIGHT_CLICK, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); - } - } - pressedTarget = null; - break; case "doubleClick": defineTarget(index); if (target != null) { @@ -670,6 +635,41 @@ package alternativa.engine3d.core { clickedTarget = null; pressedTarget = null; break; + case "middleMouseDown": + defineTarget(index); + if (target != null) { + propagateEvent(MouseEvent3D.MIDDLE_MOUSE_DOWN, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); + } + pressedMiddleTarget = target; + break; + case "middleClick": + defineTarget(index); + if (target != null) { + propagateEvent(MouseEvent3D.MIDDLE_MOUSE_UP, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); + if (pressedMiddleTarget == target) { + propagateEvent(MouseEvent3D.MIDDLE_CLICK, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); + } + } + pressedMiddleTarget = null; + break; +// case "rightMouseDown": +// defineTarget(index); +// if (target != null) { +// propagateEvent(MouseEvent3D.RIGHT_MOUSE_DOWN, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); +// } +// pressedTarget = target; +// break; +// case "rightClick": +// defineTarget(index); +// if (target != null) { +// propagateEvent(MouseEvent3D.RIGHT_MOUSE_UP, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); +// if (pressedTarget == target) { +// clickedTarget = target; +// propagateEvent(MouseEvent3D.RIGHT_CLICK, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); +// } +// } +// pressedTarget = null; +// break; case "mouseMove": defineTarget(index); if (target != null) { @@ -679,6 +679,12 @@ package alternativa.engine3d.core { processOverOut(mouseEvent, camera); } break; + case "mouseWheel": + defineTarget(index); + if (target != null) { + propagateEvent(MouseEvent3D.MOUSE_WHEEL, mouseEvent, camera, target, targetSurface, branchToVector(target, branch)); + } + break; case "mouseOut": // TODO: lastEvent not need change here. For example when MOUSE_OUT and MOUSE_MOVE exists in the one frame. lastEvent = null; diff --git a/src/alternativa/engine3d/core/events/MouseEvent3D.as b/src/alternativa/engine3d/core/events/MouseEvent3D.as index a4e9364..fd995dd 100644 --- a/src/alternativa/engine3d/core/events/MouseEvent3D.as +++ b/src/alternativa/engine3d/core/events/MouseEvent3D.as @@ -46,23 +46,23 @@ package alternativa.engine3d.core.events { */ public static const MOUSE_UP:String = "mouseUp3D"; - /** - * Defines the value of the type property of a rightClick3D event object. - * @eventType rightClick3D - */ - public static const RIGHT_CLICK:String = "rightClick3D"; - - /** - * Defines the value of the type property of a rightMouseDown3D event object. - * @eventType rightMouseDown3D - */ - public static const RIGHT_MOUSE_DOWN:String = "rightMouseDown3D"; - - /** - * Defines the value of the type property of a rightMouseUp3D event object. - * @eventType rightMouseUp3D - */ - public static const RIGHT_MOUSE_UP:String = "rightMouseUp3D"; +// /** +// * Defines the value of the type property of a rightClick3D event object. +// * @eventType rightClick3D +// */ +// public static const RIGHT_CLICK:String = "rightClick3D"; +// +// /** +// * Defines the value of the type property of a rightMouseDown3D event object. +// * @eventType rightMouseDown3D +// */ +// public static const RIGHT_MOUSE_DOWN:String = "rightMouseDown3D"; +// +// /** +// * Defines the value of the type property of a rightMouseUp3D event object. +// * @eventType rightMouseUp3D +// */ +// public static const RIGHT_MOUSE_UP:String = "rightMouseUp3D"; /** * Defines the value of the type property of a middleClick3D event object.