Esempio n. 1
0
 /// <summary>
 /// Constructor.
 /// </summary>
 public WaitForMapLoaded(MapRendererBase mapRendererBase, float maxWaitDurationInSeconds = 30.0f)
 {
     _mapRendererBase          = mapRendererBase;
     _maxWaitDurationInSeconds = Mathf.Max(0.0f, maxWaitDurationInSeconds);
     _startingFrame            = Time.frameCount;
     _startingTime             = Time.time;
 }
Esempio n. 2
0
        /// <inheritdoc/>
        public void Initialize(
            MapRendererBase mapRenderer,
            MapScene mapScene,
            float animationTimeScale,
            MapSceneAnimationKind mapSceneAnimationKind)
        {
            if (mapRenderer == null)
            {
                throw new ArgumentNullException(nameof(mapRenderer));
            }

            if (mapScene == null)
            {
                throw new ArgumentNullException(nameof(mapScene));
            }

            _runningTime = 0;

            _startMercatorCenter = mapRenderer.Center.ToMercatorCoordinate();
            _startZoomLevel      = mapRenderer.ZoomLevel;
            mapScene.GetLocationAndZoomLevel(out var endLocation, out _endZoomLevel);
            _endZoomLevel          = _endZoomLevel < mapRenderer.MinimumZoomLevel ? mapRenderer.MinimumZoomLevel : _endZoomLevel;
            _endZoomLevel          = _endZoomLevel > mapRenderer.MaximumZoomLevel ? mapRenderer.MaximumZoomLevel : _endZoomLevel;
            _endMercatorCenter     = endLocation.ToMercatorCoordinate();
            _startHeightInMercator = ZoomLevelToMercatorAltitude(_startZoomLevel);
            _endHeightInMercator   = ZoomLevelToMercatorAltitude(_endZoomLevel);

            // Determine if we should use a bow animation or a linear animation.
            // Simple rule for now: If the destination is already visible, use linear; otherwise, bow.
            _isLinearAnimation =
                mapSceneAnimationKind == MapSceneAnimationKind.Linear ||
                mapSceneAnimationKind == MapSceneAnimationKind.SmoothLinear ||
                mapRenderer.Bounds.Intersects(endLocation);
            _isSmoothed = mapSceneAnimationKind == MapSceneAnimationKind.SmoothLinear;

            // While linear animation doesn't follow the same code path as the bow animation, we can still use this function to compute
            // a reasonable duration for the linear animation.
            ComputeBowAnimationInitialValues(
                P,
                V * animationTimeScale,
                out _u0,
                out _u1,
                out _w0,
                out _, // w1
                out _r0,
                out _, // r1
                out _S,
                out _animationTime);

            // Tweaking the resulting animation time to speed up slower animations and slow down the shorter animation.
            _animationTime /= 6.0;                                 // Normalize.
            _animationTime  = Math.Pow(_animationTime, 1.0 / 3.0); // Rescale.
            _animationTime *= 6.0;                                 // Convert back to original range.
        }
        /// <inheritdoc/>
        public override void GetLocationAndZoomLevel(MapRendererBase mapRenderer, out LatLon location, out double zoomLevel)
        {
            if (mapRenderer == null)
            {
                throw new ArgumentNullException(nameof(mapRenderer));
            }

            location = BoundingBox.Center;
            var localMapDimension      = mapRenderer.LocalMapDimension;
            var targetMercatorBounds   = BoundingBox.ToMercatorBoundingBox();
            var zoomLevelForXDimension = Math.Log(localMapDimension.x / targetMercatorBounds.Width, 2);
            var zoomLevelForYDimension = Math.Log(localMapDimension.y / targetMercatorBounds.Height, 2);

            zoomLevel = (float)Math.Min(zoomLevelForXDimension, zoomLevelForYDimension) + 1;
            zoomLevel = Math.Min(Math.Max(zoomLevel, MapConstants.MinimumZoomLevel), MapConstants.MaximumZoomLevel);
        }
 /// <inheritdoc/>
 public override void GetLocationAndZoomLevel(MapRendererBase mapRenderer, out LatLon location, out double zoomLevel)
 {
     location  = Location;
     zoomLevel = ZoomLevel;
 }