Just wanted to update this thread and provide information on how I achieved
what I was looking for.
We managed to make a transparent application that you can click through with
OSG. This means that you can display models on the screen and have them move
around with regards to input and at the same time. The window is always on top
thus whatever your scene graph contains will always be visible over top of any
other application or window you have running at a given time. Haven't tested
all case scenarios but for any basic program such as chrome or MS word etc..
this works. You can never focus the OSG window so make sure you have a way of
exiting the program. For development we just use ESC at the moment.
To do this you'll need to edit the GraphicsWindowWin32.cpp file in your source.
A few important parts are needed. In bool GraphicsWindowWin32::createWindow()
You will need to set the correct Windows and Windows Extended Styles:
Code:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
windowStyle = WS_VISIBLE | WS_POPUP ;
///
extendedStyle = WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT |
WS_EX_NOACTIVATE ///
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Extended Styles are key here.... topmost, layered and transparent. Also no
activate should disallow the user from being able to focus the window.
The next part allows the window to be transparent using BlurBehindWindows
funcitonality. As far as I know this only works in windows 7 and above.
Code:
DWM_BLURBEHIND bb = { 0 };
HRGN hRgn = CreateRectRgn(0, 0, -1, -1);
bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
bb.hRgnBlur = hRgn;
bb.fEnable = TRUE;
bb.fTransitionOnMaximized = 0;
DwmEnableBlurBehindWindow(_hwnd, &bb);
Create the DWM_BLURBEHIND windows object. Set the area and flags and then use
the EnableBlur method to attach it to your window.
Next we need to define the color key for what colors to omit so before the end
of the createWindow() method add:
Code:
SetLayeredWindowAttributes(_hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
Then we need to do some work to disallow the window to be controlled if this is
what you want. So in bool GraphicsWindowWin32::realizeImplementation()
We need to edit the if(!::SetWindowPos) conditional:
Code:
if (!::SetWindowPos(_hwnd,
HWND_TOP,
_windowOriginXToRealize,
_windowOriginYToRealize,
_windowWidthToRealize,
_windowHeightToRealize,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE))
{
reportErrorForScreen("GraphicsWindowWin32::realizeImplementation() - Unable to
show window", _traits->screenNum, ::GetLastError());
return false;
}
Here adding SWP_NOACTIVATE is important. I believe the nosize and nomove help
as well but I haven't been able to determine if they actually have an affect.
Finally then in your scene youll need to set up your camera and viewer a little
differently.
Code:
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
// Set up your view however you want here.
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits(*viewer->getCamera()->getGraphicsContext()->getTraits());
traits->alpha = true;
traits->doubleBuffer = true;
traits->blue = 8;
traits->red = 8;
traits->green = 8;
traits->depth = 24;
traits->windowDecoration = false;
osg::ref_ptr<osg::Camera> camera = new
osg::Camera(*viewer->getCamera());
osg::ref_ptr<osg::GraphicsContext> graphicsContext =
osg::GraphicsContext::createGraphicsContext(traits.get());
camera->setGraphicsContext(graphicsContext);
camera->setClearColor(osg::Vec4(.0,.0,.0,.0));
camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
viewer->setCamera(camera.get());
viewer->realize();
// Add your scene
viewer->setSceneData(root);
while (!viewer->done())
{
viewer->frame();
}
When setting up the traits, and camera we need to get them from the existing
window. So use the viewer object to obtain them. Make sure you set the clear
color and your GL Clear masks. Also don't forget to set the camera object to
your viewer object.
Thats it! Hope this helps and I haven't missed to much.
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=61586#61586
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org