diff --git a/OpenRA.Game/Graphics/Renderer.cs b/OpenRA.Game/Graphics/Renderer.cs index 06c4e6157f..ccb6491799 100644 --- a/OpenRA.Game/Graphics/Renderer.cs +++ b/OpenRA.Game/Graphics/Renderer.cs @@ -133,14 +133,14 @@ namespace OpenRA.Graphics internal static void Initialize( OpenRA.FileFormats.Graphics.WindowMode windowMode ) { var resolution = GetResolution( windowMode ); - device = CreateDevice( Assembly.LoadFile( Path.GetFullPath( "OpenRA.Renderer.Cg.dll" ) ), resolution.Width, resolution.Height, windowMode, false ); + device = CreateDevice( Assembly.LoadFile( Path.GetFullPath( "OpenRA.Renderer.Gl.dll" ) ), resolution.Width, resolution.Height, windowMode, false ); } static Size GetResolution(WindowMode windowmode) { - var desktopResolution = Screen.PrimaryScreen.Bounds.Size; + var desktopResolution = Screen.PrimaryScreen.Bounds.Size; var customSize = (windowmode == WindowMode.Windowed) ? Game.Settings.Graphics.WindowedSize : Game.Settings.Graphics.FullscreenSize; - + if (customSize.X > 0 && customSize.Y > 0) { desktopResolution.Width = customSize.X; diff --git a/OpenRA.Renderer.Gl/GraphicsDevice.cs b/OpenRA.Renderer.Gl/GraphicsDevice.cs index 70d98d8b1c..67899f5e6d 100755 --- a/OpenRA.Renderer.Gl/GraphicsDevice.cs +++ b/OpenRA.Renderer.Gl/GraphicsDevice.cs @@ -23,9 +23,6 @@ namespace OpenRA.Renderer.Glsl public class GraphicsDevice : IGraphicsDevice { Size windowSize; - internal IntPtr cgContext; - internal int vertexProfile, fragmentProfile; - IntPtr surf; public Size WindowSize { get { return windowSize; } } @@ -83,18 +80,6 @@ namespace OpenRA.Renderer.Glsl windowSize = new Size( width, height ); - 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 ); - - //Console.WriteLine("VP Profile: " + vertexProfile); - //Console.WriteLine("FP Profile: " + fragmentProfile); - Gl.glEnableClientState( Gl.GL_VERTEX_ARRAY ); CheckGlError(); Gl.glEnableClientState( Gl.GL_TEXTURE_COORD_ARRAY ); @@ -103,14 +88,6 @@ namespace OpenRA.Renderer.Glsl Sdl.SDL_SetModState( 0 ); // i have had enough. } - static Tao.Cg.Cg.CGerrorCallbackFuncDelegate CgErrorCallback = () => - { - var err = Tao.Cg.Cg.cgGetError(); - var str = Tao.Cg.Cg.cgGetErrorString( err ); - throw new InvalidOperationException( - string.Format( "CG Error: {0}: {1}", err, str ) ); - }; - public void EnableScissor( int left, int top, int width, int height ) { if( width < 0 ) width = 0; diff --git a/OpenRA.Renderer.Gl/Shader.cs b/OpenRA.Renderer.Gl/Shader.cs index 6033f294e2..6e7a6b1768 100644 --- a/OpenRA.Renderer.Gl/Shader.cs +++ b/OpenRA.Renderer.Gl/Shader.cs @@ -1,4 +1,4 @@ -#region Copyright & License Information +#region Copyright & License Information /* * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made @@ -12,74 +12,86 @@ using System; using System.IO; using OpenRA.FileFormats; using OpenRA.FileFormats.Graphics; -using Tao.Cg; +using Tao.OpenGl; +using System.Text; namespace OpenRA.Renderer.Glsl { public class Shader : IShader { - IntPtr effect; - IntPtr technique; - GraphicsDevice dev; - - public Shader(GraphicsDevice dev, string name) + int program; + string type; + public Shader(GraphicsDevice dev, string type) { - this.dev = dev; - string code; - using (var file = new StreamReader(FileSystem.Open("cg{0}{1}.fx".F(Path.DirectorySeparatorChar, name)))) - code = file.ReadToEnd(); - effect = Tao.Cg.Cg.cgCreateEffect(dev.cgContext, code, null); - - if (effect == IntPtr.Zero) - { - var err = Tao.Cg.Cg.cgGetErrorString(Tao.Cg.Cg.cgGetError()); - var results = Tao.Cg.Cg.cgGetLastListing(dev.cgContext); - throw new InvalidOperationException( - string.Format("Cg compile failed ({0}):\n{1}", err, results)); - } - - technique = Tao.Cg.Cg.cgGetFirstTechnique(effect); - if (technique == IntPtr.Zero) - throw new InvalidOperationException("No techniques"); - while (Tao.Cg.Cg.cgValidateTechnique(technique) == 0) - { - technique = Tao.Cg.Cg.cgGetNextTechnique(technique); - if (technique == IntPtr.Zero) - throw new InvalidOperationException("No valid techniques"); - } + this.type = type; + Console.WriteLine("Loading shader: {0}",type); + // Vertex shader + string vertexCode; + using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, type)))) + vertexCode = file.ReadToEnd(); + + int v = Gl.glCreateShader(Gl.GL_VERTEX_SHADER); + GraphicsDevice.CheckGlError(); + + Gl.glShaderSource(v,1,new string[]{vertexCode},null); + GraphicsDevice.CheckGlError(); + Gl.glCompileShader(v); + GraphicsDevice.CheckGlError(); + + // Fragment shader + string fragmentCode; + using (var file = new StreamReader(FileSystem.Open("glsl{0}rgba.frag".F(Path.DirectorySeparatorChar, type)))) + fragmentCode = file.ReadToEnd(); + int f = Gl.glCreateShader(Gl.GL_FRAGMENT_SHADER); + GraphicsDevice.CheckGlError(); + Gl.glShaderSource(f,1,new string[]{fragmentCode},null); + GraphicsDevice.CheckGlError(); + Gl.glCompileShader(f); + GraphicsDevice.CheckGlError(); + + // Assemble program + program = Gl.glCreateProgram(); + GraphicsDevice.CheckGlError(); + Gl.glAttachShader(program,v); + GraphicsDevice.CheckGlError(); + Gl.glAttachShader(program,f); + GraphicsDevice.CheckGlError(); + + Gl.glLinkProgram(program); + StringBuilder foo = new StringBuilder(); + int[] l = new int[1]; + System.Text.StringBuilder log = new System.Text.StringBuilder(4024); + + Gl.glGetProgramInfoLog(program,4024,l,log); + Console.WriteLine(log.ToString()); + GraphicsDevice.CheckGlError(); } public void Render(Action a) { - Tao.Cg.CgGl.cgGLEnableProfile(dev.vertexProfile); - Tao.Cg.CgGl.cgGLEnableProfile(dev.fragmentProfile); - - var pass = Tao.Cg.Cg.cgGetFirstPass(technique); - while (pass != IntPtr.Zero) - { - Tao.Cg.Cg.cgSetPassState(pass); - a(); - Tao.Cg.Cg.cgResetPassState(pass); - pass = Tao.Cg.Cg.cgGetNextPass(pass); - } - - Tao.Cg.CgGl.cgGLDisableProfile(dev.fragmentProfile); - Tao.Cg.CgGl.cgGLDisableProfile(dev.vertexProfile); + GraphicsDevice.CheckGlError(); + Gl.glUseProgram(program); + GraphicsDevice.CheckGlError(); + Console.WriteLine("rendering"); + a(); + GraphicsDevice.CheckGlError(); + Gl.glUseProgram(0); + GraphicsDevice.CheckGlError(); } public void SetValue(string name, ITexture t) { - var texture = (Texture)t; - var param = Tao.Cg.Cg.cgGetNamedEffectParameter(effect, name); - if (param != IntPtr.Zero && texture != null) - Tao.Cg.CgGl.cgGLSetupSampler(param, texture.texture); + } public void SetValue(string name, float x, float y) { - var param = Tao.Cg.Cg.cgGetNamedEffectParameter(effect, name); - if (param != IntPtr.Zero) - Tao.Cg.CgGl.cgGLSetParameter2f(param, x, y); + GraphicsDevice.CheckGlError(); + Console.WriteLine("setting value {0} to {1},{2} in {3}",name,x,y,type); + int param = Gl.glGetUniformLocation(program, name); + GraphicsDevice.CheckGlError(); + Gl.glUniform2f(param,x,y); + GraphicsDevice.CheckGlError(); } public void Commit() { } diff --git a/glsl/chrome-rgba.vert b/glsl/chrome-rgba.vert new file mode 100644 index 0000000000..c2e97de386 --- /dev/null +++ b/glsl/chrome-rgba.vert @@ -0,0 +1,8 @@ +uniform vec2 r1; +uniform vec2 r2; // matrix elements + +void main() +{ + vec2 p = gl_Vertex.xy*vec2(0.001538462,-0.0025) + vec2(-1,1); + gl_Position = vec4(p.x,p.y,0,1); +} diff --git a/glsl/chrome-shp.vert b/glsl/chrome-shp.vert new file mode 100644 index 0000000000..1f9d59bd96 --- /dev/null +++ b/glsl/chrome-shp.vert @@ -0,0 +1,8 @@ +uniform vec2 Scroll; +uniform vec2 r1; +uniform vec2 r2; // matrix elements + +void main() +{ + gl_Position = ftransform(); +} diff --git a/glsl/rgba.frag b/glsl/rgba.frag new file mode 100644 index 0000000000..fa99909e96 --- /dev/null +++ b/glsl/rgba.frag @@ -0,0 +1,4 @@ +void main() +{ + gl_FragColor = vec4(0.4,0.4,0.8,1.0); +} \ No newline at end of file diff --git a/glsl/world-line.vert b/glsl/world-line.vert new file mode 100644 index 0000000000..1f9d59bd96 --- /dev/null +++ b/glsl/world-line.vert @@ -0,0 +1,8 @@ +uniform vec2 Scroll; +uniform vec2 r1; +uniform vec2 r2; // matrix elements + +void main() +{ + gl_Position = ftransform(); +} diff --git a/glsl/world-shp.vert b/glsl/world-shp.vert new file mode 100644 index 0000000000..e9c55770f8 --- /dev/null +++ b/glsl/world-shp.vert @@ -0,0 +1,9 @@ +uniform vec2 Scroll; +uniform vec2 r1; +uniform vec2 r2; // matrix elements + +void main() +{ + vec2 p = (gl_Vertex.xy); + gl_Position = gl_Vertex; +}