Beispiel #1
0
        private static ImageSetLayer AddFitsLayer(string url, string name, bool gotoTarget, ImagesetLoaded loaded)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                name = LayerManager.GetNextFitsName();
            }

            ImageSetLayer imagesetLayer = new ImageSetLayer();
            Imageset      imageset      = new Imageset();

            WcsLoaded wcsLoaded = delegate(WcsImage wcsImage)
            {
                if (((FitsImage)wcsImage).errored)
                {
                    return;
                }

                int width  = (int)wcsImage.SizeX;
                int height = (int)wcsImage.SizeY;
                //TODO make sure dataset URL is unique
                imageset.SetInitialParameters(
                    wcsImage.Description,
                    wcsImage.Filename,
                    ImageSetType.Sky,
                    BandPass.Visible,
                    ProjectionType.SkyImage,
                    Util.GetHashCode(wcsImage.Filename),
                    0,
                    0,
                    wcsImage.ScaleY,
                    ".fits",
                    wcsImage.ScaleX > 0,
                    "",
                    wcsImage.CenterX,
                    wcsImage.CenterY,
                    wcsImage.Rotation,
                    false,
                    "",
                    false,
                    false,
                    1,
                    wcsImage.ReferenceX,
                    wcsImage.ReferenceY,
                    wcsImage.Copyright,
                    wcsImage.CreditsUrl,
                    "",
                    "",
                    0,
                    ""
                    );

                imageset.WcsImage      = wcsImage;
                imagesetLayer.ImageSet = imageset;
                LayerManager.AddFitsImageSetLayer(imagesetLayer, name);

                if (gotoTarget)
                {
                    double zoom = imageset.GuessZoomSetting(WWTControl.Singleton.RenderContext.ViewCamera.Zoom);

                    WWTControl.Singleton.GotoRADecZoom(
                        wcsImage.ViewCenterX / 15,
                        wcsImage.ViewCenterY,
                        zoom,
                        false,
                        null
                        );
                }

                if (loaded != null)
                {
                    loaded(imagesetLayer);
                }
            };

            if (string.IsNullOrWhiteSpace(name))
            {
                name = LayerManager.GetNextFitsName();
            }

            if (RenderContext.UseGlVersion2)
            {
                new FitsImage(imageset, url, null, wcsLoaded);
            }
            else
            {
                new FitsImageJs(imageset, url, null, wcsLoaded);
            }
            return(imagesetLayer);
        }
Beispiel #2
0
        //UI will set this to a function that takes 2 string properties (prop,val)
        //("title", "left", or "right" for the labels, "pos" for the slider pos)
        //Pass a 0-1 float to set the slider position (stringify it if you need to for strong typing)

        public void SetTimeScrubberPosition(double posLeft)
        {
            LayerManager.SetTimeSliderValue(posLeft);
        }
Beispiel #3
0
 // Call this to add a VOTable to layers
 public VoTableLayer AddVoTableLayer(VoTable table)
 {
     return(LayerManager.AddVoTableLayer(table, "Vo Table"));
 }
Beispiel #4
0
        public void SetupMatricesSolarSystem(bool forStars)
        {
            Lighting = Settings.Active.SolarSystemLighting;

            Space = false;
            if (SolarSystemTrack != SolarSystemObjects.Custom && SolarSystemTrack != SolarSystemObjects.Undefined)
            {
                ViewCamera.ViewTarget = Planets.GetPlanetTargetPoint(SolarSystemTrack, ViewCamera.Lat, ViewCamera.Lng, 0);
            }
            RenderTriangle.CullInside = false;


            double cameraDistance = SolarSystemCameraDistance;

            Matrix3d trackingMatrix = Matrix3d.Identity;

            cameraDistance -= 0.000001;

            bool activeTrackingFrame = false;

            if (SolarSystemTrack == SolarSystemObjects.Custom && !string.IsNullOrEmpty(TrackingFrame))
            {
                activeTrackingFrame = true;
                FrameTarget target = LayerManager.GetFrameTarget(this, TrackingFrame);
                ViewCamera.ViewTarget = target.Target;
                trackingMatrix        = target.Matrix;
            }
            else if (!string.IsNullOrEmpty(TrackingFrame))
            {
                TrackingFrame = "";
            }


            Vector3d center = ViewCamera.ViewTarget;
            //Vector3d lightPosition = -center;

            double   localZoom = ViewCamera.Zoom * 20;
            Vector3d lookAt    = new Vector3d();

            Matrix3d viewAdjust = Matrix3d.Identity;

            viewAdjust.Multiply(Matrix3d.RotationX(((-ViewCamera.Lat) / 180f * Math.PI)));
            viewAdjust.Multiply(Matrix3d.RotationY(((-ViewCamera.Lng) / 180f * Math.PI)));

            Matrix3d lookAtAdjust = Matrix3d.Identity;


            bool dome = false;

            Vector3d lookUp;


            if (useSolarSystemTilt && !SandboxMode)
            {
                double angle = ViewCamera.Angle;
                if (cameraDistance > 0.0008)
                {
                    angle = 0;
                }
                else if (cameraDistance > 0.00001)
                {
                    double val = Math.Min(1.903089987, Util.Log10(cameraDistance) + 5) / 1.903089987;

                    angle = angle * Math.Max(0, 1 - val);
                }



                CameraPosition = Vector3d.Create(
                    (Math.Sin(-ViewCamera.Rotation) * Math.Sin(angle) * cameraDistance),
                    (Math.Cos(-ViewCamera.Rotation) * Math.Sin(angle) * cameraDistance),
                    ((Math.Cos(angle) * cameraDistance)));
                lookUp = Vector3d.Create(Math.Sin(-ViewCamera.Rotation), Math.Cos(-ViewCamera.Rotation), 0.00001f);
            }
            else
            {
                CameraPosition = Vector3d.Create(0, 0, ((cameraDistance)));

                lookUp = Vector3d.Create(Math.Sin(-ViewCamera.Rotation), Math.Cos(-ViewCamera.Rotation), 0.0001f);
            }


            CameraPosition = viewAdjust.Transform(CameraPosition);

            cameraOffset = CameraPosition.Copy();

            Matrix3d tmp = trackingMatrix.Clone();

            tmp.Invert();
            cameraOffset = Vector3d.TransformCoordinate(cameraOffset, tmp);



            lookUp = viewAdjust.Transform(lookUp);


            World                = Matrix3d.Identity;
            WorldBase            = Matrix3d.Identity;
            WorldBaseNonRotating = Matrix3d.Identity;

            View = Matrix3d.MultiplyMatrix(Matrix3d.MultiplyMatrix(trackingMatrix, Matrix3d.LookAtLH(CameraPosition, lookAt, lookUp)), lookAtAdjust);


            ViewBase = View.Clone();


            Vector3d temp = Vector3d.SubtractVectors(lookAt, CameraPosition);

            temp.Normalize();
            temp = Vector3d.TransformCoordinate(temp, trackingMatrix);
            temp.Normalize();
            viewPoint = temp;



            //if (activeTrackingFrame)
            //{
            //    Vector3d atfCamPos = RenderContext11.CameraPosition;
            //    Vector3d atfLookAt = lookAt;
            //    Vector3d atfLookUp = lookUp;
            //    Matrix3d mat = trackingMatrix;
            //    mat.Invert();

            //    atfCamPos.TransformCoordinate(mat);
            //    atfLookAt.TransformCoordinate(mat);
            //    atfLookUp.TransformCoordinate(mat);
            //    atfLookAt.Normalize();
            //    atfLookUp.Normalize();

            //    CustomTrackingParams.Angle = 0;
            //    CustomTrackingParams.Rotation = 0;
            //    CustomTrackingParams.DomeAlt = viewCamera.DomeAlt;
            //    CustomTrackingParams.DomeAz = viewCamera.DomeAz;
            //    CustomTrackingParams.TargetReferenceFrame = "";
            //    CustomTrackingParams.ViewTarget = viewCamera.ViewTarget;
            //    CustomTrackingParams.Zoom = viewCamera.Zoom;
            //    CustomTrackingParams.Target = SolarSystemObjects.Custom;


            //    Vector3d atfLook = atfCamPos - atfLookAt;
            //    atfLook.Normalize();



            //    Coordinates latlng = Coordinates.CartesianToSpherical2(atfLook);
            //    CustomTrackingParams.Lat = latlng.Lat;
            //    CustomTrackingParams.Lng = latlng.Lng - 90;

            //    Vector3d up = Coordinates.GeoTo3dDouble(latlng.Lat + 90, latlng.Lng - 90);
            //    Vector3d left = Vector3d.Cross(atfLook, up);

            //    double dotU = Math.Acos(Vector3d.Dot(atfLookUp, up));
            //    double dotL = Math.Acos(Vector3d.Dot(atfLookUp, left));

            //    CustomTrackingParams.Rotation = dotU;// -Math.PI / 2;
            //}


            double radius = Planets.GetAdjustedPlanetRadius((int)SolarSystemTrack);


            if (cameraDistance < radius * 2.0 && !forStars)
            {
                nearPlane = cameraDistance * 0.03;

                //m_nearPlane = Math.Max(m_nearPlane, .000000000030);
                nearPlane = Math.Max(nearPlane, .00000000001);
                back      = 1900;
            }
            else
            {
                if (forStars)
                {
                    back      = 900056;
                    back      = cameraDistance > 900056 ? cameraDistance * 3 : 900056;
                    nearPlane = .00003f;

                    // m_nearPlane = cameraDistance * 0.03;

                    // back = 9937812653;
                    //  back = 21421655730;
                }
                else
                {
                    back = cameraDistance > 1900 ? cameraDistance + 200 : 1900;

                    // m_nearPlane = .0001f;
                    if (Settings.Active.SolarSystemScale < 13)
                    {
                        nearPlane = (float)Math.Min(cameraDistance * 0.03, 0.01);
                    }
                    else
                    {
                        nearPlane = .001f;
                    }
                }
            }


            Projection     = Matrix3d.PerspectiveFovLH((fovLocal), (double)Width / (double)Height, nearPlane, back);
            PerspectiveFov = fovLocal;
            fovAngle       = ((this.ViewCamera.Zoom) / FOVMULT) / Math.PI * 180;
            fovScale       = (fovAngle / Height) * 3600;

            SetMatrixes();
            MakeFrustum();
        }
Beispiel #5
0
        public ImageSetLayer LoadFitsLayer(string url, string name, bool gotoTarget, ImagesetLoaded loaded)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                name = LayerManager.GetNextFitsName();
            }

            ImageSetLayer imagesetLayer = new ImageSetLayer();

            FitsImage img = new FitsImage(url, null, delegate(WcsImage wcsImage)
            {
                int width  = (int)wcsImage.SizeX;
                int height = (int)wcsImage.SizeY;

                Imageset imageset = Imageset.Create(
                    wcsImage.Description,
                    Util.GetHashCode(wcsImage.Filename).ToString(),
                    ImageSetType.Sky,
                    BandPass.Visible,
                    ProjectionType.SkyImage,
                    Util.GetHashCode(wcsImage.Filename),
                    0,
                    0,
                    256,
                    wcsImage.ScaleY,
                    ".tif",
                    wcsImage.ScaleX > 0,
                    "",
                    wcsImage.CenterX,
                    wcsImage.CenterY,
                    wcsImage.Rotation,
                    false,
                    "",
                    false,
                    false,
                    1,
                    wcsImage.ReferenceX,
                    wcsImage.ReferenceY,
                    wcsImage.Copyright,
                    wcsImage.CreditsUrl,
                    "",
                    "",
                    0,
                    ""
                    );

                imageset.WcsImage      = wcsImage;
                imagesetLayer.ImageSet = imageset;
                LayerManager.AddFitsImageSetLayer(imagesetLayer, name);
                LayerManager.LoadTree();
                if (gotoTarget)
                {
                    WWTControl.Singleton.GotoRADecZoom(wcsImage.CenterX / 15, wcsImage.CenterY, 10 * wcsImage.ScaleY * height, false);
                }
                if (loaded != null)
                {
                    loaded(imagesetLayer);
                }
            });

            return(imagesetLayer);
        }
Beispiel #6
0
        // Merged layers from Tour Player Alternate universe into the real layer manager layers list
        public static void MergeToursLayers()
        {
            tourLayers = false;
            bool OverWrite        = false;
            bool CollisionChecked = false;

            foreach (String key in allMapsTours.Keys)
            {
                LayerMap map = allMapsTours[key];
                if (!allMaps.ContainsKey(map.Name))
                {
                    LayerMap newMap = new LayerMap(map.Name, ReferenceFrames.Custom);
                    newMap.Frame                      = map.Frame;
                    newMap.LoadedFromTour             = true;
                    LayerManager.AllMaps[newMap.Name] = newMap;
                }
            }
            ConnectAllChildren();
            foreach (Guid key in layerListTours.Keys)
            {
                Layer layer = layerListTours[key];

                if (LayerList.ContainsKey(layer.ID))
                {
                    if (!CollisionChecked)
                    {
                        //todo add UI in the future
                        if (true)
                        // if (UiTools.ShowMessageBox(Language.GetLocalizedText(958, "There are layers with the same name. Overwrite existing layers?"), Language.GetLocalizedText(3, "Microsoft WorldWide Telescope"), System.Windows.Forms.MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                        {
                            OverWrite = true;
                        }
                        else
                        {
                            OverWrite = false;
                        }
                        CollisionChecked = true;
                    }

                    if (OverWrite)
                    {
                        LayerManager.DeleteLayerByID(layer.ID, true, false);
                    }
                }

                if (!LayerList.ContainsKey(layer.ID))
                {
                    if (AllMaps.ContainsKey(layer.ReferenceFrame))
                    {
                        LayerList[layer.ID] = layer;

                        AllMaps[layer.ReferenceFrame].Layers.Add(layer);
                    }
                }
                else
                {
                    layer.CleanUp();
                }
            }

            layerListTours.Clear();
            allMapsTours.Clear();
            layerMapsTours.Clear();
            LoadTree();
        }
        //public static TourDocument FromUrl(string url, Action callMe)
        //{

        //    TourDocument temp = new TourDocument();
        //    temp.Url = url;
        //    temp.callMe = callMe;

        //    temp.webFile = new WebFile(Util.GetTourComponent(url, "master"));
        //    temp.webFile.OnStateChange = temp.LoadXmlDocument;
        //    temp.webFile.Send();

        //    return temp;
        //}

        //private void LoadXmlDocument()
        //{
        //    if (webFile.State == StateType.Error)
        //    {
        //        Script.Literal("alert({0})", webFile.Message);
        //    }
        //    else if (webFile.State == StateType.Received)
        //    {
        //        FromXml(webFile.GetXml());
        //        callMe();
        //    }
        //}


        public void FromXml(XmlDocument doc)
        {
            XmlNode root = Util.SelectSingleNode(doc, "Tour");


            id     = root.Attributes.GetNamedItem("ID").Value.ToString();
            Title  = root.Attributes.GetNamedItem("Title").Value.ToString();
            Author = root.Attributes.GetNamedItem("Author").Value.ToString();

            if (root.Attributes.GetNamedItem("Descirption") != null)
            {
                Description = root.Attributes.GetNamedItem("Descirption").Value;
            }

            if (root.Attributes.GetNamedItem("AuthorEmail") != null)
            {
                authorEmail = root.Attributes.GetNamedItem("AuthorEmail").Value;
            }

            if (root.Attributes.GetNamedItem("Keywords") != null)
            {
                Keywords = root.Attributes.GetNamedItem("Keywords").Value;
            }

            if (root.Attributes.GetNamedItem("OrganizationName") != null)
            {
                OrgName = root.Attributes.GetNamedItem("OrganizationName").Value;
            }



            organizationUrl = root.Attributes.GetNamedItem("OrganizationUrl").Value;

            level = (UserLevel)Enums.Parse("UserLevel", root.Attributes.GetNamedItem("UserLevel").Value);

            type = (Classification)Enums.Parse("Classification", root.Attributes.GetNamedItem("Classification").Value);

            taxonomy = root.Attributes.GetNamedItem("Taxonomy").Value.ToString();
            XmlNode TourStops = Util.SelectSingleNode(root, "TourStops");

            foreach (XmlNode tourStop in TourStops.ChildNodes)
            {
                if (tourStop.Name == "TourStop")
                {
                    AddTourStop(TourStop.FromXml(this, tourStop));
                }
            }

            XmlNode Frames = Util.SelectSingleNode(root, "ReferenceFrames");

            if (Frames != null)
            {
                foreach (XmlNode frame in Frames.ChildNodes)
                {
                    if (frame.Name == "ReferenceFrame")
                    {
                        ReferenceFrame newFrame = new ReferenceFrame();
                        newFrame.InitializeFromXml(frame);
                        if (!LayerManager.AllMaps.ContainsKey(newFrame.Name))
                        {
                            LayerMap map = new LayerMap(newFrame.Name, ReferenceFrames.Custom);
                            map.Frame          = newFrame;
                            map.LoadedFromTour = true;
                            LayerManager.AllMaps[newFrame.Name] = map;
                        }
                    }
                }
                LayerManager.ConnectAllChildren();
                LayerManager.LoadTree();
            }

            XmlNode Layers = Util.SelectSingleNode(root, "Layers");

            if (Layers != null)
            {
                foreach (XmlNode layer in Layers.ChildNodes)
                {
                    if (layer.Name == "Layer")
                    {
                        Layer newLayer = Layer.FromXml(layer, true);//.Layer.FromXml(layer, true);
                        if (newLayer != null)
                        {
                            string fileName = string.Format("{0}.txt", newLayer.ID.ToString());
                            if (LayerManager.LayerList.ContainsKey(newLayer.ID)) // && newLayer.ID != ISSLayer.ISSGuid)
                            {
                                //if (!CollisionChecked)
                                //{
                                //    if (UiTools.ShowMessageBox(Language.GetLocalizedText(958, "There are layers with the same name. Overwrite existing layers?"), Language.GetLocalizedText(3, "Microsoft WorldWide Telescope"), System.Windows.Forms.MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                                //    {
                                //        OverWrite = true;
                                //    }
                                //    else
                                //    {
                                //        OverWrite = false;

                                //    }
                                //    CollisionChecked = true;
                                //}

                                //if (OverWrite)
                                //{
                                LayerManager.DeleteLayerByID(newLayer.ID, true, false);
                                //}
                            }
                            try
                            {
                                newLayer.LoadedFromTour = true;
                                newLayer.LoadData(this, fileName);
                                LayerManager.Add(newLayer, false);
                            }
                            catch
                            {
                            }
                        }
                    }
                }
                LayerManager.LoadTree();
            }

            //todo author
            //if (File.Exists(WorkingDirectory + "Author.png"))
            //{
            //    authorImage = UiTools.LoadBitmap(WorkingDirectory + "Author.png");
            //}

            tourDirty = 0;
        }
Beispiel #8
0
 public void OK(ReferenceFrame frame)
 {
     LayerManager.LoadTree();
 }
Beispiel #9
0
 public void OK(ReferenceFrame frame)
 {
     LayerManager.referenceFrameWizardFinished(frame);
 }
Beispiel #10
0
        public void Render(RenderContext renderContext)
        {
            //window.SetupMatricesOverlays();
            if (tour == null || tour.CurrentTourStop == null || !playing)
            {
                return;
            }

            renderContext.Save();

            UpdateSlideStates();

            if (!onTarget)
            {
                slideStartTime = Date.Now;
                if (renderContext.OnTarget(Tour.CurrentTourStop.Target))
                {
                    onTarget                 = true;
                    overlayBlend.State       = !Tour.CurrentTourStop.FadeInOverlays;
                    overlayBlend.TargetState = true;
                    if (tour.CurrentTourStop.MusicTrack != null)
                    {
                        tour.CurrentTourStop.MusicTrack.Play();
                    }

                    if (tour.CurrentTourStop.VoiceTrack != null)
                    {
                        tour.CurrentTourStop.VoiceTrack.Play();
                    }
                    string caption = "";
                    foreach (Overlay overlay in tour.CurrentTourStop.Overlays)
                    {
                        if (overlay.Name.ToLowerCase() == "caption")
                        {
                            TextOverlay text = overlay as TextOverlay;
                            if (text != null)
                            {
                                caption = text.TextObject.Text;
                            }
                        }
                        overlay.Play();
                    }

                    LayerManager.SetVisibleLayerList(tour.CurrentTourStop.Layers);

                    if (tour.CurrentTourStop.EndTarget != null && tour.CurrentTourStop.EndTarget.ZoomLevel != -1)
                    {
                        if (tour.CurrentTourStop.Target.Type == ImageSetType.SolarSystem)
                        {
                            // TODO fix this when Planets are implenented
                            //tour.CurrentTourStop.Target.UpdatePlanetLocation(SpaceTimeController.UtcToJulian(tour.CurrentTourStop.StartTime));
                            //tour.CurrentTourStop.EndTarget.UpdatePlanetLocation(SpaceTimeController.UtcToJulian(tour.CurrentTourStop.EndTime));
                        }
                        renderContext.ViewMover = new ViewMoverKenBurnsStyle(tour.CurrentTourStop.Target.CamParams, tour.CurrentTourStop.EndTarget.CamParams, tour.CurrentTourStop.Duration / 1000.0, tour.CurrentTourStop.StartTime, tour.CurrentTourStop.EndTime, tour.CurrentTourStop.InterpolationType);
                    }
                    Settings.TourSettings           = tour.CurrentTourStop;
                    SpaceTimeController.Now         = tour.CurrentTourStop.StartTime;
                    SpaceTimeController.SyncToClock = false;

                    WWTControl.scriptInterface.FireSlideChanged(caption);
                }
            }

            //todo implement gl based tour rendering
            if (renderContext.gl != null)
            {
                renderContext.SetupMatricesOverlays();

                //todo Factor opacity in somehow ??
                //view.overlays.Opacity = overlayBlend.Opacity;

                if (currentMasterSlide != null)
                {
                    foreach (Overlay overlay in currentMasterSlide.Overlays)
                    {
                        overlay.TweenFactor = 1f;
                        overlay.Draw3D(renderContext, false);
                    }
                }

                if (onTarget)
                {
                    foreach (Overlay overlay in tour.CurrentTourStop.Overlays)
                    {
                        if (overlay.Name.ToLowerCase() != "caption" || WWTControl.scriptInterface.ShowCaptions)
                        {
                            overlay.TweenFactor = (float)CameraParameters.EaseCurve(tour.CurrentTourStop.TweenPosition, overlay.InterpolationType == InterpolationType.DefaultV ? tour.CurrentTourStop.InterpolationType : overlay.InterpolationType);
                            overlay.Draw3D(renderContext, false);
                        }
                    }
                }


                renderContext.Restore();

                //DrawPlayerControls(renderContext);
            }
            else
            {
                renderContext.Device.Scale(renderContext.Height / 1116, renderContext.Height / 1116);

                double aspectOrig = 1920 / 1116;

                double aspectNow = renderContext.Width / renderContext.Height;

                renderContext.Device.Translate(-((1920 - (aspectNow * 1116)) / 2), 0);

                //todo Factor opacity in somehow ??
                //view.overlays.Opacity = overlayBlend.Opacity;


                if (currentMasterSlide != null)
                {
                    foreach (Overlay overlay in currentMasterSlide.Overlays)
                    {
                        overlay.TweenFactor = 1f;
                        overlay.Draw3D(renderContext, false);
                    }
                }

                if (onTarget)
                {
                    foreach (Overlay overlay in tour.CurrentTourStop.Overlays)
                    {
                        if (overlay.Name.ToLowerCase() != "caption" || WWTControl.scriptInterface.ShowCaptions)
                        {
                            overlay.TweenFactor = (float)CameraParameters.EaseCurve(tour.CurrentTourStop.TweenPosition, overlay.InterpolationType == InterpolationType.DefaultV ? tour.CurrentTourStop.InterpolationType : overlay.InterpolationType);
                            overlay.Draw3D(renderContext, false);
                        }
                    }
                }
                else
                {
                    int i = 0;
                }
                renderContext.Restore();

                DrawPlayerControls(renderContext);
            }
        }