Interesting... Multiple references _does_ seem to be the cause! I modified my simple test app to make a second ref_ptr to the loaded scene graph. So the pseudocode is:
Load scene graph into first ref_ptr. Create a second ref_ptr and make it reference the first ref_ptr's child 0. Run the Optimizer Write the scene graph (Code attached. Run it with my previous "opt1.osg" file to reproduce the problem.) With the second ref_ptr pointing to the child of the top level Transform, the top level Transform does not flatten. Is this a bug? Why does the Optimizer (apparently) not flatten a transform if it has a child with reference count greater than 1? -Paul > Thanks for the quick reply, Robert. > > It's really the flattening that I require, and not > necessarily the type change. > > For example, I see that osgconv doesn't change the type of > the top level Transform node, but it does flatten it so that > its transform is the identity. In my app, however, this top > level transform is simply not flattened; the matrix is still > non-identity. > > To be pedantic, I added a top level Group above my (previous) > top level Transform. In my app, this Transform remains unflattened. > > My app maintains other ref_ptrs into this scene graph, could > this be the problem? To check, I set a breakpoint in > Referenced::referenceCount() just before calling optimize(). > Aside from the explicit calls in > FSTV::apply(Geode&) for the vertex and normal arrays, FSTV > does not appear to query the referenceCount of any Node. So I > suspect this is not the issue. > > So I'm really quite stumped. I know it's difficult to debug > remotely, but this app is rather large and impractical to > share. Guidance on debugging would be appreciated. > -Paul > > > > -----Original Message----- > > From: [EMAIL PROTECTED] > > [mailto:[EMAIL PROTECTED] On Behalf Of > > Robert Osfield > > Sent: Friday, October 24, 2008 1:35 PM > > To: OpenSceneGraph Users > > Subject: Re: [osg-users] Problems flattening static transforms > > > > Hi Paul, > > > > I'm just online briefly so I'll give you my first thought > as what is > > amiss. Optimizer::optimize() method takes a reference to the scene > > graph to optimize, this means that it can't change it's type, so it > > can't flatten it. If you place a Group above it and then optimize > > it'll be able to optimize the node away. > > > > One could possibly write an additional method that takes a > pointer to > > a scene graph node and then return the new scene graph with > > potentially a new root node. For compatibility we'd need > to keep the > > present one. > > > > Robert. > > > > On Fri, Oct 24, 2008 at 8:24 PM, Paul Martz > <[EMAIL PROTECTED]> > > wrote: > > > Hi all -- I have a scene graph containing multiple static > > transforms. > > > My application runs the osgUtil::Optimizer on this scene > > graph. This > > > should flatten all the static transforms. Unfortunately, > > the result is > > > that all the transforms flatten _except_ for the top level > > transform. > > > If I do an osgconv on this same scene graph, all the static > > transforms > > > flatten -- they are converted to Group nodes, and their > > > transformations are folded into the geometry. Clearly, the > > issue isn't > > > with the scene graph itself, but it's something my app is > > doing wrong when it invokes the Optimizer. My dilemma: > > > why doesn't this work properly for osgconv, but not for my app? > > > > > > I have dug into thisu for quite some time now, trying to > > uncover the > > > difference between osgconv (which works) and my code (which > > doesn't work). > > > Here's what I know so far: > > > > > > * I've written a small test app to try to reproduce the > problem. It > > > loads the scene graph, runs the Optimizer, and writes the > > scene graph back out. > > > Unfortunately, it works properly, just like osgconv. It > > flattens all > > > the transforms. I'm unable to reproduce the problem in > > anything other > > > than my > > > (larger) application. This must be a bug in my code, I must > > be doing > > > something wrong. > > > > > > * I have verified that the problem is not non-STATIC transforms, > > > multiple parents, or ProxyNodes. The same scene graph > works fine in > > > osgconv and my little test app, so it isn't a scene graph > issue. I > > > believe my app handles the scene graph the same as in these > > other two apps, which work. > > > > > > * Yes I'm invoking the Optimizer the same way, with no > > flags. I'm sure > > > that the OSG_OPTIMIZER variable is not set in the > > environment. I get > > > the same behavior if I just pass the > FLATTEN_STATIC_TRANSFORMS flag > > > (top level node fails to flatten). If I set > > > OSG_OPTIMIZER=FLATTEN_STATIC_TRANSFORMS and run osgconv, it > > still works properly and flattens all transforms. > > > > > > * ObjectStruct has a Boolean called > > _moreThanOneMatrixRequired. In my > > > app, this gets set to true at Optimizer.cpp line 826. > This doesn't > > > happen when running osgconv or my small test code. This > seems to be > > > part of the problem, but the root cause that triggers this > > event is still unknown to me. > > > > > > I'll attach the scene graph in question, though I doubt > it will do > > > anyone much good, because it works fine in osgconv and my > > simple test > > > app. It only fails in my larger app. Note the top level > Node named > > > "CenterOfMassOffset"; this is the transform that refuses > to flatten. > > > > > > I'm wondering if anyone has encountered the same issue > > before, has any > > > info on how to resolve the issue, or might know how to > > proceed with debugging it. > > > Notify level DEBUG_INFO does not produce any enlightening > > information. > > > > > > I admit I'm stumped on this one. It's extremely out of > the ordinary > > > when OSG doesn't just do what I expect it to. I > appreciate any info. > > > > > > Thanks, > > > > > > Paul Martz > > > Skew Matrix Software LLC > > > http://www.skew-matrix.com > > > +1 303 859 9466 > > > > > > _______________________________________________ > > > 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-opensce > negraph.org > > > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-opensce negraph.org >
// // Copyright (c) 2008 Blue Newt Software LLC and Skew Matrix Software LLC. // All rights reserved. // #include <osgDB/ReadFile> #include <osgDB/WriteFile> #include <osgUtil/Optimizer> int main( int argc, char ** argv ) { osg::ref_ptr< osg::Node > root = osgDB::readNodeFile( "out1.osg" ); osg::ref_ptr< osg::Node > p = (dynamic_cast<osg::Group*>(root.get()))->getChild( 0 ); osg::setNotifyLevel( osg::INFO ); osgUtil::Optimizer opt; opt.optimize( root.get(), osgUtil::Optimizer::FLATTEN_STATIC_TRANSFORMS ); osgDB::writeNodeFile( *root, "out2.osg" ); return( 0 ); }
_______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org