Example #1
0
        public static void ProcessQueue(RenderContext renderContext)
        {
            while (queue.Count > 0 && openThreads > 0)
            {
                double minDistance = 100000.0f;
                bool   overlayTile = false;
                string maxKey      = null;
                int    level       = 1000;

                foreach (String key in queue.Keys)
                {
                    Tile t = queue[key];
                    if (!t.RequestPending && t.InViewFrustum)
                    {
                        Vector3d vectTemp = Vector3d.MakeCopy(t.SphereCenter);

                        vectTemp.TransformByMatrics(renderContext.World);

                        if (renderContext.Space)
                        {
                            vectTemp.Subtract(Vector3d.Create(0.0f, 0.0f, -1.0f));
                        }
                        else
                        {
                            vectTemp.Subtract(renderContext.CameraPosition);
                        }

                        double distTemp = Math.Max(0, vectTemp.Length() - t.SphereRadius);



                        //if (t.Level < (level-1) || (distTemp < minDistance && t.Level == level))
                        bool thisIsOverlay = (t.Dataset.Projection == ProjectionType.Tangent) || (t.Dataset.Projection == ProjectionType.SkyImage);
                        if (distTemp < minDistance && (!overlayTile || thisIsOverlay))
                        {
                            minDistance = distTemp;
                            maxKey      = t.Key;
                            level       = t.Level;
                            overlayTile = thisIsOverlay;
                        }
                    }
                }
                if (maxKey != null)
                {
                    Tile workTile = (Tile)queue[maxKey];
                    workTile.RequestPending = true;
                    openThreads--;
                    if (openThreads < 0)
                    {
                        openThreads = 0;
                    }
                    workTile.RequestImage();
                    if (workTile.Dataset.ElevationModel) // && workTile.Dataset.Projection == ProjectionType.Toast)
                    {
                        workTile.RequestDem();
                    }
                }
                else
                {
                    return;
                }
            }
        }