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

Robert Osfield robert.osfield at gmail.com
Thu Jul 24 03:19:21 PDT 2008


Hi Viggo,

I'd do this trick using a CullCallback on the topmost node of sub
graph that you won't to repeat rather than a pre draw callback.  The
CullVisitor keeps track of the current RenderStage.

Robert.

On Thu, Jul 24, 2008 at 10:53 AM, Viggo Løvli <vigigio at hotmail.com> wrote:
> 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 Hotmail på mobilen. Ha alltid e-posten din tilgjengelig.
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>



More information about the osg-users mailing list