void Initialize() { // GetComponentInParent is really "get component in this or recursively upward" ParentTile = gameObject.transform.parent.gameObject.GetComponentInParent <Tile>(); if (vertices.Length > 0) { return; } name = CDBTile.Name; RasterDimension = (CDBTile.LOD < 0) ? CDBTile.LOD.RasterDimension : CDBTile.LOD.RasterDimension / 2; MeshDimension = RasterDimension + 1; if (CDBTile.LOD >= 0) { QuadSN = (GeographicBounds.MaximumCoordinates.Latitude < CDBTile.Bounds.MaximumCoordinates.Latitude) ? "S" : "N"; QuadWE = (GeographicBounds.MaximumCoordinates.Longitude < CDBTile.Bounds.MaximumCoordinates.Longitude) ? "W" : "E"; name += " (" + QuadSN + QuadWE + ")"; } Name = name; //Debug.LogFormat("[{0}] INITIALIZING", Name); IsInitialized = false; IsLoaded = false; IsApplied = false; CDB.LOD imageryLOD = CDBTile.LOD + 1; var imageryTiles = Database.DB.Tiles.Generate(GeographicBounds, imageryLOD); // we should only be getting a single imagery tile foreach (var imageryTile in imageryTiles) { bool exists = Database.DB.Imagery.YearlyVstiRepresentation.Exists(imageryTile) || Database.DB.Imagery.YearlyVstiRepresentation.AlternateExists(imageryTile); if (Database.DB.Imagery.YearlyVstiRepresentation.Exists(imageryTile)) { MaterialName = Database.DB.Imagery.YearlyVstiRepresentation.Filename(imageryTile); MaterialEntry = Database.TerrainMaterialManager.Entry(MaterialName); } else { // don't try to load imagery if our parent is using the grandparent imagery if ((ParentTile == null) || ParentTile.ParentImagery) { continue; } if (Database.TileDataCache.OnlineImageryServer != null) { DownloadJob = new Unity.WMSDownloadJob(); DownloadJob.OnlineImageryServer = Database.TileDataCache.OnlineImageryServer; DownloadJob.OnlineImageryLayer = Database.TileDataCache.OnlineImageryLayer; DownloadJob.Width = imageryTile.RasterDimension; DownloadJob.Height = imageryTile.RasterDimension; DownloadJob.South = imageryTile.Bounds.MinimumCoordinates.Latitude; DownloadJob.North = imageryTile.Bounds.MaximumCoordinates.Latitude; DownloadJob.West = imageryTile.Bounds.MinimumCoordinates.Longitude; DownloadJob.East = imageryTile.Bounds.MaximumCoordinates.Longitude; DownloadJob.Filename = Database.DB.Imagery.YearlyVstiRepresentation.AlternateFilename(imageryTile); DownloadJob.Schedule(); } else { MaterialName = ParentTile.MaterialName; MaterialEntry = Database.TerrainMaterialManager.Entry(MaterialName); ParentImagery = true; } } } Task.Run(() => { TaskInitialize(); }); }
IEnumerator UpdateCoroutine() { if (!IsLoaded) { if (DownloadJob != null) { if (!DownloadJob.IsCompleted) { yield break; } DownloadJob.Complete(); if (System.IO.File.Exists(DownloadJob.Filename)) { MaterialName = DownloadJob.Filename; MaterialEntry = Database.TerrainMaterialManager.Entry(MaterialName); } else { if (ParentTile != null) { MaterialName = ParentTile.MaterialName; MaterialEntry = Database.TerrainMaterialManager.Entry(MaterialName); ParentImagery = true; } } } IsLoading = true; Task.Run(() => { TaskLoad(); }); yield break; } yield return(null); var childrenApplied = false; if (children.Count > 0) { childrenApplied = true; bool fake = true; foreach (var child in children) { if (!child.ParentElevation || !child.ParentImagery) { fake = false; } if (!child.IsApplied || !child.HasElevation || !child.HasImagery) { childrenApplied = false; child.meshRenderer.enabled = false; } } if (fake) { childrenApplied = false; } } yield return(null); if (childrenApplied && IsActive) { //Debug.LogFormat("[{0}] DEACTIVATING", Name); DestroyTerrain(this); IsActive = false; children.ForEach(child => child.meshRenderer.enabled = true); children.ForEach(child => child.IsActive = true); Database.UpdateTerrain(GeographicBounds); yield break; } yield return(null); if (!IsApplied) { if (Database.TileAppliedTerrain) { yield break; } Database.TileAppliedTerrain = true; HasImagery = (MaterialEntry != null) && MaterialEntry.Loaded && (MaterialEntry.Material != null); if (!HasImagery) { yield break; } IsApplying = true; Database.UpdateTerrain(GeographicBounds); StartCoroutine(ApplyTerrain()); float repeatRate = (CDBTile.LOD < 1) ? 1f : CDBTile.LOD; InvokeRepeating("UpdateDistance", 0f, repeatRate); } }
void Update() { if (!IsInitialized) { return; } if (IsLoading) { return; } if (IsApplying) { return; } if (!IsLoaded) { if (DownloadJob != null) { if (!DownloadJob.IsCompleted) { return; } DownloadJob.Complete(); if (System.IO.File.Exists(DownloadJob.Filename)) { MaterialName = DownloadJob.Filename; MaterialEntry = Database.MaterialManager.Entry(MaterialName); } else { if (ParentTile != null) { MaterialName = ParentTile.MaterialName; MaterialEntry = Database.MaterialManager.Entry(MaterialName); ParentImagery = true; } } } IsLoading = true; Task.Run(() => { TaskLoad(); }); return; } var childrenApplied = false; if (children.Count > 0) { childrenApplied = true; bool fake = true; foreach (var child in children) { if (!child.ParentElevation || !child.ParentImagery) { fake = false; } if (!child.IsApplied || !child.HasElevation || !child.HasImagery) { childrenApplied = false; child.meshRenderer.enabled = false; } } if (fake) { childrenApplied = false; } } if (childrenApplied && IsActive) { //Debug.LogFormat("[{0}] DEACTIVATING", Name); DestroyTerrain(this); IsActive = false; children.ForEach(child => child.meshRenderer.enabled = true); children.ForEach(child => child.IsActive = true); Database.UpdateTerrain(GeographicBounds); return; } if (!IsApplied) { if (Database.TileAppliedTerrain) { return; } Database.TileAppliedTerrain = true; Database.UpdateTerrain(GeographicBounds); StartCoroutine(ApplyTerrain()); float repeatRate = (CDBTile.LOD < 1) ? 1f : CDBTile.LOD; InvokeRepeating("UpdateDistance", 1f, repeatRate); return; } /* * if (CheckForGrandchildren()) * return; * * if (IsDistanceTested) * { * var lodSwitch = Database.LODSwitchByObject[Database]; * var divideDistance = lodSwitch.EntryDistanceForLOD(CDBTile.LOD - Database.PerformanceOffsetLOD); * var consolidateDistance = lodSwitch.ExitDistanceForLOD(CDBTile.LOD - Database.PerformanceOffsetLOD); * if (children.Count > 0) * { * if (!CheckForGrandchildren()) * { * if (cameraDistance > consolidateDistance) * Consolidate(); * } * } * else * { * bool divide = true; * if (!meshRenderer.enabled) * divide = false; * if (cameraDistance > divideDistance) * divide = false; * if (Database.SystemMemoryLimitExceeded) * divide = false; * if (!HasImagery) * divide = false; * if (!HasElevation) * divide = false; * if (ParentImagery) * divide = false; * if(divide) * Divide(); * } * IsDistanceTested = false; * } * * if (IsDistanceTesting) * return; * float dt = CDBTile.LOD; * if (dt < 1f) * dt = 1f; * if (Time.time - lastDistanceTest < dt) * return; * lastDistanceTest = Time.time; * IsDistanceTesting = true; * IsDistanceTested = false; * * Task.Run(() => { TaskDistanceTest(); }); */ }