From 0a2264cad465fcca6ea9679f1db139d6ee6cd3e6 Mon Sep 17 00:00:00 2001
From: Tim Moore <timoore@redhat.com>
Date: Sun, 15 Nov 2009 23:51:08 +0100
Subject: [PATCH] When instantiating effects, copy user data of any created nodes.
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 | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/simgear/scene/model/model.cxx b/simgear/scene/model/model.cxx
index 1485173..9ca65c8 100644
--- a/simgear/scene/model/model.cxx
+++ b/simgear/scene/model/model.cxx
@@ -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));
}
--
1.6.2.5