public void Start(GLWinFormControl glwfc) { this.glwfc = glwfc; matrixcalc = new GLMatrixCalc(); matrixcalc.PerspectiveNearZDistance = 1f; matrixcalc.PerspectiveFarZDistance = worldsize * 2; matrixcalc.InPerspectiveMode = true; matrixcalc.ResizeViewPort(this, glwfc.Size); items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block displaycontrol = new GLControlDisplay(items, glwfc, matrixcalc); // hook form to the window - its the master, it takes its size from mc.ScreenCoordMax displaycontrol.Focusable = true; // we want to be able to focus and receive key presses. displaycontrol.Name = "displaycontrol"; displaycontrol.Font = new Font("Arial", 12); gl3dcontroller = new Controller3Dd(); gl3dcontroller.PaintObjects = ControllerDraw; gl3dcontroller.ZoomDistance = 20e6 * 1000 * mscaling; // zoom 1 is X km gl3dcontroller.PosCamera.ZoomMin = 0.001f; gl3dcontroller.PosCamera.ZoomMax = 300f; gl3dcontroller.PosCamera.ZoomScaling = 1.08f; gl3dcontroller.Start(matrixcalc, displaycontrol, new Vector3d(0, 0, 0), new Vector3d(135f, 0, 0f), 0.025F, registermouseui: false, registerkeyui: true); gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { double eyedistr = Math.Pow(eyedist, 1.0); float v = (float)Math.Max(eyedistr / 1200, 0); //System.Diagnostics.Debug.WriteLine("Speed " + eyedistr + " "+ v); return((float)ms * v); }; for (int i = 1; i <= 10; i++) { int v = i * i; double f = (gl3dcontroller.PosCamera.ZoomMax - gl3dcontroller.PosCamera.ZoomMin) * v / 100.0 + gl3dcontroller.PosCamera.ZoomMin; System.Diagnostics.Debug.WriteLine($"{i} {v} {f}"); } displaycontrol.Paint += (o, ts) => // subscribing after Controller start means we paint over the scene { // MCUB set up by Controller3DDraw which did the work first // System.Diagnostics.Debug.WriteLine("Controls Draw"); displaycontrol.Render(glwfc.RenderState, ts); }; displaycontrol.MouseClick += MouseClickOnMap; // grab mouse UI displaycontrol.MouseUp += MouseUpOnMap; displaycontrol.MouseDown += MouseDownOnMap; displaycontrol.MouseMove += MouseMoveOnMap; displaycontrol.MouseWheel += MouseWheelOnMap; double startspeed = 60 * 60 * 6; // in sec GLImage minus = new GLImage("timeplus1y", new Rectangle(0, 0, 32, 32), Properties.Resources.GoBackward); minus.MouseClick += (e1, m1) => { currentjd -= 365; }; displaycontrol.Add(minus); GLImage back = new GLImage("timeback", 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("timepause", new Rectangle(80, 0, 32, 32), Properties.Resources.Pause); pause.MouseClick += (e1, m1) => { jdscaling = 0; }; displaycontrol.Add(pause); GLImage fwd = new GLImage("timefwd", 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("timeplus1y", new Rectangle(160, 0, 32, 32), Properties.Resources.GoForward); plus.MouseClick += (e1, m1) => { currentjd += 365; }; displaycontrol.Add(plus); GLImage sysleft = new GLImage("sysleft", new Rectangle(200, 0, 32, 32), Properties.Resources.GoBackward); sysleft.MouseClick += (e1, m1) => { DisplayNode(-1); }; displaycontrol.Add(sysleft); mastersystem = new GLLabel("sysname", new Rectangle(230, 6, 70, 20), "All", Color.DarkOrange); mastersystem.TextAlign = ContentAlignment.MiddleCenter; displaycontrol.Add(mastersystem); GLImage sysright = new GLImage("sysright", new Rectangle(300, 0, 32, 32), Properties.Resources.GoForward); sysright.MouseClick += (e1, m1) => { DisplayNode(1); }; displaycontrol.Add(sysright); timedisplay = new GLLabel("state", new Rectangle(340, 6, 800, 20), "Label", Color.DarkOrange); displaycontrol.Add(timedisplay); datalabel = new GLLabel("datalabel", new Rectangle(0, 40, 400, 100), "", Color.DarkOrange); datalabel.TextAlign = ContentAlignment.TopLeft; displaycontrol.Add(datalabel); status = new GLLabel("Status", new Rectangle(0, 0, 2000, 24), "x"); status.Dock = DockingType.BottomLeft; status.ForeColor = Color.Orange; status.BackColor = Color.FromArgb(50, 50, 50, 50); displaycontrol.Add(status); rightclickmenubody = new GLContextMenu("RightClickMenuBody", new GLMenuItem("RCMInfo", "Information") { MouseClick = (s, e) => { } }, new GLMenuItem("RCMZoomIn", "Track") { MouseClick = (s, e) => { track = (int)rightclickmenubody.Tag; } }, new GLMenuItem("RCMZoomIn", "Track Central Body") { MouseClick = (s, e) => { int body = (int)rightclickmenubody.Tag; if (bodyinfo[body].parentindex >= 0) { track = bodyinfo[body].parentindex; } } }, new GLMenuItem("RCMZoomIn", "Zoom In") { }, new GLMenuItem("RCMUntrack", "Untrack") { MouseClick = (s1, e1) => { track = -1; } } ); rightclickmenubody.Opening += (ms, tag) => { ms["RCMUntrack"].Enabled = track != -1; }; rightclickmenuscreen = new GLContextMenu("RightClickMenuBody", new GLMenuItem("RCMSysDisplay", "System Display") { MouseClick = (s, e) => { } }, new GLMenuItem("RCMUntrack", "Untrack") { MouseClick = (s1, e1) => { track = -1; } } ); rightclickmenuscreen.Opening += (ms, tag) => { ms["RCMUntrack"].Enabled = track != -1; }; if (true) { var shader = new GLColorShaderWorld(); items.Add(shader); GLRenderState lines = GLRenderState.Lines(1); lines.DepthTest = false; int gridsize = (int)(worldsize * mscaling); int gridoffset = (int)(gridlines * mscaling); int nolines = gridsize / gridoffset * 2 + 1; Color gridcolour = Color.FromArgb(80, 80, 80, 80); rObjects.Add(shader, GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-gridsize, -0, -gridsize), new Vector3(-gridsize, -0, gridsize), new Vector3(gridoffset, 0, 0), nolines), new Color4[] { gridcolour }) ); rObjects.Add(shader, GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines, GLShapeObjectFactory.CreateLines(new Vector3(-gridsize, -0, -gridsize), new Vector3(gridsize, -0, -gridsize), new Vector3(0, 0, gridoffset), nolines), new Color4[] { gridcolour })); Size bmpsize = new Size(128, 30); var maps = new GLBitmaps("bitmap1", rObjects, bmpsize, 3, OpenTK.Graphics.OpenGL4.SizedInternalFormat.Rgba8, false, false); using (StringFormat fmt = new StringFormat(StringFormatFlags.NoWrap) { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center }) { float hsize = 40e6f * 1000 * mscaling; // million km -> m -> scaling float vsize = hsize * bmpsize.Height / bmpsize.Width; Font f = new Font("MS sans serif", 12f); long pos = -nolines / 2 * (gridlines / 1000); for (int i = -nolines / 2; i < nolines / 2; i++) { if (i != 0) { double v = Math.Abs(pos * 1000); long p = Math.Abs(pos); maps.Add(i, (p).ToString("N0"), f, Color.White, Color.Transparent, new Vector3(i * gridoffset + hsize / 2, 0, vsize / 2), new Vector3(hsize, 0, 0), new Vector3(0, 0, 0), fmt); maps.Add(i, (v / oneAU_m).ToString("N1") + "AU", f, Color.White, Color.Transparent, new Vector3(i * gridoffset + hsize / 2, 0, -vsize / 2), new Vector3(hsize, 0, 0), new Vector3(0, 0, 0), fmt); maps.Add(i, (p).ToString("N0"), f, Color.White, Color.Transparent, new Vector3(hsize / 2, 0, i * gridoffset + vsize / 2), new Vector3(hsize, 0, 0), new Vector3(0, 0, 0), fmt); maps.Add(i, (v / oneAU_m).ToString("N1") + "AU", f, Color.White, Color.Transparent, new Vector3(hsize / 2, 0, i * gridoffset - vsize / 2), new Vector3(hsize, 0, 0), new Vector3(0, 0, 0), fmt); } pos += 50000000; } } } var orbitlinesvertshader = new GLPLVertexShaderModelWorldUniform(new Color[] { Color.FromArgb(128, 128, 0, 0), Color.FromArgb(128, 128, 128, 0) }); orbitlineshader = new GLShaderPipeline(orbitlinesvertshader, new GLPLFragmentShaderVSColor()); bodyplaneshader = new GLShaderPipeline(orbitlinesvertshader, new GLPLFragmentShaderVSColor()); // model pos in, with uniform world pos, vectors out, with vs_colour selected by worldpos.w // set up ARB IDs for all images we are going to use.. var tbs = items.NewBindlessTextureHandleBlock(arbblock); var texs = items.NewTexture2D(null, Properties.Resources.golden, SizedInternalFormat.Rgba8); var texp = items.NewTexture2D(null, Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8); var texb = items.NewTexture2D(null, Properties.Resources.dotted, SizedInternalFormat.Rgba8); var texs2 = items.NewTexture2D(null, Properties.Resources.wooden, SizedInternalFormat.Rgba8); tbs.WriteHandles(new IGLTexture[] { texs, texp, texb, texs2 }); // using 0 tex coord, 4 image id and arb text binding var bodyfragshader = new GLPLFragmentShaderBindlessTexture(arbblock, discardiftransparent: true, useprimidover2: false); // takes 0:Vector4 model, 1: vec2 text, 4:matrix, out is 0:tex, 1: modelpos, 2: instance, 4 = matrix[3][3] var bodyvertshader = new GLPLVertexShaderModelMatrixTexture(1000000 * 1000 * mscaling, useeyedistance: false); bodyshader = new GLShaderPipeline(bodyvertshader, bodyfragshader); items.Add(bodyshader); // hold shape var sphereshape = GLSphereObjectFactory.CreateTexturedSphereFromTriangles(3, 1.0f); spherebuffer = items.NewBuffer(); // fill buffer with model co-ords spherebuffer.AllocateFill(sphereshape.Item1); spheretexcobuffer = items.NewBuffer(); // fill buffer with tex coords spheretexcobuffer.AllocateFill(sphereshape.Item2); bodymatrixbuffer = items.NewBuffer(); // this holds the matrix to set position and size GLStorageBlock findbufferresults = items.NewStorageBlock(findblock); var geofind = new GLPLGeoShaderFindTriangles(findbufferresults, 16); // pass thru normal vert/tcs/tes then to geoshader for results findshader = items.NewShaderPipeline(null, bodyvertshader, null, null, geofind, null, null, null); }
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(); }
public MapMenu(Map g, Map.Parts parts) { map = g; // names of MS* are on screen items hidden during main menu presentation int leftmargin = 4; int vpos = 4; int hpad = 8; int hpos = leftmargin; GLImage menuimage = new GLImage("MSMainMenu", new Rectangle(hpos, vpos, iconsize, iconsize), BaseUtils.Icons.IconSet.GetBitmap("GalMap.hamburgermenu")); menuimage.ToolTipText = "Open configuration menu"; map.displaycontrol.Add(menuimage); menuimage.MouseClick = (o, e1) => { ShowMenu(parts); }; hpos += menuimage.Width + hpad; if ((parts & Map.Parts.TravelPath) != 0) { GLImage tpback = new GLImage("MSTPBack", new Rectangle(hpos, vpos, iconsize, iconsize), BaseUtils.Icons.IconSet.GetBitmap("GalMap.GoBackward")); tpback.ToolTipText = "Go back one system"; map.displaycontrol.Add(tpback); tpback.MouseClick = (o, e1) => { g.GoToTravelSystem(-1); }; hpos += iconsize + hpad; GLImage tphome = new GLImage("MSTPHome", new Rectangle(hpos, vpos, iconsize, iconsize), BaseUtils.Icons.IconSet.GetBitmap("GalMap.GoToHomeSystem")); tphome.ToolTipText = "Go to current system"; map.displaycontrol.Add(tphome); tphome.MouseClick = (o, e1) => { g.GoToCurrentSystem(); }; hpos += iconsize + hpad; GLImage tpforward = new GLImage("MSTPForward", new Rectangle(hpos, vpos, iconsize, iconsize), BaseUtils.Icons.IconSet.GetBitmap("GalMap.GoForward")); tpforward.ToolTipText = "Go forward one system"; map.displaycontrol.Add(tpforward); tpforward.MouseClick = (o, e1) => { g.GoToTravelSystem(1); }; hpos += iconsize + hpad; } if ((parts & Map.Parts.GalaxyResetPos) != 0) { GLImage tpgalview = new GLImage("MSTPGalaxy", new Rectangle(hpos, vpos, iconsize, iconsize), BaseUtils.Icons.IconSet.GetBitmap("GalMap.ShowGalaxy")); tpgalview.ToolTipText = "View Galaxy"; map.displaycontrol.Add(tpgalview); tpgalview.MouseClick = (o, e1) => { g.ViewGalaxy(); }; hpos += iconsize + hpad; } if ((parts & Map.Parts.Bookmarks) != 0) { GLCheckBox butbkmks = new GLCheckBox("MSTPBookmarks", new Rectangle(hpos, vpos, iconsize, iconsize), BaseUtils.Icons.IconSet.GetBitmap("GalMap.ShowBookmarks"), null); butbkmks.ToolTipText = "Show bookmark list"; butbkmks.CheckOnClick = true; butbkmks.CheckChanged += (e1) => { g.ToggleBookmarkList(butbkmks.Checked); }; map.displaycontrol.Add(butbkmks); hpos += butbkmks.Width + hpad; } if ((parts & Map.Parts.SearchBox) != 0) { EntryTextBox = new GLTextBoxAutoComplete("MSTPEntryText", new Rectangle(hpos, vpos, 300, iconsize), ""); EntryTextBox.TextAlign = ContentAlignment.MiddleLeft; EntryTextBox.BackColor = Color.FromArgb(96, 50, 50, 50); EntryTextBox.BorderColor = Color.Gray; EntryTextBox.BorderWidth = 1; map.displaycontrol.Add(EntryTextBox); hpos += EntryTextBox.Width + hpad; } if ((parts & Map.Parts.PrepopulateEDSMLocalArea) != 0) { GLImage butpopstars = new GLImage("MSPopulate", new Rectangle(hpos, vpos, iconsize, iconsize), BaseUtils.Icons.IconSet.GetBitmap("GalMap.ShowMoreStars")); butpopstars.ToolTipText = "Load star box at current look location"; butpopstars.MouseClick = (o, e1) => { g.AddMoreStarsAtLookat(); }; map.displaycontrol.Add(butpopstars); hpos += butpopstars.Width + hpad; } DBStatus = new GLImage("MSDB", new Rectangle(hpos, vpos, iconsize, iconsize), BaseUtils.Icons.IconSet.GetBitmap("GalMap.db")); DBStatus.Dock = DockingType.BottomRight; DBStatus.ToolTipText = "Reading from DB"; DBStatus.Visible = false; map.displaycontrol.Add(DBStatus); status = new GLLabel("Status", new Rectangle(leftmargin, 500, 600, 24), "x"); status.Dock = DockingType.BottomLeft; status.ForeColor = Color.Orange; status.BackColor = Color.FromArgb(50, 50, 50, 50); map.displaycontrol.Add(status); GLToolTip maintooltip = new GLToolTip("MTT", Color.FromArgb(180, 50, 50, 50)); maintooltip.ForeColor = Color.Orange; map.displaycontrol.Add(maintooltip); // detect mouse press with menu open and close it map.displaycontrol.GlobalMouseDown += (ctrl, e) => { // if map open, and no ctrl hit or ctrl is not a child of galmenu if (map.displaycontrol["Galmenu"] != null && (ctrl == null || !map.displaycontrol["Galmenu"].IsThisOrChildOf(ctrl))) { ((GLForm)map.displaycontrol["Galmenu"]).Close(); } }; }
public MapMenu(Map g) { map = g; GLBaseControl.Themer = Theme; // names of MS* are on screen items hidden during main menu presentation GLImage menuimage = new GLImage("MSMainMenu", new Rectangle(10, 10, iconsize, iconsize), Properties.Resources.hamburgermenu); menuimage.ToolTipText = "Open configuration menu"; map.displaycontrol.Add(menuimage); menuimage.MouseClick = (o, e1) => { ShowMenu(); }; GLImage tpback = new GLImage("MSTPBack", new Rectangle(50, 10, iconsize, iconsize), Properties.Resources.GoBackward); tpback.ToolTipText = "Go back one system"; map.displaycontrol.Add(tpback); tpback.MouseClick = (o, e1) => { g.GoToTravelSystem(-1); }; GLImage tphome = new GLImage("MSTPHome", new Rectangle(90, 10, iconsize, iconsize), Properties.Resources.GoToHomeSystem); tphome.ToolTipText = "Go to current home system"; map.displaycontrol.Add(tphome); tphome.MouseClick = (o, e1) => { g.GoToTravelSystem(0); }; GLImage tpforward = new GLImage("MSTPForward", new Rectangle(130, 10, iconsize, iconsize), Properties.Resources.GoForward); tpforward.ToolTipText = "Go forward one system"; map.displaycontrol.Add(tpforward); tpforward.MouseClick = (o, e1) => { g.GoToTravelSystem(1); }; GLTextBoxAutoComplete tptextbox = new GLTextBoxAutoComplete(EntryTextName, new Rectangle(170, 10, 300, iconsize), ""); tptextbox.TextAlign = ContentAlignment.MiddleLeft; tptextbox.BackColor = Color.FromArgb(96, 50, 50, 50); tptextbox.BorderColor = Color.Gray; tptextbox.BorderWidth = 1; map.displaycontrol.Add(tptextbox); GLToolTip maintooltip = new GLToolTip("MTT", Color.FromArgb(180, 50, 50, 50)); maintooltip.ForeColor = Color.Orange; map.displaycontrol.Add(maintooltip); status = new GLLabel("Status", new Rectangle(10, 500, 600, 24), "x"); status.Dock = DockingType.BottomLeft; status.ForeColor = Color.Orange; status.BackColor = Color.FromArgb(50, 50, 50, 50); map.displaycontrol.Add(status); // detect mouse press with menu open and close it map.displaycontrol.GlobalMouseDown += (ctrl, e) => { // if map open, and no ctrl hit or ctrl is not a child of galmenu if (map.displaycontrol["Galmenu"] != null && (ctrl == null || !map.displaycontrol["Galmenu"].IsThisOrChildOf(ctrl))) { ((GLForm)map.displaycontrol["Galmenu"]).Close(); } }; }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Closed += ShaderTest_Closed; items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block int front = -20000, back = front + 90000, left = -45000, right = left + 90000, vsize = 2000; Vector4[] displaylines = new Vector4[] { new Vector4(left, -vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, front, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, +vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, -vsize, back, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, -vsize, front, 1), new Vector4(left, -vsize, back, 1), new Vector4(left, +vsize, front, 1), new Vector4(left, +vsize, back, 1), new Vector4(right, -vsize, front, 1), new Vector4(right, -vsize, back, 1), new Vector4(right, +vsize, front, 1), new Vector4(right, +vsize, back, 1), }; GLRenderState rl = GLRenderState.Lines(1); { items.Add(new GLFixedShader(System.Drawing.Color.Yellow), "LINEYELLOW"); rObjects.Add(items.Shader("LINEYELLOW"), GLRenderableItem.CreateVector4(items, PrimitiveType.Lines, rl, displaylines)); } float h = 0; if (h != -1) { items.Add(new GLColorShaderWorld(), "COS-1L"); int dist = 1000; Color cr = Color.FromArgb(100, Color.White); rObjects.Add(items.Shader("COS-1L"), // horizontal GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateLines(new Vector3(left, h, front), new Vector3(left, h, back), new Vector3(dist, 0, 0), (back - front) / dist + 1), new Color4[] { cr }) ); rObjects.Add(items.Shader("COS-1L"), GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl, GLShapeObjectFactory.CreateLines(new Vector3(left, h, front), new Vector3(right, h, front), new Vector3(0, 0, dist), (right - left) / dist + 1), new Color4[] { cr }) ); } { items.Add(new GLTexturedShaderObjectTranslation(), "TEX"); items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "dotted2"); GLRenderState rt = GLRenderState.Tri(); rObjects.Add(items.Shader("TEX"), GLRenderableItem.CreateVector4Vector2(items, OpenTK.Graphics.OpenGL4.PrimitiveType.Triangles, rt, GLCubeObjectFactory.CreateSolidCubeFromTriangles(2000f), GLCubeObjectFactory.CreateCubeTexTriangles(), new GLRenderDataTranslationRotationTexture(items.Tex("dotted2"), new Vector3(-2, 0, 0)) )); } { items.Add(new GLFixedColorShaderWorld(Color.FromArgb(150, Color.Green)), "FCS1"); items.Add(new GLFixedColorShaderWorld(Color.FromArgb(80, Color.Red)), "FCS2"); GLRenderState rq = GLRenderState.Quads(); rObjects.Add(items.Shader("FCS1"), GLRenderableItem.CreateVector4(items, OpenTK.Graphics.OpenGL4.PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000, pos: new Vector3(4000, 500, 0)))); rObjects.Add(items.Shader("FCS2"), GLRenderableItem.CreateVector4(items, OpenTK.Graphics.OpenGL4.PrimitiveType.Quads, rq, GLShapeObjectFactory.CreateQuad(1000, pos: new Vector3(4000, 1000, 0)))); } MatrixCalcSpecial mc = new MatrixCalcSpecial(); mc.PerspectiveNearZDistance = 1f; mc.PerspectiveFarZDistance = 500000f; mc.ResizeViewPort(this, glwfc.Size); // must establish size before starting displaycontrol = new GLControlDisplay(items, glwfc, mc); // 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"; GLForm pform = new GLForm("Form1", "GL Control demonstration", new Rectangle(0, 0, 1000, 850)); // pform.BackColor = Color.FromArgb(200, Color.Red); //pform.BackColorGradientDir = 90; //pform.BackColorGradientAlt = Color.FromArgb(200, Color.Yellow); displaycontrol.Add(pform); if (true) { GLPanel p1 = new GLPanel("P3", new Size(150, 150), DockingType.TopLeft, 0); p1.SetMarginBorderWidth(new MarginType(1), 1, Color.Black, new PaddingType(1)); pform.Add(p1); } if (true) { GLTableLayoutPanel ptable = new GLTableLayoutPanel("tablelayout", new Rectangle(5, 200, 190, 190)); ptable.Margin = new MarginType(2); ptable.Padding = new PaddingType(2); ptable.BorderWidth = 1; ptable.Rows = new List <GLTableLayoutPanel.Style> { new GLTableLayoutPanel.Style(GLTableLayoutPanel.Style.SizeTypeEnum.Weight, 50), new GLTableLayoutPanel.Style(GLTableLayoutPanel.Style.SizeTypeEnum.Weight, 50) }; ptable.Columns = new List <GLTableLayoutPanel.Style> { new GLTableLayoutPanel.Style(GLTableLayoutPanel.Style.SizeTypeEnum.Weight, 50), new GLTableLayoutPanel.Style(GLTableLayoutPanel.Style.SizeTypeEnum.Weight, 50) }; pform.Add(ptable); GLImage pti1 = new GLImage("PTI1", new Rectangle(0, 0, 24, 24), Properties.Resources.dotted); pti1.Column = 0; pti1.Row = 0; pti1.Dock = DockingType.Fill; ptable.Add(pti1); GLImage pti2 = new GLImage("PTI2", new Rectangle(100, 0, 24, 24), Properties.Resources.dotted2); pti2.Column = 1; pti1.Row = 0; ptable.Add(pti2); GLImage pti3 = new GLImage("PTI3", new Rectangle(100, 0, 48, 48), Properties.Resources.ImportSphere); pti3.Column = 0; pti3.Row = 1; pti3.Dock = DockingType.LeftCenter; pti3.ImageStretch = true; ptable.Add(pti3); GLImage pti4 = new GLImage("PTI4", new Rectangle(100, 0, 64, 64), Properties.Resources.Logo8bpp); pti4.Column = 1; pti4.Row = 1; pti4.Dock = DockingType.Center; ptable.Add(pti4); } if (true) { GLFlowLayoutPanel pflow1 = new GLFlowLayoutPanel("flowlayout", new Rectangle(5, 400, 190, 190)); pflow1.SetMarginBorderWidth(new MarginType(2), 1, Color.Black, new PaddingType(2)); pflow1.FlowPadding = new PaddingType(10, 5, 0, 0); pform.Add(pflow1); GLImage pti1 = new GLImage("PTI1", new Rectangle(0, 0, 24, 24), Properties.Resources.dotted); pflow1.Add(pti1); GLImage pti2 = new GLImage("PTI2", new Rectangle(100, 0, 32, 32), Properties.Resources.dotted2); pflow1.Add(pti2); GLImage pti3 = new GLImage("PTI3", new Rectangle(100, 0, 48, 48), Properties.Resources.ImportSphere); pflow1.Add(pti3); GLImage pti4 = new GLImage("PTI4", new Rectangle(100, 0, 64, 64), Properties.Resources.Logo8bpp); pflow1.Add(pti4); } if (true) { GLScrollPanel sp1 = new GLScrollPanel("VSP1", new Rectangle(5, 600, 200, 200)); sp1.BorderWidth = 1; sp1.BackColor = Color.Yellow; // sp1.SetMarginBorderWidth(new Margin(2), 1, Color.Black, new GLOFC.GL4.Controls.Padding(2)); pform.Add(sp1); GLImage sp1i1 = new GLImage("SP1I1", new Rectangle(0, 0, 190, 100), Properties.Resources.dotted); sp1.Add(sp1i1); GLImage sp1i2 = new GLImage("SP1I22", new Rectangle(10, 150, 100, 100), Properties.Resources.dotted); sp1.Add(sp1i2); GLImage sp1i3 = new GLImage("SP1I23", new Rectangle(100, 100, 200, 200), Properties.Resources.dotted2); sp1.Add(sp1i3); sp1.VertScrollPos = 0; sp1.HorzScrollPos = 0; GLScrollBar sb1 = new GLScrollBar("SB1", new Rectangle(220, 600, 20, 100), 0, 200); sb1.Scroll += (c, s1e) => sp1.VertScrollPos = s1e.NewValue; pform.Add(sb1); GLScrollBar sb2 = new GLScrollBar("SB2", new Rectangle(260, 600, 100, 20), 0, 200); sb2.HorizontalScroll = true; sb2.Scroll += (c, s1e) => sp1.HorzScrollPos = s1e.NewValue; pform.Add(sb2); } int col2 = 200; if (true) { GLScrollPanelScrollBar spb1 = new GLScrollPanelScrollBar("CSPan", new Rectangle(col2, 5, 190, 190)); spb1.ScrollBackColor = Color.Yellow; spb1.SetMarginBorderWidth(new MarginType(2), 1, Color.Black, new PaddingType(2)); pform.Add(spb1); GLImage spb1i1 = new GLImage("SPB1I1", new Rectangle(10, 10, 100, 100), Properties.Resources.dotted); spb1.Add(spb1i1); GLButton but = new GLButton("SPB1BUT1", new Rectangle(40, 120, 40, 20), "But1"); but.Click += (en, eb) => { System.Diagnostics.Debug.WriteLine("Click on SP Button"); }; spb1.Add(but); GLImage spb1i2 = new GLImage("SPB1I2", new Rectangle(10, 150, 100, 100), Properties.Resources.dotted); spb1.Add(spb1i2); spb1.EnableHorzScrolling = false; } { GLButton but = new GLButton("ButExample", new Rectangle(40, 160, 40, 20), "But1"); but.Click += (en, eb) => { System.Diagnostics.Debug.WriteLine("Click on SP Button"); }; pform.Add(but); } int col3 = 400; if (true) { GLScrollPanelScrollBar spb1 = new GLScrollPanelScrollBar("CSPan2", new Rectangle(col3, 5, 190, 190)); spb1.ScrollBackColor = Color.Blue; spb1.ScrollBarTheme.ThumbButtonColor = Color.Red; spb1.SetMarginBorderWidth(new MarginType(2), 1, Color.Black, new PaddingType(2)); pform.Add(spb1); GLImage spb1i1 = new GLImage("SPB1I1", new Rectangle(10, 10, 100, 100), Properties.Resources.dotted); spb1.Add(spb1i1); GLImage spb1i2 = new GLImage("SPB1I2", new Rectangle(10, 120, 100, 100), Properties.Resources.dotted); spb1.Add(spb1i2); GLImage spb1i3 = new GLImage("SPB1I3", new Rectangle(150, 50, 100, 100), Properties.Resources.dotted2); spb1.Add(spb1i3); } if (true) { //GLGroupBox p3 = new GLGroupBox("GB1", "Group Box Very Long Title", new Rectangle(col2,200,190,190)); GLGroupBox p3 = new GLGroupBox("GB1", "Group Box", new Rectangle(col2, 200, 190, 190)); p3.TextAlign = ContentAlignment.MiddleRight; p3.AutoSize = true; GLImage spb1i1 = new GLImage("SPB1I1", new Rectangle(10, 10, 100, 100), Properties.Resources.dotted); p3.Add(spb1i1); pform.Add(p3); } if (true) { GLTabControl tc = new GLTabControl("Tabc", new Rectangle(col2, 400, 200, 190)); tc.TabNotSelectedColor = Color.Yellow; tc.TabSelectedColor = Color.Red; tc.TabStyle = new TabStyleRoundedEdge(); //tc.TabStyle = new TabStyleSquare(); //tc.TabStyle = new TabStyleAngled(); tc.Font = new Font("Ms Sans Serif", 9); GLTabPage tabp1 = new GLTabPage("tabp1", "TAB 1", Color.Blue); tc.Add(tabp1); GLButton tabp1b1 = new GLButton("B1", new Rectangle(5, 5, 80, 40), "Button 1"); tabp1.Add(tabp1b1); tabp1b1.Click += (c, ev) => { System.Diagnostics.Debug.WriteLine("On click for " + c.Name + " " + ev.Button); }; tabp1b1.ToolTipText = "Button 1"; GLTabPage tabp2 = new GLTabPage("tabp2", "TAB Page 2", Color.Yellow); GLButton tabp2b1 = new GLButton("B2-2", new Rectangle(5, 25, 80, 40), "Button 2-2"); tabp2.Add(tabp2b1); tc.Add(tabp2); GLTabPage tabp3 = new GLTabPage("tabp3", "TAB Page 3", Color.Green); tc.Add(tabp3); GLTabPage tabp4 = new GLTabPage("tabp4", "TAB Page 4", Color.Magenta); tc.Add(tabp4); pform.Add(tc); // tc.SelectedTab = 0; GLButton tabselnone = new GLButton("BTSN", new Rectangle(col2 + 200 + 5, 400, 40, 15), "None"); tabselnone.Click += (c12, ev2) => { tc.SelectedTab = -1; }; pform.Add(tabselnone); } if (true) { GLPanel pouter = new GLPanel("outerflow", new Rectangle(col3, 200, 1300, 30)); // make it very wide, so the child has all the width it wants to flow into pouter.SetMarginBorderWidth(new MarginType(5), 1, Color.Blue, new PaddingType(5)); pouter.AutoSize = true; GLFlowLayoutPanel pflow2; pflow2 = new GLFlowLayoutPanel("Flowlayout2", new Rectangle(0, 0, 10, 10)); pflow2.AutoSize = true; pflow2.Margin = new MarginType(2); pflow2.Padding = new PaddingType(2); pflow2.BorderWidth = 1; pflow2.FlowPadding = new PaddingType(10, 5, 0, 5); GLImage pti1 = new GLImage("PTI1", new Rectangle(0, 0, 24, 24), Properties.Resources.dotted2); pflow2.Add(pti1); GLImage pti2 = new GLImage("PTI2", new Rectangle(0, 0, 32, 32), Properties.Resources.dotted2); pflow2.Add(pti2); GLImage pti3 = new GLImage("PTI3", new Rectangle(0, 0, 48, 48), Properties.Resources.ImportSphere); pflow2.Add(pti3); for (int i = 0; i < 5; i++) { GLImage pti4 = new GLImage("PTI00" + i, new Rectangle(0, 0, 64, 64), Properties.Resources.Logo8bpp); pflow2.Add(pti4); } pouter.Add(pflow2); pform.Add(pouter); } { GLToolTip tip = new GLToolTip("ToolTip"); displaycontrol.Add(tip); } gl3dcontroller = new Controller3D(); gl3dcontroller.ZoomDistance = 5000F; gl3dcontroller.YHoldMovement = true; gl3dcontroller.PaintObjects = Controller3dDraw; gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) => { return((float)ms * 10.0f); }; gl3dcontroller.MatrixCalc.InPerspectiveMode = true; if (displaycontrol != null) { gl3dcontroller.Start(mc, displaycontrol, new Vector3(0, 0, 10000), new Vector3(140.75f, 0, 0), 0.5F); // HOOK the 3dcontroller to the form so it gets Form events displaycontrol.Paint += (o, ts) => // subscribing after start means we paint over the scene, letting transparency work { //System.Diagnostics.Debug.WriteLine(ts + " Render"); displaycontrol.Render(glwfc.RenderState, ts); // we use the same matrix calc as done in controller 3d draw }; } else { gl3dcontroller.Start(glwfc, new Vector3(0, 0, 10000), new Vector3(140.75f, 0, 0), 0.5F); // HOOK the 3dcontroller to the form so it gets Form events } systemtimer.Interval = 25; systemtimer.Tick += new EventHandler(SystemTick); systemtimer.Start(); }