<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16525" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff background="">
<DIV><FONT face=Arial size=2></FONT><FONT face=Arial size=2></FONT><FONT 
face=Arial size=2>Hi everyone,</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>I don't know if I was very clear in my last post. 
My problem is to implement in C# small sfx in nodes in the 
scenegraph...</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>The fact is that as soon as the Osg.Node (in the 
example the _root Osg.PositionAttitudeTransform) that is added to the scene is 
enterily monitored by a C# class (and not statically or locally defined in the 
main loop function), there seems to occur destruction on that Node being 
nonetheless regular in term of OSG reference count (the _root is held by 
the MySfxInstance, added to the sceneGraph, and therefore its ref count is 
1).</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Of course, in osgDotNet (managed code), ref_ptr and 
osg::Referenced::ref()/unref() aren't ported.</FONT></DIV>
<DIV><FONT face=Arial size=2>I'm assuming that reference count managing is done 
according CLR behaviour (as long as a reference on your 
instance is held by someone, the CLR doesn't invoke Dispose on that 
instance).</FONT> </DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Am I missing something obvious ?</FONT></DIV>
<DIV><FONT face=Arial size=2>Am I the only one using osgDotNet having this 
problem ?</FONT><BR></DIV>
<DIV><FONT face=Arial size=2>{ Hereafter follow the same code I sent on friday, 
focusing on the important class and functions and simplified of #regions and 
unsignicant comments : }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT><BR><FONT face=Arial 
size=2>>>>>> file MySfx.cs <<<<<<BR><BR>public 
class MySfx<BR>{<BR>  protected Osg.PositionAttitudeTransform 
_root;<BR>  protected Osg.Group _psScene;<BR></DIV></FONT>
<DIV><FONT face=Arial size=2>  public MySfx(float fFar)<BR>  
{<BR>    _root = null;<BR>    _psScene = 
null;</FONT></DIV>
<DIV><FONT face=Arial size=2><BR>    // Sub scenegraph 
creation<BR>    _root = new 
Osg.PositionAttitudeTransform();<BR>    
_root.setName("SkyModel_Root");<BR>    
//_root.setDataVariance(Osg.Object.DataVariance.DYNAMIC);</FONT></DIV><FONT 
face=Arial size=2>
<DIV><BR>    // Init update callback<BR>    
_root.setUpdateCallback(new Oktal.OvOsg.MySfxUpdateCallback(this));<BR>  
}<BR></FONT><FONT face=Arial size=2><BR>  public void setScene(Osg.Group 
psScene)<BR>  {<BR>    if (psScene != 
null)<BR>    {<BR>        _psScene 
= psScene;<BR>        
_psScene.addChild(_root);<BR>    }<BR>  }<BR></FONT></DIV>
<DIV><FONT face=Arial size=2>  public void update() <BR>  { 
<BR>    // Place update code here<BR>  } 
<BR>}<BR></DIV></FONT>
<DIV><FONT face=Arial size=2>internal class MySfxUpdateCallback: 
Osg.NodeCallback<BR>{<BR>   protected Oktal.OvOsg.MySfx 
_mySfx;<BR><BR>   public MySfxUpdateCallback(Oktal.OvOsg.MySfx mysfx) 
<BR>   {<BR>     _mySfx = mysfx; <BR>   
}<BR><BR>   public override void op_FunctionCall(Osg.Node node, 
Osg.NodeVisitor nv)<BR>   {<BR>       if 
(_mySfx != null)<BR>       {<BR>    
       
_mySfx.update(); <BR>       }<BR>       
traverse(node, nv);<BR>   }<BR>}<BR></FONT></DIV>
<DIV><FONT face=Arial size=2>>>>>> file Program.cs 
<<<<<<BR></FONT></DIV>
<DIV><FONT face=Arial size=2>static void Main(string[] args)</FONT></DIV>
<DIV><FONT face=Arial size=2>{</FONT></DIV>
<DIV><FONT face=Arial size=2>    // (...)</FONT></DIV>
<DIV><FONT face=Arial size=2><BR>    // load the 
data<BR>    Osg.Node loadedModel = 
OsgViewerExe.OsgDotNetGlobals.osgDBReadNodeFiles(arguments, new 
OsgDB.ReaderWriter.Options());<BR>    <BR>     // 
(...)</DIV>
<DIV> </DIV>
<DIV>     // optimize the scene graph, remove redundant 
nodes and state etc.<BR>     OsgUtil.Optimizer optimizer = 
new OsgUtil.Optimizer();<BR>     
optimizer.optimize(loadedModel);</DIV>
<DIV> </DIV>
<DIV>     // DEDICATED CODE 
HERE<BR>     Osg.Group root = new 
Osg.Group();<BR>     Osg.BoundingSphere info = 
loadedModel.computeBound();<BR>     root.addChild(loadedModel);</DIV>
<DIV> </DIV>
<DIV>     Oktal.OvOsg.MySfx sfx = new 
Oktal.OvOsg.MySfx(info.radius());<BR>     sfx.setScene(root); 
// equals root.addChild(skyModel);<BR>     // END 
DEDICATED CODE</DIV>
<DIV> </DIV>
<DIV>     // Comment that (default view is away from the 
scene) shows the bug 
better...<BR>     //viewer.getCameraManipulator().setHomePosition(new 
Osg.Vec3d(0.0, -10.0, 50.0), new Osg.Vec3d(0.0, 0.0, 50.0), new Osg.Vec3d(0.0, 
0.0, 1.0)); </DIV>
<DIV> </DIV>
<DIV>     viewer.setSceneData(root);<BR>     viewer.run();</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>}</FONT></DIV>
<DIV><FONT face=Arial size=2> </DIV></FONT>
<DIV><FONT face=Arial 
size=2>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>Thx for any advice !</DIV></FONT>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>-- <BR>Christophe Médard<BR>Société OKTAL (<A 
href="http://www.oktal.fr">http://www.oktal.fr</A>)<BR>2 impasse 
Boudeville<BR>31100 Toulouse (France)<BR>Tél. : (+33) 5 62 11 50 10<BR>Fax : 
(+33) 5 62 11 50 29<BR></DIV>
<DIV><BR><BR>----- Original Message ----- <BR>From: Christophe Medard <BR>To: 
osg-users@lists.openscenegraph.org <BR>Sent: Friday, September 21, 2007 5:47 
PM<BR>Subject: osgDotNet : Nodes adding to scene graph outside main() function 
scope<BR><BR><BR>Hi all, <BR><BR>If I can still think straight (after such a 
long week), there seems to be a major problem for people that want to code 
special Effects in osgDotNet in C#  : <BR>If you want to add to your main 
scenegraph osg::Nodes that are held by (because created, updated and modified 
by) an SFX class, you quickly have memory corruption problems due to the fact 
that Dispose calls are done on those nodes whose reference count is greater than 
0.  <BR><BR>This problem doesn't occur in a similar code written in C++ - 
using native osg dlls - in which a destructor is implementable for the SFX 
class, and osg::Referenced::ref() (resp. unref()) methods can be called when 
osg::Nodes are created (resp. inside SFX class' destructor).<BR><BR>I'm 
attaching a very short C# example illustrating that.<BR>The application crashes 
rapidly, in Release or Debug. The shallow Debug trace is :<BR><BR>I must say to 
be complete that for instance I'm using version 2.0.0 of OSG and 
osgWrappers.<BR><BR>If there's is a way to avoid those Dispose calls on regular 
Nodes I'm interested to know !!<BR>(My preceeding attemps of sfx implementation 
in C# where done roughly entirely in the main() function, which doesn't raise 
problems...)<BR><BR>-- <BR>Christophe Médard<BR>Société OKTAL 
(http://www.oktal.fr)<BR>2 impasse Boudeville<BR>31100 Toulouse (France)<BR>Tél. 
: (+33) 5 62 11 50 10<BR>Fax : (+33) 5 62 11 50 29</FONT></DIV></BODY></HTML>