From c61f3cb3266c04f6d1f116b345cc38c5af243458 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 10 Mar 2018 17:07:38 +1100 Subject: [PATCH] Allow turning off individual channels in gfx api --- ClassicalSharp/GraphicsAPI/Direct3D9Api.cs | 5 +++-- ClassicalSharp/GraphicsAPI/IGraphicsApi.cs | 2 +- ClassicalSharp/GraphicsAPI/OpenGLApi.cs | 4 +++- ClassicalSharp/Rendering/MapRenderer.cs | 4 ++-- src/Client/D3D9Api.c | 4 ++-- src/Client/MapRenderer.c | 4 ++-- src/Client/OpenGLApi.c | 4 ++-- 7 files changed, 15 insertions(+), 12 deletions(-) diff --git a/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs b/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs index b67532797..48ba7f174 100644 --- a/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs +++ b/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs @@ -247,8 +247,9 @@ namespace ClassicalSharp.GraphicsAPI { lastClearCol = col.Pack(); } - public override bool ColourWrite { - set { device.SetRenderState(RenderState.ColorWriteEnable, value ? 0xF : 0x0); } + public override void ColourWriteMask(bool r, bool g, bool b, bool a) { + int flags = (r ? 1 : 0) | (g ? 2 : 0) | (b ? 4 : 0) | (a ? 8 : 0); + device.SetRenderState(RenderState.ColorWriteEnable, flags); } Compare depthTestFunc; diff --git a/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs b/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs index 26955a623..3523d2a14 100644 --- a/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs +++ b/ClassicalSharp/GraphicsAPI/IGraphicsApi.cs @@ -144,7 +144,7 @@ namespace ClassicalSharp.GraphicsAPI { public abstract void DepthTestFunc(CompareFunc func); /// Whether writing to the colour buffer is enabled. - public abstract bool ColourWrite { set; } + public abstract void ColourWriteMask(bool r, bool g, bool b, bool a); /// Whether writing to the depth buffer is enabled. public abstract bool DepthWrite { set; } diff --git a/ClassicalSharp/GraphicsAPI/OpenGLApi.cs b/ClassicalSharp/GraphicsAPI/OpenGLApi.cs index a76df97b3..b2b35b767 100644 --- a/ClassicalSharp/GraphicsAPI/OpenGLApi.cs +++ b/ClassicalSharp/GraphicsAPI/OpenGLApi.cs @@ -138,7 +138,9 @@ namespace ClassicalSharp.GraphicsAPI { } } - public override bool ColourWrite { set { GL.ColorMask(value, value, value, value); } } + public override void ColourWriteMask(bool r, bool g, bool b, bool a) { + GL.ColorMask(r, g, b, a); + } public override void DepthTestFunc(CompareFunc func) { GL.DepthFunc(compareFuncs[(int)func]); diff --git a/ClassicalSharp/Rendering/MapRenderer.cs b/ClassicalSharp/Rendering/MapRenderer.cs index 84d6bbb84..506b9d31b 100644 --- a/ClassicalSharp/Rendering/MapRenderer.cs +++ b/ClassicalSharp/Rendering/MapRenderer.cs @@ -146,7 +146,7 @@ namespace ClassicalSharp.Renderers { gfx.SetBatchFormat(VertexFormat.P3fT2fC4b); gfx.Texturing = false; gfx.AlphaBlending = false; - gfx.ColourWrite = false; + gfx.ColourWriteMask(false, false, false, false); for (int batch = 0; batch < _1DUsed; batch++) { if (translucentPartsCount[batch] <= 0) continue; if (pendingTranslucent[batch] || usedTranslucent[batch]) { @@ -159,7 +159,7 @@ namespace ClassicalSharp.Renderers { // Then actually draw the transluscent blocks gfx.AlphaBlending = true; gfx.Texturing = true; - gfx.ColourWrite = true; + gfx.ColourWriteMask(true, true, true, true); gfx.DepthWrite = false; // we already calculated depth values in depth pass int[] texIds = game.TerrainAtlas1D.TexIds; diff --git a/src/Client/D3D9Api.c b/src/Client/D3D9Api.c index 158dac6d6..340794950 100644 --- a/src/Client/D3D9Api.c +++ b/src/Client/D3D9Api.c @@ -411,8 +411,8 @@ void Gfx_SetDepthTestFunc(Int32 compareFunc) { D3D9_SetRenderState(d3d9_alphaTestFunc, D3DRS_ZFUNC, "D3D9_SetDepthTestFunc"); } -void Gfx_SetColourWrite(bool enabled) { - UInt32 channels = enabled ? 0xF : 0x0; +void Gfx_SetColourWriteMask(bool r, bool g, bool b, bool a) { + UInt32 channels = (r ? 1u : 0u) | (g ? 2u : 0u) | (b ? 4u : 0u) | (a ? 8u : 0u); D3D9_SetRenderState(channels, D3DRS_COLORWRITEENABLE, "D3D9_SetColourWrite"); } diff --git a/src/Client/MapRenderer.c b/src/Client/MapRenderer.c index 418faa18a..7c2b9d8dc 100644 --- a/src/Client/MapRenderer.c +++ b/src/Client/MapRenderer.c @@ -214,7 +214,7 @@ void MapRenderer_RenderTranslucent(Real64 deltaTime) { Gfx_SetBatchFormat(VERTEX_FORMAT_P3FT2FC4B); Gfx_SetTexturing(false); Gfx_SetAlphaBlending(false); - Gfx_SetColourWrite(false); + Gfx_SetColourWriteMask(false, false, false, false); UInt32 batch; for (batch = 0; batch < MapRenderer_1DUsedCount; batch++) { @@ -229,7 +229,7 @@ void MapRenderer_RenderTranslucent(Real64 deltaTime) { /* Then actually draw the transluscent blocks */ Gfx_SetAlphaBlending(true); Gfx_SetTexturing(true); - Gfx_SetColourWrite(true); + Gfx_SetColourWriteMask(true, true, true, true); Gfx_SetDepthWrite(false); /* we already calculated depth values in depth pass */ Gfx_EnableMipmaps(); diff --git a/src/Client/OpenGLApi.c b/src/Client/OpenGLApi.c index 39bc4a25e..5d6aec8c0 100644 --- a/src/Client/OpenGLApi.c +++ b/src/Client/OpenGLApi.c @@ -230,8 +230,8 @@ void Gfx_ClearColour(PackedCol col) { gl_lastClearCol = col; } -void Gfx_SetColourWrite(bool enabled) { - glColorMask(enabled, enabled, enabled, enabled); +void Gfx_SetColourWriteMask(bool r, bool g, bool b, bool a) { + glColorMask(r, g, b, a); } void Gfx_SetDepthWrite(bool enabled) {