[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