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); }
//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); }
// Call this to add a VOTable to layers public VoTableLayer AddVoTableLayer(VoTable table) { return(LayerManager.AddVoTableLayer(table, "Vo Table")); }
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(); }
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); }
// 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; }
public void OK(ReferenceFrame frame) { LayerManager.LoadTree(); }
public void OK(ReferenceFrame frame) { LayerManager.referenceFrameWizardFinished(frame); }
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); } }