Allow FrameBuffer clear color to be customized.

This commit is contained in:
Paul Chote
2019-08-31 18:21:30 +01:00
committed by teinarss
parent 09dd66fd5a
commit d2298b6f04
4 changed files with 27 additions and 7 deletions

View File

@@ -60,6 +60,7 @@ namespace OpenRA
IVertexBuffer<Vertex> CreateVertexBuffer(int size); IVertexBuffer<Vertex> CreateVertexBuffer(int size);
ITexture CreateTexture(); ITexture CreateTexture();
IFrameBuffer CreateFrameBuffer(Size s); IFrameBuffer CreateFrameBuffer(Size s);
IFrameBuffer CreateFrameBuffer(Size s, Color clearColor);
IShader CreateShader(string name); IShader CreateShader(string name);
void EnableScissor(int left, int top, int width, int height); void EnableScissor(int left, int top, int width, int height);
void DisableScissor(); void DisableScissor();

View File

@@ -20,12 +20,14 @@ namespace OpenRA.Platforms.Default
{ {
readonly ITexture texture; readonly ITexture texture;
readonly Size size; readonly Size size;
readonly Color clearColor;
uint framebuffer, depth; uint framebuffer, depth;
bool disposed; bool disposed;
public FrameBuffer(Size size, ITextureInternal texture) public FrameBuffer(Size size, ITextureInternal texture, Color clearColor)
{ {
this.size = size; this.size = size;
this.clearColor = clearColor;
if (!Exts.IsPowerOf2(size.Width) || !Exts.IsPowerOf2(size.Height)) if (!Exts.IsPowerOf2(size.Width) || !Exts.IsPowerOf2(size.Height))
throw new InvalidDataException("Frame buffer size ({0}x{1}) must be a power of two".F(size.Width, size.Height)); throw new InvalidDataException("Frame buffer size ({0}x{1}) must be a power of two".F(size.Width, size.Height));
@@ -94,7 +96,7 @@ namespace OpenRA.Platforms.Default
OpenGL.CheckGLError(); OpenGL.CheckGLError();
OpenGL.glViewport(0, 0, size.Width, size.Height); OpenGL.glViewport(0, 0, size.Width, size.Height);
OpenGL.CheckGLError(); OpenGL.CheckGLError();
OpenGL.glClearColor(0, 0, 0, 0); OpenGL.glClearColor(clearColor.R, clearColor.G, clearColor.B, clearColor.A);
OpenGL.CheckGLError(); OpenGL.CheckGLError();
OpenGL.glClear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); OpenGL.glClear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
OpenGL.CheckGLError(); OpenGL.CheckGLError();

View File

@@ -62,13 +62,19 @@ namespace OpenRA.Platforms.Default
public IFrameBuffer CreateFrameBuffer(Size s) public IFrameBuffer CreateFrameBuffer(Size s)
{ {
VerifyThreadAffinity(); VerifyThreadAffinity();
return new FrameBuffer(s, new Texture()); return new FrameBuffer(s, new Texture(), Color.FromArgb(0));
} }
public IFrameBuffer CreateFrameBuffer(Size s, ITextureInternal texture) public IFrameBuffer CreateFrameBuffer(Size s, Color clearColor)
{ {
VerifyThreadAffinity(); VerifyThreadAffinity();
return new FrameBuffer(s, texture); return new FrameBuffer(s, new Texture(), clearColor);
}
public IFrameBuffer CreateFrameBuffer(Size s, ITextureInternal texture, Color clearColor)
{
VerifyThreadAffinity();
return new FrameBuffer(s, texture, clearColor);
} }
public IShader CreateShader(string name) public IShader CreateShader(string name)

View File

@@ -86,7 +86,13 @@ namespace OpenRA.Platforms.Default
doPresent = () => context.Present(); doPresent = () => context.Present();
getGLVersion = () => context.GLVersion; getGLVersion = () => context.GLVersion;
getCreateTexture = () => new ThreadedTexture(this, (ITextureInternal)context.CreateTexture()); getCreateTexture = () => new ThreadedTexture(this, (ITextureInternal)context.CreateTexture());
getCreateFrameBuffer = s => new ThreadedFrameBuffer(this, context.CreateFrameBuffer((Size)s, (ITextureInternal)CreateTexture())); getCreateFrameBuffer =
tuple =>
{
var t = (Tuple<Size, Color>)tuple;
return new ThreadedFrameBuffer(this,
context.CreateFrameBuffer(t.Item1, (ITextureInternal)CreateTexture(), t.Item2));
};
getCreateShader = name => new ThreadedShader(this, context.CreateShader((string)name)); getCreateShader = name => new ThreadedShader(this, context.CreateShader((string)name));
getCreateVertexBuffer = length => new ThreadedVertexBuffer(this, context.CreateVertexBuffer((int)length)); getCreateVertexBuffer = length => new ThreadedVertexBuffer(this, context.CreateVertexBuffer((int)length));
doDrawPrimitives = doDrawPrimitives =
@@ -384,7 +390,12 @@ namespace OpenRA.Platforms.Default
public IFrameBuffer CreateFrameBuffer(Size s) public IFrameBuffer CreateFrameBuffer(Size s)
{ {
return Send(getCreateFrameBuffer, s); return Send(getCreateFrameBuffer, Tuple.Create(s, Color.FromArgb(0)));
}
public IFrameBuffer CreateFrameBuffer(Size s, Color clearColor)
{
return Send(getCreateFrameBuffer, Tuple.Create(s, clearColor));
} }
public IShader CreateShader(string name) public IShader CreateShader(string name)