<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>
Hi Robert,<BR> <BR>I have a very strange bug.<BR> <BR>The code I have written to render one bin twice works fine in the project code-base that I am working on. I took the class and integrated into the OSGForest example, and there it does not work as expected.<BR> <BR>In the OSGForest example:<BR>- The bin is rendered two times, as expected.<BR>- The state-set that is added to only one of the bins are now used when both bins are rendered. And there is the bug :-/<BR> <BR>I would appreciate it if you could take a look at the code and try it out.<BR> <BR>I have attached my class to this mail, and below here is the new main function for OSGForest. Just keep the rest of the osgforest.cpp file as it is. Only add the include and the green code at the bottom of main.<BR> <BR>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New" color=#339966>#include "TransparencyGlitchFixNode.h"</FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New" color=#0000ff>int main( int argc, char **argv )</FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New" color=#0000ff>{</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>// use an ArgumentParser object to manage the program arguments.</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::ArgumentParser arguments(&argc,argv);</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><SPAN style="mso-spacerun: yes"><FONT face="Courier New" color=#0000ff>   </FONT></SPAN></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>// construct the viewer.</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>osgViewer::Viewer viewer(arguments);</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>float numTreesToCreates = 10000;</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>arguments.read('--trees',numTreesToCreates);</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><SPAN style="mso-spacerun: yes"><FONT face="Courier New" color=#0000ff>    </FONT></SPAN></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>osg::ref_ptr<ForestTechniqueManager> ttm = new ForestTechniqueManager;</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><SPAN style="mso-spacerun: yes"><FONT face="Courier New" color=#0000ff>    </FONT></SPAN></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>viewer.addEventHandler(new TechniqueEventHandler(ttm.get()));</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));</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>// add model to viewer.</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 color=#339966>TransparencyGlitchFixNode* root = new TransparencyGlitchFixNode();</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 color=#339966>root->addChild( </FONT>ttm->createScene((unsigned int)numTreesToCreates) </FONT><FONT color=#339966>);</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New"><FONT color=#0000ff><SPAN style="mso-spacerun: yes">    </SPAN>viewer.setSceneData( <FONT color=#339966>root</FONT> );</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"><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>return viewer.run();</FONT></FONT></P>
<P class=MsoPlainText style="MARGIN: 0cm 0cm 0pt"><FONT face="Courier New" color=#0000ff>}</FONT></P>
<FONT color=#0000ff></FONT> <BR>
Here is what to expect:<BR>
- The forest will be rendered twice.<BR>
- First pass will be additive blend without depth-buffer write.<BR>
- Second pass shall be a normal render of the forest.<BR>
- The bug is so that the state-set is used both times, so both get additive-blend.<BR>
 <BR>
The additive-blend is something I have added only to ease the visual debugging. The final code shall only have the state for turning off depth-buffer write. If everything works smoothly then you are supposed to see the forest as normal but with high-lighting due to the additive blend at all places where the trees are transparent.<BR>
 <BR>
 <BR>
Regards,<BR>Viggo<BR><BR><BR><BR>
<HR>
<BR>From: vigigio@hotmail.com<BR>To: osg-users@lists.openscenegraph.org<BR>Date: Fri, 25 Jul 2008 10:42:08 +0200<BR>Subject: Re: [osg-users] Robert: I figured it out :-) (was: Is it possible to know when the node-graph is 'dirty'?)<BR><BR>
<META content="Microsoft SafeHTML" name=Generator>
<STYLE>.ExternalClass .EC_hmmessage P{padding:0px;}.ExternalClass body.EC_hmmessage{font-size:10pt;font-family:Tahoma;}</STYLE>
Hi Robert,<BR> <BR>> Hi Viggo,<BR>> <BR>> The rendering backend uses ref_ptr<>'s so there shouldn't be any leak,<BR>> assigning the new RenderBin will lead to the previous one being<BR>> deleted.<BR>> <BR>Yep I figured out that one :-)<BR><BR>> Rather than second guess what will be need might I suggest you<BR>> maintain a recycling list of ref_ptr<> to your custom RenderBin, then<BR>> traverse this list to find an entry that has a referenceCount() of<BR>> one, then take ownership of this.<BR>> <BR>I took into usage a std::list which starts off empty. I am currently counting how many times cull-traverse is called and increasing the list at need. <BR> <BR>Your idea of checking the reference count is better. It will make the system more robust.<BR>I will continue using a std::list for this.<BR>I will keep track of what was the last used element of the list, so when I need a new one then I will traverse the list from that point. This should increase the chance of finding a free entry immediately.<BR>If I parse through the whole list, then I will insert a new element to the list and use that one. <BR>The list will thus grow to the maximum needed size and stay there until the class is deleted. Future changes of number of cameras or what ever re-configurations that can cause one thread to hold data longer will thus automatically work.<BR> <BR>I am also ensuring that the original RenderBinList of RenderStage is not changed anywhere else than for element 10. I used to add a new bin to element 9, but that may be in usage already. Element 10 will instead point to a new bin that contain it's own bin #9 and #10. Both will point to the original content that RenderStage pointed to in it's bin #10.<BR><BR>> Robert.<BR>> _______________________________________________<BR>> osg-users mailing list<BR>> osg-users@lists.openscenegraph.org<BR>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org<BR><BR><BR><BR>
<HR>
<BR>Få Hotmail du også. <A href="http://clk.atdmt.com/GBL/go/msnnkdre0010000005gbl/direct/01/" target=_blank>Windows Live Hotmail nå med 5000 MB gratis lagringsplass.</A> <BR>
<BR><br /><hr />Windows Live Messenger på mobilen. <a href='http://windowslivemobile.msn.com/Homepage.aspx?lang=nb-no&ocid=30032' target='_new'>Hold kontakten - hvor som helst når som helst.</a></body>
</html>