]> git.mxchange.org Git - simgear.git/commitdiff
Make sure each carrier gets its own valocity.
authorfrohlich <frohlich>
Fri, 13 Mar 2009 05:45:11 +0000 (05:45 +0000)
committerTim Moore <timoore@redhat.com>
Wed, 18 Mar 2009 06:53:50 +0000 (07:53 +0100)
Modified Files:
simgear/scene/model/ModelRegistry.cxx

simgear/scene/model/ModelRegistry.cxx

index 1d587c2b5f9563484712382160ba9eae99989640..55af268c9a4236451375c34908679cc3952a6efa 100644 (file)
@@ -226,6 +226,28 @@ private:
     FilePathList _pathList;
 };
 
     FilePathList _pathList;
 };
 
+// Create new userdata structs in a copied model.
+// The BVH trees are shared with the original model, but the velocity fields
+// should usually be distinct fields for distinct models.
+class UserDataCopyVisitor : public osg::NodeVisitor {
+public:
+    UserDataCopyVisitor() :
+        osg::NodeVisitor(osg::NodeVisitor::NODE_VISITOR,
+                         osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
+    {
+    }
+    virtual void apply(osg::Node& node)
+    {
+        osg::ref_ptr<SGSceneUserData> userData;
+        userData = SGSceneUserData::getSceneUserData(&node);
+        if (userData.valid()) {
+            SGSceneUserData* newUserData  = new SGSceneUserData(*userData);
+            newUserData->setVelocity(0);
+            node.setUserData(newUserData);
+        }
+        node.traverse(*this);
+    }
+};
 
 class SGTexCompressionVisitor : public SGTextureStateAttributeVisitor {
 public:
 
 class SGTexCompressionVisitor : public SGTextureStateAttributeVisitor {
 public:
@@ -427,6 +449,11 @@ osg::Node* DefaultCopyPolicy::copy(osg::Node* model, const string& fileName,
     TextureUpdateVisitor liveryUpdate(opt->getDatabasePathList());
     res->accept(liveryUpdate);
 
     TextureUpdateVisitor liveryUpdate(opt->getDatabasePathList());
     res->accept(liveryUpdate);
 
+    // Copy the userdata fields, still sharing the boundingvolumes,
+    // but introducing new data for velocities.
+    UserDataCopyVisitor userDataCopyVisitor;
+    res->accept(userDataCopyVisitor);
+
     return res;
 }
 
     return res;
 }