@@ -56,9 +56,9 @@ QgsGlobeTileImage::QgsGlobeTileImage( QgsGlobeTileSource* tileSource, const QgsR
5656 , mTileSource( tileSource )
5757 , mTileExtent( tileExtent )
5858 , mTileSize( tileSize )
59- , mImageUpdatePending( false )
6059 , mLod( tileLod )
6160{
61+ mTileSource ->addTile ( this );
6262#ifdef GLOBE_SHOW_TILE_STATS
6363 QgsGlobeTileStatistics::instance ()->updateTileCount ( + 1 );
6464#endif
@@ -69,10 +69,8 @@ QgsGlobeTileImage::QgsGlobeTileImage( QgsGlobeTileSource* tileSource, const QgsR
6969 GL_BGRA, GL_UNSIGNED_BYTE,
7070 mTileData, osg::Image::NO_DELETE );
7171
72- mLastUpdateTime = osgEarth::DateTime().asTimeStamp();
7372 mTileSource->mTileUpdateManager.addTile( const_cast<QgsGlobeTileImage*>( this ) );
7473 mDpi = 72;
75- mImageUpdatePending = true;
7674#else
7775 QImage qImage ( mTileData , mTileSize , mTileSize , QImage::Format_ARGB32_Premultiplied );
7876 QPainter painter ( &qImage );
@@ -84,35 +82,19 @@ QgsGlobeTileImage::QgsGlobeTileImage( QgsGlobeTileSource* tileSource, const QgsR
8482 mTileData , osg::Image::NO_DELETE );
8583 flipVertical ();
8684 mDpi = qImage.logicalDpiX ();
87- mLastUpdateTime = osgEarth::DateTime ().asTimeStamp ();
8885#endif
8986}
9087
9188QgsGlobeTileImage::~QgsGlobeTileImage ()
9289{
90+ mTileSource ->removeTile ( this );
9391 mTileSource ->mTileUpdateManager .removeTile ( this );
9492 delete[] mTileData ;
9593#ifdef GLOBE_SHOW_TILE_STATS
9694 QgsGlobeTileStatistics::instance ()->updateTileCount ( -1 );
9795#endif
9896}
9997
100- bool QgsGlobeTileImage::requiresUpdateCall () const
101- {
102- if ( mLastUpdateTime < mTileSource ->mLastModifiedTime )
103- {
104- mLastUpdateTime = mTileSource ->mLastModifiedTime ;
105- if ( !mTileExtent .intersects ( mTileSource ->mLastUpdateExtent ) )
106- {
107- return false ;
108- }
109- mTileSource ->mTileUpdateManager .addTile ( const_cast <QgsGlobeTileImage*>( this ) );
110- mImageUpdatePending = true ;
111- return true ;
112- }
113- return mImageUpdatePending ;
114- }
115-
11698QgsMapSettings QgsGlobeTileImage::createSettings ( int dpi , const QStringList &layerSet ) const
11799{
118100 QgsMapSettings settings;
@@ -143,7 +125,6 @@ void QgsGlobeTileImage::update( osg::NodeVisitor * )
143125 mTileData , osg::Image::NO_DELETE );
144126 flipVertical ();
145127 mUpdatedImage = QImage ();
146- mImageUpdatePending = false ;
147128 }
148129}
149130
@@ -237,14 +218,17 @@ void QgsGlobeTileUpdateManager::renderingFinished()
237218QgsGlobeTileSource::QgsGlobeTileSource ( QgsMapCanvas* canvas, const osgEarth::TileSourceOptions& options )
238219 : TileSource( options )
239220 , mCanvas( canvas )
240- , mLastModifiedTime( 0 )
241221{
222+ osgEarth::GeoExtent geoextent ( osgEarth::SpatialReference::get ( " wgs84" ), -180 ., -90 ., 180 ., 90 . );
223+ osgEarth::DataExtentList extents;
224+ extents.push_back ( geoextent );
225+ getDataExtents () = extents;
226+ dirtyDataExtents ();
242227}
243228
244229osgEarth::TileSource::Status QgsGlobeTileSource::initialize ( const osgDB::Options* /* dbOptions*/ )
245230{
246231 setProfile ( osgEarth::Registry::instance ()->getGlobalGeodeticProfile () );
247- mLastModifiedTime = osgEarth::DateTime ().asTimeStamp ();
248232 return STATUS_OK;
249233}
250234
@@ -266,36 +250,40 @@ osg::Image* QgsGlobeTileSource::createImage( const osgEarth::TileKey& key, osgEa
266250 return new QgsGlobeTileImage ( this , tileExtent, getPixelsPerTile (), key.getLOD () );
267251}
268252
269- bool QgsGlobeTileSource::hasDataInExtent ( const osgEarth::GeoExtent &extent ) const
253+ void QgsGlobeTileSource::refresh ( const QgsRectangle& dirtyExtent )
270254{
271- osgEarth::Bounds bounds = extent.bounds ();
272- QgsRectangle requestExtent ( bounds.xMin (), bounds.yMin (), bounds.xMax (), bounds.yMax () );
273- return requestExtent.intersects ( mViewExtent );
255+ mTileUpdateManager .updateLayerSet ( mLayerSet );
256+ mTileListLock .lock ();
257+ foreach ( QgsGlobeTileImage* tile, mTiles )
258+ {
259+ if ( tile->extent ().intersects ( dirtyExtent ) )
260+ {
261+ mTileUpdateManager .addTile ( tile );
262+ }
263+ }
264+ mTileListLock .unlock ();
274265}
275266
276- bool QgsGlobeTileSource::hasData ( const osgEarth::TileKey& key ) const
267+ void QgsGlobeTileSource::setLayerSet ( const QStringList &layerSet )
277268{
278- const osgEarth::GeoExtent& tileExtent = key.getExtent ();
279- QgsRectangle rect ( tileExtent.xMin (), tileExtent.yMin (), tileExtent.xMax (), tileExtent.yMax () );
280- return rect.intersects ( mViewExtent );
269+ mLayerSet = layerSet;
281270}
282271
283- void QgsGlobeTileSource::refresh ( const QgsRectangle& updateExtent )
272+ const QStringList& QgsGlobeTileSource::layerSet () const
284273{
285- osgEarth::TimeStamp old = mLastModifiedTime ;
286- mLastModifiedTime = osgEarth::DateTime ().asTimeStamp ();
287- mTileUpdateManager .updateLayerSet ( mLayerSet );
288- mLastUpdateExtent = updateExtent;
289- QgsDebugMsg ( QString ( " Updated QGIS map layer modified time from %1 to %2" ).arg ( old ).arg ( mLastModifiedTime ) );
290- mViewExtent = QgsCoordinateTransformCache::instance ()->transform ( mCanvas ->mapSettings ().destinationCrs ().authid (), GEO_EPSG_CRS_AUTHID )->transform ( mCanvas ->fullExtent () );
274+ return mLayerSet ;
291275}
292276
293- void QgsGlobeTileSource::setLayerSet ( const QStringList &layerSet )
277+ void QgsGlobeTileSource::addTile ( QgsGlobeTileImage* tile )
294278{
295- mLayerSet = layerSet;
279+ mTileListLock .lock ();
280+ mTiles .append ( tile );
281+ mTileListLock .unlock ();
296282}
297283
298- const QStringList& QgsGlobeTileSource::layerSet () const
284+ void QgsGlobeTileSource::removeTile ( QgsGlobeTileImage* tile )
299285{
300- return mLayerSet ;
286+ mTileListLock .lock ();
287+ mTiles .removeOne ( tile );
288+ mTileListLock .unlock ();
301289}
0 commit comments