void Update()
        {
            //Camera Debugging
            //Vector3[] frustumCorners = new Vector3[4];
            //_cbtpOptions.camera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), _cbtpOptions.camera.transform.position.y, Camera.MonoOrStereoscopicEye.Mono, frustumCorners);

            //for (int i = 0; i < 4; i++)
            //{
            //	var worldSpaceCorner = _cbtpOptions.camera.transform.TransformVector(frustumCorners[i]);
            //	Debug.DrawRay(_cbtpOptions.camera.transform.position, worldSpaceCorner, Color.blue);
            //}

            if (!_shouldUpdate)
            {
                return;
            }

            _elapsedTime += Time.deltaTime;

            if (_elapsedTime >= _cbtpOptions.updateInterval)
            {
                _elapsedTime = 0f;

                //update viewport in case it was changed by switching zoom level
                Vector2dBounds _viewPortWebMercBounds = getcurrentViewPortWebMerc();

                var tilesToRequest = TileCover.GetWithWebMerc(_viewPortWebMercBounds, _map.AbsoluteZoom);

                var activeTiles = _activeTiles.Keys.ToList();
                List <UnwrappedTileId> toRemove = activeTiles.Except(tilesToRequest).ToList();
                foreach (var t2r in toRemove)
                {
                    RemoveTile(t2r);
                }
                var finalTilesNeeded = tilesToRequest.Except(activeTiles);

                foreach (var tile in activeTiles)
                {
                    // Reposition tiles in case we panned.
                    RepositionTile(tile);
                }

                foreach (var tile in finalTilesNeeded)
                {
                    AddTile(tile);
                }
            }
        }
示例#2
0
        void Update()
        {
            Vector2dBounds currentViewPortWebMercBnds = getcurrentViewPortWebMerc();
            bool           bboxChanged = !(_viewPortWebMercBounds.ToString() == currentViewPortWebMercBnds.ToString());
            float          cameraY     = _referenceCamera.transform.localPosition.y;

            //no zoom, no pan -> don't change tiles
            if (cameraY == _previousY && !bboxChanged)
            {
                return;
            }
            _previousY = cameraY;

            //camera moves within one zoom level, and no panning, don't do anything
            if (
                (cameraY > _cameraZoomingRangeMinY && cameraY < _cameraZoomingRangeMaxY) &&
                !bboxChanged
                )
            {
                //no changes, bail
                return;
            }

            _viewPortWebMercBounds = currentViewPortWebMercBnds;

            //panning
            //TODO: move active tiles on pan
            //HACK: just deactivate all active tiles
            //!!!BEWARE!!!: don't compare Vector2d via '==' use 'Equals()'
            if (!_previousWebMercCenter.Equals(_dynamicZoomMap.CenterMercator))
            {
                _previousWebMercCenter = _dynamicZoomMap.CenterMercator;
                var remove = _activeTiles.Keys.ToList();
                foreach (var r in remove)
                {
                    RemoveTile(r);
                }
            }

            Vector3 localPosition = _referenceCamera.transform.position;

            //close to ground, zoom in
            if (cameraY < _cameraZoomingRangeMinY)
            {
                //already at highest level, don't do anything -> camera free to move closer
                if (_dynamicZoomMap.Zoom == _dynamicZoomMap.MaxZoom)
                {
                    return;
                }
                _dynamicZoomMap.SetZoom(_dynamicZoomMap.Zoom + 1);
                //reposition camera at max distance
                localPosition.y = _cameraZoomingRangeMaxY;
                _referenceCamera.transform.localPosition = localPosition;
            }
            //arrived at max distance, zoom out
            else if (cameraY > _cameraZoomingRangeMaxY)
            {
                //already at lowest level, don't do anything -> camera free to move further away
                if (_dynamicZoomMap.Zoom == _dynamicZoomMap.MinZoom)
                {
                    return;
                }
                _dynamicZoomMap.SetZoom(_dynamicZoomMap.Zoom - 1);
                //reposition camera at min distance
                localPosition.y = _cameraZoomingRangeMinY;
                _referenceCamera.transform.localPosition = localPosition;
            }

            //update viewport in case it was changed by switching zoom level
            _viewPortWebMercBounds = getcurrentViewPortWebMerc();

            var tilesNeeded = TileCover.GetWithWebMerc(_viewPortWebMercBounds, _dynamicZoomMap.Zoom);

            var activeTiles = _activeTiles.Keys.ToList();
            List <UnwrappedTileId> toRemove = activeTiles.Except(tilesNeeded).ToList();

            foreach (var t2r in toRemove)
            {
                RemoveTile(t2r);
            }
            var finalTilesNeeded = tilesNeeded.Except(activeTiles);

            foreach (var tile in finalTilesNeeded)
            {
                AddTile(tile);
            }
        }