]> git.mxchange.org Git - simgear.git/commitdiff
When instantiating effects, copy user data of any created nodes.
authorTim Moore <timoore@redhat.com>
Sun, 15 Nov 2009 22:51:08 +0000 (23:51 +0100)
committerTim Moore <timoore@redhat.com>
Sun, 15 Nov 2009 22:51:08 +0000 (23:51 +0100)
This bug was the cause of the huge memory consumption / death reported at some places:
the BVH data on "raw" .ac models (random objects) was dropped on the floor.

simgear/scene/model/model.cxx

index 1485173f0c86d22d95973fab9e6ba0eeb8efe565..9ca65c89d23fb323df12be01845a8c24ad15631b 100644 (file)
@@ -241,6 +241,10 @@ void MakeEffectVisitor::apply(osg::Group& node)
         }
     }
     SplicingVisitor::apply(node);
+    // If a new node was created, copy the user data too.
+    ref_ptr<SGSceneUserData> userData = SGSceneUserData::getSceneUserData(&node);
+    if (userData.valid() && _childStack.back().back().get() != &node)
+        _childStack.back().back()->setUserData(new SGSceneUserData(*userData));
     if (restoreEffect)
         _currentEffectParent = savedEffectRoot;
 }
@@ -265,6 +269,9 @@ void MakeEffectVisitor::apply(osg::Geode& geode)
     } else {
         eg = new EffectGeode;
         eg->setEffect(effect);
+        ref_ptr<SGSceneUserData> userData = SGSceneUserData::getSceneUserData(&geode);
+        if (userData.valid())
+            eg->setUserData(new SGSceneUserData(*userData));
         for (int i = 0; i < geode.getNumDrawables(); ++i)
             eg->addDrawable(geode.getDrawable(i));
     }