static public void CreateInfoTree(StarScan.ScanNode sn, StarScan.ScanNode parent, int p, double prevmasskg, List <BodyInfo> oilist) { KeplerOrbitElements kepler = null; if (sn.scandata != null && sn.scandata.nSemiMajorAxis.HasValue) { kepler = new KeplerOrbitElements(true, sn.scandata.nSemiMajorAxis.Value, sn.scandata.nEccentricity != null ? sn.scandata.nEccentricity.Value : 0, // protect against missing data sn.scandata.nOrbitalInclination != null ? sn.scandata.nOrbitalInclination.Value : 0, sn.scandata.nAscendingNode != null ? sn.scandata.nAscendingNode.Value : 0, sn.scandata.nPeriapsis != null ? sn.scandata.nPeriapsis.Value : 0, sn.scandata.nMeanAnomaly != null ? sn.scandata.nPeriapsis.Value : 0, sn.scandata.EventTimeUTC.ToJulianDate() ); } else { System.Diagnostics.Debug.WriteLine($"{sn.OwnName} does not have kepler info"); } BodyInfo oi = new BodyInfo(); oi.kepler = kepler; oi.scannode = sn; oi.index = oilist.Count; oi.parentindex = p; oi.orbitpos = new GLRenderDataWorldPositionColor(); oi.bodypos = new GLRenderDataWorldPositionColor(); oilist.Add(oi); if (kepler != null) { if (prevmasskg == 0 && kepler.SemiMajorAxis > 0) { kepler.CentralMass = kepler.CalculateMass(sn.scandata.nOrbitalPeriod.Value); } else { kepler.CentralMass = prevmasskg; } } if (sn.Children != null) { foreach (var kvp in sn.Children) { CreateInfoTree(kvp.Value, sn, oi.index, sn.scandata?.nMassKG != null ? sn.scandata.nMassKG.Value : 0, oilist); } } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; matrixcalc = new GLMatrixCalc(); matrixcalc.PerspectiveNearZDistance = 1f; matrixcalc.PerspectiveFarZDistance = worldsize * 2; matrixcalc.InPerspectiveMode = true; matrixcalc.ResizeViewPort(this, glwfc.Size); displaycontrol = new GLControlDisplay(items, glwfc, matrixcalc); // hook form to the window - its the master, it takes its size fro mc.ScreenCoordMax displaycontrol.Focusable = true; // we want to be able to focus and receive key presses. displaycontrol.Name = "displaycontrol"; displaycontrol.Paint += (o, ts) => // subscribing after start means we paint over the scene, letting transparency work { // MCUB set up by Controller3DDraw which did the work first displaycontrol.Render(glwfc.RenderState, ts); }; double startspeed = 60 * 60 * 6; // in sec GLImage minus = new GLImage("plus", new Rectangle(0, 0, 32, 32), Properties.Resources.GoBackward); minus.MouseClick += (e1, m1) => { currentjd -= 365; }; displaycontrol.Add(minus); GLImage back = new GLImage("back", new Rectangle(40, 0, 32, 32), Properties.Resources.Backwards); back.MouseClick += (e1, m1) => { if (jdscaling > 0) { jdscaling /= 2; } else if (jdscaling < 0) { jdscaling *= 2; } else { jdscaling = -startspeed; } }; displaycontrol.Add(back); GLImage pause = new GLImage("back", new Rectangle(80, 0, 32, 32), Properties.Resources.Pause); pause.MouseClick += (e1, m1) => { jdscaling = 0; }; displaycontrol.Add(pause); GLImage fwd = new GLImage("fwd", new Rectangle(120, 0, 32, 32), Properties.Resources.Forward); fwd.MouseClick += (e1, m1) => { if (jdscaling < 0) { jdscaling /= 2; } else if (jdscaling > 0) { jdscaling *= 2; } else { jdscaling = startspeed; } }; displaycontrol.Add(fwd); GLImage plus = new GLImage("plus", new Rectangle(160, 0, 32, 32), Properties.Resources.GoForward); plus.MouseClick += (e1, m1) => { currentjd += 365; }; displaycontrol.Add(plus); status = new GLLabel("state", new Rectangle(200, 0, 400, 20), "Label", Color.DarkOrange); displaycontrol.Add(status); datalabel = new GLLabel("datalabel", new Rectangle(0, 40, 400, 100), "", Color.DarkOrange); datalabel.TextAlign = ContentAlignment.TopLeft; displaycontrol.Add(datalabel); gl3dcontroller = new Controller3D(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.ZoomDistance = 3000F; gl3dcontroller.Start(matrixcalc, displaycontrol, new Vector3(0, 0, 0), new Vector3(135f, 0, 0f), 0.025F); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms * 100.0f); }; items.Add(new GLColorShaderWorld(), "COSW"); items.Add(new GLTexturedShaderObjectCommonTranslation(), "TEXOCT"); items.Add(new GLTexture2D(Properties.Resources.golden, SizedInternalFormat.Rgba8), "golden"); items.Add(new GLTexture2D(Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8), "moon"); #region coloured lines int gridsize = (int)(worldsize * mscaling); int markers = gridsize / 20; { GLRenderState lines = GLRenderState.Lines(1); Color gridcolour = Color.FromArgb(255, 60, 60, 60); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-gridsize, -0, -gridsize), new Vector3(-gridsize, -0, gridsize), new Vector3(markers, 0, 0), gridsize / markers * 2 + 1), new Color4[] { gridcolour }) ); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-gridsize, -0, -gridsize), new Vector3(gridsize, -0, -gridsize), new Vector3(0, 0, markers), gridsize / markers * 2 + 1), new Color4[] { gridcolour })); } rObjects.Add(new GLOperationClearDepthBuffer()); { GLRenderState rt = GLRenderState.Tri(); float sunscaled = sunradiusm * mscaling * sunscaleup; rObjects.Add(items.Shader("TEXOCT"), "sun", GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rt, GLSphereObjectFactory.CreateTexturedSphereFromTriangles(3, sunscaled), new GLRenderDataTranslationRotationTexture(items.Tex("golden"), new Vector3(0, 0, 0)) )); } #endregion { // debug check DateTime t = new DateTime(2000, 1, 1, 12, 0, 0); double jd = t.ToJulianDate(); DateTime t2 = jd.JulianToDateTime(); System.Diagnostics.Debug.WriteLine($"Date time {t} JD {jd} back to {t2}"); } items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block currentjd = KeplerOrbitElements.J2000; jdscaling = 0; bodies = new KeplerOrbitElements[4]; bodypositions = new GLRenderDataTranslationRotationTexture[4]; // earth bodies[0] = new KeplerOrbitElements(true, semimajoraxiskm: 0.38709893 * AU, // https://nssdc.gsfc.nasa.gov/planetary/factsheet/mercuryfact.html eccentricity: 0.20563069, inclination: 7.00487, longitudeofascendingnode: 48.33167, longitudeofperihelion: 77.45645, meanlongitude: 252.25084, currentjd); bodies[1] = new KeplerOrbitElements(true, semimajoraxiskm: 0.72333199 * AU, // https://nssdc.gsfc.nasa.gov/planetary/factsheet/venusfact.html eccentricity: 0.00677323, inclination: 3.39471, longitudeofascendingnode: 76.68069, longitudeofperihelion: 131.53298, meanlongitude: 181.97973, currentjd); bodies[2] = new KeplerOrbitElements(true, semimajoraxiskm: 1.49596E+08, // https://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html eccentricity: 0.0167086, inclination: 0.00005, longitudeofascendingnode: -11.26064, longitudeofperihelion: 102.94719, meanlongitude: 100.46435, currentjd); bodies[3] = new KeplerOrbitElements(true, semimajoraxiskm: 1.52366231 * AU, // https://nssdc.gsfc.nasa.gov/planetary/factsheet/marsfact.html eccentricity: 0.09341233, inclination: 1.85061, longitudeofascendingnode: 49.57854, longitudeofperihelion: 336.04084, meanlongitude: 355.45332, currentjd); float planetsize = earthradiusm * mscaling * planetscaleup; for (int i = 0; i < bodies.Length; i++) { bodies[i].CentralMass = Msol; System.Diagnostics.Debug.WriteLine($"{i} {bodies[i].OrbitalPeriodS/60/60/24} {bodies[i].CalculateMass(bodies[i].OrbitalPeriodS)}"); bodypositions[i] = new GLRenderDataTranslationRotationTexture(items.Tex("moon"), new Vector3(0, 0, 0)); GLRenderState rt = GLRenderState.Tri(); rObjects.Add(items.Shader("TEXOCT"), "Body" + i, GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rt, GLSphereObjectFactory.CreateTexturedSphereFromTriangles(3, planetsize), bodypositions[i])); Vector4[] orbit = bodies[i].Orbit(currentjd, 1, mscaling); GLRenderState lines = GLRenderState.Lines(1); rObjects.Add(items.Shader("COSW"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.LineStrip, lines, orbit, new Color4[] { Color.FromArgb(255, 128, 0, 0) })); } systemtimer.Interval = 25; systemtimer.Tick += new EventHandler(SystemTick); systemtimer.Start(); }