diff --git a/pipeline/Utilities.cpp b/pipeline/Utilities.cpp index 7d0f343b9d1be7b85d7253ed8fe53ce00f1033d6..38bbdfe67578d632cad50101d6da697573b2791d 100644 --- a/pipeline/Utilities.cpp +++ b/pipeline/Utilities.cpp @@ -90,6 +90,20 @@ static osg::Camera* createImageCamera(osg::Image* image, const osg::BoundingBox& return camera.release(); } +static void setupOffscreenCamera(osg::Camera* camera, osg::Image* image) +{ + camera->setViewport(0, 0, image->s(), image->t()); + osg::ref_ptr traits = new osg::GraphicsContext::Traits; + traits->x = 0; + traits->y = 0; + traits->width = image->s(); + traits->height = image->t(); + traits->doubleBuffer = false; + traits->pbuffer = true; + osg::ref_ptr gc = osg::GraphicsContext::createGraphicsContext(traits.get()); + camera->setGraphicsContext(gc); +} + class MyReadFileCallback : public osgDB::ReadFileCallback { public: @@ -699,6 +713,7 @@ namespace osgVerse osg::ref_ptr camera = createImageCamera(image.get(), bbox); osg::ref_ptr viewer = dynamic_cast(userViewer); if (!viewer) viewer = new osgViewer::Viewer; + setupOffscreenCamera(viewer->getCamera(), image); viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded); viewer->getCamera()->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f)); { @@ -760,6 +775,7 @@ namespace osgVerse osg::ref_ptr camera = createImageCamera(image.get(), bbox); osg::ref_ptr viewer = dynamic_cast(userViewer); if (!viewer) viewer = new osgViewer::Viewer; + setupOffscreenCamera(viewer->getCamera(), image); viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded); viewer->getCamera()->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f)); { @@ -793,6 +809,7 @@ namespace osgVerse osg::ref_ptr root = new osg::Group; root->addChild(camera.get()); camera->addChild(node); + viewer->setSceneData(root.get()); HostTextureReserver reserver; root->accept(reserver); reserver.set(true);