Style fixes for Renderer.Gl.
This commit is contained in:
@@ -12,8 +12,6 @@ using System;
|
|||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using OpenRA.FileFormats.Graphics;
|
using OpenRA.FileFormats.Graphics;
|
||||||
using OpenRA.Renderer.SdlCommon;
|
using OpenRA.Renderer.SdlCommon;
|
||||||
using Tao.OpenGl;
|
|
||||||
using Tao.Sdl;
|
|
||||||
|
|
||||||
[assembly: Renderer(typeof(OpenRA.Renderer.Glsl.DeviceFactory))]
|
[assembly: Renderer(typeof(OpenRA.Renderer.Glsl.DeviceFactory))]
|
||||||
|
|
||||||
@@ -30,7 +28,7 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
|
|
||||||
public class GraphicsDevice : SdlGraphics
|
public class GraphicsDevice : SdlGraphics
|
||||||
{
|
{
|
||||||
static string[] RequiredExtensions =
|
static string[] requiredExtensions =
|
||||||
{
|
{
|
||||||
"GL_ARB_vertex_shader",
|
"GL_ARB_vertex_shader",
|
||||||
"GL_ARB_fragment_shader",
|
"GL_ARB_fragment_shader",
|
||||||
@@ -39,8 +37,8 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
};
|
};
|
||||||
|
|
||||||
public GraphicsDevice(Size size, WindowMode window)
|
public GraphicsDevice(Size size, WindowMode window)
|
||||||
: base(size, window, RequiredExtensions) {}
|
: base(size, window, requiredExtensions) { }
|
||||||
|
|
||||||
public override IShader CreateShader(string name) { return new Shader( this, name ); }
|
public override IShader CreateShader(string name) { return new Shader(this, name); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,20 +21,20 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
{
|
{
|
||||||
public class Shader : IShader
|
public class Shader : IShader
|
||||||
{
|
{
|
||||||
int program;
|
|
||||||
readonly Dictionary<string, int> samplers = new Dictionary<string, int>();
|
readonly Dictionary<string, int> samplers = new Dictionary<string, int>();
|
||||||
readonly Dictionary<int, ITexture> textures = new Dictionary<int, ITexture>();
|
readonly Dictionary<int, ITexture> textures = new Dictionary<int, ITexture>();
|
||||||
|
int program;
|
||||||
|
|
||||||
public Shader(GraphicsDevice dev, string type)
|
public Shader(GraphicsDevice dev, string name)
|
||||||
{
|
{
|
||||||
// Vertex shader
|
// Vertex shader
|
||||||
string vertexCode;
|
string vertexCode;
|
||||||
using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, type))))
|
using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, name))))
|
||||||
vertexCode = file.ReadToEnd();
|
vertexCode = file.ReadToEnd();
|
||||||
|
|
||||||
int v = Gl.glCreateShaderObjectARB(Gl.GL_VERTEX_SHADER_ARB);
|
var v = Gl.glCreateShaderObjectARB(Gl.GL_VERTEX_SHADER_ARB);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glShaderSourceARB(v,1,new string[]{vertexCode},null);
|
Gl.glShaderSourceARB(v, 1, new string[] { vertexCode }, null);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glCompileShaderARB(v);
|
Gl.glCompileShaderARB(v);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
@@ -43,15 +43,16 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
Gl.glGetObjectParameterivARB(v, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
|
Gl.glGetObjectParameterivARB(v, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
if (success == 0)
|
if (success == 0)
|
||||||
throw new InvalidProgramException("Compile error in {0}{1}.vert".F(Path.DirectorySeparatorChar, type));
|
throw new InvalidProgramException("Compile error in {0}{1}.vert".F(Path.DirectorySeparatorChar, name));
|
||||||
|
|
||||||
// Fragment shader
|
// Fragment shader
|
||||||
string fragmentCode;
|
string fragmentCode;
|
||||||
using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, type))))
|
using (var file = new StreamReader(FileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name))))
|
||||||
fragmentCode = file.ReadToEnd();
|
fragmentCode = file.ReadToEnd();
|
||||||
int f = Gl.glCreateShaderObjectARB(Gl.GL_FRAGMENT_SHADER_ARB);
|
|
||||||
|
var f = Gl.glCreateShaderObjectARB(Gl.GL_FRAGMENT_SHADER_ARB);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glShaderSourceARB(f,1,new string[]{fragmentCode},null);
|
Gl.glShaderSourceARB(f, 1, new string[] { fragmentCode }, null);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glCompileShaderARB(f);
|
Gl.glCompileShaderARB(f);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
@@ -59,15 +60,14 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
Gl.glGetObjectParameterivARB(f, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
|
Gl.glGetObjectParameterivARB(f, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
if (success == 0)
|
if (success == 0)
|
||||||
throw new InvalidProgramException("Compile error in glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, type));
|
throw new InvalidProgramException("Compile error in glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name));
|
||||||
|
|
||||||
|
|
||||||
// Assemble program
|
// Assemble program
|
||||||
program = Gl.glCreateProgramObjectARB();
|
program = Gl.glCreateProgramObjectARB();
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glAttachObjectARB(program,v);
|
Gl.glAttachObjectARB(program, v);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glAttachObjectARB(program,f);
|
Gl.glAttachObjectARB(program, f);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
|
|
||||||
Gl.glLinkProgramARB(program);
|
Gl.glLinkProgramARB(program);
|
||||||
@@ -76,32 +76,35 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
Gl.glGetObjectParameterivARB(program, Gl.GL_OBJECT_LINK_STATUS_ARB, out success);
|
Gl.glGetObjectParameterivARB(program, Gl.GL_OBJECT_LINK_STATUS_ARB, out success);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
if (success == 0)
|
if (success == 0)
|
||||||
throw new InvalidProgramException("Linking error in {0} shader".F(type));
|
throw new InvalidProgramException("Linking error in {0} shader".F(name));
|
||||||
|
|
||||||
|
|
||||||
Gl.glUseProgramObjectARB(program);
|
Gl.glUseProgramObjectARB(program);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
|
|
||||||
int numUniforms;
|
int numUniforms;
|
||||||
Gl.glGetObjectParameterivARB( program, Gl.GL_ACTIVE_UNIFORMS, out numUniforms );
|
Gl.glGetObjectParameterivARB(program, Gl.GL_ACTIVE_UNIFORMS, out numUniforms);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
|
|
||||||
int nextTexUnit = 0;
|
int nextTexUnit = 0;
|
||||||
for( int i = 0 ; i < numUniforms ; i++ )
|
for (var i = 0; i < numUniforms; i++)
|
||||||
{
|
{
|
||||||
int uLen, uSize, uType, loc;
|
int length, size, type;
|
||||||
var sb = new StringBuilder(128);
|
var sb = new StringBuilder(128);
|
||||||
Gl.glGetActiveUniformARB( program, i, 128, out uLen, out uSize, out uType, sb );
|
|
||||||
|
Gl.glGetActiveUniformARB(program, i, 128, out length, out size, out type, sb);
|
||||||
var sampler = sb.ToString();
|
var sampler = sb.ToString();
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
if( uType == Gl.GL_SAMPLER_2D_ARB )
|
|
||||||
|
if (type == Gl.GL_SAMPLER_2D_ARB)
|
||||||
{
|
{
|
||||||
samplers.Add( sampler, nextTexUnit );
|
samplers.Add(sampler, nextTexUnit);
|
||||||
loc = Gl.glGetUniformLocationARB(program, sampler);
|
|
||||||
|
var loc = Gl.glGetUniformLocationARB(program, sampler);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glUniform1iARB( loc, nextTexUnit );
|
Gl.glUniform1iARB(loc, nextTexUnit);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
++nextTexUnit;
|
|
||||||
|
nextTexUnit++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,8 +113,7 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
{
|
{
|
||||||
Gl.glUseProgramObjectARB(program);
|
Gl.glUseProgramObjectARB(program);
|
||||||
|
|
||||||
/* bind the textures */
|
// bind the textures
|
||||||
|
|
||||||
foreach (var kv in textures)
|
foreach (var kv in textures)
|
||||||
{
|
{
|
||||||
Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + kv.Key);
|
Gl.glActiveTextureARB(Gl.GL_TEXTURE0_ARB + kv.Key);
|
||||||
@@ -127,6 +129,7 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
{
|
{
|
||||||
if (t == null)
|
if (t == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int texUnit;
|
int texUnit;
|
||||||
if (samplers.TryGetValue(name, out texUnit))
|
if (samplers.TryGetValue(name, out texUnit))
|
||||||
textures[texUnit] = t;
|
textures[texUnit] = t;
|
||||||
@@ -136,9 +139,9 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
{
|
{
|
||||||
Gl.glUseProgramObjectARB(program);
|
Gl.glUseProgramObjectARB(program);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
int param = Gl.glGetUniformLocationARB(program, name);
|
var param = Gl.glGetUniformLocationARB(program, name);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glUniform1fARB(param,x);
|
Gl.glUniform1fARB(param, x);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,17 +149,17 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
{
|
{
|
||||||
Gl.glUseProgramObjectARB(program);
|
Gl.glUseProgramObjectARB(program);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
int param = Gl.glGetUniformLocationARB(program, name);
|
var param = Gl.glGetUniformLocationARB(program, name);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glUniform2fARB(param,x,y);
|
Gl.glUniform2fARB(param, x, y);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetVec(string name, float[] vec, int length)
|
public void SetVec(string name, float[] vec, int length)
|
||||||
{
|
{
|
||||||
int param = Gl.glGetUniformLocationARB(program, name);
|
var param = Gl.glGetUniformLocationARB(program, name);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
switch(length)
|
switch (length)
|
||||||
{
|
{
|
||||||
case 1: Gl.glUniform1fv(param, 1, vec); break;
|
case 1: Gl.glUniform1fv(param, 1, vec); break;
|
||||||
case 2: Gl.glUniform2fv(param, 1, vec); break;
|
case 2: Gl.glUniform2fv(param, 1, vec); break;
|
||||||
@@ -164,6 +167,7 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
case 4: Gl.glUniform4fv(param, 1, vec); break;
|
case 4: Gl.glUniform4fv(param, 1, vec); break;
|
||||||
default: throw new InvalidDataException("Invalid vector length");
|
default: throw new InvalidDataException("Invalid vector length");
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,7 +178,7 @@ namespace OpenRA.Renderer.Glsl
|
|||||||
|
|
||||||
Gl.glUseProgramObjectARB(program);
|
Gl.glUseProgramObjectARB(program);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
int param = Gl.glGetUniformLocationARB(program, name);
|
var param = Gl.glGetUniformLocationARB(program, name);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
Gl.glUniformMatrix4fv(param, 1, Gl.GL_FALSE, mtx);
|
Gl.glUniformMatrix4fv(param, 1, Gl.GL_FALSE, mtx);
|
||||||
ErrorHandler.CheckGlError();
|
ErrorHandler.CheckGlError();
|
||||||
|
|||||||
Reference in New Issue
Block a user