Example #1
0
    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));
    }
Example #2
0
    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));
    }
Example #3
0
    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);
 }
Example #6
0
    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;
    }
Example #7
0
    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;
    }
Example #8
0
    /// <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;
    }
Example #9
0
    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;
        }
    }
Example #10
0
    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;
    }
Example #11
0
    /// <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;
    }