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; } }
string GetTilePath(TileName name) { var filename = _source.Name + "-" + name.Zoom + "-" + name.X + "-" + name.Y + _source.FileExtension; return(Path.Combine(DataDir, filename)); }
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 }
public void Remove(TileName tile) { var key = GetId(tile); _tiles.Remove(key); }
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++; } }