]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/tgdb/TileEntry.cxx
Remove using std:: from the metar header, remove HTTP support, add very basic unit...
[simgear.git] / simgear / scene / tgdb / TileEntry.cxx
index f5f76d92a2b8fce31664df89509adf1f3c3384d0..6c7c54c21580f33c8a17faf3e1e353435bad9381 100644 (file)
 #include <sstream>
 #include <istream>
 
-#include <osg/Array>
-#include <osg/Geometry>
-#include <osg/Geode>
 #include <osg/LOD>
 #include <osg/MatrixTransform>
 #include <osg/Math>
 #include <osg/NodeCallback>
-#include <osg/Switch>
 
 #include <osgDB/FileNameUtils>
 #include <osgDB/ReaderWriter>
@@ -68,61 +64,16 @@ osgDB::RegisterReaderWriterProxy<ReaderWriterSTG> g_readerWriterSTGProxy;
 ModelRegistryCallbackProxy<LoadOnlyCallback> g_stgCallbackProxy("stg");
 }
 
-namespace
-{
-// Update the timestamp on a tile whenever it is in view.
-
-class TileCullCallback : public osg::NodeCallback
-{
-public:
-    TileCullCallback() : _timeStamp(0) {}
-    TileCullCallback(const TileCullCallback& tc, const osg::CopyOp& copyOp) :
-        NodeCallback(tc, copyOp), _timeStamp(tc._timeStamp)
-    {
-    }
-
-    virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);
-    double getTimeStamp() const { return _timeStamp; }
-    void setTimeStamp(double timeStamp) { _timeStamp = timeStamp; }
-protected:
-    double _timeStamp;
-};
-}
-
-void TileCullCallback::operator()(osg::Node* node, osg::NodeVisitor* nv)
-{
-    if (nv->getFrameStamp())
-        _timeStamp = nv->getFrameStamp()->getReferenceTime();
-    traverse(node, nv);
-}
-
-double TileEntry::get_timestamp() const
-{
-    if (_node.valid()) {
-        return (dynamic_cast<TileCullCallback*>(_node->getCullCallback()))
-            ->getTimeStamp();
-    } else
-        return DBL_MAX;
-}
-
-void TileEntry::set_timestamp(double time_ms)
-{
-    if (_node.valid()) {
-        TileCullCallback* cb
-            = dynamic_cast<TileCullCallback*>(_node->getCullCallback());
-        if (cb)
-            cb->setTimeStamp(time_ms);
-    }
-}
 
 // Constructor
 TileEntry::TileEntry ( const SGBucket& b )
     : tile_bucket( b ),
+      tileFileName(b.gen_index_str()),
       _node( new osg::LOD ),
-      is_inner_ring(false),
-      tileFileName(b.gen_index_str())
+      _priority(-FLT_MAX),
+      _current_view(false),
+      _time_expired(-1.0)
 {
-    _node->setCullCallback(new TileCullCallback);
     tileFileName += ".stg";
     _node->setName(tileFileName);
     // Give a default LOD range so that traversals that traverse
@@ -131,6 +82,20 @@ TileEntry::TileEntry ( const SGBucket& b )
     _node->setRange(0, 0.0, 10000.0);
 }
 
+TileEntry::TileEntry( const TileEntry& t )
+: tile_bucket( t.tile_bucket ),
+  tileFileName(t.tileFileName),
+  _node( new osg::LOD ),
+  _priority(t._priority),
+  _current_view(t._current_view),
+  _time_expired(t._time_expired)
+{
+    _node->setName(tileFileName);
+    // Give a default LOD range so that traversals that traverse
+    // active children (like the groundcache lookup) will work before
+    // tile manager has had a chance to update this node.
+    _node->setRange(0, 0.0, 10000.0);
+}
 
 // Destructor
 TileEntry::~TileEntry ()
@@ -149,19 +114,6 @@ static void WorldCoordinate(osg::Matrix& obj_pos, double lat,
 }
 
 
-// Clean up the memory used by this tile and delete the arrays used by
-// ssg as well as the whole ssg branch
-bool TileEntry::free_tile() {
-    SG_LOG( SG_TERRAIN, SG_DEBUG,
-            "FREEING TILE = (" << tile_bucket << ")" );
-
-    _node->removeChildren(0, _node->getNumChildren());
-    _node = 0;
-
-    return true;
-}
-
-
 // Update the ssg transform node for this tile so it can be
 // properly drawn relative to our (0,0,0) point
 void TileEntry::prep_ssg_node(float vis) {
@@ -205,9 +157,9 @@ struct Object {
         in >> ::skipeol;
 
         if (type == OBJECT)
-            SG_LOG(SG_TERRAIN, SG_INFO, "    " << token << "  " << name);
+            SG_LOG(SG_TERRAIN, SG_BULK, "    " << token << "  " << name);
         else
-            SG_LOG(SG_TERRAIN, SG_INFO, "    " << token << "  " << name << "  lon=" <<
+            SG_LOG(SG_TERRAIN, SG_BULK, "    " << token << "  " << name << "  lon=" <<
                     lon << "  lat=" << lat << "  elev=" << elev << "  hdg=" << hdg);
     }
     object_type type;
@@ -269,7 +221,7 @@ TileEntry::loadTileByFileName(const string& fileName,
         SGPath basename = tile_path;
         basename.append( index_str );
 
-        SG_LOG( SG_TERRAIN, SG_INFO, "  Trying " << basename.str() );
+        SG_LOG( SG_TERRAIN, SG_DEBUG, "  Trying " << basename.str() );
 
 
         // Check for master .stg (scene terra gear) file
@@ -292,7 +244,7 @@ TileEntry::loadTileByFileName(const string& fileName,
             if ( token == "OBJECT_BASE" ) {
                 string name;
                 in >> name >> ::skipws;
-                SG_LOG( SG_TERRAIN, SG_INFO, "    " << token << " " << name );
+                SG_LOG( SG_TERRAIN, SG_BULK, "    " << token << " " << name );
 
                 if (!found_tile_base) {
                     found_tile_base = true;
@@ -302,7 +254,7 @@ TileEntry::loadTileByFileName(const string& fileName,
                     object_base.append(name);
 
                 } else
-                    SG_LOG(SG_TERRAIN, SG_INFO, "    (skipped)");
+                    SG_LOG(SG_TERRAIN, SG_BULK, "    (skipped)");
 
                             // Load only if base is not in another file
             } else if ( token == "OBJECT" ) {
@@ -311,7 +263,7 @@ TileEntry::loadTileByFileName(const string& fileName,
                 else {
                     string name;
                     in >> name >> ::skipeol;
-                    SG_LOG(SG_TERRAIN, SG_INFO, "    " << token << "  "
+                    SG_LOG(SG_TERRAIN, SG_BULK, "    " << token << "  "
                             << name << "  (skipped)");
                 }
 
@@ -350,7 +302,7 @@ TileEntry::loadTileByFileName(const string& fileName,
     if (found_tile_base) {
         // load tile if found ...
         opt->setCalcLights(true);
-        obj_load( object_base.str(), new_tile, true, opt);
+        obj_load( object_base.str(), new_tile, true, opt.get());
 
     } else {
         // ... or generate an ocean tile on the fly
@@ -371,7 +323,7 @@ TileEntry::loadTileByFileName(const string& fileName,
             SGPath custom_path = obj->path;
             custom_path.append( obj->name );
             opt->setCalcLights(true);
-            obj_load( custom_path.str(), new_tile, false, opt);
+            obj_load( custom_path.str(), new_tile, false, opt.get());
 
         } else if (obj->type == OBJECT_SHARED || obj->type == OBJECT_STATIC) {
             // object loading is deferred to main render thread,
@@ -388,6 +340,7 @@ TileEntry::loadTileByFileName(const string& fileName,
             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
@@ -408,6 +361,7 @@ TileEntry::loadTileByFileName(const string& fileName,
             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;
@@ -462,3 +416,19 @@ TileEntry::removeFromSceneGraph()
     }
 }
 
+void
+TileEntry::refresh()
+{
+    osg::Group *parent = NULL;
+    // find the nodes branch parent
+    if ( _node->getNumParents() > 0 ) {
+        // find the first parent (should only be one)
+        parent = _node->getParent( 0 ) ;
+        if( parent ) {
+            parent->removeChild( _node.get() );
+        }
+    }
+    _node = new osg::LOD;
+    if (parent)
+        parent->addChild(_node.get());
+}