@@ -1,6 +1,6 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2013 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,7 @@ using System.Linq;
|
||||
using OpenRA;
|
||||
using OpenRA.Graphics;
|
||||
using SDL2;
|
||||
using Tao.OpenGl;
|
||||
using OpenTK.Graphics.OpenGL;
|
||||
|
||||
[assembly: Renderer(typeof(OpenRA.Renderer.Sdl2.DeviceFactory))]
|
||||
|
||||
@@ -33,6 +33,7 @@ namespace OpenRA.Renderer.Sdl2
|
||||
{
|
||||
static string[] requiredExtensions =
|
||||
{
|
||||
// TODO: not ARB anymore
|
||||
"GL_ARB_vertex_shader",
|
||||
"GL_ARB_fragment_shader",
|
||||
"GL_ARB_vertex_buffer_object",
|
||||
@@ -41,7 +42,7 @@ namespace OpenRA.Renderer.Sdl2
|
||||
|
||||
Size size;
|
||||
Sdl2Input input;
|
||||
IntPtr window;
|
||||
IntPtr context, window;
|
||||
|
||||
public Size WindowSize { get { return size; } }
|
||||
|
||||
@@ -84,10 +85,12 @@ namespace OpenRA.Renderer.Sdl2
|
||||
}
|
||||
|
||||
SDL.SDL_ShowCursor(0);
|
||||
SDL.SDL_GL_CreateContext(window);
|
||||
context = SDL.SDL_GL_CreateContext(window);
|
||||
SDL.SDL_GL_MakeCurrent(window, context);
|
||||
GL.LoadAll();
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
var extensions = Gl.glGetString(Gl.GL_EXTENSIONS);
|
||||
var extensions = GL.GetString(StringName.Extensions);
|
||||
if (extensions == null)
|
||||
Console.WriteLine("Failed to fetch GL_EXTENSIONS, this is bad.");
|
||||
|
||||
@@ -98,9 +101,9 @@ namespace OpenRA.Renderer.Sdl2
|
||||
throw new InvalidProgramException("Unsupported GPU. See graphics.log for details.");
|
||||
}
|
||||
|
||||
Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
|
||||
GL.EnableClientState(ArrayCap.VertexArray);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glEnableClientState(Gl.GL_TEXTURE_COORD_ARRAY);
|
||||
GL.EnableClientState(ArrayCap.TextureCoordArray);
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
SDL.SDL_SetModState(0);
|
||||
@@ -109,17 +112,19 @@ namespace OpenRA.Renderer.Sdl2
|
||||
|
||||
public virtual void Quit()
|
||||
{
|
||||
SDL.SDL_GL_DeleteContext(context);
|
||||
SDL.SDL_DestroyWindow(window);
|
||||
SDL.SDL_Quit();
|
||||
}
|
||||
|
||||
int ModeFromPrimitiveType(PrimitiveType pt)
|
||||
BeginMode ModeFromPrimitiveType(PrimitiveType pt)
|
||||
{
|
||||
switch (pt)
|
||||
{
|
||||
case PrimitiveType.PointList: return Gl.GL_POINTS;
|
||||
case PrimitiveType.LineList: return Gl.GL_LINES;
|
||||
case PrimitiveType.TriangleList: return Gl.GL_TRIANGLES;
|
||||
case PrimitiveType.QuadList: return Gl.GL_QUADS;
|
||||
case PrimitiveType.PointList: return BeginMode.Points;
|
||||
case PrimitiveType.LineList: return BeginMode.Lines;
|
||||
case PrimitiveType.TriangleList: return BeginMode.Triangles;
|
||||
case PrimitiveType.QuadList: return BeginMode.Quads;
|
||||
}
|
||||
|
||||
throw new NotImplementedException();
|
||||
@@ -127,63 +132,63 @@ namespace OpenRA.Renderer.Sdl2
|
||||
|
||||
public void DrawPrimitives(PrimitiveType pt, int firstVertex, int numVertices)
|
||||
{
|
||||
Gl.glDrawArrays(ModeFromPrimitiveType(pt), firstVertex, numVertices);
|
||||
GL.DrawArrays(ModeFromPrimitiveType(pt), firstVertex, numVertices);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
Gl.glClearColor(0, 0, 0, 0);
|
||||
GL.ClearColor(0, 0, 0, 0);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
|
||||
GL.Clear(ClearBufferMask.ColorBufferBit);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
|
||||
public void EnableDepthBuffer()
|
||||
{
|
||||
Gl.glClear(Gl.GL_DEPTH_BUFFER_BIT);
|
||||
GL.Clear(ClearBufferMask.DepthBufferBit);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glEnable(Gl.GL_DEPTH_TEST);
|
||||
GL.Enable(EnableCap.DepthTest);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
|
||||
public void DisableDepthBuffer()
|
||||
{
|
||||
Gl.glDisable(Gl.GL_DEPTH_TEST);
|
||||
GL.Disable(EnableCap.DepthTest);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
|
||||
public void SetBlendMode(BlendMode mode)
|
||||
{
|
||||
Gl.glBlendEquation(Gl.GL_FUNC_ADD);
|
||||
GL.BlendEquation(BlendEquationMode.FuncAdd);
|
||||
ErrorHandler.CheckGlError();
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case BlendMode.None:
|
||||
Gl.glDisable(Gl.GL_BLEND);
|
||||
GL.Disable(EnableCap.Blend);
|
||||
break;
|
||||
case BlendMode.Alpha:
|
||||
Gl.glEnable(Gl.GL_BLEND);
|
||||
GL.Enable(EnableCap.Blend);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
|
||||
break;
|
||||
case BlendMode.Additive:
|
||||
Gl.glEnable(Gl.GL_BLEND);
|
||||
GL.Enable(EnableCap.Blend);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glBlendFunc(Gl.GL_ONE, Gl.GL_ONE);
|
||||
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One);
|
||||
break;
|
||||
case BlendMode.Subtractive:
|
||||
Gl.glEnable(Gl.GL_BLEND);
|
||||
GL.Enable(EnableCap.Blend);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glBlendFunc(Gl.GL_ONE, Gl.GL_ONE);
|
||||
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.One);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glBlendEquation(Gl.GL_FUNC_REVERSE_SUBTRACT);
|
||||
GL.BlendEquation(BlendEquationMode.FuncReverseSubtract);
|
||||
break;
|
||||
case BlendMode.Multiply:
|
||||
Gl.glEnable(Gl.GL_BLEND);
|
||||
GL.Enable(EnableCap.Blend);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glBlendFuncSeparate(Gl.GL_DST_COLOR, Gl.GL_ZERO, Gl.GL_ONE, Gl.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GL.BlendFuncSeparate(BlendingFactorSrc.DstColor, BlendingFactorDest.Zero, BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha);
|
||||
ErrorHandler.CheckGlError();
|
||||
break;
|
||||
}
|
||||
@@ -199,21 +204,21 @@ namespace OpenRA.Renderer.Sdl2
|
||||
if (height < 0)
|
||||
height = 0;
|
||||
|
||||
Gl.glScissor(left, size.Height - (top + height), width, height);
|
||||
GL.Scissor(left, size.Height - (top + height), width, height);
|
||||
ErrorHandler.CheckGlError();
|
||||
Gl.glEnable(Gl.GL_SCISSOR_TEST);
|
||||
GL.Enable(EnableCap.ScissorTest);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
|
||||
public void DisableScissor()
|
||||
{
|
||||
Gl.glDisable(Gl.GL_SCISSOR_TEST);
|
||||
GL.Disable(EnableCap.ScissorTest);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
|
||||
public void SetLineWidth(float width)
|
||||
{
|
||||
Gl.glLineWidth(width);
|
||||
GL.LineWidth(width);
|
||||
ErrorHandler.CheckGlError();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user