<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>
Hi Robert :-D<BR>
 <BR>
Thanx a lot for pointing in the right direction!!!<BR>
 <BR>
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 :-)<BR>
 <BR>
This is what I did:<BR>
Camera is set up with a callback: <BR>
    <FONT color=#0000ff>camera.setPreDrawCallback( new MyCallback() );</FONT><BR>
 <BR>
The callback struct's operator () looks like this:<BR>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>virtual void operator () (osg::RenderInfo& renderInfo) const</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>{</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>osg::Camera* camera = renderInfo.getCurrentCamera();</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>if( !camera )</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>{</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>return;</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>}</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p><FONT face="Courier New" color=#0000ff> </FONT></o:p></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>osgViewer::Renderer* renderer = dynamic_cast<osgViewer::Renderer*>( camera->getRenderer() );</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>if( !renderer )</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>{</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>return;</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>}</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><o:p><FONT face="Courier New" color=#0000ff> </FONT></o:p></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>// HACK: This loop should not be here...</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>//<SPAN style="mso-spacerun: yes">       </SPAN>Need to figure out which scene-view that is used (0 or 1).</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>//<SPAN style="mso-spacerun: yes">       </SPAN>Renderer::draw() does it this way: sceneView = _drawQueue.takeFront()</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>//<SPAN style="mso-spacerun: yes">       </SPAN>_drawQueue is protected and not accessible through class methods.</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>//<SPAN style="mso-spacerun: yes">       </SPAN>This hack means we do the job below twice each frame.</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>//</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>for( int i=0; i<2; i++ )</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>{</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>osgUtil::SceneView* sceneView = renderer->getSceneView( i );</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>if( !sceneView )</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>{</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>return;</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>}</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><o:p><FONT face="Courier New" color=#0000ff> </FONT></o:p></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>osgUtil::RenderStage* renderStage = sceneView->getRenderStage();</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>if( !renderStage )</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>{</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>return;</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>}</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><o:p><FONT face="Courier New" color=#0000ff> </FONT></o:p></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>osgUtil::RenderBin::RenderBinList& binList = renderStage->getRenderBinList();</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>if( binList.find(10) != binList.end() )</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">     </SPAN><SPAN style="mso-spacerun: yes">       </SPAN>{</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>// Clone bin 10</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>osgUtil::RenderBin* clonedBin = new osgUtil::RenderBin( *(binList[10].get()) );</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><o:p><FONT face="Courier New" color=#0000ff> </FONT></o:p></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>// Clone the stateset</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New" color=#0000ff>                // TODO: Need to check that getStateSet does not return NULL.</FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>osg::StateSet* stateSet = new osg::StateSet( *(clonedBin->getStateSet()) );</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><o:p><FONT face="Courier New" color=#0000ff> </FONT></o:p></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>// Ensure the cloned stateset is used in the cloned bin</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>clonedBin->setStateSet( stateSet );</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><o:p><FONT face="Courier New" color=#0000ff> </FONT></o:p></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>// Cloned bin shall not write to the depth-buffer</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>stateSet->setMode( GL_DEPTH_TEST, osg::StateAttribute::ON<SPAN style="mso-spacerun: yes">  </SPAN>| osg::StateAttribute::OVERRIDE );</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>stateSet->setAttributeAndModes( new osg::Depth(osg::Depth::LESS, 0.0, 1.0, false), osg::StateAttribute::ON | osg::StateAttribute::OVERRIDE );</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><o:p><FONT face="Courier New" color=#0000ff> </FONT></o:p></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>// Ensure cloned bin is rendered before bin 10.</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">                </SPAN>binList[9] = clonedBin;</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">            </SPAN>}</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">        </SPAN>}</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>}</FONT></FONT></P>

<P> <BR>
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?<BR>
 <BR>
Do you see any other problems with this code?<BR>
 <BR>
Regards,<BR>
Viggo<BR>
 <BR>
 <BR>
<BR><BR>> Date: Wed, 23 Jul 2008 15:01:50 +0100<BR>> From: robert.osfield@gmail.com<BR>> To: osg-users@lists.openscenegraph.org<BR>> Subject: Re: [osg-users] Is it possible to know when the node-graph is 'dirty'?<BR>> <BR>> Hi Viggo,<BR>> <BR>> I think you are on totally wrong take w.r.t trying to track changes in<BR>> the scene graph, for what is effectively just a custom transparent<BR>> renderbin setup, and has little to do with the scene itself.<BR>> <BR>> The way you should tackle it is to customize the rendering backend so<BR>> that the bins you require are built for you. One one for instance<BR>> would be to post process the RenderStage and its contents after the<BR>> CullVisitor has filled it in.<BR>> <BR>> Robert.<BR>> <BR><BR></P><br /><hr />Windows Live Hotmail på mobilen. <a href='http://windowslivemobile.msn.com/BrowserServiceHotmail.aspx?lang=nb-NO&ocid=30032' target='_new'>Ha alltid e-posten din tilgjengelig.</a></body>
</html>