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