private Rect GetMarkerRect(OnlineMapsMarker marker) { const int s = OnlineMapsUtils.tileSize; Vector2 p = OnlineMapsUtils.LatLongToTilef(marker.position, bufferZoom); p.x -= bufferPosition.x; p.y -= bufferPosition.y; OnlineMapsVector2i ip = marker.GetAlignedPosition(new OnlineMapsVector2i((int)(p.x * s), (int)(p.y * s))); return(new Rect(ip.x, ip.y, marker.width, marker.height)); }
private Rect GetMarkerRect(OnlineMapsMarker marker) { const int s = OnlineMapsUtils.tileSize; double tx, ty; marker.GetTilePosition(out tx, out ty); tx -= bufferPosition.x; ty -= bufferPosition.y; OnlineMapsVector2i ip = marker.GetAlignedPosition((int)(tx * s), (int)(ty * s)); return(new Rect(ip.x, ip.y, marker.width, marker.height)); }
private Rect GetMarkerRect(OnlineMapsMarker marker) { const int s = OnlineMapsUtils.tileSize; double mx, my; marker.GetPosition(out mx, out my); double tx, ty; api.projection.CoordinatesToTile(mx, my, bufferZoom, out tx, out ty); tx -= bufferPosition.x; ty -= bufferPosition.y; OnlineMapsVector2i ip = marker.GetAlignedPosition(new OnlineMapsVector2i((int)(tx * s), (int)(ty * s))); return(new Rect(ip.x, ip.y, marker.width, marker.height)); }
private void SetMarkerToBuffer(OnlineMapsMarker marker, Vector2 startPos, Vector2 endPos) { const int s = OnlineMapsUtils.tileSize; float mx = marker.position.x; if (!(((mx > startPos.x && mx < endPos.x) || (mx + 360 > startPos.x && mx + 360 < endPos.x) || (mx - 360 > startPos.x && mx - 360 < endPos.x)) && marker.position.y < startPos.y && marker.position.y > endPos.y)) return; #if !UNITY_WEBGL int maxCount = 20; while (marker.locked && maxCount > 0) { Thread.Sleep(1); maxCount--; } #endif marker.locked = true; Vector2 p = OnlineMapsUtils.LatLongToTilef(marker.position, bufferZoom); p -= bufferPosition; int maxX = 1 << bufferZoom; if (p.x < 0) p.x += maxX; else if (p.x > maxX) p.x -= maxX; OnlineMapsVector2i ip = marker.GetAlignedPosition(new OnlineMapsVector2i((int) (p.x * s), (int) (p.y * s))); Color[] markerColors = marker.colors; if (markerColors == null || markerColors.Length == 0) return; int markerWidth = marker.width; int markerHeight = marker.height; for (int y = 0; y < marker.height; y++) { if (ip.y + y < 0 || ip.y + y >= height) continue; int my = (markerHeight - y - 1) * markerWidth; for (int x = 0; x < marker.width; x++) { if (ip.x + x < 0 || ip.x + x >= width) continue; try { SetColorToBuffer(markerColors[my + x], ip, y, x); } catch { } } } marker.locked = false; }
private Rect GetMarkerRect(OnlineMapsMarker marker) { const int s = OnlineMapsUtils.tileSize; Vector2 p = OnlineMapsUtils.LatLongToTilef(marker.position, bufferZoom); p.x -= bufferPosition.x; p.y -= bufferPosition.y; OnlineMapsVector2i ip = marker.GetAlignedPosition(new OnlineMapsVector2i((int)(p.x * s), (int)(p.y * s))); return new Rect(ip.x, ip.y, marker.width, marker.height); }
private void SetMarkerToBuffer(OnlineMapsMarker marker, OnlineMapsVector2i bufferPosition, int bufferZoom, OnlineMapsVector2i frontBufferPosition, double sx, double sy, double ex, double ey) { const int s = OnlineMapsUtils.tileSize; double mx, my; marker.GetPosition(out mx, out my); int maxX = 1 << bufferZoom; bool isEntireWorld = map.buffer.renderState.width == maxX * s; bool isBiggestThatBuffer = map.buffer.renderState.width + 512 == maxX * s; if (isEntireWorld || isBiggestThatBuffer) { } else if (!(((mx > sx && mx < ex) || (mx + 360 > sx && mx + 360 < ex) || (mx - 360 > sx && mx - 360 < ex)) && my < sy && my > ey)) { return; } #if !UNITY_WEBGL int maxCount = 20; while (marker.locked && maxCount > 0) { OnlineMapsUtils.ThreadSleep(1); maxCount--; } #endif marker.locked = true; double px, py; map.projection.CoordinatesToTile(mx, my, bufferZoom, out px, out py); px -= bufferPosition.x; py -= bufferPosition.y; if (isEntireWorld) { double tx, ty; map.projection.CoordinatesToTile(map.buffer.renderState.longitude, map.buffer.renderState.latitude, bufferZoom, out tx, out ty); tx -= map.buffer.renderState.width / s / 2; if (px < tx) { px += maxX; } } else { if (px < 0) { px += maxX; } else if (px > maxX) { px -= maxX; } } float zoomCoof = map.buffer.renderState.zoomCoof; px *= s; py *= s; int ipx = (int)((px - frontBufferPosition.x) / zoomCoof); int ipy = (int)((py - frontBufferPosition.y) / zoomCoof); OnlineMapsVector2i ip = marker.GetAlignedPosition(ipx, ipy); Color32[] markerColors = marker.colors; if (markerColors == null || markerColors.Length == 0) { return; } int markerWidth = marker.width; int markerHeight = marker.height; OnlineMapsBuffer buffer = map.buffer; for (int y = 0; y < marker.height; y++) { if (ip.y + y < 0 || ip.y + y >= map.height) { continue; } int cy = (markerHeight - y - 1) * markerWidth; for (int x = 0; x < marker.width; x++) { if (ip.x + x < 0 || ip.x + x >= map.buffer.renderState.width) { continue; } try { buffer.SetColorToBuffer(markerColors[cy + x], ip, y, x); } catch { } } } if (isEntireWorld) { ip.x -= (int)(buffer.renderState.width / zoomCoof); for (int y = 0; y < marker.height; y++) { if (ip.y + y < 0 || ip.y + y >= map.height) { continue; } int cy = (markerHeight - y - 1) * markerWidth; for (int x = 0; x < marker.width; x++) { if (ip.x + x < 0 || ip.x + x >= map.buffer.renderState.width) { continue; } try { buffer.SetColorToBuffer(markerColors[cy + x], ip, y, x); } catch { } } } ip.x += (int)(buffer.renderState.width * 2 / zoomCoof); for (int y = 0; y < marker.height; y++) { if (ip.y + y < 0 || ip.y + y >= map.height) { continue; } int cy = (markerHeight - y - 1) * markerWidth; for (int x = 0; x < marker.width; x++) { if (ip.x + x < 0 || ip.x + x >= map.buffer.renderState.width) { continue; } try { buffer.SetColorToBuffer(markerColors[cy + x], ip, y, x); } catch { } } } } marker.locked = false; }
private void SetMarkerToBuffer(OnlineMapsMarker marker, double sx, double sy, double ex, double ey) { const int s = OnlineMapsUtils.tileSize; double mx, my; marker.GetPosition(out mx, out my); if (!(((mx > sx && mx < ex) || (mx + 360 > sx && mx + 360 < ex) || (mx - 360 > sx && mx - 360 < ex)) && my < sy && my > ey)) { return; } #if !UNITY_WEBGL int maxCount = 20; while (marker.locked && maxCount > 0) { #if !NETFX_CORE Thread.Sleep(1); #else OnlineMapsThreadWINRT.Sleep(1); #endif maxCount--; } #endif marker.locked = true; double px, py; api.projection.CoordinatesToTile(mx, my, bufferZoom, out px, out py); px -= bufferPosition.x; py -= bufferPosition.y; int maxX = 1 << bufferZoom; if (px < 0) { px += maxX; } else if (px > maxX) { px -= maxX; } OnlineMapsVector2i ip = marker.GetAlignedPosition((int)(px * s), (int)(py * s)); Color32[] markerColors = marker.colors; if (markerColors == null || markerColors.Length == 0) { return; } int markerWidth = marker.width; int markerHeight = marker.height; for (int y = 0; y < marker.height; y++) { if (disposed) { return; } if (ip.y + y < 0 || ip.y + y >= height) { continue; } int cy = (markerHeight - y - 1) * markerWidth; for (int x = 0; x < marker.width; x++) { if (ip.x + x < 0 || ip.x + x >= width) { continue; } try { SetColorToBuffer(markerColors[cy + x], ip, y, x); } catch { } } } marker.locked = false; }
/// <summary> /// Get the center point and best zoom for the array of markers. /// </summary> /// <param name="markers">Array of markers.</param> /// <param name="center">Center point.</param> /// <param name="zoom">Best zoom.</param> public static void GetCenterPointAndZoom(OnlineMapsMarkerBase[] markers, out Vector2 center, out int zoom) { float minX = Single.MaxValue; float minY = Single.MaxValue; float maxX = Single.MinValue; float maxY = Single.MinValue; foreach (OnlineMapsMarkerBase marker in markers) { if (marker.position.x < minX) { minX = marker.position.x; } if (marker.position.y < minY) { minY = marker.position.y; } if (marker.position.x > maxX) { maxX = marker.position.x; } if (marker.position.y > maxY) { maxY = marker.position.y; } } float rx = maxX - minX; float ry = maxY - minY; center = new Vector2(rx / 2 + minX, ry / 2 + minY); int width = OnlineMaps.instance.width; int height = OnlineMaps.instance.height; float countX = width / (float)tileSize / 2; float countY = height / (float)tileSize / 2; bool useZoomMin = false; for (int z = 20; z > 4; z--) { bool success = true; foreach (OnlineMapsMarkerBase marker in markers) { Vector2 p = LatLongToTilef(marker.position, z); Vector2 bufferPosition = LatLongToTilef(center, z); p.x -= bufferPosition.x - countX; p.y -= bufferPosition.y - countY; if (marker is OnlineMapsMarker) { useZoomMin = true; OnlineMapsMarker m = marker as OnlineMapsMarker; OnlineMapsVector2i ip = m.GetAlignedPosition(new OnlineMapsVector2i((int)(p.x * tileSize), (int)(p.y * tileSize))); if (ip.x < 0 || ip.y < 0 || ip.x + m.width > width || ip.y + m.height > height) { success = false; break; } } else if (marker is OnlineMapsMarker3D) { if (p.x < 0 || p.y < 0 || p.x > width || p.y > height) { success = false; break; } } else { throw new Exception("Wrong marker type"); } } if (success) { zoom = z; if (useZoomMin) { zoom -= 1; } return; } } zoom = 3; }
private void SetMarkerToBuffer(OnlineMapsMarker marker, Vector2 startPos, Vector2 endPos) { const int s = OnlineMapsUtils.tileSize; float mx = marker.position.x; if (((mx > startPos.x && mx < endPos.x) || (mx + 360 > startPos.x && mx + 360 < endPos.x) || (mx - 360 > startPos.x && mx - 360 < endPos.x)) && marker.position.y < startPos.y && marker.position.y > endPos.y) { while (marker.locked) Thread.Sleep(1); marker.locked = true; Vector2 p = OnlineMapsUtils.LatLongToTilef(marker.position, bufferZoom); p -= bufferPosition; OnlineMapsVector2i ip = marker.GetAlignedPosition(new OnlineMapsVector2i((int) (p.x * s), (int) (p.y * s))); Color[] markerColors = marker.colors; if (markerColors == null || markerColors.Length == 0) return; for (int x = 0; x < marker.width; x++) { if (ip.x + x < 0 || ip.x + x >= width) continue; for (int y = 0; y < marker.height; y++) { if (ip.y + y < 0 || ip.y + y >= height) continue; try { SetColorToBuffer(markerColors[(marker.height - y - 1) * marker.width + x], ip, y, x); } catch { } } } marker.locked = false; } }
private void SetMarkerToBuffer(OnlineMapsMarker marker, Vector2 startPos, Vector2 endPos) { const int s = OnlineMapsUtils.tileSize; float mx = marker.position.x; if (!(((mx > startPos.x && mx < endPos.x) || (mx + 360 > startPos.x && mx + 360 < endPos.x) || (mx - 360 > startPos.x && mx - 360 < endPos.x)) && marker.position.y < startPos.y && marker.position.y > endPos.y)) { return; } #if !UNITY_WEBGL int maxCount = 20; while (marker.locked && maxCount > 0) { Thread.Sleep(1); maxCount--; } #endif marker.locked = true; Vector2 p = OnlineMapsUtils.LatLongToTilef(marker.position, bufferZoom); p -= bufferPosition; int maxX = 1 << bufferZoom; if (p.x < 0) { p.x += maxX; } else if (p.x > maxX) { p.x -= maxX; } OnlineMapsVector2i ip = marker.GetAlignedPosition(new OnlineMapsVector2i((int)(p.x * s), (int)(p.y * s))); Color[] markerColors = marker.colors; if (markerColors == null || markerColors.Length == 0) { return; } int markerWidth = marker.width; int markerHeight = marker.height; for (int y = 0; y < marker.height; y++) { if (ip.y + y < 0 || ip.y + y >= height) { continue; } int my = (markerHeight - y - 1) * markerWidth; for (int x = 0; x < marker.width; x++) { if (ip.x + x < 0 || ip.x + x >= width) { continue; } try { SetColorToBuffer(markerColors[my + x], ip, y, x); } catch { } } } marker.locked = false; }
/// <summary> /// Get the center point and best zoom for the array of markers. /// </summary> /// <param name="markers">Array of markers.</param> /// <param name="center">Center point.</param> /// <param name="zoom">Best zoom.</param> public static void GetCenterPointAndZoom(OnlineMapsMarkerBase[] markers, out Vector2 center, out int zoom) { OnlineMaps api = OnlineMaps.instance; OnlineMapsProjection projection = api.projection; double minX = Double.MaxValue; double minY = Double.MaxValue; double maxX = Double.MinValue; double maxY = Double.MinValue; foreach (OnlineMapsMarkerBase marker in markers) { double mx, my; marker.GetPosition(out mx, out my); if (mx < minX) { minX = mx; } if (my < minY) { minY = my; } if (mx > maxX) { maxX = mx; } if (my > maxY) { maxY = my; } } double rx = maxX - minX; double ry = maxY - minY; center = new Vector2((float)(rx / 2 + minX), (float)(ry / 2 + minY)); int width = api.width; int height = api.height; float countX = width / (float)tileSize / 2; float countY = height / (float)tileSize / 2; bool useZoomMin = false; for (int z = 20; z > 4; z--) { bool success = true; double bx, by; projection.CoordinatesToTile(center.x, center.y, z, out bx, out by); foreach (OnlineMapsMarkerBase marker in markers) { double mx, my; marker.GetPosition(out mx, out my); double px, py; projection.CoordinatesToTile(mx, my, z, out px, out py); px -= bx - countX; py -= by - countY; if (marker is OnlineMapsMarker) { useZoomMin = true; OnlineMapsMarker m = marker as OnlineMapsMarker; OnlineMapsVector2i ip = m.GetAlignedPosition(new OnlineMapsVector2i((int)(px * tileSize), (int)(py * tileSize))); if (ip.x < 0 || ip.y < 0 || ip.x + m.width > width || ip.y + m.height > height) { success = false; break; } } else if (marker is OnlineMapsMarker3D) { if (px < 0 || py < 0 || px > width || py > height) { success = false; break; } } else { throw new Exception("Wrong marker type"); } } if (success) { zoom = z; if (useZoomMin) { zoom -= 1; } return; } } zoom = 3; }