From d2298b6f04fd01681f54a3476262091ea5dec60b Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 31 Aug 2019 18:21:30 +0100 Subject: [PATCH] Allow FrameBuffer clear color to be customized. --- OpenRA.Game/Graphics/PlatformInterfaces.cs | 1 + OpenRA.Platforms.Default/FrameBuffer.cs | 6 ++++-- OpenRA.Platforms.Default/Sdl2GraphicsContext.cs | 12 +++++++++--- .../ThreadedGraphicsContext.cs | 15 +++++++++++++-- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/OpenRA.Game/Graphics/PlatformInterfaces.cs b/OpenRA.Game/Graphics/PlatformInterfaces.cs index a6aa16863b..25c66c249b 100644 --- a/OpenRA.Game/Graphics/PlatformInterfaces.cs +++ b/OpenRA.Game/Graphics/PlatformInterfaces.cs @@ -60,6 +60,7 @@ namespace OpenRA IVertexBuffer CreateVertexBuffer(int size); ITexture CreateTexture(); IFrameBuffer CreateFrameBuffer(Size s); + IFrameBuffer CreateFrameBuffer(Size s, Color clearColor); IShader CreateShader(string name); void EnableScissor(int left, int top, int width, int height); void DisableScissor(); diff --git a/OpenRA.Platforms.Default/FrameBuffer.cs b/OpenRA.Platforms.Default/FrameBuffer.cs index c19e9a73dc..002b7b5c09 100644 --- a/OpenRA.Platforms.Default/FrameBuffer.cs +++ b/OpenRA.Platforms.Default/FrameBuffer.cs @@ -20,12 +20,14 @@ namespace OpenRA.Platforms.Default { readonly ITexture texture; readonly Size size; + readonly Color clearColor; uint framebuffer, depth; bool disposed; - public FrameBuffer(Size size, ITextureInternal texture) + public FrameBuffer(Size size, ITextureInternal texture, Color clearColor) { this.size = size; + this.clearColor = clearColor; 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)); @@ -94,7 +96,7 @@ namespace OpenRA.Platforms.Default OpenGL.CheckGLError(); OpenGL.glViewport(0, 0, size.Width, size.Height); OpenGL.CheckGLError(); - OpenGL.glClearColor(0, 0, 0, 0); + OpenGL.glClearColor(clearColor.R, clearColor.G, clearColor.B, clearColor.A); OpenGL.CheckGLError(); OpenGL.glClear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); OpenGL.CheckGLError(); diff --git a/OpenRA.Platforms.Default/Sdl2GraphicsContext.cs b/OpenRA.Platforms.Default/Sdl2GraphicsContext.cs index c99fedf384..dcadf3d3b8 100644 --- a/OpenRA.Platforms.Default/Sdl2GraphicsContext.cs +++ b/OpenRA.Platforms.Default/Sdl2GraphicsContext.cs @@ -62,13 +62,19 @@ namespace OpenRA.Platforms.Default public IFrameBuffer CreateFrameBuffer(Size s) { 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(); - 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) diff --git a/OpenRA.Platforms.Default/ThreadedGraphicsContext.cs b/OpenRA.Platforms.Default/ThreadedGraphicsContext.cs index d28b0cbe6a..d5309dd4e8 100644 --- a/OpenRA.Platforms.Default/ThreadedGraphicsContext.cs +++ b/OpenRA.Platforms.Default/ThreadedGraphicsContext.cs @@ -86,7 +86,13 @@ namespace OpenRA.Platforms.Default doPresent = () => context.Present(); getGLVersion = () => context.GLVersion; getCreateTexture = () => new ThreadedTexture(this, (ITextureInternal)context.CreateTexture()); - getCreateFrameBuffer = s => new ThreadedFrameBuffer(this, context.CreateFrameBuffer((Size)s, (ITextureInternal)CreateTexture())); + getCreateFrameBuffer = + tuple => + { + var t = (Tuple)tuple; + return new ThreadedFrameBuffer(this, + context.CreateFrameBuffer(t.Item1, (ITextureInternal)CreateTexture(), t.Item2)); + }; getCreateShader = name => new ThreadedShader(this, context.CreateShader((string)name)); getCreateVertexBuffer = length => new ThreadedVertexBuffer(this, context.CreateVertexBuffer((int)length)); doDrawPrimitives = @@ -384,7 +390,12 @@ namespace OpenRA.Platforms.Default 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)