/// <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; }
/// <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; }