// Demonstrate buffer feedback AND geo shader add vertex/dump vertex

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            Closed += ShaderTest_Closed;

            gl3dcontroller = new Controller3D();
            gl3dcontroller.PaintObjects = ControllerDraw;
            gl3dcontroller.ZoomDistance = 100F;
            gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 0.1f;
            glwfc.BackColor = Color.FromArgb(0, 0, 60);
            gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(120f, 0, 0f), 1F);

            gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) =>
            {
                return((float)ms / 20.0f);
            };

            IGLTexture array2d = items.Add(new GLTexture2DArray(new Bitmap[] { Properties.Resources.mipmap, Properties.Resources.mipmap2,
                                                                               Properties.Resources.mipmap3, Properties.Resources.mipmap4 }, SizedInternalFormat.Rgba8, 9), "2DArray2");

            if (true)
            {
                items.Add(new GLMultipleTexturedBlended(false, 2), "ShaderPos");
                items.Shader("ShaderPos").StartAction += (s, m) =>
                {
                    array2d.Bind(1);
                };

                Vector4[] instancepositions = new Vector4[4];
                instancepositions[0] = new Vector4(-25, 0, -40, 0);      // last is image index..
                instancepositions[1] = new Vector4(-25, 0, 0, 0);
                instancepositions[2] = new Vector4(-25, 0, 40, 2);
                instancepositions[3] = new Vector4(-25, 0, 80, 2);

                GLRenderState rt = GLRenderState.Tri(cullface: false);
                rObjects.Add(items.Shader("ShaderPos"),
                             GLRenderableItem.CreateVector4Vector2Vector4(items, PrimitiveType.Triangles, rt,
                                                                          GLSphereObjectFactory.CreateTexturedSphereFromTriangles(3, 20.0f),
                                                                          instancepositions, ic: 4, separbuf: true
                                                                          ));
            }

            // Shader MAT

            if (true)
            {
                IGLProgramShader smat = items.Add(new GLMultipleTexturedBlended(true, 2), "ShaderMat");
                smat.StartAction += (s, m) =>
                {
                    array2d.Bind(1);
                };

                Matrix4[] pos2 = new Matrix4[3];
                pos2[0]     = Matrix4.CreateRotationY(-80f.Radians());
                pos2[0]    *= Matrix4.CreateTranslation(new Vector3(25, 0, -40));
                pos2[0].M44 = 0;        // this is the image number

                pos2[1]     = Matrix4.CreateRotationY(-70f.Radians());
                pos2[1]    *= Matrix4.CreateTranslation(new Vector3(25, 0, 0));
                pos2[1].M44 = 2;        // this is the image number

                pos2[2]     = Matrix4.CreateRotationZ(-60f.Radians());
                pos2[2]    *= Matrix4.CreateTranslation(new Vector3(25, 0, 40));
                pos2[2].M44 = 0;        // this is the image number

                GLRenderState rq = GLRenderState.Quads(cullface: false);
                rObjects.Add(items.Shader("ShaderMat"),
                             GLRenderableItem.CreateVector4Vector2Matrix4(items, PrimitiveType.Quads, rq,
                                                                          GLShapeObjectFactory.CreateQuad(20.0f, 20.0f, new Vector3(-90f.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW,
                                                                          pos2, ic: 3, separbuf: false
                                                                          ));
            }

            items.Add(new GLMatrixCalcUniformBlock(), "MCUB");      // def binding of 0
        }
Example #2
0
        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;

            gl3dcontroller = new Controller3D();
            gl3dcontroller.PaintObjects = ControllerDraw;
            gl3dcontroller.ZoomDistance = 100F;
            gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 0.1f;
            glwfc.BackColor = Color.FromArgb(0, 0, 20);
            gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(120f, 0, 0f), 1F);
            gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) =>
            {
                return((float)ms / 20.0f);
            };

            // this bit is eye candy just to show its working

            items.Add(new GLColorShaderWorld(), "COSW");
            GLRenderState rl = GLRenderState.Lines(1);

            rObjects.Add(items.Shader("COSW"),
                         GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl,
                                                              GLShapeObjectFactory.CreateLines(new Vector3(-40, 0, -40), new Vector3(-40, 0, 40), new Vector3(10, 0, 0), 9),
                                                              new Color4[] { Color.Red, Color.Red, Color.Green, Color.Green })
                         );


            rObjects.Add(items.Shader("COSW"),
                         GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl,
                                                              GLShapeObjectFactory.CreateLines(new Vector3(-40, 0, -40), new Vector3(40, 0, -40), new Vector3(0, 0, 10), 9),
                                                              new Color4[] { Color.Red, Color.Red, Color.Green, Color.Green })
                         );


            items.Add(new GLTexture2D(Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8), "moon");
            items.Add(new GLTexturedShaderObjectTranslation(), "TEX");

            GLRenderState rt = GLRenderState.Tri();

            rObjects.Add(items.Shader("TEX"), "sphere7",
                         GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rt,
                                                               GLSphereObjectFactory.CreateTexturedSphereFromTriangles(4, 20.0f),
                                                               new GLRenderDataTranslationRotationTexture(items.Tex("moon"), new Vector3(0, 0, 0))
                                                               ));


            // Pass vertex data thru a vertex shader which stores into a block

            items.Add(new GLShaderPipeline(new GLVertexShaderCompute()), "N1");

            vecoutbuffer = new GLStorageBlock(1);                                                                                // new storage block on binding index 1 which the vertex shader uses
            vecoutbuffer.AllocateBytes(sizeof(float) * 2048 + sizeof(int), OpenTK.Graphics.OpenGL4.BufferUsageHint.DynamicCopy); // set size of vec buffer

            //Vector4[] data = new Vector4[] {
            //    new Vector4(1, 2, 3, 0),
            //    new Vector4(4, 5, 6, 0)
            //};

            Vector4[] data = GLSphereObjectFactory.CreateSphereFromTriangles(0, 1.0f);

            GLRenderState rp = GLRenderState.Points();

            rObjects.Add(items.Shader("N1"), GLRenderableItem.CreateVector4(items, PrimitiveType.Points, rp, data));

            for (double ang = -Math.PI / 2; ang <= Math.PI / 2 + 0.1; ang += 0.1)
            {
                Vector3 pos         = new Vector3((float)Math.Cos(ang), (float)Math.Sin(ang), 0);
                Vector3 up          = new Vector3(0, 1, 0);
                float   dotp        = Vector3.Dot(up, pos);
                float   lens        = (float)(up.Length * pos.Length);
                double  computedang = Math.Acos(dotp / lens);
                System.Diagnostics.Debug.WriteLine(ang.Degrees() + " " + pos + "-> dotp" + dotp + " " + computedang.Degrees());
            }

            items.Add(new GLMatrixCalcUniformBlock(), "MCUB");      // def binding of 0
        }
Example #4
0
        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();
        }
Example #5
0
        // Demonstrate buffer feedback AND geo shader add vertex/dump vertex



        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            Closed += ShaderTest_Closed;

            gl3dcontroller = new Controller3D();
            gl3dcontroller.PaintObjects = ControllerDraw;
            gl3dcontroller.ZoomDistance = 20F;
            gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 0.1f;
            glwfc.BackColor = Color.FromArgb(0, 0, 60);
            gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(120f, 0, 0f), 1F);

            gl3dcontroller.KeyboardTravelSpeed = (ms, eyedist) =>
            {
                return((float)ms / 20.0f);
            };

            items.Add(new GLMatrixCalcUniformBlock(), "MCUB");      // def binding of 0

            {
                items.Add(new GLColorShaderWorld(), "COS");
                GLRenderState rl = GLRenderState.Lines(1);

                rObjects.Add(items.Shader("COS"),
                             GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, rl,
                                                                  GLShapeObjectFactory.CreateLines(new Vector3(-40, 0, -40), new Vector3(-40, 0, 40), new Vector3(10, 0, 0), 9),
                                                                  new Color4[] { Color.Red, Color.Red, Color.Green, Color.Green })
                             );


                rObjects.Add(items.Shader("COS"),
                             GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, null,
                                                                  GLShapeObjectFactory.CreateLines(new Vector3(-40, 0, -40), new Vector3(40, 0, -40), new Vector3(0, 0, 10), 9),
                                                                  new Color4[] { Color.Red, Color.Red, Color.Green, Color.Green })
                             );
            }

            {
                items.Add(new GLTexturedShaderObjectTranslation(), "TEX");
                items.Add(new GLTexture2D(Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8), "moon");

                GLRenderState rt = GLRenderState.Tri();

                rObjects.Add(items.Shader("TEX"), "sphere7",
                             GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Triangles, rt,
                                                                   GLSphereObjectFactory.CreateTexturedSphereFromTriangles(4, 10.0f),
                                                                   new GLRenderDataTranslationRotationTexture(items.Tex("moon"), new Vector3(-30, 0, 0))
                                                                   ));
            }

            {
                var sunvertex = new GLPLVertexShaderModelCoordWorldAutoscale(new Color[] { Color.Yellow, Color.FromArgb(255, 230, 230, 1) });

                items.Add(new GLShaderPipeline(sunvertex, new GLPLStarSurfaceFragmentShader()), "STAR");

                GLRenderState rt = GLRenderState.Tri();

                rObjects.Add(items.Shader("STAR"), "sun",
                             GLRenderableItem.CreateVector4(items, PrimitiveType.Triangles,
                                                            rt,
                                                            GLSphereObjectFactory.CreateSphereFromTriangles(3, 10.0f),
                                                            new GLRenderDataTranslationRotation(new Vector3(20, 0, 0)),
                                                            ic: 1));

                items.Add(new GLShaderStarCorona(), "CORONA");

                GLRenderState rq = GLRenderState.Quads();

                rObjects.Add(items.Shader("CORONA"), GLRenderableItem.CreateVector4(items, PrimitiveType.Quads,
                                                                                    rq,
                                                                                    GLShapeObjectFactory.CreateQuad(1f),
                                                                                    new GLRenderDataTranslationRotation(new Vector3(20, 0, 0), new Vector3(0, 0, 0), 20f, calclookat: true)));
            }

            if (true)
            {
                Vector4[] pos = new Vector4[3];
                pos[0] = new Vector4(-20, 0, 10, 0);
                pos[1] = new Vector4(0, 0, 10, 1);
                pos[2] = new Vector4(20, 0, 10, 2);

                var shape = GLSphereObjectFactory.CreateSphereFromTriangles(3, 10.0f);

                GLRenderState    rt = GLRenderState.Tri();
                GLRenderableItem ri = GLRenderableItem.CreateVector4Vector4(items, PrimitiveType.Triangles, rt, shape, pos, null, pos.Length, 1);

                var vertshader = new GLPLVertexShaderModelCoordWorldAutoscale(new Color[] { Color.Red, Color.Green, Color.Blue });
                var shader     = new GLShaderPipeline(vertshader, new GLPLStarSurfaceFragmentShader());
                items.Add(shader, "STAR-M2");
                rObjects.Add(shader, ri);
            }

            GLOFC.GLStatics.Check();

            GL.Enable(EnableCap.DepthClamp);
        }