[osg-users] Robert: I figured it out :-) (was: Is it possible to know when the node-graph is 'dirty'?)

Viggo Løvli vigigio at hotmail.com
Thu Jul 24 02:53:48 PDT 2008


Hi Robert :-D
 
Thanx a lot for pointing in the right direction!!!
 
I can now enforce render-bin 10 to be rendered twice each frame with the needed stateset changes. No node-mask stuff is needed. This is a completely stand-alone fix :-)
 
This is what I did:
Camera is set up with a callback: 
    camera.setPreDrawCallback( new MyCallback() );
 
The callback struct's operator () looks like this:
    virtual void operator () (osg::RenderInfo& renderInfo) const
    {
        osg::Camera* camera = renderInfo.getCurrentCamera();
        if( !camera )
        {
            return;
        }
 
        osgViewer::Renderer* renderer = dynamic_cast<osgViewer::Renderer*>( camera->getRenderer() );
        if( !renderer )
        {
            return;
        }
 
        // HACK: This loop should not be here...
        //       Need to figure out which scene-view that is used (0 or 1).
        //       Renderer::draw() does it this way: sceneView = _drawQueue.takeFront()
        //       _drawQueue is protected and not accessible through class methods.
        //       This hack means we do the job below twice each frame.
        //
        for( int i=0; i<2; i++ )
        {
            osgUtil::SceneView* sceneView = renderer->getSceneView( i );
            if( !sceneView )
            {
                return;
            }
 
            osgUtil::RenderStage* renderStage = sceneView->getRenderStage();
            if( !renderStage )
            {
                return;
            }
 
            osgUtil::RenderBin::RenderBinList& binList = renderStage->getRenderBinList();
            if( binList.find(10) != binList.end() )
            {
                // Clone bin 10
                osgUtil::RenderBin* clonedBin = new osgUtil::RenderBin( *(binList[10].get()) );
 
                // Clone the stateset
                // TODO: Need to check that getStateSet does not return NULL.
                osg::StateSet* stateSet = new osg::StateSet( *(clonedBin->getStateSet()) );
 
                // Ensure the cloned stateset is used in the cloned bin
                clonedBin->setStateSet( stateSet );
 
                // Cloned bin shall not write to the depth-buffer
                stateSet->setMode( GL_DEPTH_TEST, osg::StateAttribute::ON  | osg::StateAttribute::OVERRIDE );
                stateSet->setAttributeAndModes( new osg::Depth(osg::Depth::LESS, 0.0, 1.0, false), osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE );
 
                // Ensure cloned bin is rendered before bin 10.
                binList[9] = clonedBin;
            }
        }
    }

 
I am not sure how to solve the 0..1 loop marked by "// HACK:" in the source. Do you know how I can know what SceneView that is used?
 
Do you see any other problems with this code?
 
Regards,
Viggo
 
 
> Date: Wed, 23 Jul 2008 15:01:50 +0100> From: robert.osfield at gmail.com> To: osg-users at lists.openscenegraph.org> Subject: Re: [osg-users] Is it possible to know when the node-graph is 'dirty'?> > Hi Viggo,> > I think you are on totally wrong take w.r.t trying to track changes in> the scene graph, for what is effectively just a custom transparent> renderbin setup, and has little to do with the scene itself.> > The way you should tackle it is to customize the rendering backend so> that the bins you require are built for you. One one for instance> would be to post process the RenderStage and its contents after the> CullVisitor has filled it in.> > Robert.> 
_________________________________________________________________
Windows Live Messenger - også på mobilen.
http://windowslivemobile.msn.com/Homepage.aspx?lang=nb-no&ocid=30032
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20080724/eb861800/attachment-0003.htm>


More information about the osg-users mailing list