private new  void Add(IGLProgramShader prog, IGLRenderableItem r, bool atend = false)
 {
     System.Diagnostics.Debug.Assert(false, "Cannot add a normal shader to a compute shader list");
 }
 private string EnsureName(string name, IGLProgramShader prog, IGLRenderableItem r)
 {
     return(name.HasChars() ? name : (prog.GetType().Name + ":" + r.GetType().Name + " # " + (unnamed++).ToStringInvariant()));
 }
Example #3
0
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            Closed += ShaderTest_Closed;

            gl3dcontroller = new Controller3D();
            gl3dcontroller.PaintObjects = ControllerDraw;
            gl3dcontroller.MatrixCalc.PerspectiveNearZDistance = 1f;
            gl3dcontroller.MatrixCalc.PerspectiveFarZDistance  = 1000f;
            gl3dcontroller.ZoomDistance = 20F;
            gl3dcontroller.Start(glwfc, new Vector3(0, 0, 0), new Vector3(110f, 0, 0f), 1F);

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

            items.Add(new GLTexturedShaderObjectTranslation(), "TEXOT");
            items.Add(new GLTexturedShaderObjectTranslation(), "TEXOTNoRot");
            items.Add(new GLColorShaderWorld(), "COSW");
            items.Add(new GLColorShaderObjectTranslation(), "COSOT");
            items.Add(new GLFixedColorShaderObjectTranslation(Color.Goldenrod), "FCOSOT");
            items.Add(new GLTexturedShaderObjectCommonTranslation(), "TEXOCT");

            items.Add(new GLTexture2D(Properties.Resources.dotted2, SizedInternalFormat.Rgba8), "dotted");
            items.Add(new GLTexture2D(Properties.Resources.Logo8bpp, SizedInternalFormat.Rgba8), "logo8bpp");

            items.Add(new GLTexture2D(Properties.Resources.wooden, SizedInternalFormat.Rgba8), "wooden");
            items.Add(new GLTexture2D(Properties.Resources.shoppinglist, SizedInternalFormat.Rgba8), "shoppinglist");
            items.Add(new GLTexture2D(Properties.Resources.golden, SizedInternalFormat.Rgba8), "golden");
            items.Add(new GLTexture2D(Properties.Resources.smile5300_256x256x8, SizedInternalFormat.Rgba8), "smile");
            items.Add(new GLTexture2D(Properties.Resources.moonmap1k, SizedInternalFormat.Rgba8), "moon");


            #region coloured lines

            GLRenderState def = new GLRenderState()
            {
                DepthTest = false
            };                                                                  // set up default state for fixed values - no depth test, rely on stencil

            if (true)
            {
                rObjects.Add(new GLOperationSetStencil());      // set default stencil

                GLRenderState rq = GLRenderState.Quads(def);

                IGLProgramShader s = items.Shader("TEXOT");

                rObjects.Add(s, "Quad",
                             GLRenderableItem.CreateVector4Vector2(items, PrimitiveType.Quads, rq,
                                                                   GLShapeObjectFactory.CreateQuad(5.0f, 5.0f, new Vector3(-90F.Radians(), 0, 0)), GLShapeObjectFactory.TexQuadCW,
                                                                   new GLRenderDataTranslationRotationTexture(items.Tex("dotted"), new Vector3(-2, 3, -6))
                                                                   ));

                rObjects.Add(new GLOperationStencilOnlyIfEqual());
            }

            #region Coloured triangles
            if (true)
            {
                GLRenderState rc = GLRenderState.Tri(def);
                rc.CullFace = false;

                rObjects.Add(items.Shader("COSOT"), "Tri",
                             GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Triangles, rc,
                                                                  GLCubeObjectFactory.CreateSolidCubeFromTriangles(5f),
                                                                  new Color4[] { Color4.Red, Color4.Green, Color4.Blue, Color4.White, Color4.Cyan, Color4.Orange },
                                                                  new GLRenderDataTranslationRotation(new Vector3(10, 3, 20))
                                                                  ));
            }

            if (true)
            {
                GLRenderState lines = GLRenderState.Lines(def, 5);

                rObjects.Add(items.Shader("COSW"), "L1",
                             GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines,
                                                                  GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(-100, -0, 100), new Vector3(10, 0, 0), 21),
                                                                  new Color4[] { Color.White, Color.Red, Color.DarkRed, Color.DarkRed })
                             );

                GLRenderState lines2 = GLRenderState.Lines(def, 1);

                rObjects.Add(items.Shader("COSW"), "L2",
                             GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2,
                                                                  GLShapeObjectFactory.CreateLines(new Vector3(-100, -0, -100), new Vector3(100, -0, -100), new Vector3(0, 0, 10), 21),
                                                                  new Color4[] { Color.Orange, Color.Blue, Color.DarkRed, Color.DarkRed }));

                rObjects.Add(items.Shader("COSW"), "L3",
                             GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2,
                                                                  GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(-100, 10, 100), new Vector3(10, 0, 0), 21),
                                                                  new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange })
                             );

                rObjects.Add(items.Shader("COSW"), "L4",
                             GLRenderableItem.CreateVector4Color4(items, PrimitiveType.Lines, lines2,
                                                                  GLShapeObjectFactory.CreateLines(new Vector3(-100, 10, -100), new Vector3(100, 10, -100), new Vector3(0, 0, 10), 21),
                                                                  new Color4[] { Color.Yellow, Color.Orange, Color.Yellow, Color.Orange })
                             );
            }

            #endregion


            #endregion

            #region Matrix Calc Uniform

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

            #endregion
        }
        /// <summary>Execute the render list, given the render state, matrix calc. Optional verbose debug output mode </summary>
        public void Render(GLRenderState currentstate, GLMatrixCalc c, bool verbose = false)
        {
            if (verbose)
            {
                System.Diagnostics.Trace.WriteLine("***Begin RList");
            }

            GLStatics.Check();      // ensure clear before start

            GLRenderState    lastapplied = null;
            IGLProgramShader curshader   = null;

            foreach (var shaderri in renderables)        // kvp of Key=Shader, Value = list of renderables
            {
                // shader must be enabled
                if (shaderri.Item1.Enable)
                {
                    if (shaderri.Item2 == null)                             // indicating its a compute or operation
                    {
                        if (shaderri.Item1 is GLShaderCompute)              // if compute
                        {
                            if (curshader != null)                          // turn off current shader
                            {
                                curshader.Finish();
                                curshader = null;
                            }

                            if (verbose)
                            {
                                System.Diagnostics.Trace.WriteLine("  Compute Shader " + shaderri.Item1.GetType().Name);
                            }

                            shaderri.Item1.Start(c);                        // start/finish it
                            shaderri.Item1.Finish();
                        }
                        else
                        {
                            if (verbose)
                            {
                                System.Diagnostics.Trace.WriteLine("  Operation " + shaderri.Item1.GetType().Name);
                            }
                            shaderri.Item1.Start(c);                        // operations just start, but don't change the current shader
                        }
                    }
                    else if (shaderri.Item2.Find(x => x.Item2.Visible) != null)      // must have a list, all must not be null, and some must be visible
                    {
                        if (curshader != shaderri.Item1)                             // if a different shader instance
                        {
                            if (curshader != null)                                   // finish the last one if present
                            {
                                curshader.Finish();
                            }
                            curshader = shaderri.Item1;
                            curshader.Start(c);                                         // start the program - if compute shader, or operation, this executes the code
                        }
                        //System.Diagnostics.Trace.WriteLine("Shader " + kvp.Item1.GetType().Name);

                        foreach (var g in shaderri.Item2)
                        {
                            GLOFC.GLStatics.Check();

                            if (g.Item2 != null && g.Item2.Visible)                    // Make sure its visible and not empty slot
                            {
                                if (verbose)
                                {
                                    System.Diagnostics.Trace.WriteLine("  Bind " + g.Item1 + " shader " + shaderri.Item1.GetType().Name);
                                }
                                if (g.Item2.RenderState == null)                       // if no render control, do not change last applied.
                                {
                                    g.Item2.Bind(null, shaderri.Item1, c);
                                }
                                else if (object.ReferenceEquals(g.Item2.RenderState, lastapplied))     // no point forcing the test of rendercontrol if its the same as last applied
                                {
                                    g.Item2.Bind(null, shaderri.Item1, c);
                                }
                                else
                                {
                                    g.Item2.Bind(currentstate, shaderri.Item1, c);      // change and remember
                                    lastapplied = g.Item2.RenderState;
                                }

                                if (verbose)
                                {
                                    System.Diagnostics.Trace.WriteLine("  Render " + g.Item1 + " shader " + shaderri.Item1.GetType().Name);
                                }
                                g.Item2.Render();
                                //System.Diagnostics.Trace.WriteLine("....Render Over " + g.Item1);
                            }
                            else
                            {
                                if (verbose)
                                {
                                    System.Diagnostics.Trace.WriteLine("  Not visible " + g.Item1 + " " + shaderri.Item1.GetType().Name);
                                }
                            }

                            GLOFC.GLStatics.Check();
                        }
                    }
                    else
                    {
                        if (verbose)
                        {
                            System.Diagnostics.Trace.WriteLine("  No items visible " + shaderri.Item1.GetType().Name);
                        }
                    }
                }
                else
                {
                    if (verbose)
                    {
                        System.Diagnostics.Trace.WriteLine("  Shader disabled " + shaderri.Item1.GetType().Name + " " + shaderri.Item1.Name);
                    }
                }
            }

            if (curshader != null)
            {
                curshader.Finish();
            }

            if (verbose)
            {
                System.Diagnostics.Trace.WriteLine("***End RList");
            }
            GL.UseProgram(0);           // final clean up
            GL.BindProgramPipeline(0);
        }
Example #5
0
 /// <summary> Add this type with an optional name </summary>
 public IGLProgramShader Add(IGLProgramShader disp, string name = null)
 {
     System.Diagnostics.Debug.Assert(!items.ContainsValue(disp));
     items.Add(EnsureName(name), disp);
     return(disp);
 }