Ejemplo n.º 1
0
        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(); });
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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(); });
             */
        }