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