[osg-submissions] Making osgGA::NodeTrackerManipulator ignore already handled events.
Ole-Morten Duesund
olemd+osg-submissions at glemt.net
Wed Sep 12 07:20:02 PDT 2007
Robert Osfield wrote:
> Hi Ole-Morten,
>
> As of 1.9.x onwards all EventHandlers including CameraManipulators get
> all events whether handled or not, in keeping with the Chain of
> Responsibility Design Pattern.
And I certainly see the point in this.
> The reason for passing on all events is that it permits a fuller range
> of usage models the blanket ignoring of events would deny, as the OSG
> is a general purpose toolkit this capability is important and not one
> I'm about to throw away on a whim.
I know, which is why I wasn't suggesting a change to the the Viewer
without a discussion.
> Now I do roughly understand the problem you are trying to tackle, but
> doing a blanket reject even for just a single manipulator is the wrong
> way to do it, if users want to ignore already handled events in an
> event handler then this should be optional, and even then possibly in
> a limited way. For instance your event handler might still want to
> get frame events, but not already handled mouse events, in these case
> the check should be local to the event switch case. Even this more
> limited scope still should be optional for most camera manipulators.
>
> Might I suggest considering adding an option to discard already handle
> events, and to local the use of this to just events that make sense to
> ignore in this case. Feel free to code this up.
I'd really like to be able to use any of the already existing
manipulators interchangeably - without having to maintain my own version
of OSG so I'm more than open to a more generic approach.
Doing a selective enable/disable would be fairly easy if
GUIEventAdapter::EventType could be used as a mask instead of just a
sequencial enum.
That way the user could set an enable/disable mask with a default to
all. And the cameramanipulators would just have to do a quick and
between the mask and the event-type to know if they should return early.
For instance :
manipulator->setIgnoreUsedEventsMask(DRAG | MOVE)
would do the obvious, but still be able to react to other events, even
if they're already handled.
This, along with the possibility to set a default ignore-mask would
solve at least my problems.
As far as I can see this would require changes to
GUIEventAdapter::EventType, adding get/setIgnoreUsedEventsMask() and
get/setDefaultIgnoreUsedEventsMask() to MatrixManipulator. As well as a
quick check either in all the CameraManipulators or in
Viewer::eventTraversal().
If EventType can't be changed, it should rather be an on/off thing
instead since I can't see any sensible way to selectively switch on/off
the various events in this case.
I'll be happy to provide the code or suggestions on how to do it
differently.
- OM
More information about the osg-submissions
mailing list