About MouseEvent3D and mouseChildren property behavior

Software: Away3D 4.x

Avatar
SharpEdge, Member
Posted: 06 September 2013 09:44 AM   Total Posts: 94

Link GitHub Issue

tl;dr:
The target property of a MouseEvent3D should always point to the first ObjectContainer3D found that have mouseChildren=false in the capture phase.

From AS3 documentation on mouseChildren property:

“...This property is useful when you create a button with an instance of the Sprite class (instead of using the SimpleButton class). When you use a Sprite instance to create a button, you can choose to decorate the button by using the addChild() method to add additional Sprite instances. This process can cause unexpected behavior with mouse events because the Sprite instances you add as children can become the target object of a mouse event when you expect the parent instance to be the target object. To ensure that the parent instance serves as the target objects for mouse events, you can set the mouseChildren property of the parent instance to false…”

That’s how it works in Stage and i think it should work the same way in Stage3D ( the properties have the same name and we can say ObjectContainer3D is a sort of Sprite)

So i’m expecting to use this property i.e. when i have an ObjectContainer3D that groups multiple children and i want to make it look like the events are dispatched from the ObjectContainer3D and not from the children of it.

EDIT: I think that should be changed “isIgnored(entity:Entity)” function (line 162) in RaycastPicker Class and not ignore entities that have _ancestorAllorMouseEnabled = false, later Mouse3DManager is already checking for _ancestorsAllowMouseEnabled and using parent if false( Line 137).

TESTED and working

FROM:
if (
_onlyMouseEnabled && (!entity._ancestorsAllowMouseEnabled || !entity.mouseEnabled))

TO:
if (
_onlyMouseEnabled && !entity.mouseEnabled

Also Mouse3DManager needs a change at line 141 inside fireMouseEvents() function:

FROM:
for (
0len; ++i{
                
// Only dispatch from first implicitly enabled object ( one that is not a child of a mouseChildren = false hierarchy ).
                
event _queuedEvents[i];
                
dispatcher event.object;

                while (
dispatcher && !dispatcher._ancestorsAllowMouseEnabled)
                    
dispatcher dispatcher.parent;

                if (
dispatcher)
                    
dispatcher.dispatchEvent(event);
            
}

TO
:

for (
0len; ++i{
                
// Only dispatch from first implicitly enabled object ( one that is not a child of a mouseChildren = false hierarchy ).
                
event _queuedEvents[i];
                
dispatcher event.object;

                while (
dispatcher && !dispatcher._ancestorsAllowMouseEnabled)
                 
{
                    dispatcher 
dispatcher.parent;
                    
event.object dispatcher;
                 


                
if (dispatcher)
                    
dispatcher.dispatchEvent(event);
            

I hope it’s clear what i mean.

   
   

X

Away3D Forum

Member Login

Username

Password

Remember_me



X