public override double GetSurfacePointAltitude(double lat, double lng, bool meters)
        {
            if (level < lastDeepestLevel)
            {
                //interate children
                foreach (long childKey in childrenId)
                {
                    Tile child = TileCache.GetCachedTile(childKey);
                    if (child != null)
                    {
                        if (child.IsPointInTile(lat, lng))
                        {
                            double retVal = child.GetSurfacePointAltitude(lat, lng, meters);
                            if (retVal != 0)
                            {
                                return(retVal);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }
            }

            double alt = GetAltitudeAtLatLng(lat, lng, meters ? 1 : DemScaleFactor);

            return(alt);
        }
Пример #2
0
 public static void ShowHistogram(IImageSet imageset, bool toggle, Point pnt)
 {
     if (imageset.WcsImage is FitsImage)
     {
         if (singleton == null)
         {
             singleton       = new Histogram();
             singleton.Owner = Earth3d.MainWindow;
         }
         else
         {
             if (toggle)
             {
                 HideHistogram();
                 return;
             }
             else
             {
                 singleton.Hide();
             }
         }
         singleton.Top  = pnt.Y - singleton.Height;
         singleton.Left = pnt.X;
         singleton.Show();
         singleton.Top   = pnt.Y - singleton.Height;
         singleton.Left  = pnt.X;
         singleton.Image = (FitsImage)imageset.WcsImage;
         singleton.Tile  = (SkyImageTile)TileCache.GetTile(0, 0, 0, imageset, null);
     }
 }
Пример #3
0
        public bool KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
            case Keys.C:
                //center
                if (Earth3d.MainWindow.StudyImageset == null)
                {
                    return(false);
                }
                Tile root = TileCache.GetTile(0, 0, 0, Earth3d.MainWindow.StudyImageset, null);
                if (root != null)
                {
                    root.CleanUpGeometryRecursive();
                }
                Earth3d.MainWindow.StudyImageset.CenterX = Earth3d.MainWindow.RA * 15;
                Earth3d.MainWindow.StudyImageset.CenterY = Earth3d.MainWindow.Dec;
                return(true);

            case Keys.S:
                //scale to view
                return(true);
            }

            return(false);
        }
Пример #4
0
        public override bool Draw3D(RenderContext11 renderContext, float transparancy, Tile parent)
        {
            RenderedGeneration = CurrentRenderGeneration;
            TilesTouched++;

            InViewFrustum = true;

            if (!ReadyToRender)
            {
                TileCache.AddTileToQueue(this);

                return(false);
            }

            TilesInView++;

            if (!CreateGeometry(renderContext, true))
            {
                return(false);
            }

            renderContext.SetVertexBuffer(vertexBuffer);

            renderContext.MainTexture = texture;

            renderContext.SetIndexBuffer(indexBuffer[0]);

            int partCount = this.TriangleCount;

            TrianglesRendered += partCount;

            renderContext.devContext.DrawIndexed(indexBuffer[0].Count, 0, 0);

            return(true);
        }
Пример #5
0
 private static void CleanUpImageSets()
 {
     if (Earth3d.MainWindow != null && Earth3d.MainWindow.videoOverlay != null)
     {
         Tile tile = TileCache.GetTile(0, 0, 0, Earth3d.MainWindow.videoOverlay, null);
         tile.CleanUp(false);
         Earth3d.MainWindow.videoOverlay = null;
     }
 }
Пример #6
0
        public override double GetSurfacePointAltitudeNow(double lat, double lng, bool meters, int targetLevel)
        {
            if (level < targetLevel)
            {
                int yOffset = 0;
                if (dataset.Mercator || dataset.BottomsUp)
                {
                    yOffset = 1;
                }
                int xOffset = 0;

                int xMax       = 2;
                int childIndex = 0;
                for (int y1 = 0; y1 < 2; y1++)
                {
                    for (int x1 = 0; x1 < xMax; x1++)
                    {
                        //  if (level < (demEnabled ? 12 : dataset.Levels))
                        if (level < dataset.Levels && level < (targetLevel + 1))
                        {
                            Tile child = TileCache.GetCachedTile(childrenId[childIndex]);
                            if (child == null || !child.ReadyToRender)
                            {
                                countCreatedForNow++;
                                child = TileCache.GetTileNow(level + 1, x * 2 + ((x1 + xOffset) % 2), y * 2 + ((y1 + yOffset) % 2), dataset, this);
                                childrenId[childIndex] = child.Key;
                            }
                            childIndex++;
                            if (child != null)
                            {
                                if (child.IsPointInTile(lat, lng))
                                {
                                    double retVal = child.GetSurfacePointAltitudeNow(lat, lng, meters, targetLevel);
                                    if (retVal != 0)
                                    {
                                        return(retVal);
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(GetAltitudeFromLatLng(lat, lng, meters));
        }
Пример #7
0
        public static Tile GetTileNow(int level, int x, int y, IImageSet dataset, Tile parent)
        {
            if (level < dataset.BaseLevel)
            {
                return(null);
            }

            Tile retTile = null;
            long tileKey = ImageSetHelper.GetTileKey(dataset, level, x, y);

            try
            {
                if (!tiles.ContainsKey(tileKey))
                {
                    retTile = ImageSetHelper.GetNewTile(dataset, level, x, y, parent);
                    tileMutex.WaitOne();
                    tiles.Add(tileKey, retTile);
                    tileMutex.ReleaseMutex();
                }
                else
                {
                    retTile = tiles[tileKey];
                }
            }
            catch
            {
                if (Earth3d.Logging)
                {
                    Earth3d.WriteLogMessage("GetTile: Exception");
                }
            }
            finally
            {
                //todoperf get rid of this write for GC
                retTile.AccessCount = AccessID++;
            }

            // Create if not ready to render

            if (!retTile.ReadyToRender)
            {
                TileCache.GetTileFromWeb(retTile, false);
                retTile.CreateGeometry(Earth3d.MainWindow.RenderContext11, false);
            }


            return(retTile);
        }
        public override double GetSurfacePointAltitudeNow(double lat, double lng, bool meters, int targetLevel)
        {
            if (level < targetLevel)
            {
                int yOffset = 0;
                if (dataset.Mercator || dataset.BottomsUp)
                {
                    yOffset = 1;
                }
                int xOffset = 0;

                int xMax       = 2;
                int childIndex = 0;
                for (int y1 = 0; y1 < 2; y1++)
                {
                    for (int x1 = 0; x1 < xMax; x1++)
                    {
                        //  if (level < (demEnabled ? 12 : dataset.Levels))
                        if (level < dataset.Levels && level < (targetLevel + 1))
                        {
                            Tile child = TileCache.GetTileNow(level + 1, x * 2 + ((x1 + xOffset) % 2), y * 2 + ((y1 + yOffset) % 2), dataset, this);
                            childrenId[childIndex++] = child.Key;
                            if (child != null)
                            {
                                if (child.IsPointInTile(lat, lng))
                                {
                                    double retVal = child.GetSurfacePointAltitudeNow(lat, lng, meters, targetLevel);
                                    if (retVal != 0)
                                    {
                                        return(retVal);
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            double alt = GetAltitudeAtLatLng(lat, lng, meters ? 1 : DemScaleFactor);

            return(alt);
        }
Пример #9
0
        private void HistogramView_MouseMove(object sender, MouseEventArgs e)
        {
            switch (dragType)
            {
            case DragType.Low:
                lowPosition = Math.Min(255, Math.Max(0, e.X));
                break;

            case DragType.High:
                highPosition = Math.Min(255, Math.Max(0, e.X));
                break;

            case DragType.Range:
                lowPosition  = downPosition;
                highPosition = Math.Min(255, Math.Max(0, e.X));
                break;

            case DragType.Center:
                int hWidth   = Math.Abs(highPosition - lowPosition) / 2;
                int adCenter = Math.Min(255 - hWidth, Math.Max(hWidth, e.X));
                int moved    = center - adCenter;
                lowPosition  -= moved;
                highPosition -= moved;
                break;

            case DragType.None:
                return;

            default:
                break;
            }
            center = (lowPosition + highPosition) / 2;
            HistogramView.Refresh();
            double factor = (image.MaxVal - image.MinVal) / 256.0;
            double low    = image.MinVal + (lowPosition * factor);
            double hi     = image.MinVal + (highPosition * factor);

            this.Tile           = (SkyImageTile)TileCache.GetTile(Tile.Level, Tile.X, Tile.Y, Tile.Dataset, null);
            updateTimer.Enabled = false;
            updateTimer.Enabled = true;
            image.lastMax       = highPosition;
            image.lastMin       = lowPosition;
        }
Пример #10
0
        public override bool Draw3D(RenderContext11 renderContext, float transparancy, Tile parent)
        {
            InViewFrustum = true;

            transparancy = transparancy / 100;
            if (transparancy > 1f)
            {
                transparancy = 1.0f;
            }

            if (transparancy < 0f)
            {
                transparancy = 0;
            }


            if (!ReadyToRender)
            {
                TileCache.AddTileToQueue(this);
                if (texture == null)
                {
                    return(false);
                }
            }

            if (!CreateGeometry(renderContext, true))
            {
                return(false);
            }


            renderContext.MainTexture = texture;

            renderContext.SetVertexBuffer(vertexBuffer);
            renderContext.SetIndexBuffer(indexBuffer);
            renderContext.PreDraw();
            renderContext.devContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.TriangleList;
            renderContext.devContext.DrawIndexed(6, 0, 0);


            return(true);
        }
Пример #11
0
        private static void CaptureThreadFunction()
        {
            int frameNumber = 0;

            while (Earth3d.MainWindow != null)
            {
                Thread.Sleep(msPerFrame);
                if (capturing && Earth3d.MainWindow != null)
                {
                    frameNumber++;
                    Graphics g = Graphics.FromImage(bmp);

                    g.CopyFromScreen(0, 0, 0, 0, new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height));
                    g.Dispose();

                    MemoryStream ms = new MemoryStream();

                    bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

                    ScreenImage = ms.ToArray();
                    ms.Dispose();
                    ms = null;
                    string url = string.Format(String.Format("http://{0}:5050/images/{1}/screenshot.png",
                                                             MyWebServer.IpAddress.ToString(),
                                                             frameNumber.ToString()));



                    NetControl.SendCommand(String.Format("SCREEN,{4},{0},{1},{2},http://{3}:5050/images/{5}/screenshot.png",
                                                         Properties.Settings.Default.ScreenOverlayAlt,
                                                         Properties.Settings.Default.ScreenOverlayAz,
                                                         Properties.Settings.Default.ScreenOverlayScale,
                                                         MyWebServer.IpAddress.ToString(),
                                                         Earth3d.MainWindow.Config.ClusterID.ToString(), frameNumber.ToString()));


                    if (Properties.Settings.Default.ScreenOverlayShowLocal)
                    {
                        if (Earth3d.MainWindow.videoOverlay == null)
                        {
                            Earth3d.MainWindow.videoOverlay = new ImageSetHelper("video", url, ImageSetType.Sky,
                                                                                 BandPass.Visible, ProjectionType.SkyImage,
                                                                                 Math.Abs(url.GetHashCode32()), 0, 0, 256, Properties.Settings.Default.ScreenOverlayScale / 1000,
                                                                                 ".tif", false, "", Properties.Settings.Default.ScreenOverlayAz, Properties.Settings.Default.ScreenOverlayAlt, 0, false, "", false, false, 2,
                                                                                 960, 600, "", "", "", "", 0, "");
                        }

                        Earth3d.MainWindow.videoOverlay.CenterX         = Properties.Settings.Default.ScreenOverlayAz;
                        Earth3d.MainWindow.videoOverlay.CenterY         = Properties.Settings.Default.ScreenOverlayAlt;
                        Earth3d.MainWindow.videoOverlay.BaseTileDegrees = Properties.Settings.Default.ScreenOverlayScale / 1000;
                        Tile tile = TileCache.GetTile(0, 0, 0, Earth3d.MainWindow.videoOverlay, null);
                        if (Dirty)
                        {
                            tile.CleanUpGeometryOnly();
                            Dirty = false;
                        }

                        tile.ReadyToRender = false;
                        tile.TextureReady  = false;
                        tile.Volitile      = true;
                    }
                    else if (Earth3d.MainWindow.videoOverlay != null)
                    {
                        CleanUpImageSets();
                    }
                }
                else
                {
                    CleanUpImageSets();
                }
            }
        }
Пример #12
0
        public bool MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (Earth3d.MainWindow.StudyImageset == null)
            {
                mouseDown = false;
                return(false);
            }
            Tile root = TileCache.GetTile(0, 0, 0, Earth3d.MainWindow.StudyImageset, null);

            if (root == null)
            {
                mouseDown = false;
                return(false);
            }
            if (e.Button == MouseButtons.Right && (root is SkyImageTile))
            {
                anchored = !anchored;
                popup.SetPivotMode(anchored);
                if (anchored)
                {
                    anchoredPoint1 = Earth3d.MainWindow.GetCoordinatesForScreenPoint(e.X, e.Y);
                    TourPlace place = new TourPlace("", anchoredPoint1.Dec, anchoredPoint1.RA, Classification.Unidentified, "UMA", ImageSetType.Sky, -1);
                    Earth3d.MainWindow.SetLabelText(place, false);
                    if (root is TangentTile)
                    {
                        TangentTile tile   = (TangentTile)root;
                        Vector3d    vector = tile.TransformPoint(12, 12);
                        vector = Coordinates.GeoTo3dDouble(anchoredPoint1.Lat, anchoredPoint1.Lng);
                        double x;
                        double y;
                        tile.UnTransformPoint(vector, out x, out y);
                    }
                    else if (root is SkyImageTile)
                    {
                        SkyImageTile tile = (SkyImageTile)root;
                        anchorPoint1 = tile.GetImagePixel(anchoredPoint1);
                    }
                }
                mouseDown = true;
                return(true);
            }
            else if (e.Button == MouseButtons.Left)
            {
                dragging = true;
                pntDown  = e.Location;
                if (anchored)
                {
                    if (root is TangentTile)
                    {
                        startRotation = Earth3d.MainWindow.StudyImageset.Rotation;
                        startCenterX  = Earth3d.MainWindow.StudyImageset.OffsetX;
                        startCenterY  = Earth3d.MainWindow.StudyImageset.OffsetY;
                        startScale    = Earth3d.MainWindow.StudyImageset.BaseTileDegrees;
                        Coordinates downPoint = Earth3d.MainWindow.GetCoordinatesForScreenPoint(e.X, e.Y);
                        startLength = anchoredPoint1.Distance(downPoint);
                        startAngle  = anchoredPoint1.Angle(downPoint) / RC;
                    }
                    else if (root is SkyImageTile)
                    {
                        SkyImageTile tile = (SkyImageTile)root;
                        anchoredPoint2 = Earth3d.MainWindow.GetCoordinatesForScreenPoint(e.X, e.Y);
                        anchorPoint2   = tile.GetImagePixel(anchoredPoint2);
                    }
                }
                mouseDown = true;
                return(true);
            }
            else
            {
                mouseDown = false;
                return(false);
            }
        }
Пример #13
0
        public static void QueueThread()
        {
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US", false);
            bool fileOnly = fileOnlyThreadID == Thread.CurrentThread.ManagedThreadId;

            while (running)
            {
                if (queue.Count < 1)
                {
                    System.Threading.Thread.Sleep(50);
                }
                else
                {
                    System.Threading.Thread.Sleep(1);
                }

                double minDistance = 1000000000000000000;
                bool   overlayTile = false;
                long   maxKey      = 0;
                int    level       = 1000;

                queueMutex.WaitOne();
                foreach (Tile t in queue.Values)
                {
                    if (!t.RequestPending)  // && t.InViewFrustum)
                    {
                        Vector3d vectTemp = new Vector3d(t.SphereCenter);

                        vectTemp.TransformCoordinate(Earth3d.WorldMatrix);

                        if (Earth3d.MainWindow.Space)
                        {
                            vectTemp.Subtract(new Vector3d(0.0f, 0.0f, -1.0f));
                        }
                        else
                        {
                            vectTemp.Subtract(Earth3d.MainWindow.RenderContext11.CameraPosition);
                        }

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

                        bool thisIsOverlay = (t.Dataset.Projection == ProjectionType.Tangent) || (t.Dataset.Projection == ProjectionType.SkyImage);
                        if (distTemp < minDistance && (!overlayTile || thisIsOverlay))
                        {
                            Tile test = (Tile)queue[t.Key];



                            if (!test.FileChecked)
                            {
                                test.FileExists  = File.Exists(test.FileName);
                                test.FileChecked = true;
                                if (test.Volitile)
                                {
                                    test.FileExists = false;
                                }
                            }

                            if (test.FileExists || (!test.FileExists && !fileOnly))
                            {
                                minDistance = distTemp;
                                maxKey      = t.Key;
                                level       = t.Level;
                                overlayTile = thisIsOverlay;
                            }
                        }
                    }
                }
                if (maxKey != 0)
                {
                    Tile workTile = (Tile)queue[maxKey];
                    workTile.RequestPending = true;
                    TileCache.RequestCount++;
                    queueMutex.ReleaseMutex();
                    TileCache.GetTileFromWeb(workTile, true);
                    queueMutex.WaitOne();
                    TileCache.RequestCount--;
                    workTile.RequestPending = false;
                    queue.Remove(workTile.Key);
                }

                queueMutex.ReleaseMutex();
            }
            return;
        }
Пример #14
0
 private void ClearCache_Click(object sender, EventArgs e)
 {
     TileCache.ClearCache();
 }
Пример #15
0
 private void PurgeQueue_Click(object sender, EventArgs e)
 {
     TileCache.PurgeQueue();
 }
Пример #16
0
 private void timer1_Tick(object sender, System.EventArgs e)
 {
     object[] tiles = TileCache.GetQueueList();
     this.listBox.Items.Clear();
     this.listBox.Items.AddRange(tiles);
 }
Пример #17
0
        public override bool Draw3D(RenderContext11 renderContext, float opacity, Tile parent)
        {
            InViewFrustum      = true;
            RenderedGeneration = CurrentRenderGeneration;
            if (!ReadyToRender)
            {
                TileCache.AddTileToQueue(this);
                return(false);
            }

            InViewFrustum = true;

            if (starVertexBuffer == null)
            {
                starProfile = Texture11.FromBitmap(Properties.Resources.StarProfile);

                int count = stars.Count;
                int index = 0;
                starCount = count;

                starVertexBuffer = new PositionColorSizeVertexBuffer11(count, RenderContext11.PrepDevice);

                PositionColorSize[] points = (PositionColorSize[])starVertexBuffer.Lock(0, 0); // Lock the buffer (which will return our structs)
                foreach (Star star in stars)
                {
                    Vector3d pos = Coordinates.RADecTo3d(star.RA + 12, star.Dec, 1f);
                    points[index].Position = pos.Vector3;
                    points[index].Color    = star.Col;
                    double radDec = (.5) / Math.Pow(1.6, star.Magnitude);
                    points[index].size = (float)radDec;
                    index++;
                }
                starVertexBuffer.Unlock();
            }

            renderContext.SetVertexBuffer(starVertexBuffer);
            renderContext.BlendMode        = BlendMode.Additive;
            renderContext.DepthStencilMode = DepthStencilMode.Off;
            renderContext.setRasterizerState(TriangleCullMode.Off);
            SharpDX.Matrix mvp = (renderContext.World * renderContext.View * renderContext.Projection).Matrix11;
            mvp.Transpose();
            PointSpriteShader11.WVPMatrix = mvp;
            PointSpriteShader11.Color     = SharpDX.Color.White;

            float adjustedScale = (float)(1 / (Earth3d.MainWindow.ZoomFactor / 360));

            PointSpriteShader11.ViewportScale     = new SharpDX.Vector2((2.0f / renderContext.ViewPort.Width) * adjustedScale, (2.0f / renderContext.ViewPort.Height) * adjustedScale);
            PointSpriteShader11.PointScaleFactors = new SharpDX.Vector3(0.0f, 0.0f, 10000.0f);
            PointSpriteShader11.Use(renderContext.Device.ImmediateContext);

            renderContext.Device.ImmediateContext.PixelShader.SetShaderResource(0, starProfile.ResourceView);


            renderContext.devContext.InputAssembler.PrimitiveTopology = SharpDX.Direct3D.PrimitiveTopology.PointList;
            renderContext.devContext.Draw(starCount, 0);

            renderContext.Device.ImmediateContext.GeometryShader.Set(null);

            // Reset blend mode so we don't mess up subsequent sky layer rendering
            renderContext.BlendMode = BlendMode.Alpha;

            return(true);
        }
Пример #18
0
        public bool MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (Earth3d.MainWindow.StudyImageset == null)
            {
                return(false);
            }
            if (dragging)
            {
                Tile root = TileCache.GetTile(0, 0, 0, Earth3d.MainWindow.StudyImageset, null);
                root.CleanUpGeometryRecursive();

                bool twoRoots = false;

                if (Earth3d.MainWindow.StudyImageset.Projection == ProjectionType.Tangent && Earth3d.MainWindow.StudyImageset.WidthFactor == 1)
                {
                    twoRoots = true;
                }

                if (anchored)
                {
                    if (root is SkyImageTile)
                    {
                        SkyImageTile tile   = (SkyImageTile)root;
                        Coordinates  point2 = Earth3d.MainWindow.GetCoordinatesForScreenPoint(e.X, e.Y);


                        WcsFitter fitter = new WcsFitter(tile.Width, tile.Height);
                        fitter.AddPoint(anchoredPoint1, anchorPoint1);
                        fitter.AddPoint(point2, anchorPoint2);
                        fitter.Solve();
                        Earth3d.MainWindow.StudyImageset.BaseTileDegrees = fitter.Solution.Scale;
                        Earth3d.MainWindow.StudyImageset.Rotation        = (fitter.Solution.Rotation);
                        Earth3d.MainWindow.StudyImageset.CenterX         = (fitter.Solution.CenterX * 15);
                        Earth3d.MainWindow.StudyImageset.CenterY         = fitter.Solution.CenterY;
                        Earth3d.MainWindow.StudyImageset.OffsetX         = fitter.Solution.OffsetX;
                        Earth3d.MainWindow.StudyImageset.OffsetY         = fitter.Solution.OfsetY;
                    }
                    else
                    {
                        Coordinates downPoint = Earth3d.MainWindow.GetCoordinatesForScreenPoint(e.X, e.Y);
                        double      len       = anchoredPoint1.Distance(downPoint);
                        double      angle     = anchoredPoint1.Angle(downPoint) / RC;
                        Earth3d.MainWindow.Text = String.Format("Angle = {0}", angle);
                        Earth3d.MainWindow.StudyImageset.BaseTileDegrees = startScale * (len / startLength);
                        Earth3d.MainWindow.StudyImageset.Rotation        = startRotation - (angle - startAngle);
                    }
                }
                else
                {
                    double factor = 1.0;
                    if ((Control.ModifierKeys & Keys.Alt) == Keys.Alt)
                    {
                        factor = .01;
                    }

                    if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
                    {
                        double rotation = (pntDown.X - e.Location.X) / 50.0;
                        rotation *= factor;
                        Earth3d.MainWindow.StudyImageset.Rotation += rotation;
                        Earth3d.MainWindow.StudyImageset.Rotation  = Earth3d.MainWindow.StudyImageset.Rotation % 360;
                    }
                    else if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
                    {
                        double scale = 1.0 + (((pntDown.X - e.Location.X) / 500.0) * factor);
                        Earth3d.MainWindow.StudyImageset.BaseTileDegrees *= scale;
                        if (Earth3d.MainWindow.StudyImageset.BaseTileDegrees > 180)
                        {
                            Earth3d.MainWindow.StudyImageset.BaseTileDegrees = 180;
                        }
                    }
                    else
                    {
                        double moveX = (pntDown.X - e.Location.X) * Earth3d.MainWindow.GetPixelScaleX(true);
                        double moveY = (pntDown.Y - e.Location.Y) * Earth3d.MainWindow.GetPixelScaleY();
                        Earth3d.MainWindow.StudyImageset.CenterX += moveX;
                        Earth3d.MainWindow.StudyImageset.CenterY += moveY;
                    }
                    pntDown = e.Location;
                }

                if (twoRoots)
                {
                    Tile root2 = TileCache.GetTile(0, 1, 0, Earth3d.MainWindow.StudyImageset, null);
                    root2.CleanUpGeometryRecursive();
                }
            }
            return(false);
        }