Jesper,

2 days ago, I was doing the same thing, same problem, but with
composite viewer. Here is what I did...

I create my screenshot camera while I create my main CompositeViewer
and its children Viewers. When I create this screenshot viewer, I set
its nodemask to 0 - by default, it won't render. I then trigger
screenshot by placing a graphics operation into graphics context's
operation queue, which saves an osg::Image. This image will then
becomes texture of a quad. Right after screenshot completes, I trigger
another event which does:
* Iterate through compositeviewer, set all viewers' masks to 0.
* Set nodemask of screenshot viewer to 0xffffffff
* Also set things like setCameraWithFocus, etc.

There is no flicker. I have no access to code right now, I may post an
example later tonight.

HTH
Ismail

On Wed, Apr 15, 2009 at 1:52 PM, Jesper D. Thomsen <[email protected]> wrote:
> Hi all,
>
> I have an application where I use an osg::viewer for a single viewport of a
> model. The camera for the viewer is created like this:
>
> ------------------------------
>
> // Init a new Camera (Master for this View)
>
> camera = mViewer->getCamera();
>
> // Assign Graphics Context to the Camera
>
> camera->setGraphicsContext(gc);
>
> // Set the viewport for the Camera
>
> camera->setViewport(
>
> new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
>
> // Add the Camera to the Viewer
>
> mViewer->setCamera(camera.get());
>
> -------------------------------
>
> I have created a function which will be used to both take high-res
> screenshots of the main viewport and to make renderings from other cameras
> defined in the model (not osg::camera's, just a camera class defining a
> camera view). I wanted to do this by creating a new osg::camera on the fly
> and disabling to main viewer camera in order to not have the viewport
> redrawn while making a rendering/screenshot. If I do not disable the
> viewer-camera by using setnodemask, the following code works but the
> contents of the main viewport disappear until the next normal frame() is
> called, which causes some naste blinking of the viewport, when recording
> video from it. When I use setnodemask to try to disable the viewer camera, I
> just get a uniform grey osg::Image. I'm somewhat new to OSG, so it is
> probably some simple error. The source code for my screenshot/rendering
> function can be found below.
> System data: Viste 64, OSG 2.6.1, Visual Studio 2005 sp1.
>
>
> bool
>
> CModelView::CreateOSGImageSnap(int p_width, int p_height, double p_left,
> double p_right,
>
> double p_bottom, double p_top, double p_near, double p_far,
>
> double p_eye_pivot_0, double p_eye_pivot_1, double p_eye_pivot_2,
>
> double p_eye_eulerpar_0, double p_eye_eulerpar_1, double p_eye_eulerpar_2,
>
> double p_eye_eulerpar_3, double p_eye_dist, bool p_ortho, osg::Image*
> p_image)
>
> {
>
> osg::ref_ptr<osg::Camera> t_camera = new osg::Camera;
>
> osg::ref_ptr<osg::Group> t_parent = new osg::Group;
>
> unsigned int t_samples = 0;
>
> unsigned int t_colorSamples = 0;
>
> t_camera->setViewport(0,0,p_width,p_height);
>
> if(p_ortho){
>
> t_camera->setProjectionMatrixAsOrtho(p_left,p_right,p_bottom,p_top,p_near,p_far);
>
> }else{
>
> t_camera->setProjectionMatrixAsFrustum(p_left,p_right,p_bottom,p_top,p_near,p_far);
>
> }
>
> osg::Matrixd t_matrix =
> osg::Matrixd::translate(-(osg::Vec3d(p_eye_pivot_0,p_eye_pivot_1,p_eye_pivot_2)))*
>
> osg::Matrixd::rotate((osg::Quat(p_eye_eulerpar_1,p_eye_eulerpar_2,p_eye_eulerpar_3,p_eye_eulerpar_0)).inverse())*
>
> osg::Matrixd::translate(0.0,0.0,-p_eye_dist);
>
> t_camera->setViewMatrix(t_matrix);
>
> t_camera->setRenderOrder(osg::Camera::PRE_RENDER);
>
> t_camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
>
> t_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
>
> t_camera->setClearColor(
> osg::Vec4(GetBackgroundColor()[0],GetBackgroundColor()[1],GetBackgroundColor()[2],1.0)
> );
>
> p_image->allocateImage(p_width, p_height, 1, GL_RGBA, GL_UNSIGNED_BYTE);
>
> t_camera->attach(osg::Camera::COLOR_BUFFER, p_image, t_samples,
> t_colorSamples);
>
> t_camera->setPostDrawCallback(new MyCameraPostDrawCallback(p_image));
>
> osg::Node* t_oldroot = mOSG->getASG()->getOSGRoot();
>
> t_camera->addChild(mOSG->getASG()->getOSGRoot());
>
> t_parent->addChild(t_camera.get());
>
> mOSG->getViewer()->setSceneData(t_parent.get());
>
> mOSG->getViewer()->getCamera()->setNodeMask(0x0);
>
> mOSG->getViewer()->frame();
>
> //bool s_test = osgDB::writeImageFile(*p_image, "screenshot.bmp");
>
> mOSG->getViewer()->setSceneData(t_oldroot);
>
> mOSG->getViewer()->getCamera()->setNodeMask(0xffffffff);
>
> return true; //Fixme: This should be changed to a bool describing whether
> the snapshot was successful.
>
> };
>
>
> Regards, and thanks in advance.
>
>
> Jesper D. Thomsen
>
>
>
> _______________________________________________
> 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