[osg-users] Intercepting Windows messages
Anders Backman
andersb at cs.umu.se
Thu Nov 12 11:01:39 PST 2015
So there seem to be only a very few alternatives for integrating such a
windows oriented toolkit as the 3DConnexion SpaceMouse...
My idea of being able to create a custom implementation of a
GraphicsWindowWin32 would really open up for a better integration, albeit
not a portable one...
Right now, using VRPN feels a bit strange in a native application (as it
requires a server).
As far as I know there is no polling API for the 3DConnexion devices, no?
I see older emails about accessing it through Direct3D, and native
USB...whereas listening to windows messages would be the "correct" way of
integrating it.
I would have to hack into the context classes to do this...
Hm....
/Anders
On Thu, Nov 12, 2015 at 3:54 PM, Anders Backman <andersb at cs.umu.se> wrote:
> That is certainly an important call yes.
>
> I guess my problem is that these two calls are not interchangeable:
>
> #if 1
> osg::ref_ptr<osg::GraphicsContext> gc =
> osg::GraphicsContext::createGraphicsContext(traits.get());
> #else
> osg::ref_ptr<osgViewer::GraphicsWindowWin32> window = new
> osgViewer::GraphicsWindowWin32(traits);
> gc = window.get();
> #endif
>
> createGraphicsContext() will do a few more things which the creation of a
> osgViewer::GraphicsWindowWin32 does not. The question is really, is it
> possible to even consider this?
> Is there a mechanism for creating a custom GraphicsWindowWin32 or is this
> path doomed to fail.
>
> /Anders
>
>
>
> On Thu, Nov 12, 2015 at 3:31 PM, Trajce Nikolov NICK <
> trajce.nikolov.nick at gmail.com> wrote:
>
>> Did you tried something like:
>>
>> osgViewer::Viewer viewer;
>> viewer.getCamera()->setGraphicContext(gc);
>>
>> ?
>>
>> On Thu, Nov 12, 2015 at 2:52 PM, Anders Backman <andersb at cs.umu.se>
>> wrote:
>>
>>> I notice that there is a major difference between osgViewer::Viewer and
>>> osgViewer::CompositeViewer:
>>>
>>> The following code:
>>>
>>> osgViewer::CompositeViewer viewer;
>>>
>>> osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
>>> osg::GraphicsContext::Traits;
>>> traits->x = 100;
>>> traits->y = 100;
>>> traits->width = 1000;
>>> traits->height = 800;
>>> traits->windowDecoration = true;
>>> traits->doubleBuffer = true;
>>> traits->sharedContext = 0;
>>>
>>> osg::ref_ptr<osg::GraphicsContext> gc =
>>> osg::GraphicsContext::createGraphicsContext(traits.get());
>>>
>>> osgViewer::View* view = new osgViewer::View;
>>> view->setName("View one");
>>> viewer.addView(view);
>>>
>>> view->setSceneData(scene.get());
>>> view->getCamera()->setViewport(new osg::Viewport(0, 0, traits->width
>>> / 2, traits->height / 2));
>>> view->getCamera()->setGraphicsContext(gc.get());
>>>
>>> viewer.realize(); // Context already created. No call to
>>> GraphicsWIndowWIn32::GraphicsWIndowWin32 will be called
>>>
>>>
>>>
>>> If I replace osgViewerCompositeViewer with a osgViewer::Viewer and
>>> remove the creation of View, I get:
>>>
>>> viewer.realize(); // A new context is created. A new call to
>>> GraphicsWIndowWIn32::GraphicsWIndowWin32 will be called
>>>
>>>
>>> So it seems that osgViewer::Viewer does not respect? the previously
>>> created GraphicsCOntext?
>>>
>>> /Anders
>>>
>>>
>>>
>>> On Thu, Nov 12, 2015 at 2:24 PM, Anders Backman <andersb at cs.umu.se>
>>> wrote:
>>>
>>>> That is quite explicit. I was thinking about some method for
>>>> intercepting events.
>>>> I tried fiddling with creating a custom GraphicsWindowWin32 class, but
>>>> it turns out that this is explicitly created internally in:
>>>>
>>>> osg::GraphicsContext* Win32WindowingSystem::createGraphicsContext(
>>>> osg::GraphicsContext::Traits* traits )
>>>> {
>>>> ...
>>>> osg::ref_ptr<osgViewer::GraphicsWindowWin32> window = new
>>>> GraphicsWindowWin32(traits);
>>>>
>>>> }
>>>>
>>>> So this does not seem to be the way to catch windows messages.
>>>> My idea was that I could register my instance of the
>>>> GraphicsWindowWin32 to implement the virtual method:
>>>>
>>>> LRESULT GraphicsWindowWin32::handleNativeWindowingEvent( HWND hwnd,
>>>> UINT uMsg, WPARAM wParam, LPARAM lParam )
>>>>
>>>>
>>>> Where I could catch all windows events.
>>>>
>>>>
>>>> Turns out that I do not have enough understanding when and where
>>>> context etc is created.
>>>>
>>>> It seems that a GraphicsWindowWIn32 is first created at the call to:
>>>>
>>>> osg::ref_ptr<osg::GraphicsContext> gc =
>>>> osg::GraphicsContext::createGraphicsContext(traits.get());
>>>>
>>>>
>>>> And then at the call to:
>>>>
>>>> viewer->realize();
>>>>
>>>> will also result in a call
>>>> to GraphicsContext::createGraphicsContext(Traits* traits), which in turn
>>>> will create yet another GraphicsWindowWin32.
>>>>
>>>> So there lies my problem, my call to viewer->realize() will override my
>>>> first call to GraphicsContext::createGraphicsContext(traits.get());
>>>>
>>>>
>>>> Not sure how to get around this though. Ideas?
>>>>
>>>> /Anders
>>>>
>>>>
>>>> On Wed, Nov 11, 2015 at 5:05 PM, Trajce Nikolov NICK <
>>>> trajce.nikolov.nick at gmail.com> wrote:
>>>>
>>>>> Hi Anders,
>>>>>
>>>>> here is what I do for this on Windows
>>>>>
>>>>> while (!viewer->done())
>>>>> {
>>>>>
>>>>> #if defined(_WIN32)
>>>>> MSG msg;
>>>>> if (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
>>>>> {
>>>>> ::GetMessage(&msg, NULL, 0, 0);
>>>>>
>>>>> if (wins.size())
>>>>> {
>>>>> osgViewer::GraphicsHandleWin32 *hdl =
>>>>> dynamic_cast<osgViewer::GraphicsHandleWin32*>(wins.at(0));
>>>>> if(hdl)
>>>>> {
>>>>> WNDPROC fWndProc =
>>>>> (WNDPROC)::GetWindowLongPtr(hdl->getHWND(), GWLP_WNDPROC);
>>>>> if (fWndProc && hdl->getHWND())
>>>>> {
>>>>> ::CallWindowProc(fWndProc,hdl->getHWND(),msg.message, msg.wParam,
>>>>> msg.lParam);
>>>>> }
>>>>> }
>>>>> }
>>>>> }
>>>>> #endif
>>>>>
>>>>> On Wed, Nov 11, 2015 at 4:21 PM, Anders Backman <andersb at cs.umu.se>
>>>>> wrote:
>>>>>
>>>>>> Hi.
>>>>>>
>>>>>> Trying the 3DConnexion SpaceNavigator with OSG. However I would like
>>>>>> to stay away from VRPN and such dependencies...
>>>>>>
>>>>>> I was wondering how to best intercept Windows messages from the
>>>>>> GraphicsWindowWin32 class.
>>>>>>
>>>>>> This class has a virtual method handleNativeWindowingEvent which I
>>>>>> would like to override to catch custom messages from my device.
>>>>>>
>>>>>> Would it be possible to implement a derived class and have that
>>>>>> instantiated instead of the standard osgViewer::GraphicsWindowWin32 one?
>>>>>>
>>>>>> Or is there a different method to listen to the messages:
>>>>>>
>>>>>> ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
>>>>>>
>>>>>> Thanks,
>>>>>> Anders
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> __________________________________________
>>>>>> Anders Backman, HPC2N
>>>>>> 90187 Umeå University, Sweden
>>>>>> anders at cs.umu.se http://www.hpc2n.umu.se
>>>>>> Cell: +46-70-392 64 67
>>>>>>
>>>>>> _______________________________________________
>>>>>> osg-users mailing list
>>>>>> osg-users at lists.openscenegraph.org
>>>>>>
>>>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> trajce nikolov nick
>>>>>
>>>>> _______________________________________________
>>>>> osg-users mailing list
>>>>> osg-users at lists.openscenegraph.org
>>>>>
>>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> __________________________________________
>>>> Anders Backman, HPC2N
>>>> 90187 Umeå University, Sweden
>>>> anders at cs.umu.se http://www.hpc2n.umu.se
>>>> Cell: +46-70-392 64 67
>>>>
>>>
>>>
>>>
>>> --
>>> __________________________________________
>>> Anders Backman, HPC2N
>>> 90187 Umeå University, Sweden
>>> anders at cs.umu.se http://www.hpc2n.umu.se
>>> Cell: +46-70-392 64 67
>>>
>>> _______________________________________________
>>> osg-users mailing list
>>> osg-users at lists.openscenegraph.org
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>
>>>
>>
>>
>> --
>> trajce nikolov nick
>>
>> _______________________________________________
>> osg-users mailing list
>> osg-users at lists.openscenegraph.org
>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>
>>
>
>
> --
> __________________________________________
> Anders Backman, HPC2N
> 90187 Umeå University, Sweden
> anders at cs.umu.se http://www.hpc2n.umu.se
> Cell: +46-70-392 64 67
>
--
__________________________________________
Anders Backman, HPC2N
90187 Umeå University, Sweden
anders at cs.umu.se http://www.hpc2n.umu.se
Cell: +46-70-392 64 67
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20151112/43322a8b/attachment-0003.htm>
More information about the osg-users
mailing list