protected override void AfterUpdate()
    {
        base.AfterUpdate();

        if (api.showMarkerTooltip == OnlineMapsShowMarkerTooltip.onHover)
        {
            OnlineMapsMarkerInstanceBase markerInstance = GetBillboardMarkerFromScreen(Input.mousePosition);
            if (markerInstance != null)
            {
                api.tooltip       = markerInstance.marker.label;
                api.tooltipMarker = markerInstance.marker;
            }
        }

        if (allowAddMarker3DByN && Input.GetKeyUp(KeyCode.N))
        {
            OnlineMapsMarker3D m = new OnlineMapsMarker3D
            {
                position = GetCoords(),
                scale    = marker3DScale,
                control  = this
            };
            m.Init(transform);
            double tlx, tly, brx, bry;
            api.GetTopLeftPosition(out tlx, out tly);
            api.GetBottomRightPosition(out brx, out bry);
            m.Update(tlx, tly, brx, bry, api.zoom);
            List <OnlineMapsMarker3D> markerList = markers3D.ToList();
            markerList.Add(m);
            markers3D = markerList.ToArray();
        }
    }
    private IEnumerator WaitLongPress()
    {
        yield return(new WaitForSeconds(longPressDelay));

        OnlineMapsMarker marker        = null;
        Vector2          inputPosition = GetInputPosition();

        if (this is OnlineMapsControlBase3D && OnlineMapsControlBase3D.instance.marker2DMode == OnlineMapsMarker2DMode.billboard)
        {
            OnlineMapsMarkerInstanceBase instanceBase = OnlineMapsControlBase3D.instance.GetBillboardMarkerFromScreen(inputPosition);
            if (instanceBase != null)
            {
                marker = instanceBase.marker as OnlineMapsMarker;
            }
        }
        else
        {
            marker = map.GetMarkerFromScreen(inputPosition);
        }

        if (marker != null && marker.OnLongPress != null)
        {
            marker.OnLongPress(marker);
        }

        if (OnMapLongPress != null)
        {
            OnMapLongPress();
            isMapDrag = false;
        }

        longPressEnumenator = null;
    }
    public override IOnlineMapsInteractiveElement GetInteractiveElement(Vector2 screenPosition)
    {
        if (IsCursorOnUIElement(screenPosition))
        {
            return(null);
        }

        //TODO: Find a way to refactory this method
        RaycastHit hit;

        if (Physics.Raycast(activeCamera.ScreenPointToRay(screenPosition), out hit, OnlineMapsUtils.maxRaycastDistance))
        {
            OnlineMapsMarkerInstanceBase markerInstance = hit.collider.gameObject.GetComponent <OnlineMapsMarkerInstanceBase>();
            if (markerInstance != null)
            {
                return(markerInstance.marker);
            }
        }

        OnlineMapsMarker marker = markerDrawer.GetMarkerFromScreen(screenPosition);

        if (marker != null)
        {
            return(marker);
        }

        OnlineMapsDrawingElement drawingElement = map.GetDrawingElement(screenPosition);

        return(drawingElement);
    }
    protected override void AfterUpdate()
    {
        base.AfterUpdate();

        Vector2 inputPosition = GetInputPosition();

        if (map.showMarkerTooltip == OnlineMapsShowMarkerTooltip.onHover)
        {
            OnlineMapsMarkerInstanceBase markerInstance = GetBillboardMarkerFromScreen(inputPosition);
            if (markerInstance != null)
            {
                OnlineMapsTooltipDrawerBase.tooltip       = markerInstance.marker.label;
                OnlineMapsTooltipDrawerBase.tooltipMarker = markerInstance.marker;
            }
        }
    }
Beispiel #5
0
    public override IOnlineMapsInteractiveElement GetInteractiveElement(Vector2 screenPosition)
    {
        #if !IGUI && ((!UNITY_ANDROID && !UNITY_IOS) || UNITY_EDITOR)
        if (map.notInteractUnderGUI && GUIUtility.hotControl != 0)
        {
            return(null);
        }
#endif

        if (EventSystem.current != null)
        {
            PointerEventData pe = new PointerEventData(EventSystem.current);
            pe.position = screenPosition;
            List <RaycastResult> hits = new List <RaycastResult>();
            EventSystem.current.RaycastAll(pe, hits);
            if (hits.Count > 0 && hits[0].gameObject != gameObject)
            {
                return(null);
            }
        }

        RaycastHit hit;
        if (Physics.Raycast(activeCamera.ScreenPointToRay(screenPosition), out hit, OnlineMapsUtils.maxRaycastDistance))
        {
            OnlineMapsMarkerInstanceBase markerInstance = hit.collider.gameObject.GetComponent <OnlineMapsMarkerInstanceBase>();
            if (markerInstance != null)
            {
                return(markerInstance.marker);
            }
        }

        OnlineMapsMarker marker = map.GetMarkerFromScreen(screenPosition);
        if (marker != null)
        {
            return(marker);
        }

        OnlineMapsDrawingElement drawingElement = map.GetDrawingElement(screenPosition);
        return(drawingElement);
    }
    /// <summary>
    /// Method that is called when you release the map.
    /// </summary>
    protected void OnMapBaseRelease()
    {
        if (waitZeroTouches && GetTouchCount() == 0)
        {
            waitZeroTouches = false;
        }
        if (GUIUtility.hotControl != 0)
        {
            return;
        }

        Vector2 inputPosition = GetInputPosition();
        bool    isClick       = (pressPoint - inputPosition).sqrMagnitude < 400;

        isMapDrag      = false;
        mapDragStarted = false;
        dragMarker     = null;

        if (longPressEnumenator != null)
        {
            StopCoroutine("WaitLongPress");
            longPressEnumenator = null;
        }

        lastInputPosition        = Vector2.zero;
        OnlineMaps.isUserControl = false;

        if (!isMapPress)
        {
            return;
        }
        isMapPress = false;
        if (OnMapRelease != null)
        {
            OnMapRelease();
        }

        OnlineMapsMarker marker = null;

        if (this is OnlineMapsControlBase3D &&
            OnlineMapsControlBase3D.instance.marker2DMode == OnlineMapsMarker2DMode.billboard)
        {
            OnlineMapsMarkerInstanceBase instanceBase = OnlineMapsControlBase3D.instance.GetBillboardMarkerFromScreen(inputPosition);
            if (instanceBase != null)
            {
                marker = instanceBase.marker as OnlineMapsMarker;
            }
        }
        else
        {
            marker = map.GetMarkerFromScreen(inputPosition);
        }

        OnlineMapsDrawingElement drawingElement = null;

        if (map.showMarkerTooltip == OnlineMapsShowMarkerTooltip.onPress && (map.tooltipMarker != null || map.tooltipDrawingElement != null))
        {
            map.tooltipMarker         = null;
            map.tooltipDrawingElement = null;
            map.tooltip = null;
        }

        if (marker != null)
        {
            if (marker.OnRelease != null)
            {
                marker.OnRelease(marker);
            }
            if (isClick && marker.OnClick != null)
            {
                marker.OnClick(marker);
            }
        }
        else
        {
            drawingElement = map.GetDrawingElement(inputPosition);
            if (drawingElement != null && drawingElement.OnRelease != null)
            {
                drawingElement.OnRelease(drawingElement);
            }
        }

        if (isClick && DateTime.Now.Ticks - lastClickTimes[0] < 5000000)
        {
            if (marker != null && marker.OnDoubleClick != null)
            {
                marker.OnDoubleClick(marker);
            }
            else if (drawingElement != null && drawingElement.OnDoubleClick != null)
            {
                drawingElement.OnDoubleClick(drawingElement);
            }
            else
            {
                if (OnMapDoubleClick != null)
                {
                    OnMapDoubleClick();
                }

                if (allowZoom && zoomInOnDoubleClick)
                {
                    ZoomOnPoint(1, inputPosition);
                }
            }

            lastClickTimes[0] = 0;
            lastClickTimes[1] = 0;
        }
        else if (isClick)
        {
            if (drawingElement != null && drawingElement.OnClick != null)
            {
                drawingElement.OnClick(drawingElement);
            }
            if (OnMapClick != null)
            {
                OnMapClick();
            }
        }

        if (map.bufferStatus == OnlineMapsBufferStatus.wait)
        {
            map.needRedraw = true;
        }
    }
    /// <summary>
    /// Method that is called when you press the map.
    /// </summary>
    protected void OnMapBasePress()
    {
        isMapPress = false;

        if (waitZeroTouches)
        {
            if (GetTouchCount() <= 1)
            {
                waitZeroTouches = false;
            }
            else
            {
                return;
            }
        }

        dragMarker = null;
        if (!HitTest())
        {
            return;
        }

#if !IGUI && ((!UNITY_ANDROID && !UNITY_IOS) || UNITY_EDITOR)
        if (map.notInteractUnderGUI && GUIUtility.hotControl != 0)
        {
            return;
        }
#endif

        Vector2 inputPosition = GetInputPosition();

        if (EventSystem.current != null)
        {
            PointerEventData pe = new PointerEventData(EventSystem.current);
            pe.position = inputPosition;
            List <RaycastResult> hits = new List <RaycastResult>();
            EventSystem.current.RaycastAll(pe, hits);
            if (hits.Count > 0 && hits[0].gameObject != gameObject)
            {
                return;
            }
        }

        if (OnMapPress != null)
        {
            OnMapPress();
        }

        lastClickTimes[0] = lastClickTimes[1];
        lastClickTimes[1] = DateTime.Now.Ticks;

        bool hit = GetCoords(out lastPositionLng, out lastPositionLat);
        lastInputPosition = pressPoint = inputPosition;
        if (!hit)
        {
            return;
        }

        isMapPress = true;

        OnlineMapsMarker marker = null;

        if (this is OnlineMapsControlBase3D && OnlineMapsControlBase3D.instance.marker2DMode == OnlineMapsMarker2DMode.billboard)
        {
            OnlineMapsMarkerInstanceBase instanceBase = OnlineMapsControlBase3D.instance.GetBillboardMarkerFromScreen(inputPosition);
            if (instanceBase != null)
            {
                marker = instanceBase.marker as OnlineMapsMarker;
            }
        }
        else
        {
            marker = map.GetMarkerFromScreen(inputPosition);
        }

        bool allowMapLongPress = true;

        if (marker != null)
        {
            if (marker.OnPress != null)
            {
                marker.OnPress(marker);
            }
            if (marker.OnLongPress != null)
            {
                allowMapLongPress = false;
            }
            if (map.showMarkerTooltip == OnlineMapsShowMarkerTooltip.onPress)
            {
                map.tooltipMarker = marker;
                map.tooltip       = marker.label;
            }
            if (Input.GetKey(KeyCode.LeftControl))
            {
                dragMarker = marker;
            }
        }
        else
        {
            OnlineMapsDrawingElement drawingElement = map.GetDrawingElement(inputPosition);
            if (drawingElement != null)
            {
                if (drawingElement.OnPress != null)
                {
                    drawingElement.OnPress(drawingElement);
                }
                if (map.showMarkerTooltip == OnlineMapsShowMarkerTooltip.onPress)
                {
                    map.tooltipDrawingElement = drawingElement;
                    map.tooltip = drawingElement.tooltip;
                }
            }
        }

        if (dragMarker == null)
        {
            isMapDrag = true;

            if (allowMapLongPress)
            {
                longPressEnumenator = WaitLongPress();
                StartCoroutine("WaitLongPress");
            }
        }
        else
        {
            lastClickTimes[0] = 0;
        }

        if (allowUserControl)
        {
            OnlineMaps.isUserControl = true;
        }
    }
    protected override void AfterUpdate()
    {
        base.AfterUpdate();

        Vector2 inputPosition = GetInputPosition();

        if (allowCameraControl)
        {
#if (!UNITY_ANDROID && !UNITY_IPHONE) || UNITY_EDITOR
            if (Input.GetMouseButton(1))
            {
                isCameraControl = true;
                if (lastInputPosition != inputPosition && lastInputPosition != Vector2.zero)
                {
                    Vector2 offset = lastInputPosition - inputPosition;
                    cameraRotation.x -= offset.y / 10f * cameraSpeed.x;
                    cameraRotation.y -= offset.x / 10f * cameraSpeed.y;
                }
                lastInputPosition = inputPosition;
            }
            else if (isCameraControl)
            {
                lastInputPosition = Vector2.zero;
                isCameraControl   = false;
            }
#else
            if (!allowZoom && allowCameraControl)
            {
                if (Input.touchCount == 2)
                {
                    Vector2 p1 = Input.GetTouch(0).position;
                    Vector2 p2 = Input.GetTouch(1).position;

                    Vector2 center = Vector2.Lerp(p1, p2, 0.5f);
                    if (lastGestureCenter == Vector2.zero)
                    {
                        lastGestureCenter = center;
                    }
                    else if (lastGestureCenter != center)
                    {
                        Vector2 offset = lastGestureCenter - center;
                        cameraRotation.x -= offset.y / 10f * cameraSpeed.x;
                        cameraRotation.y -= offset.x / 10f * cameraSpeed.y;
                        lastGestureCenter = center;
                    }

                    lastInputPosition = center;
                }
                else
                {
                    lastGestureCenter = Vector2.zero;
                }
            }
#endif

            UpdateCameraPosition();
        }

        if (map.showMarkerTooltip == OnlineMapsShowMarkerTooltip.onHover)
        {
            OnlineMapsMarkerInstanceBase markerInstance = GetBillboardMarkerFromScreen(inputPosition);
            if (markerInstance != null)
            {
                map.tooltip       = markerInstance.marker.label;
                map.tooltipMarker = markerInstance.marker;
            }
        }

        if (allowAddMarker3DByN && Input.GetKeyUp(KeyCode.N))
        {
            OnlineMapsMarker3D marker = AddMarker3D(GetCoords(), default3DMarker != null? Instantiate(default3DMarker) as GameObject: null);
            marker.control = this;
            marker.scale   = marker3DScale;
        }
    }
    protected override void AfterUpdate()
    {
        base.AfterUpdate();

        Vector2 inputPosition = GetInputPosition();

        if (allowCameraControl)
        {
#if (!UNITY_ANDROID && !UNITY_IPHONE) || UNITY_EDITOR
            if (Input.GetMouseButton(1))
            {
                isCameraControl = true;
                if (lastInputPosition != inputPosition && lastInputPosition != Vector2.zero)
                {
                    Vector2 offset = lastInputPosition - inputPosition;
                    cameraRotation.x -= offset.y / 10f * cameraSpeed.x;
                    cameraRotation.y -= offset.x / 10f * cameraSpeed.y;
                }
                lastInputPosition = inputPosition;
            }
            else if (isCameraControl)
            {
                lastInputPosition = Vector2.zero;
                isCameraControl   = false;
            }
#else
            if (!allowZoom && allowCameraControl)
            {
                if (Input.touchCount == 2)
                {
                    Vector2 p1 = Input.GetTouch(0).position;
                    Vector2 p2 = Input.GetTouch(1).position;

                    Vector2 center = Vector2.Lerp(p1, p2, 0.5f);
                    if (lastGestureCenter == Vector2.zero)
                    {
                        lastGestureCenter = center;
                    }
                    else if (lastGestureCenter != center)
                    {
                        Vector2 offset = lastGestureCenter - center;
                        cameraRotation.x -= offset.y / 10f * cameraSpeed.x;
                        cameraRotation.y -= offset.x / 10f * cameraSpeed.y;
                        lastGestureCenter = center;
                    }

                    lastInputPosition = center;
                }
                else
                {
                    lastGestureCenter = Vector2.zero;
                }
            }
#endif

            UpdateCameraPosition();
        }

        if (api.showMarkerTooltip == OnlineMapsShowMarkerTooltip.onHover)
        {
            OnlineMapsMarkerInstanceBase markerInstance = GetBillboardMarkerFromScreen(inputPosition);
            if (markerInstance != null)
            {
                api.tooltip       = markerInstance.marker.label;
                api.tooltipMarker = markerInstance.marker;
            }
        }

        if (allowAddMarker3DByN && Input.GetKeyUp(KeyCode.N))
        {
            OnlineMapsMarker3D m = new OnlineMapsMarker3D
            {
                position = GetCoords(),
                scale    = marker3DScale,
                prefab   = default3DMarker != null?Instantiate(default3DMarker) as GameObject : null,
                control  = this
            };
            m.Init(transform);
            double tlx, tly, brx, bry;
            api.GetTopLeftPosition(out tlx, out tly);
            api.GetBottomRightPosition(out brx, out bry);
            m.Update(tlx, tly, brx, bry, api.zoom);

            if (markers3D == null)
            {
                markers3D = new OnlineMapsMarker3D[0];
            }
            Array.Resize(ref markers3D, markers3D.Length + 1);
            markers3D[markers3D.Length - 1] = m;
        }
    }