On 28. Apr 2009, at 0:21, Jonas Walti wrote:
> Thomas McGuire schrieb
>> You could use Config::handleEvent() to translate Equalizer events
>> to OSG
>> events and add them to the EventQueue I guess. I'm not sure how you
>> can get
>> the EventQueue of the viewer. The viewer has a window, which is a
>> osgViewer::GraphicsWindow, where you can get the EventQueue from it
>> seems. We
>> use a GraphicsWindowEmbedded as the GraphicsWindow, so that OSG re-
>> uses the
>> context provided by Equalizer instead of creating its own window.
>> Not sure if
>> that already provides an EventQueue, maybe you need to derive from
>> it.
> With mViewer->getEventQueue()->keyPress('a'); you can directly
> "simulate" a keypress of char 'a'.
>
> But in the config class, where eqOSG currently handles the Equalizer
> events, we don't have access to the viewer instance, which is a
> member of the pipe class. What would be the smartest design-approach
> to pass the events to the viewer?
>
> Currently I just save the pressed key in the FrameData as a char
> member and raise the event in the Pipe::updateSceneGraph() method,
> which does more or less what it should, but is still a big hack.
>
> Any creative ideas out there?
There are different use cases, I guess:
1) Some events you directly want to pass to the view on the client in
(OS)Window::processEvent, e.g., window resize.
2) Events modifying the SG you want to handle in Config::processEvent,
and then distribute the changes to all render clients using FrameData,
either as distributed objects or as a list of commands to execute
3) Events modifying the Camera are already handled in the second way,
iirc.
I don't know how use case 2) is implemented in OSG.
Keep in mind that the application doesn't necessarily have a viewer,
i.e., when there is no appNode.
I hope SG modifications are not done in the viewer's event queue.
Ideally the data flow is:
recv event -> create command -> enqueue command in FrameData
appNode: process enqueued commands, start frame
render client: process enqueued commands
For events modifying the viewer state (e.g. stats mode) you probably
want to put the viewer state in the frame data (or in a subclass of
eq::View, if you want to keep it view-specific). Ideally the code
changing the viewer state doesn't need an osgViewer, i.e., you do all
the work in Config::handleEvent, and then copy the viewer state from
framedata into each osgViewer at the beginning of the frame.
HTH,
Stefan.
_______________________________________________
eq-dev mailing list
[email protected]
http://www.equalizergraphics.com/cgi-bin/mailman/listinfo/eq-dev
http://www.equalizergraphics.com