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 }) ); } GLMatrixCalc mc = new GLMatrixCalc(); 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"; displaycontrol.Font = new Font("Times", 8); GLForm pform; if (true) { pform = new GLForm("Form1", "GL Form demonstration", new Rectangle(0, 0, 1000, 800)); //pform.BackColor = Color.FromArgb(200, Color.Red); //pform.Opacity = 0.7f; // pform.BackColorGradientDir = 90; // pform.BackColorGradientAlt = Color.FromArgb(200, Color.Yellow); //pform.ScaleWindow = new SizeF(0.75f, 0.75f); //pform.AlternatePos = new RectangleF(100, 100, 500, 400); //pform.AlternatePos = new RectangleF(100, 100, 1200, 1000); // pform.ScaleWindow = new SizeF(0.0f, 0.0f); // pform.Animators.Add(new AnimateScale(100, 1000, true, new SizeF(1, 1),removeafterend:true)); // pform.Animators.Add(new AnimateTranslate(glwfc.ElapsedTimems + 100, glwfc.ElapsedTimems + 1000, false, new Point(100, 100), removeafterend: true)); // pform.Animators.Add(new AnimateOpacity(glwfc.ElapsedTimems + 100, glwfc.ElapsedTimems + 2000, false, 1.0f,0.0f, removeafterend: true)); int taborder = 0; if (true) { GLLabel lab1 = new GLLabel("Lab1", new Rectangle(400, 0, 0, 0), "From Check"); pform.Add(lab1); GLButton b1 = new GLButton("B1", new Rectangle(5, 10, 80, 30), "Configuration Dialog"); b1.Margin = new MarginType(2); b1.AutoSize = true; b1.TabOrder = taborder++; b1.Padding = new PaddingType(5); b1.Click += (c, ev) => { ConfDialog(); }; b1.ToolTipText = "Button 1 tip\r\nLine 2 of it"; pform.Add(b1); GLButton b2 = new GLButton("B2", new Rectangle(5, 50, 0, 0), "Msg1"); b2.Image = Properties.Resources.ImportSphere; b2.TabOrder = taborder++; b2.ImageAlign = ContentAlignment.MiddleLeft; b2.TextAlign = ContentAlignment.MiddleRight; b2.Click += (c, ev) => { MsgDialog1(); }; b2.ToolTipText = "Button 2 tip\r\nLine 2 of it"; pform.Add(b2); GLButton b3 = new GLButton("B3", new Rectangle(100, 10, 80, 30), "Font"); b3.Margin = new MarginType(2); b3.TabOrder = taborder++; b3.Padding = new PaddingType(5); b3.ToolTipText = "Button 3 tip\r\nLine 2 of it"; b3.Click += (c, ev) => { displaycontrol.Font = new Font("Times", 12); }; pform.Add(b3); GLButton b4 = new GLButton("B4", new Rectangle(100, 50, 80, 30), "Msg2"); b4.TabOrder = taborder++; b4.Padding = new PaddingType(2); b4.ToolTipText = "Button 4 tip\r\nLine 2 of it"; b4.Click += (c, ev) => { MsgDialog2(); }; pform.Add(b4); GLButton b5 = new GLButton("B5", new Rectangle(200, 10, 80, 30), "Conf2"); b5.TabOrder = taborder++; b5.Padding = new PaddingType(2); b5.ToolTipText = "Button 5 tip\r\nLine 2 of it"; b5.Click += (c, ev) => { ConfDialog2(); }; pform.Add(b5); GLButton b6 = new GLButton("B3", new Rectangle(200, 50, 80, 30), "Disabled"); b6.TabOrder = taborder++; b6.ToolTipText = "Button 6 tip\r\nLine 2 of it"; b6.Enabled = false; pform.Add(b6); } if (true) { GLComboBox cb1 = new GLComboBox("CB", new Rectangle(0, 100, 0, 0), new List <string>() { "one", "two", "three" }); cb1.Margin = new MarginType(16, 8, 16, 8); cb1.TabOrder = taborder++; cb1.ToolTipText = "Combo Box"; pform.Add(cb1); GLComboBox cbstars = new GLComboBox("GalaxyStarsNumber", new Rectangle(100, 100, 100, 32)); cbstars.ToolTipText = "Control how many stars are shown when zoomes in"; cbstars.Items = new List <string>() { "Ultra", "High", "Medium", "Low" }; cbstars.TabOrder = taborder++; var list = new List <int>() { 1000000, 500000, 250000, 100000 }; int itemno = 1; cbstars.SelectedIndex = itemno >= 0 ? itemno : 1; // high default pform.Add(cbstars); } if (true) { GLCheckBox chk1 = new GLCheckBox("Checkbox1", new Rectangle(0, 150, 0, 0), "Normal"); chk1.Margin = new MarginType(16, 0, 0, 0); chk1.TabOrder = taborder++; pform.Add(chk1); GLCheckBox chk2 = new GLCheckBox("Checkbox2", new Rectangle(100, 150, 0, 0), "Radio"); chk2.Appearance = GLCheckBox.CheckBoxAppearance.Radio; chk2.TabOrder = taborder++; chk2.Checked = true; pform.Add(chk2); GLCheckBox chk3 = new GLCheckBox("Checkbox3", new Rectangle(200, 150, 0, 0), "Button"); chk3.Appearance = GLCheckBox.CheckBoxAppearance.Button; chk3.TabOrder = taborder++; chk3.BackColor = Color.FromArgb(200, 200, 200); pform.Add(chk3); GLCheckBox chk4 = new GLCheckBox("Checkbox4", new Rectangle(300, 150, 0, 0), ""); chk4.TabOrder = taborder++; pform.Add(chk4); GLCheckBox chk5 = new GLCheckBox("Checkbox5", new Rectangle(350, 150, 0, 0), "R1"); chk5.Appearance = GLCheckBox.CheckBoxAppearance.Radio; chk5.GroupRadioButton = true; chk5.TabOrder = taborder++; pform.Add(chk5); GLCheckBox chk6 = new GLCheckBox("Checkbox6", new Rectangle(400, 150, 0, 0), "R2"); chk6.Appearance = GLCheckBox.CheckBoxAppearance.Radio; chk6.GroupRadioButton = true; chk6.TabOrder = taborder++; pform.Add(chk6); GLCheckBox chk7 = new GLCheckBox("Checkbox7", new Rectangle(0, 175, 0, 0), "Disabled"); chk7.TabOrder = taborder++; chk7.Enabled = false; pform.Add(chk7); GLCheckBox chk8 = new GLCheckBox("Checkbox8", new Rectangle(100, 175, 0, 0), "Disabled"); chk8.Appearance = GLCheckBox.CheckBoxAppearance.Radio; chk8.TabOrder = taborder++; chk8.Enabled = false; pform.Add(chk8); GLCheckBox chk9 = new GLCheckBox("Checkbox9", new Rectangle(200, 175, 0, 0), "CDisabled"); chk9.TabOrder = taborder++; chk9.Enabled = false; chk9.Checked = true; pform.Add(chk9); GLCheckBox chk10 = new GLCheckBox("Checkbox10", new Rectangle(300, 175, 0, 0), "CDisabled"); chk10.Appearance = GLCheckBox.CheckBoxAppearance.Radio; chk10.TabOrder = taborder++; chk10.Enabled = false; chk10.Checked = true; pform.Add(chk10); } if (true) { GLDateTimePicker dtp = new GLDateTimePicker("DTP", new Rectangle(0, 210, 500, 30), DateTime.Now); dtp.Culture = System.Globalization.CultureInfo.GetCultureInfo("de-AT"); dtp.Format = GLDateTimePicker.DateTimePickerFormat.Long; //dtp.CustomFormat = "'start' dddd 'hello there' MMMM' and here 'yyyy"; dtp.Font = new Font("Ms Sans Serif", 11); dtp.ShowCheckBox = true; dtp.ShowCalendar = true; dtp.ShowUpDown = true; dtp.AutoSize = true; //dtp.Culture = CultureInfo.GetCultureInfo("es"); dtp.TabOrder = taborder++; pform.Add(dtp); } if (true) { List <string> i1 = new List <string>() { "one two three four five six seven eight", "two", "three", "four", "five", "six", "seven is very long too to check", "eight", "nine", "ten", "eleven", "twelve" }; GLListBox lb1 = new GLListBox("LB1", new Rectangle(0, 260, 260, 100), i1); lb1.Font = new Font("Microsoft Sans Serif", 12f); lb1.TabOrder = taborder++; lb1.ShowFocusBox = true; lb1.ScrollBarTheme.SliderColor = Color.AliceBlue; lb1.ScrollBarTheme.ThumbButtonColor = Color.Blue; //lb1.FitToItemsHeight = false; pform.Add(lb1); lb1.SelectedIndexChanged += (s, si) => { System.Diagnostics.Debug.WriteLine("Selected index " + si); }; } if (true) { GLUpDownControl upc1 = new GLUpDownControl("UPC1", new Rectangle(0, 600, 26, 46)); upc1.TabOrder = taborder++; pform.Add(upc1); upc1.Clicked += (s, upe) => System.Diagnostics.Debug.WriteLine("Up down control {0} {1}", s.Name, upe); } if (true) { GLCalendar cal = new GLCalendar("Cal", new Rectangle(500, 10, 300, 200)); cal.TabOrder = taborder++; //cal.Culture = CultureInfo.GetCultureInfo("es"); cal.AutoSize = true; cal.Font = new Font("Arial", 10); pform.Add(cal); } if (true) { GLNumberBoxFloat glf = new GLNumberBoxFloat("FLOAT", new Rectangle(500, 250, 100, 25), 23.4f); glf.BackColor = Color.AliceBlue; glf.TabOrder = taborder++; glf.Font = new Font("Ms Sans Serif", 12); glf.Minimum = -1000; glf.Maximum = 1000; glf.ValueChanged += (a) => { System.Diagnostics.Debug.WriteLine("GLF value changed"); }; glf.ValidityChanged += (a, b) => { System.Diagnostics.Debug.WriteLine($"GLF validity changed {b}"); }; pform.Add(glf); GLButton glfbut = new GLButton("FLOATBUT", new Rectangle(610, 250, 40, 15), "Value"); glfbut.Click += (e1, b1) => { glf.Value = 20.22f; }; pform.Add(glfbut); GLTextBoxAutoComplete gla = new GLTextBoxAutoComplete("ACTB", new Rectangle(500, 300, 100, 25)); gla.TabOrder = taborder++; gla.Font = new Font("Ms Sans Serif", 12); gla.PerformAutoCompleteInThread += (s, a, set) => { var r = new List <string>() { "one", "two", "three" }; foreach (var x in r) { if (x.StartsWith(s) || s.IsEmpty()) { set.Add(x); } } }; gla.SelectedEntry += (s) => { System.Diagnostics.Debug.WriteLine($"Autocomplete selected {s.Text}"); }; pform.Add(gla); } if (true) { GLButton b1 = new GLButton("BD1", new Rectangle(5, 10, 80, 30), "Bottom 1"); b1.TabOrder = taborder++; b1.Dock = DockingType.Bottom; displaycontrol.Add(b1); GLButton b2 = new GLButton("BD2", new Rectangle(5, 10, 80, 30), "Bottom 2"); b2.TabOrder = taborder++; b2.Dock = DockingType.Bottom; displaycontrol.Add(b2); } displaycontrol.Add(pform); } if (true) { GLForm pform2 = new GLForm("Form2", "Form 2 GL Control demonstration", new Rectangle(1100, 0, 400, 400)); pform2.BackColor = Color.FromArgb(200, Color.Red); pform2.Font = new Font("Ms sans serif", 10); pform2.BackColorGradientDir = 90; pform2.BackColorGradientAlt = Color.FromArgb(200, Color.Blue); displaycontrol.Add(pform2); GLButton b1 = new GLButton("*********** F2B1", new Rectangle(5, 10, 80, 30), "F2B1"); pform2.Add(b1); } if (true) { GLToolTip tip = new GLToolTip("ToolTip"); displaycontrol.Add(tip); } displaycontrol.GlobalMouseDown += (ctrl, ex) => { if (ctrl == null || !pform.IsThisOrChildOf(ctrl)) { // System.Diagnostics.Debug.WriteLine("Not on form"); } else { // System.Diagnostics.Debug.WriteLine("Click on form"); } }; 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 { 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.Start(); }
public void Start(GLOFC.WinForm.GLWinFormControl glwfc, GalacticMapping edsmmapping, GalacticMapping eliteregions) { this.glwfc = glwfc; this.edsmmapping = edsmmapping; this.elitemapping = eliteregions; hptimer.Start(); items.Add(new GLMatrixCalcUniformBlock(), "MCUB"); // create a matrix uniform block int lyscale = 1; int front = -20000 / lyscale, back = front + 90000 / lyscale, left = -45000 / lyscale, right = left + 90000 / lyscale, vsize = 2000 / lyscale; if (false) // debug bounding box { 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 GLShaderPipeline(new GLPLVertexShaderWorldCoord(), new GLPLFragmentShaderFixedColor(Color.Yellow)), "LINEYELLOW"); rObjects.Add(items.Shader("LINEYELLOW"), GLRenderableItem.CreateVector4(items, PrimitiveType.Lines, rl, displaylines)); items.Add(new GLColorShaderWorld(), "COS-1L"); float h = 0; int dist = 1000 / lyscale; 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 OpenTK.Graphics.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 OpenTK.Graphics.Color4[] { cr }) ); rObjects.Add(new GLOperationClearDepthBuffer()); } int ctrlo = 2048 | 32 | 64; ctrlo = -1; if ((ctrlo & 1) != 0) // galaxy { volumetricboundingbox = new Vector4[] { 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(left, -vsize, back, 1), new Vector4(left, vsize, back, 1), new Vector4(right, vsize, back, 1), new Vector4(right, -vsize, back, 1), }; const int gnoisetexbinding = 3; //tex bindings are attached per shaders so are not global const int gdisttexbinding = 4; const int galtexbinding = 1; volumetricblock = new GLVolumetricUniformBlock(volumenticuniformblock); items.Add(volumetricblock, "VB"); int sc = 1; GLTexture3D noise3d = new GLTexture3D(1024 * sc, 64 * sc, 1024 * sc, OpenTK.Graphics.OpenGL4.SizedInternalFormat.R32f); // red channel only items.Add(noise3d, "Noise"); ComputeShaderNoise3D csn = new ComputeShaderNoise3D(noise3d.Width, noise3d.Height, noise3d.Depth, 128 * sc, 16 * sc, 128 * sc, gnoisetexbinding); // must be a multiple of localgroupsize in csn csn.StartAction += (A, m) => { noise3d.BindImage(gnoisetexbinding); }; csn.Run(); // compute noise csn.Dispose(); GLTexture1D gaussiantex = new GLTexture1D(1024, OpenTK.Graphics.OpenGL4.SizedInternalFormat.R32f); // red channel only items.Add(gaussiantex, "Gaussian"); // set centre=width, higher widths means more curve, higher std dev compensate. // fill the gaussiantex with data ComputeShaderGaussian gsn = new ComputeShaderGaussian(gaussiantex.Width, 2.0f, 2.0f, 1.4f, gdisttexbinding); gsn.StartAction += (A, m) => { gaussiantex.BindImage(gdisttexbinding); }; gsn.Run(); // compute noise gsn.Dispose(); GL.MemoryBarrier(MemoryBarrierFlags.AllBarrierBits); // load one upside down and horz flipped, because the volumetric co-ords are 0,0,0 bottom left, 1,1,1 top right GLTexture2D galtex = new GLTexture2D(Properties.Resources.Galaxy_L180, SizedInternalFormat.Rgba8); items.Add(galtex, "galtex"); galaxyshader = new GalaxyShader(volumenticuniformblock, galtexbinding, gnoisetexbinding, gdisttexbinding); items.Add(galaxyshader, "Galaxy-sh"); // bind the galaxy texture, the 3dnoise, and the gaussian 1-d texture for the shader galaxyshader.StartAction += (a, m) => { galtex.Bind(galtexbinding); noise3d.Bind(gnoisetexbinding); gaussiantex.Bind(gdisttexbinding); }; // shader requires these, so bind using shader GLRenderState rt = GLRenderState.Tri(); galaxyrenderable = GLRenderableItem.CreateNullVertex(OpenTK.Graphics.OpenGL4.PrimitiveType.Points, rt); // no vertexes, all data from bound volumetric uniform, no instances as yet rObjects.Add(galaxyshader, "galshader", galaxyrenderable); } if ((ctrlo & 2) != 0) { var corr = new GalMapRegions.ManualCorrections[] { // nerf the centeroid position slightly new GalMapRegions.ManualCorrections("The Galactic Aphelion", y: -2000), new GalMapRegions.ManualCorrections("The Abyss", y: +3000), new GalMapRegions.ManualCorrections("Eurus", y: -3000), new GalMapRegions.ManualCorrections("The Perseus Transit", x: -3000, y: -3000), new GalMapRegions.ManualCorrections("Zephyrus", x: 0, y: 2000), }; edsmgalmapregions = new GalMapRegions(); edsmgalmapregions.CreateObjects("edsmregions", items, rObjects, edsmmapping, 8000, corr: corr); } if ((ctrlo & 4) != 0) { elitemapregions = new GalMapRegions(); elitemapregions.CreateObjects("eliteregions", items, rObjects, eliteregions, 8000); EliteRegionsEnable = false; } if ((ctrlo & 8) != 0) { int gran = 8; Bitmap img = Properties.Resources.Galaxy_L180; Bitmap heat = img.Function(img.Width / gran, img.Height / gran, mode: GLOFC.Utils.BitMapHelpers.BitmapFunction.HeatMap); heat.Save(@"c:\code\heatmap.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); Random rnd = new Random(23); GLBuffer buf = items.NewBuffer(16 * 350000, false); // since RND is fixed, should get the same number every time. buf.StartWrite(0); // get a ptr to the whole schebang int xcw = (right - left) / heat.Width; int zch = (back - front) / heat.Height; int points = 0; for (int x = 0; x < heat.Width; x++) { for (int z = 0; z < heat.Height; z++) { int i = heat.GetPixel(x, z).R; if (i > 32) { int gx = left + x * xcw; int gz = front + z * zch; float dx = (float)Math.Abs(gx) / 45000; float dz = (float)Math.Abs(25889 - gz) / 45000; double d = Math.Sqrt(dx * dx + dz * dz); // 0 - 0.1412 d = 1 - d; // 1 = centre, 0 = unit circle d = d * 2 - 1; // -1 to +1 double dist = ObjectExtensionsNumbersBool.GaussianDist(d, 1, 1.4); int c = Math.Min(Math.Max(i * i * i / 120000, 1), 40); //int c = Math.Min(Math.Max(i * i * i / 24000000, 1), 40); dist *= 2000 / lyscale; //System.Diagnostics.Debug.WriteLine("{0} {1} : dist {2} c {3}", x, z, dist, c); //System.Diagnostics.Debug.Write(c); GLPointsFactory.RandomStars4(buf, c, gx, gx + xcw, gz, gz + zch, (int)dist, (int)-dist, rnd, w: 0.8f); points += c; System.Diagnostics.Debug.Assert(points < buf.Length / 16); } } //System.Diagnostics.Debug.WriteLine("."); } buf.StopReadWrite(); stardots = new GalaxyStarDots(); items.Add(stardots); GLRenderState rc = GLRenderState.Points(1); rc.DepthTest = false; // note, if this is true, there is a wierd different between left and right in view.. not sure why rObjects.Add(stardots, "stardots", GLRenderableItem.CreateVector4(items, OpenTK.Graphics.OpenGL4.PrimitiveType.Points, rc, buf, points)); System.Diagnostics.Debug.WriteLine("Stars " + points); } rObjects.Add(new GLOperationClearDepthBuffer()); // clear depth buffer and now use full depth testing on the rest if ((ctrlo & 16) != 0) { items.Add(new GLTexture2D(Properties.Resources.StarFlare2, SizedInternalFormat.Rgba8), "lensflare"); items.Add(new GLPointSpriteShader(items.Tex("lensflare"), 64, 40), "PS"); var p = GLPointsFactory.RandomStars4(1000, 0, 25899 / lyscale, 10000 / lyscale, 1000 / lyscale, -1000 / lyscale); GLRenderState rps = GLRenderState.PointSprites(); rObjects.Add(items.Shader("PS"), "starsprites", GLRenderableItem.CreateVector4Color4(items, OpenTK.Graphics.OpenGL4.PrimitiveType.Points, rps, p, new Color4[] { Color.White })); } if ((ctrlo & 32) != 0) { gridvertshader = new DynamicGridVertexShader(Color.Cyan); //items.Add(gridvertshader, "PLGRIDVertShader"); var frag = new GLPLFragmentShaderVSColor(); //items.Add(frag, "PLGRIDFragShader"); GLRenderState rl = GLRenderState.Lines(1); items.Add(new GLShaderPipeline(gridvertshader, frag), "DYNGRID"); gridrenderable = GLRenderableItem.CreateNullVertex(OpenTK.Graphics.OpenGL4.PrimitiveType.Lines, rl, drawcount: 2); rObjects.Add(items.Shader("DYNGRID"), "DYNGRIDRENDER", gridrenderable); } if ((ctrlo & 64) != 0) { gridbitmapvertshader = new DynamicGridCoordVertexShader(); var frag = new GLPLFragmentShaderTexture2DIndexed(0); GLRenderState rl = GLRenderState.Tri(cullface: false); GLTexture2DArray gridtexcoords = new GLTexture2DArray(); items.Add(gridtexcoords, "PLGridBitmapTextures"); GLShaderPipeline sp = new GLShaderPipeline(gridbitmapvertshader, frag); items.Add(sp, "DYNGRIDBitmap"); rObjects.Add(items.Shader("DYNGRIDBitmap"), "DYNGRIDBitmapRENDER", GLRenderableItem.CreateNullVertex(OpenTK.Graphics.OpenGL4.PrimitiveType.TriangleStrip, rl, drawcount: 4, instancecount: 9)); } GLStorageBlock findresults = items.NewStorageBlock(findblock); float sunsize = .5f; if ((ctrlo & 128) != 0) { Random rnd = new Random(52); List <HistoryEntry> pos = new List <HistoryEntry>(); DateTime start = new DateTime(2020, 1, 1); Color[] colors = new Color[] { Color.Red, Color.Green, Color.Blue, Color.White, Color.Black, Color.Purple, Color.Yellow }; for (int j = 0; j <= 200; j++) { Color jc = colors[j % colors.Length]; int i = j * 10; string name = "Kyli Flyuae AA-B h" + j.ToString(); if (i < 30000) { pos.Add(new HistoryEntry(start, name, i + rnd.Next(50), rnd.Next(50), i, jc)); } else if (i < 60000) { pos.Add(new HistoryEntry(start, name, 60000 - i + rnd.Next(50), rnd.Next(50), i, jc)); } else if (i < 90000) { pos.Add(new HistoryEntry(start, name, -(i - 60000) + rnd.Next(50), rnd.Next(50), 120000 - i, jc)); } else { pos.Add(new HistoryEntry(start, name, -30000 + (i - 90000) + rnd.Next(50), rnd.Next(50), -i + 120000, jc)); } start = start.AddDays(1); } // tested to 50k stars travelpath = new TravelPath(1000); travelpath.Create(items, rObjects, pos, sunsize, sunsize, findresults, true); travelpath.SetSystem(0); } if ((ctrlo & 256) != 0) { galmapobjects = new GalMapObjects(); galmapobjects.CreateObjects(items, rObjects, edsmmapping, findresults, true); } if ((ctrlo & 512) != 0) { // galaxystars = new GalaxyStars(items, rObjects, sunsize, findresults); } if ((ctrlo & 1024) != 0) { rightclickmenu = new GLContextMenu("RightClickMenu", new GLMenuItem("RCMInfo", "Information") { MouseClick = (s, e) => { var nl = NameLocationDescription(rightclickmenu.Tag); System.Diagnostics.Debug.WriteLine($"Info {nl.Item1} {nl.Item2}"); // logical name is important as menu uses it to close down GLMessageBox msg = new GLMessageBox("InfoBoxForm-1", displaycontrol, e.WindowLocation, nl.Item3, $"{nl.Item1} @ {nl.Item2.X:#.#},{nl.Item2.Y:#.#},{nl.Item2.Z:#.#}", GLMessageBox.MessageBoxButtons.OK, null, Color.FromArgb(220, 60, 60, 70), Color.DarkOrange); } }, new GLMenuItem("RCMZoomIn", "Goto Zoom In") { MouseClick = (s1, e1) => { var nl = NameLocationDescription(rightclickmenu.Tag); gl3dcontroller.SlewToPositionZoom(nl.Item2, 100, -1); } }, new GLMenuItem("RCMGoto", "Goto Position") { MouseClick = (s1, e1) => { var nl = NameLocationDescription(rightclickmenu.Tag); System.Diagnostics.Debug.WriteLine($"Goto {nl.Item1} {nl.Item2}"); gl3dcontroller.SlewToPosition(nl.Item2, -1); } }, new GLMenuItem("RCMLookAt", "Look At") { MouseClick = (s1, e1) => { var nl = NameLocationDescription(rightclickmenu.Tag); gl3dcontroller.PanTo(nl.Item2, -1); } } ); } if ((ctrlo & 2048) != 0) { bookmarks = new Bookmarks(); var syslist = new List <SystemClass> { new SystemClass("bk1", 1000, 0, 0), new SystemClass("bk1", 1000, 0, 2000), }; bookmarks.Create(items, rObjects, syslist, 10, findresults, false); } // Matrix calc holding transform info matrixcalc = new GLMatrixCalc(); matrixcalc.PerspectiveNearZDistance = 1f; matrixcalc.PerspectiveFarZDistance = 120000f / lyscale; matrixcalc.InPerspectiveMode = true; matrixcalc.ResizeViewPort(this, glwfc.Size); // must establish size before starting // menu system displaycontrol = new GLControlDisplay(items, glwfc, matrixcalc, true, 0.00001f, 0.00001f); // hook form to the window - its the master displaycontrol.Font = new Font("Arial", 10f); displaycontrol.Focusable = true; // we want to be able to focus and receive key presses. displaycontrol.SetFocus(); // 3d controller gl3dcontroller = new Controller3D(); gl3dcontroller.PosCamera.ZoomMax = 600; // gives 5ly gl3dcontroller.ZoomDistance = 3000F / lyscale; gl3dcontroller.PosCamera.ZoomMin = 0.1f; gl3dcontroller.PosCamera.ZoomScaling = 1.1f; gl3dcontroller.YHoldMovement = true; gl3dcontroller.PaintObjects = Controller3DDraw; 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); }; // hook gl3dcontroller to display control - its the slave. Do not register mouse UI, we will deal with that. gl3dcontroller.Start(matrixcalc, displaycontrol, new Vector3(0, 0, 0), new Vector3(140.75f, 0, 0), 0.5F, false, true); //gl3dcontroller.Start(matrixcalc, displaycontrol, new Vector3(0, 0, 0), new Vector3(90F, 0, 0), 0.5F, false, true); if (displaycontrol != null) { 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 galaxymenu.UpdateCoords(gl3dcontroller.MatrixCalc, gl3dcontroller.PosCamera.ZoomFactor); // debug this galaxymenu.DebugStatusText(gl3dcontroller.PosCamera.StringPositionCamera); gl3dcontroller.PosCamera.SetPositionCamera(gl3dcontroller.PosCamera.StringPositionCamera); displaycontrol.Animate(glwfc.ElapsedTimems); displaycontrol.Render(glwfc.RenderState, ts); }; } displaycontrol.MouseClick += MouseClickOnMap; displaycontrol.MouseUp += MouseUpOnMap; displaycontrol.MouseDown += MouseDownOnMap; displaycontrol.MouseMove += MouseMoveOnMap; displaycontrol.MouseWheel += MouseWheelOnMap; galaxymenu = new MapMenu(this); // Autocomplete text box at top for searching GLTextBoxAutoComplete tbac = ((GLTextBoxAutoComplete)displaycontrol[MapMenu.EntryTextName]); tbac.PerformAutoCompleteInUIThread = (s, a, set) => { System.Diagnostics.Debug.Assert(Application.MessageLoop); // must be in UI thread var glist = edsmmapping.galacticMapObjects.Where(x => s.Length < 3 ? x.name.StartsWith(s, StringComparison.InvariantCultureIgnoreCase) : x.name.Contains(s, StringComparison.InvariantCultureIgnoreCase)).Select(x => x).ToList(); List <string> list = glist.Select(x => x.name).ToList(); list.AddRange(travelpath.CurrentList.Where(x => s.Length < 3 ? x.System.Name.StartsWith(s, StringComparison.InvariantCultureIgnoreCase) : x.System.Name.Contains(s, StringComparison.InvariantCultureIgnoreCase)).Select(x => x.System.Name)); foreach (var x in list) { set.Add(x); } }; tbac.SelectedEntry = (a) => // in UI thread { System.Diagnostics.Debug.Assert(Application.MessageLoop); // must be in UI thread System.Diagnostics.Debug.WriteLine("Selected " + tbac.Text); var gmo = edsmmapping.galacticMapObjects.Find(x => x.name.Equals(tbac.Text, StringComparison.InvariantCultureIgnoreCase)); if (gmo != null) { System.Diagnostics.Debug.WriteLine("Move to gmo " + gmo.points[0]); gl3dcontroller.SlewToPosition(new Vector3((float)gmo.points[0].X, (float)gmo.points[0].Y, (float)gmo.points[0].Z), -1); } else { var he = travelpath.CurrentList.Find(x => x.System.Name.Equals(tbac.Text, StringComparison.InvariantCultureIgnoreCase)); if (he != null) { System.Diagnostics.Debug.WriteLine("Move to sys " + he.System.Name); gl3dcontroller.SlewToPosition(new Vector3((float)he.System.X, (float)he.System.Y, (float)he.System.Z), -1); } else { tbac.InErrorCondition = true; } } }; if (galaxystars != null) { galaxystars.Start(); } if (false) // enable for debug buffer { debugbuffer = new GLStorageBlock(31, true); debugbuffer.AllocateBytes(32000, OpenTK.Graphics.OpenGL4.BufferUsageHint.DynamicCopy); // set size of vec buffer } if (false) // enable for debug { items.Add(new GLColorShaderObjectTranslation(), "COSOT"); GLRenderState rc = GLRenderState.Tri(cullface: false); rc.DepthTest = false; Vector3[] markers = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, -5, 0), new Vector3(0, -5 - 3.125f / 2f, 0) }; for (int i = 0; i < markers.Length; i++) { rObjects.Add(items.Shader("COSOT"), "marker" + i, GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc, GLCubeObjectFactory.CreateSolidCubeFromTriangles(0.5f), new Color4[] { Color4.Red, Color4.Green, Color4.Blue, Color4.White, Color4.Cyan, Color4.Orange }, new GLRenderDataTranslationRotation(markers[i]) )); } } }
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(); } }; }