@@ -1,6 +1,6 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
|
||||
* Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
@@ -14,7 +14,8 @@ using System.IO;
|
||||
using System.Text;
|
||||
using OpenRA.FileSystem;
|
||||
using OpenRA.Graphics;
|
||||
using Tao.OpenGl;
|
||||
using OpenTK;
|
||||
using OpenTK.Graphics.OpenGL;
|
||||
|
||||
namespace OpenRA.Renderer.Sdl2
|
||||
{
|
||||
@@ -31,76 +32,73 @@ namespace OpenRA.Renderer.Sdl2
|
||||
using (var file = new StreamReader(GlobalFileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, name))))
|
||||
vertexCode = file.ReadToEnd();
|
||||
|
||||
var v = Gl.glCreateShaderObjectARB(Gl.GL_VERTEX_SHADER_ARB);
|
||||
var vertexShader = GL.CreateShader(ShaderType.VertexShader);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glShaderSourceARB(v, 1, new string[] { vertexCode }, null);
|
||||
GL.ShaderSource(vertexShader, vertexCode);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glCompileShaderARB(v);
|
||||
GL.CompileShader(vertexShader);
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
int success;
|
||||
Gl.glGetObjectParameterivARB(v, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
|
||||
GL.GetShader(vertexShader, ShaderParameter.CompileStatus, out success);
|
||||
ErrorHandler.CheckGlError();
|
||||
if (success == 0)
|
||||
throw new InvalidProgramException("Compile error in {0}{1}.vert".F(Path.DirectorySeparatorChar, name));
|
||||
if (success == (int)All.False)
|
||||
throw new InvalidProgramException("Compile error in glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, name));
|
||||
|
||||
// Fragment shader
|
||||
string fragmentCode;
|
||||
using (var file = new StreamReader(GlobalFileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name))))
|
||||
fragmentCode = file.ReadToEnd();
|
||||
|
||||
var f = Gl.glCreateShaderObjectARB(Gl.GL_FRAGMENT_SHADER_ARB);
|
||||
var fragmentShader = GL.CreateShader(ShaderType.FragmentShader);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glShaderSourceARB(f, 1, new string[] { fragmentCode }, null);
|
||||
GL.ShaderSource(fragmentShader, fragmentCode);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glCompileShaderARB(f);
|
||||
GL.CompileShader(fragmentShader);
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
Gl.glGetObjectParameterivARB(f, Gl.GL_OBJECT_COMPILE_STATUS_ARB, out success);
|
||||
GL.GetShader(vertexShader, ShaderParameter.CompileStatus, out success);
|
||||
ErrorHandler.CheckGlError();
|
||||
if (success == 0)
|
||||
if (success == (int)All.False)
|
||||
throw new InvalidProgramException("Compile error in glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name));
|
||||
|
||||
// Assemble program
|
||||
program = Gl.glCreateProgramObjectARB();
|
||||
program = GL.CreateProgram();
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glAttachObjectARB(program, v);
|
||||
GL.AttachShader(program, vertexShader);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glAttachObjectARB(program, f);
|
||||
GL.AttachShader(program, fragmentShader);
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
Gl.glLinkProgramARB(program);
|
||||
GL.LinkProgram(program);
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
Gl.glGetObjectParameterivARB(program, Gl.GL_OBJECT_LINK_STATUS_ARB, out success);
|
||||
GL.GetProgram(program, ProgramParameter.LinkStatus, out success);
|
||||
ErrorHandler.CheckGlError();
|
||||
if (success == 0)
|
||||
if (success == (int)All.False)
|
||||
throw new InvalidProgramException("Linking error in {0} shader".F(name));
|
||||
|
||||
Gl.glUseProgramObjectARB(program);
|
||||
GL.UseProgram(program);
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
int numUniforms;
|
||||
Gl.glGetObjectParameterivARB(program, Gl.GL_ACTIVE_UNIFORMS, out numUniforms);
|
||||
GL.GetProgram(program, ProgramParameter.ActiveUniforms, out numUniforms);
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
int nextTexUnit = 0;
|
||||
for (var i = 0; i < numUniforms; i++)
|
||||
{
|
||||
int length, size, type;
|
||||
int length, size;
|
||||
ActiveUniformType type;
|
||||
var sb = new StringBuilder(128);
|
||||
|
||||
Gl.glGetActiveUniformARB(program, i, 128, out length, out size, out type, sb);
|
||||
GL.GetActiveUniform(program, i, 128, out length, out size, out type, sb);
|
||||
var sampler = sb.ToString();
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
if (type == Gl.GL_SAMPLER_2D_ARB)
|
||||
if (type == ActiveUniformType.Sampler2D)
|
||||
{
|
||||
samplers.Add(sampler, nextTexUnit);
|
||||
|
||||
var loc = Gl.glGetUniformLocationARB(program, sampler);
|
||||
var loc = GL.GetUniformLocation(program, sampler);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glUniform1iARB(loc, nextTexUnit);
|
||||
GL.Uniform1(loc, nextTexUnit);
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
nextTexUnit++;
|
||||
@@ -110,13 +108,13 @@ namespace OpenRA.Renderer.Sdl2
|
||||
|
||||
public void Render(Action a)
|
||||
{
|
||||
Gl.glUseProgramObjectARB(program);
|
||||
GL.UseProgram(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);
|
||||
GL.ActiveTexture(TextureUnit.Texture0 + kv.Key);
|
||||
GL.BindTexture(TextureTarget.Texture2D, ((Texture)kv.Value).ID);
|
||||
}
|
||||
|
||||
ErrorHandler.CheckGlError();
|
||||
@@ -136,34 +134,34 @@ namespace OpenRA.Renderer.Sdl2
|
||||
|
||||
public void SetVec(string name, float x)
|
||||
{
|
||||
Gl.glUseProgramObjectARB(program);
|
||||
GL.UseProgram(program);
|
||||
ErrorHandler.CheckGlError();
|
||||
var param = Gl.glGetUniformLocationARB(program, name);
|
||||
var param = GL.GetUniformLocation(program, name);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glUniform1fARB(param, x);
|
||||
GL.Uniform1(param, x);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
|
||||
public void SetVec(string name, float x, float y)
|
||||
{
|
||||
Gl.glUseProgramObjectARB(program);
|
||||
GL.UseProgram(program);
|
||||
ErrorHandler.CheckGlError();
|
||||
var param = Gl.glGetUniformLocationARB(program, name);
|
||||
var param = GL.GetUniformLocation(program, name);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glUniform2fARB(param, x, y);
|
||||
GL.Uniform2(param, x, y);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
|
||||
public void SetVec(string name, float[] vec, int length)
|
||||
{
|
||||
var param = Gl.glGetUniformLocationARB(program, name);
|
||||
var param = GL.GetUniformLocation(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;
|
||||
case 1: GL.Uniform1(param, 1, vec); break;
|
||||
case 2: GL.Uniform2(param, 1, vec); break;
|
||||
case 3: GL.Uniform3(param, 1, vec); break;
|
||||
case 4: GL.Uniform4(param, 1, vec); break;
|
||||
default: throw new InvalidDataException("Invalid vector length");
|
||||
}
|
||||
|
||||
@@ -175,11 +173,11 @@ namespace OpenRA.Renderer.Sdl2
|
||||
if (mtx.Length != 16)
|
||||
throw new InvalidDataException("Invalid 4x4 matrix");
|
||||
|
||||
Gl.glUseProgramObjectARB(program);
|
||||
GL.UseProgram(program);
|
||||
ErrorHandler.CheckGlError();
|
||||
var param = Gl.glGetUniformLocationARB(program, name);
|
||||
var param = GL.GetUniformLocation(program, name);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glUniformMatrix4fv(param, 1, Gl.GL_FALSE, mtx);
|
||||
GL.UniformMatrix4(param, 1, false, mtx);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user