private List <OnlineMapsTile> CreateParents(List <OnlineMapsTile> tiles, int zoom) { List <OnlineMapsTile> newParentTiles = new List <OnlineMapsTile>(); OnlineMapsBufferZoom parentZoom; if (!zooms.ContainsKey(zoom)) { parentZoom = new OnlineMapsBufferZoom(zoom); zooms[zoom] = parentZoom; } else { parentZoom = zooms[zoom]; } foreach (OnlineMapsTile tile in tiles) { if (tile.parent == null) { CreateTileParent(zoom, tile, parentZoom, newParentTiles); } else { newParentTiles.Add(tile.parent); } tile.used = true; tile.parent.used = true; } return(newParentTiles); }
private void InitTiles(int zoom, OnlineMapsBufferZoom activeZoom, int countX, OnlineMapsVector2i pos, int countY, int maxY, List <OnlineMapsTile> newBaseTiles) { //IEnumerable<OnlineMapsTile> tiles = OnlineMapsTile.tiles.Where(t => t.provider == api.provider && t.zoom == activeZoom.id && t.type == api.type); IEnumerable <OnlineMapsTile> tiles = activeZoom.tiles; int maxX = 1 << bufferZoom; for (int x = 0; x < countX; x++) { int px = x + pos.x; if (px < 0) { px += maxX; } else if (px >= maxX) { px -= maxX; } for (int y = 0; y < countY; y++) { InitTile(zoom, activeZoom, pos, maxY, newBaseTiles, y, tiles, px); } } }
private void CreateTileParent(int zoom, OnlineMapsTile tile, OnlineMapsBufferZoom parentZoom, List <OnlineMapsTile> newParentTiles) { int px = tile.x / 2; int py = tile.y / 2; OnlineMapsTile parent = parentZoom.tiles.FirstOrDefault(t => t.x == px && t.y == py); if (parent == null) { parent = new OnlineMapsTile(px, py, zoom, api) { OnSetColor = OnTileSetColor }; parentZoom.tiles.Add(parent); } newParentTiles.Add(parent); parent.used = true; tile.SetParent(parent); if (parent.hasColors && tile.status != OnlineMapsTileStatus.loaded) { parent.SetChildColor(tile); } }
private void InitTile(int zoom, OnlineMapsBufferZoom activeZoom, OnlineMapsVector2i pos, int maxY, List <OnlineMapsTile> newBaseTiles, int y, IEnumerable <OnlineMapsTile> ts, int px) { int py = y + pos.y; if (py < 0 || py >= maxY) { return; } OnlineMapsTile tile = null; foreach (OnlineMapsTile t in ts) { if (t.x == px && t.y == py) { tile = t; break; } } if (tile == null) { OnlineMapsTile parent = null; if (!api.useCurrentZoomTiles && zooms.ContainsKey(zoom - 1)) { int ptx = px / 2; int pty = py / 2; foreach (OnlineMapsTile t in zooms[zoom - 1].tiles) { if (t.x == ptx && t.y == pty) { parent = t; parent.used = true; break; } } } tile = new OnlineMapsTile(px, py, zoom, api, parent) { OnSetColor = OnTileSetColor }; activeZoom.tiles.Add(tile); } newBaseTiles.Add(tile); tile.used = true; if (api.target == OnlineMapsTarget.texture) { SetBufferTile(tile); } }
private OnlineMapsBufferZoom GetActiveZoom(int zoom) { OnlineMapsBufferZoom activeZoom; if (zooms == null) { zooms = new Dictionary <int, OnlineMapsBufferZoom>(); } if (!zooms.ContainsKey(zoom)) { activeZoom = new OnlineMapsBufferZoom(zoom); zooms[zoom] = activeZoom; return(activeZoom); } return(zooms[zoom]); }
private List <OnlineMapsTile> CreateParents(List <OnlineMapsTile> tiles, int zoom) { List <OnlineMapsTile> newParentTiles = new List <OnlineMapsTile>(); OnlineMapsBufferZoom parentZoom; if (!zooms.ContainsKey(zoom)) { parentZoom = new OnlineMapsBufferZoom(zoom); zooms[zoom] = parentZoom; } else { parentZoom = zooms[zoom]; } foreach (OnlineMapsTile tile in tiles) { if (tile.parent == null) { CreateTileParent(zoom, tile, parentZoom, newParentTiles); } else { newParentTiles.Add(tile.parent); } tile.used = true; tile.parent.used = true; } if (api.target == OnlineMapsTarget.texture) { foreach (OnlineMapsTile tile in newParentTiles) { if (tile.status == OnlineMapsTileStatus.loaded) { continue; } tile.GetColorsFromChilds(); } } return(newParentTiles); }
private void InitTiles(int zoom, OnlineMapsBufferZoom activeZoom, int countX, OnlineMapsVector2i pos, int countY, int maxY, List<OnlineMapsTile> newBaseTiles) { //IEnumerable<OnlineMapsTile> tiles = OnlineMapsTile.tiles.Where(t => t.provider == api.provider && t.zoom == activeZoom.id && t.type == api.type); IEnumerable<OnlineMapsTile> tiles = activeZoom.tiles; int maxX = 1 << bufferZoom; for (int x = 0; x < countX; x++) { int px = x + pos.x; if (px < 0) px += maxX; else if (px >= maxX) px -= maxX; for (int y = 0; y < countY; y++) InitTile(zoom, activeZoom, pos, maxY, newBaseTiles, y, tiles, px); } }
private void InitTile(int zoom, OnlineMapsBufferZoom activeZoom, OnlineMapsVector2i pos, int maxY, List<OnlineMapsTile> newBaseTiles, int y, IEnumerable<OnlineMapsTile> ts, int px) { int py = y + pos.y; if (py < 0 || py >= maxY) return; OnlineMapsTile tile = null; foreach (OnlineMapsTile t in ts) { if (t.x == px && t.y == py) { tile = t; break; } } if (tile == null) { OnlineMapsTile parent = null; if (!api.useCurrentZoomTiles && zooms.ContainsKey(zoom - 1)) { int ptx = px / 2; int pty = py / 2; foreach (OnlineMapsTile t in zooms[zoom - 1].tiles) { if (t.x == ptx && t.y == pty) { parent = t; parent.used = true; break; } } } tile = new OnlineMapsTile(px, py, zoom, api, parent) { OnSetColor = OnTileSetColor }; activeZoom.tiles.Add(tile); } newBaseTiles.Add(tile); tile.used = true; if (api.target == OnlineMapsTarget.texture) SetBufferTile(tile); }
private OnlineMapsBufferZoom GetActiveZoom(int zoom) { OnlineMapsBufferZoom activeZoom; if (zooms == null) zooms = new Dictionary<int, OnlineMapsBufferZoom>(); if (!zooms.ContainsKey(zoom)) { activeZoom = new OnlineMapsBufferZoom(zoom); zooms[zoom] = activeZoom; return activeZoom; } return zooms[zoom]; }
private void CreateTileParent(int zoom, OnlineMapsTile tile, OnlineMapsBufferZoom parentZoom, List<OnlineMapsTile> newParentTiles) { int px = tile.x / 2; int py = tile.y / 2; OnlineMapsTile parent = parentZoom.tiles.FirstOrDefault(t => t.x == px && t.y == py); if (parent == null) { parent = new OnlineMapsTile(px, py, zoom, api) {OnSetColor = OnTileSetColor}; parentZoom.tiles.Add(parent); } newParentTiles.Add(parent); parent.used = true; tile.SetParent(parent); if (parent.hasColors && tile.status != OnlineMapsTileStatus.loaded) parent.SetChildColor(tile); }
private List<OnlineMapsTile> CreateParents(List<OnlineMapsTile> tiles, int zoom) { List<OnlineMapsTile> newParentTiles = new List<OnlineMapsTile>(); OnlineMapsBufferZoom parentZoom; if (!zooms.ContainsKey(zoom)) { parentZoom = new OnlineMapsBufferZoom(zoom); zooms[zoom] = parentZoom; } else { parentZoom = zooms[zoom]; } foreach (OnlineMapsTile tile in tiles) { if (tile.parent == null) CreateTileParent(zoom, tile, parentZoom, newParentTiles); else newParentTiles.Add(tile.parent); tile.used = true; tile.parent.used = true; } if (api.target == OnlineMapsTarget.texture) { foreach (OnlineMapsTile tile in newParentTiles) { if (tile.status == OnlineMapsTileStatus.loaded) continue; tile.GetColorsFromChilds(); } } return newParentTiles; }
private bool UpdateBackBuffer(double px, double py, int zoom, bool fullRedraw) { const int s = OnlineMapsUtils.tileSize; int countX = api.width / s + 2; int countY = api.height / s + 2; double cx, cy; api.projection.CoordinatesToTile(px, py, zoom, out cx, out cy); OnlineMapsVector2i pos = new OnlineMapsVector2i((int)cx - countX / 2, (int)cy - countY / 2); int maxY = 1 << zoom; if (pos.y < 0) { pos.y = 0; } if (pos.y >= maxY - countY - 1) { pos.y = maxY - countY - 1; } if (api.target == OnlineMapsTarget.texture) { if (frontBuffer == null || frontBuffer.Length != api.width * api.height) { frontBuffer = new Color32[api.width * api.height]; fullRedraw = true; } if (backBuffer == null || width != countX * s || height != countY * s) { width = countX * s; height = countY * s; backBuffer = new Color32[height * width]; fullRedraw = true; } } if (!updateBackBuffer && !fullRedraw && bufferZoom == zoom && bufferPosition != null && bufferPosition == pos) { return(false); } updateBackBuffer = false; bufferPosition = pos; bufferZoom = zoom; OnlineMapsBufferZoom activeZoom = GetActiveZoom(zoom); List <OnlineMapsTile> newBaseTiles = new List <OnlineMapsTile>(); lock (OnlineMapsTile.tiles) { foreach (OnlineMapsTile tile in OnlineMapsTile.tiles) { tile.used = false; } InitTiles(zoom, activeZoom, countX, pos, countY, maxY, newBaseTiles); if (!api.useCurrentZoomTiles) { List <OnlineMapsTile> newParentTiles = CreateParents(newBaseTiles, zoom - 1); if (zoom - 2 > 2) { newParentTiles = CreateParents(newParentTiles, zoom - 2); if (zoom - 3 > 2) { CreateParents(newParentTiles, zoom - 3); } } } foreach (OnlineMapsTile tile in newBaseTiles) { SetBufferTile(tile); } //if (api.target == OnlineMapsTarget.texture) SetMarkersToBuffer(api.markers); } needUnloadTiles = true; return(true); }
private List<OnlineMapsTile> CreateParents(List<OnlineMapsTile> tiles, int zoom) { List<OnlineMapsTile> newParentTiles = new List<OnlineMapsTile>(); OnlineMapsBufferZoom parentZoom = zooms.FirstOrDefault(z => z.id == zoom); if (parentZoom == null) { parentZoom = new OnlineMapsBufferZoom(zoom); zooms.Add(parentZoom); } foreach (OnlineMapsTile tile in tiles) { if (tile.parent == null) CreateTileParent(zoom, tile, parentZoom, newParentTiles); tile.parent.used = true; } foreach (OnlineMapsTile tile in newParentTiles.Where(t=> t.status != OnlineMapsTileStatus.loaded)) tile.GetColorsFromChilds(); return newParentTiles; }
private void InitTile(int zoom, OnlineMapsBufferZoom activeZoom, OnlineMapsVector2i pos, int maxY, List<OnlineMapsTile> newBaseTiles, int y, List<OnlineMapsTile> ts, int px) { int py = y + pos.y; if (py < 0 || py >= maxY) return; OnlineMapsTile tile = ts.FirstOrDefault(t => t.x == px && t.y == py); if (tile == null) { OnlineMapsTile parent = OnlineMapsTile.tiles.FirstOrDefault( t => t.zoom == zoom - 1 && t.x == px / 2 && t.y == py / 2); tile = new OnlineMapsTile(px, py, zoom, api, parent) {OnSetColor = OnTileSetColor}; activeZoom.tiles.Add(tile); } newBaseTiles.Add(tile); tile.used = true; SetBufferTile(tile); }
private OnlineMapsBufferZoom GetActiveZoom(int zoom) { OnlineMapsBufferZoom activeZoom; if (zooms == null) zooms = new List<OnlineMapsBufferZoom>(); lock (zooms) { activeZoom = zooms.FirstOrDefault(z => z.id == zoom); if (activeZoom == null) { activeZoom = new OnlineMapsBufferZoom(zoom); zooms.Add(activeZoom); } } return activeZoom; }