]> git.mxchange.org Git - simgear.git/commitdiff
scenery: Only add trasnform matrices on successful loaded models.
authorMathias Froehlich <Mathias.Froehlich@web.de>
Sun, 4 Mar 2012 12:07:41 +0000 (13:07 +0100)
committerMathias Froehlich <Mathias.Froehlich@web.de>
Sun, 4 Mar 2012 12:07:41 +0000 (13:07 +0100)
simgear/scene/tgdb/TileEntry.cxx
simgear/scene/tgdb/TileEntry.hxx

index 47a72052c760819879c9284aeef08b7d540c7478..92a6dab4ebe993f6d38bec48b5d01bd0f93c3978 100644 (file)
@@ -130,17 +130,6 @@ void TileEntry::prep_ssg_node(float vis) {
     _node->setRange( 0, 0, vis + bounding_radius );
 }
 
-bool TileEntry::obj_load(const string& path, osg::Group *geometry, bool is_base,
-                         const osgDB::Options* options)
-{
-    osg::Node* node = osgDB::readNodeFile(path, options);
-    if (node)
-      geometry->addChild(node);
-
-    return node != 0;
-}
-
-
 typedef enum {
     OBJECT,
     OBJECT_SHARED,
@@ -305,8 +294,10 @@ TileEntry::loadTileByFileName(const string& fileName,
 
     if (found_tile_base) {
         // load tile if found ...
-        obj_load( object_base.str(), new_tile, true, opt.get());
-
+        osg::ref_ptr<osg::Node> node;
+        node = osgDB::readRefNodeFile(object_base.str(), opt.get());
+        if (node.valid())
+            new_tile->addChild(node);
     } else {
         // ... or generate an ocean tile on the fly
         SG_LOG(SG_TERRAIN, SG_INFO, "  Generating ocean tile");
@@ -328,7 +319,10 @@ TileEntry::loadTileByFileName(const string& fileName,
         if (obj->type == OBJECT) {
             SGPath custom_path = obj->path;
             custom_path.append( obj->name );
-            obj_load( custom_path.str(), new_tile, false, opt.get());
+            osg::ref_ptr<osg::Node> node;
+            node = osgDB::readRefNodeFile(custom_path.str(), opt.get());
+            if (node.valid())
+                new_tile->addChild(node);
 
         } else if (obj->type == OBJECT_SHARED || obj->type == OBJECT_STATIC) {
             // object loading is deferred to main render thread,
@@ -341,34 +335,31 @@ TileEntry::loadTileByFileName(const string& fileName,
             }
             custom_path.append( obj->name );
 
-            osg::Matrix obj_pos;
-            WorldCoordinate( obj_pos, obj->lat, obj->lon, obj->elev, obj->hdg );
-
-            osg::MatrixTransform *obj_trans = new osg::MatrixTransform;
-            obj_trans->setDataVariance(osg::Object::STATIC);
-            obj_trans->setMatrix( obj_pos );
-
-            // wire as much of the scene graph together as we can
-            new_tile->addChild( obj_trans );
-
-            osg::Node* model = 0;
+            osg::ref_ptr<osg::Node> model;
             if(_modelLoader)
                 model = _modelLoader->loadTileModel(custom_path.str(),
                                                     obj->type == OBJECT_SHARED);
-            if (model)
-                obj_trans->addChild(model);
+            else
+                model = osgDB::readRefNodeFile(custom_path.str(), opt.get());
+
+            if (model.valid()) {
+                osg::Matrix obj_pos;
+                WorldCoordinate( obj_pos, obj->lat, obj->lon, obj->elev, obj->hdg );
+                
+                osg::MatrixTransform *obj_trans = new osg::MatrixTransform;
+                obj_trans->setDataVariance(osg::Object::STATIC);
+                obj_trans->setMatrix( obj_pos );
+                
+                // wire as much of the scene graph together as we can
+                new_tile->addChild( obj_trans );
+
+                obj_trans->addChild(model.get());
+            }
         } else if (obj->type == OBJECT_SIGN || obj->type == OBJECT_RUNWAY_SIGN) {
             // load the object itself
             SGPath custom_path = obj->path;
             custom_path.append( obj->name );
 
-            osg::Matrix obj_pos;
-            WorldCoordinate( obj_pos, obj->lat, obj->lon, obj->elev, obj->hdg );
-
-            osg::MatrixTransform *obj_trans = new osg::MatrixTransform;
-            obj_trans->setDataVariance(osg::Object::STATIC);
-            obj_trans->setMatrix( obj_pos );
-
             osg::Node *custom_obj = 0;
             if (obj->type == OBJECT_SIGN)
                 custom_obj = SGMakeSign(opt->getMaterialLib(), custom_path.str(), obj->name);
@@ -377,10 +368,17 @@ TileEntry::loadTileByFileName(const string& fileName,
 
             // wire the pieces together
             if ( custom_obj != NULL ) {
-                obj_trans -> addChild( custom_obj );
+                osg::Matrix obj_pos;
+                WorldCoordinate( obj_pos, obj->lat, obj->lon, obj->elev, obj->hdg );
+                
+                osg::MatrixTransform *obj_trans = new osg::MatrixTransform;
+                obj_trans->setDataVariance(osg::Object::STATIC);
+                obj_trans->setMatrix( obj_pos );
+                
+                obj_trans->addChild( custom_obj );
+                
+                new_tile->addChild( obj_trans );
             }
-            new_tile->addChild( obj_trans );
-
         }
         delete obj;
     }
index c7e8f8e1d6de42fc07a012291f0b37f64562c0f4..551ccc67f4add9cc66d5e04a88a217508a597f5e 100644 (file)
@@ -68,11 +68,6 @@ private:
     // osgDB::DatabasePager.
     osg::ref_ptr<osg::Referenced> _databaseRequest;
 
-    static bool obj_load( const std::string& path,
-                          osg::Group* geometry,
-                          bool is_base,
-                          const osgDB::Options* options);
-
     /**
      * This value is used by the tile scheduler/loader to load tiles
      * in a useful sequence. The priority is set to reflect the tiles