Hi Chris,

I did not followed your code, sorry, but reading the question  I realized
that what you need is a silent renderer

see discussion here http://forum.openscenegraph.org/viewtopic.php?t=7202

just read all the discussion on three forum pages.
then taking rendered images - you can put them into layered windows.

Regards
Sergey






On Tue, Aug 19, 2014 at 8:50 PM, Chris Hidden <[email protected]> wrote:

> Anyone have any ideas?
>
> This is what Im working on so far.  I have used the exmaple linked in the
> above post.
>
> I create a layered window:
>
>
> Code:
>
> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
>         LPSTR lpCmdLine, int nShowCmd)
> {
>         DetectMemoryLeaks();
>
>         MSG msg = { 0 };
>         WNDCLASSEX wcl = { 0 };
>
>         wcl.cbSize = sizeof(wcl);
>         wcl.style = CS_HREDRAW | CS_VREDRAW;
>         wcl.lpfnWndProc = WindowProc;
>         wcl.cbClsExtra = 0;
>         wcl.cbWndExtra = 0;
>         wcl.hInstance = hInstance;
>         wcl.hIcon = LoadIcon(0, IDI_APPLICATION);
>         wcl.hCursor = LoadCursor(0, IDC_ARROW);
>         wcl.hbrBackground = 0;
>         wcl.lpszMenuName = 0;
>         wcl.lpszClassName = _T("GLLayeredWindowClass");
>         wcl.hIconSm = 0;
>
>         if (!RegisterClassEx(&wcl))
>                 return 0;
>
>         g_hWnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TOPMOST,
> wcl.lpszClassName,
>                 _T("GL Layered Window Demo"), WS_POPUP, 0, 0, IMAGE_WIDTH,
>                 IMAGE_HEIGHT, 0, 0, wcl.hInstance, 0);
>
>         if (g_hWnd)
>         {
>
>                 if (Init())
>                 {
>                         ShowWindow(g_hWnd, nShowCmd);
>                         UpdateWindow(g_hWnd);
>
>                         while (true)
>                         {
>                                 if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
>                                 {
>                                         if (msg.message == WM_QUIT)
>                                                 break;
>
>                                         TranslateMessage(&msg);
>                                         DispatchMessage(&msg);
>                                 }
>                                 else
>                                 {
>                                         DrawFrame();
>                                 }
>                         }
>                 }
>
>                 Cleanup();
>                 UnregisterClass(wcl.lpszClassName, hInstance);
>         }
>
>         return (int)(msg.wParam);
> }
>
>
>
>
> Then I establish the osg reference object for my scene in the WindProc:
>
>
> Code:
>
> LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM
> lParam)
> {
>         static TCHAR szBuffer[32] = { 0 };
>
>         switch (msg)
>         {
>         case WM_CREATE:
>         {
>                 osg::ref_ptr<osg::Referenced> windata =
>                         new
> osgViewer::GraphicsWindowWin32::WindowData(hWnd);
>
>                 osg::ref_ptr<osg::GraphicsContext::Traits> traits =
>                         new osg::GraphicsContext::Traits;
>                 traits->x = 0;
>                 traits->y = 0;
>                 traits->width = 800;
>                 traits->height = 600;
>                 traits->windowDecoration = false;
>                 traits->doubleBuffer = true;
>                 traits->pbuffer = true;
>                 traits->inheritedWindowData = windata;
>
>                 osg::ref_ptr<osg::GraphicsContext> gc =
>
> osg::GraphicsContext::createGraphicsContext(traits.get()
>                         );
>                 osg::ref_ptr<osg::Camera> camera = new osg::Camera;
>                 camera->setGraphicsContext(gc);
>                 camera->setViewport(
>                         new osg::Viewport(0, 0, traits->width,
> traits->height));
>                 camera->setClearMask(GL_DEPTH_BUFFER_BIT |
> GL_COLOR_BUFFER_BIT);
>                 camera->setClearColor(osg::Vec4f(0.0f, 0.0f, 0.0f, 0.0f));
>                 camera->setProjectionMatrixAsPerspective(
>                         30.0f, (double)traits->width / (double)traits
>                         ->height, 1.0, 1000.0);
>                 g_viewer = new osgViewer::Viewer;
>                 g_viewer->setCamera(camera.get());
>                 g_viewer->setSceneData(osgDB::readNodeFile("cessna.osg"));
>                 g_viewer->setKeyEventSetsDone(0);
>                 g_viewer->setCameraManipulator(
>                         new osgGA::TrackballManipulator);
>
>
>                 return 0;
>         }
>
>
>         case WM_DESTROY:
>                 PostQuitMessage(0);
>                 return 0;
>
>         case WM_KEYDOWN:
>                 if (wParam == VK_ESCAPE)
>                 {
>                         SendMessage(hWnd, WM_CLOSE, 0, 0);
>                         return 0;
>                 }
>                 break;
>
>         case WM_NCHITTEST:
>                 return HTCAPTION;   // allows dragging of the window
>
>         case WM_TIMER:
>                 _stprintf(szBuffer, _TEXT("%d FPS"), g_frames);
>                 SetWindowText(hWnd, szBuffer);
>                 g_frames = 0;
>                 return 0;
>
>         default:
>                 break;
>         }
>
>         return DefWindowProc(hWnd, msg, wParam, lParam);
> }
>
>
>
>
> Then in the msg loop in WinMain
>
> Draw frame is called and it looks like this:
>
>
> Code:
>
> void DrawFrame()
> {
>
>         g_viewer->frame();
>
>         // At this stage the pbuffer will contain our scene. Now we make a
> system
>         // memory copy of the pbuffer.
>         CopyPBufferToImage();
>
>         // Then we pre-multiply each pixel with its alpha component. This
> is how
>         // the layered windows API expects images containing alpha
> information.
>         ImagePreMultAlpha(&g_scene);
>
>         // Finally we update our layered window with our scene.
>         RedrawLayeredWindow();
>
>         // Since we're doing off-screen rendering the frame rate will be
>         // independent of the video display's refresh rate.
>         g_frames++;
> }
>
>
>
> He has his own code to establish OpenGL and set up pbuffers.  But OSG
> offers pbuffers, so Im thinking I should be able to draw to the pbuffer,
> then follow his order of things where we do pre multiplication of each
> pixel with alpha.
>
> Then call g_viewer->frame() after that maybe and use his g_frames++ to
> help the refresh rate.  Im just lacking the knowledge I need to implement
> the pbuffer.... or well at least that as a starting point.
>
> Any one who can guide me in the right direction? Or tell me Im going in
> the completely wrong one?
>
> Thanks!!
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=60720#60720
>
>
>
>
>
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to