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 <[EMAIL PROTECTED]> 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: [EMAIL PROTECTED] >> To: osg-users@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@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > > _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org