All pastes #1672727 Raw Edit

Stuff

public text v1 · immutable
#1672727 ·published 2009-11-15 22:53 UTC
rendered paste body
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