Esempio n. 1
0
 public T this[TileName name] {
     get {
         TileCollectionItem t = null;
         if (_tiles.TryGetValue(GetId(name), out t))
         {
             t.Priority = _nextPriority++;
             return((T)t.Value);
         }
         else
         {
             return(default(T));
         }
     }
     set {
         var t = new TileCollectionItem()
         {
             Priority = _nextPriority++,
             Name     = name.Clone(),
             Value    = value
         };
         _tiles[GetId(name)] = t;
     }
 }
Esempio n. 2
0
        string GetTilePath(TileName name)
        {
            var filename = _source.Name + "-" + name.Zoom + "-" + name.X + "-" + name.Y + _source.FileExtension;

            return(Path.Combine(DataDir, filename));
        }
Esempio n. 3
0
        public int GetTile(TileName name)
        {
            //
            // Try to get it from the in-memory store
            //
            var r = _glTiles[name];

            if (r != 0)
            {
                return(r);
            }

            //
            // If it's not in memory, let's see if its data has been loaded
            //
            TextureData data = null;

            lock (_loadedTiles) {
                data = _loadedTiles[name];
            }
            if (data != null)
            {
                r = data.CreateGLTexture();

                lock (_loadedTiles) {
                    _loadedTiles.Remove(name);
                }
                data.Dispose();

                //
                // Clear memory if needed
                //
                if (_glTiles.Count >= MaxInMemoryTextures)
                {
                    var oldest = _glTiles.GetLowestPriority();
                    _glTiles.Remove(oldest.Name);
                    //Console.WriteLine ("Free " + _glTiles.Count);
                    DeleteTextureMemory((int)oldest.Value);
                }
                _glTiles[name] = r;
                return(r);
            }

            //
            // Have we already requested that this tile be loaded from disk?
            //
            lock (_loadingTiles) {
                var loading = _loadingTiles[name];

                if (loading)
                {
                    // Already queued, just need to be patient
                    return(0);
                }
            }

            //
            // OK, we've never even tried to load it before, try to get it from disk
            //
            var onDisk = false;

            lock (_onDiskTiles) {
                onDisk = _onDiskTiles[name];
            }
            if (onDisk)
            {
                lock (_loadingTiles) {
                    _loadingTiles[name] = true;
                }
                _wakeupLoader.Set();

                return(0);
            }

            //
            // It's not on disk either! Better ask for it to be downloaded
            //
            lock (_downloadingTiles) {
                var d = _downloadingTiles[name];
                if (!d)
                {
                    _downloadingTiles[name] = true;
                    _wakeupDownloader.Set();
                }
            }

            return(0);            // We've got nothing, for now
        }
Esempio n. 4
0
        public void Remove(TileName tile)
        {
            var key = GetId(tile);

            _tiles.Remove(key);
        }
Esempio n. 5
0
        void DrawTiles(Camera cam, TileName centerTile, float alpha)
        {
            //
            // Determine the number of tiles to show
            //
            int minX = 99999999, minY = 99999999, maxX = 0, maxY = 0;

            for (var i = 0; i < cam.ScreenLocations.Length; i++)
            {
                var loc = cam.ScreenLocations[i];
                if (loc != null)
                {
                    var c = TileName.FromLocation(loc, centerTile.Zoom);
                    minX = Math.Min(c.X, minX);
                    minY = Math.Min(c.Y, minY);
                    maxX = Math.Max(c.X, maxX);
                    maxY = Math.Max(c.Y, maxY);
                }
            }
            minX  = Math.Min(centerTile.X, minX);
            minY  = Math.Min(centerTile.Y, minY);
            maxX  = Math.Max(centerTile.X, maxX);
            maxY  = Math.Max(centerTile.Y, maxY);
            minX -= 1;
            minY -= 1;
            maxX += 1;
            maxY += 1;

            //
            // Draw them
            //
            var nd   = 0;
            var tile = new TileName()
            {
                Zoom = centerTile.Zoom
            };

            var n = (int)Math.Pow(2, tile.Zoom);

            foreach (var p in RenderOrder)
            {
                tile.X = centerTile.X + p.X;
                tile.Y = centerTile.Y + p.Y;

                while (tile.X < 0)
                {
                    tile.X += n;
                }
                while (tile.Y < 0)
                {
                    tile.Y += n;
                }
                while (tile.X >= n)
                {
                    tile.X -= n;
                }
                while (tile.Y >= n)
                {
                    tile.Y -= n;
                }

                if (tile.X < minX || tile.Y < minY)
                {
                    continue;
                }
                if (tile.X > maxX || tile.Y > maxY)
                {
                    continue;
                }

                DrawTile(tile, alpha);
                nd++;
            }
        }