Exemple #1
0
        public GraphicsDevice(Size size, WindowMode window)
        {
            Console.WriteLine("Using Cg renderer");
            windowSize = size;

            var extensions = new []
            {
                "GL_ARB_vertex_program",
                "GL_ARB_fragment_program",
                "GL_ARB_vertex_buffer_object",
            };

            surf = SdlGraphics.InitializeSdlGl(ref windowSize, window, extensions);

            cgContext = Tao.Cg.Cg.cgCreateContext();

            Tao.Cg.Cg.cgSetErrorCallback(CgErrorCallback);

            Tao.Cg.CgGl.cgGLRegisterStates(cgContext);
            Tao.Cg.CgGl.cgGLSetManageTextureParameters(cgContext, true);
            vertexProfile   = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_VERTEX);
            fragmentProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_FRAGMENT);

            Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
            ErrorHandler.CheckGlError();
            Gl.glEnableClientState(Gl.GL_TEXTURE_COORD_ARRAY);
            ErrorHandler.CheckGlError();

            Sdl.SDL_SetModState(0);             // i have had enough.

            input = new SdlInput(surf);
        }
Exemple #2
0
        public void SetVec(string name, float x, float y)
        {
            Gl.glUseProgramObjectARB(program);
            ErrorHandler.CheckGlError();
            var param = Gl.glGetUniformLocationARB(program, name);

            ErrorHandler.CheckGlError();
            Gl.glUniform2fARB(param, x, y);
            ErrorHandler.CheckGlError();
        }
Exemple #3
0
 public void Render(Action a)
 {
     Gl.glUseProgramObjectARB(program);
     ErrorHandler.CheckGlError();
     // Todo: Only enable alpha blending if we need it
     Gl.glEnable(Gl.GL_BLEND);
     ErrorHandler.CheckGlError();
     Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
     ErrorHandler.CheckGlError();
     a();
     ErrorHandler.CheckGlError();
     Gl.glDisable(Gl.GL_BLEND);
     ErrorHandler.CheckGlError();
 }
Exemple #4
0
        public void SetMatrix(string name, float[] mtx)
        {
            if (mtx.Length != 16)
            {
                throw new InvalidDataException("Invalid 4x4 matrix");
            }

            Gl.glUseProgramObjectARB(program);
            ErrorHandler.CheckGlError();
            var param = Gl.glGetUniformLocationARB(program, name);

            ErrorHandler.CheckGlError();
            Gl.glUniformMatrix4fv(param, 1, Gl.GL_FALSE, mtx);
            ErrorHandler.CheckGlError();
        }
Exemple #5
0
        public void Render(Action a)
        {
            Gl.glUseProgramObjectARB(program);

            // bind the textures
            foreach (var kv in textures)
            {
                Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + kv.Key);
                Gl.glBindTexture(Gl.GL_TEXTURE_2D, ((Texture)kv.Value).ID);
            }

            ErrorHandler.CheckGlError();
            a();
            ErrorHandler.CheckGlError();
        }
Exemple #6
0
        public void EnableScissor(int left, int top, int width, int height)
        {
            if (width < 0)
            {
                width = 0;
            }
            if (height < 0)
            {
                height = 0;
            }

            Gl.glScissor(left, windowSize.Height - (top + height), width, height);
            ErrorHandler.CheckGlError();
            Gl.glEnable(Gl.GL_SCISSOR_TEST);
            ErrorHandler.CheckGlError();
        }
Exemple #7
0
        public void SetVec(string name, float[] vec, int length)
        {
            var param = Gl.glGetUniformLocationARB(program, name);

            ErrorHandler.CheckGlError();
            switch (length)
            {
            case 1: Gl.glUniform1fv(param, 1, vec); break;

            case 2: Gl.glUniform2fv(param, 1, vec); break;

            case 3: Gl.glUniform3fv(param, 1, vec); break;

            case 4: Gl.glUniform4fv(param, 1, vec); break;

            default: throw new InvalidDataException("Invalid vector length");
            }

            ErrorHandler.CheckGlError();
        }
Exemple #8
0
        public void SetValue(string name, ITexture t)
        {
            if (t == null)
            {
                return;
            }
            Gl.glUseProgramObjectARB(program);
            ErrorHandler.CheckGlError();
            var texture = (Texture)t;
            int texUnit;

            if (samplers.TryGetValue(name, out texUnit))
            {
                Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + texUnit);
                ErrorHandler.CheckGlError();
                Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture.texture);
                ErrorHandler.CheckGlError();
                Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB);
            }
        }
Exemple #9
0
        public GraphicsDevice(Size size, WindowMode window)
        {
            Console.WriteLine("Using Gl renderer");
            windowSize = size;

            var extensions = new []
            {
                "GL_ARB_vertex_shader",
                "GL_ARB_fragment_shader",
                "GL_ARB_vertex_buffer_object",
            };

            surf = SdlGraphics.InitializeSdlGl(ref windowSize, window, extensions);

            Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
            ErrorHandler.CheckGlError();
            Gl.glEnableClientState(Gl.GL_TEXTURE_COORD_ARRAY);
            ErrorHandler.CheckGlError();

            Sdl.SDL_SetModState(0);

            input = new SdlInput(surf);
        }
Exemple #10
0
        public void Render(Action a)
        {
            Gl.glUseProgramObjectARB(program);

            /* bind the textures */

            foreach (var kv in textures)
            {
                Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + kv.Key);
                Gl.glBindTexture(Gl.GL_TEXTURE_2D, ((Texture)kv.Value).texture);
            }

            /* configure blend state */
            ErrorHandler.CheckGlError();
            // TODO: Only enable alpha blending if we need it
            Gl.glEnable(Gl.GL_BLEND);
            ErrorHandler.CheckGlError();
            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
            ErrorHandler.CheckGlError();
            a();
            ErrorHandler.CheckGlError();
            Gl.glDisable(Gl.GL_BLEND);
            ErrorHandler.CheckGlError();
        }
Exemple #11
0
        public Shader(GraphicsDevice dev, string name)
        {
            // Vertex shader
            string vertexCode;

            using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, name))))
                vertexCode = file.ReadToEnd();

            var v = Gl.glCreateShaderObjectARB(Gl.GL_VERTEX_SHADER_ARB);

            ErrorHandler.CheckGlError();
            Gl.glShaderSourceARB(v, 1, new string[] { vertexCode }, null);
            ErrorHandler.CheckGlError();
            Gl.glCompileShaderARB(v);
            ErrorHandler.CheckGlError();

            int success;

            Gl.glGetObjectParameterivARB(v, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
            ErrorHandler.CheckGlError();
            if (success == 0)
            {
                throw new InvalidProgramException("Compile error in {0}{1}.vert".F(Path.DirectorySeparatorChar, name));
            }

            // Fragment shader
            string fragmentCode;

            using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name))))
                fragmentCode = file.ReadToEnd();

            var f = Gl.glCreateShaderObjectARB(Gl.GL_FRAGMENT_SHADER_ARB);

            ErrorHandler.CheckGlError();
            Gl.glShaderSourceARB(f, 1, new string[] { fragmentCode }, null);
            ErrorHandler.CheckGlError();
            Gl.glCompileShaderARB(f);
            ErrorHandler.CheckGlError();

            Gl.glGetObjectParameterivARB(f, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
            ErrorHandler.CheckGlError();
            if (success == 0)
            {
                throw new InvalidProgramException("Compile error in glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name));
            }

            // Assemble program
            program = Gl.glCreateProgramObjectARB();
            ErrorHandler.CheckGlError();
            Gl.glAttachObjectARB(program, v);
            ErrorHandler.CheckGlError();
            Gl.glAttachObjectARB(program, f);
            ErrorHandler.CheckGlError();

            Gl.glLinkProgramARB(program);
            ErrorHandler.CheckGlError();

            Gl.glGetObjectParameterivARB(program, Gl.GL_OBJECT_LINK_STATUS_ARB, out success);
            ErrorHandler.CheckGlError();
            if (success == 0)
            {
                throw new InvalidProgramException("Linking error in {0} shader".F(name));
            }

            Gl.glUseProgramObjectARB(program);
            ErrorHandler.CheckGlError();

            int numUniforms;

            Gl.glGetObjectParameterivARB(program, Gl.GL_ACTIVE_UNIFORMS, out numUniforms);
            ErrorHandler.CheckGlError();

            int nextTexUnit = 0;

            for (var i = 0; i < numUniforms; i++)
            {
                int length, size, type;
                var sb = new StringBuilder(128);

                Gl.glGetActiveUniformARB(program, i, 128, out length, out size, out type, sb);
                var sampler = sb.ToString();
                ErrorHandler.CheckGlError();

                if (type == Gl.GL_SAMPLER_2D_ARB)
                {
                    samplers.Add(sampler, nextTexUnit);

                    var loc = Gl.glGetUniformLocationARB(program, sampler);
                    ErrorHandler.CheckGlError();
                    Gl.glUniform1iARB(loc, nextTexUnit);
                    ErrorHandler.CheckGlError();

                    nextTexUnit++;
                }
            }
        }
Exemple #12
0
 public void DisableScissor()
 {
     Gl.glDisable(Gl.GL_SCISSOR_TEST);
     ErrorHandler.CheckGlError();
 }
Exemple #13
0
 public void SetLineWidth(float width)
 {
     Gl.glLineWidth(width);
     ErrorHandler.CheckGlError();
 }