diff --git a/Logo.png b/Logo.png index a78661a..23f2df9 100644 Binary files a/Logo.png and b/Logo.png differ diff --git a/Logo_Small.png b/Logo_Small.png index c21509c..b03856f 100644 Binary files a/Logo_Small.png and b/Logo_Small.png differ diff --git a/Logo_ZDF.png b/Logo_ZDF.png index 95e6cc4..91c00b0 100644 Binary files a/Logo_ZDF.png and b/Logo_ZDF.png differ diff --git a/cvarinfo.marifx b/cvarinfo.marifx index 29786a6..78a5b89 100644 --- a/cvarinfo.marifx +++ b/cvarinfo.marifx @@ -119,7 +119,8 @@ nosave bool mfx_palenable = false; nosave int mfx_palnum = 0; nosave float mfx_palsat = 1.; nosave float mfx_palpow = 1.; -nosave float mfx_paldither = .05; +nosave int mfx_paldither = 3; +nosave int mfx_paldepth = 6; nosave string mfx_presetname = "Unnamed"; diff --git a/gldefs.txt b/gldefs.txt index bfc0e9e..5363bc2 100644 --- a/gldefs.txt +++ b/gldefs.txt @@ -191,6 +191,8 @@ HardwareShader postprocess scene Uniform vec2 sfact Uniform float palsat Uniform float palpow - Uniform float paldither + Uniform int paldepth + Uniform int dsize + Uniform int doffset Uniform int palnum } diff --git a/language.txt b/language.txt index 38b22cd..75505b6 100644 --- a/language.txt +++ b/language.txt @@ -78,6 +78,11 @@ MFX_PALETTE61="RGB3"; MFX_PALETTE62="RGB4"; MFX_PALETTE63="RGB5"; MFX_PALETTE64="RGB6"; +MFX_DITHER1="Checkerboard"; +MFX_DITHER2="Bayer 2x2"; +MFX_DITHER3="Bayer 4x4"; +MFX_DITHER4="Bayer 8x8"; +MFX_DITHER5="Bayer 16x16"; MFX_LUT1="Skyrim Day"; MFX_LUT2="Skyrim Interior Day"; MFX_LUT3="Skyrim Interior Night"; @@ -226,6 +231,7 @@ MFX_PALNUM="Palette"; MFX_PALSAT="Saturation"; MFX_PALPOW="Gamma"; MFX_PALDITHER="Dithering"; +MFX_PALDEPTH="Depth"; MFX_PRESETNUM="Preset Slot"; MFX_PRESETNAME="Preset Name"; MFX_LOADPRESET="Load Preset"; diff --git a/menudef.txt b/menudef.txt index 8051bed..a58d351 100644 --- a/menudef.txt +++ b/menudef.txt @@ -105,6 +105,15 @@ OptionValue "MFXPalette" 63, "$MFX_PALETTE64" } +OptionValue "MFXDither" +{ + 0, "$MFX_DITHER1" + 1, "$MFX_DITHER2" + 2, "$MFX_DITHER3" + 3, "$MFX_DITHER4" + 4, "$MFX_DITHER5" +} + OptionValue "MFXLUT" { 0, "$MFX_LUT1" @@ -308,6 +317,7 @@ OptionMenu "MFXOptionsMenu" Option "$MFX_PALNUM", "mfx_palnum", "MFXPalette" MFXSlider "$MFX_PALSAT", "mfx_palsat", 0, 2, 0.01, 2 MFXSlider "$MFX_PALPOW", "mfx_palpow", 0, 2, 0.01, 2 - MFXSlider "$MFX_PALDITHER", "mfx_paldither", 0, 1, 0.01, 2 + Option "$MFX_PALDITHER", "mfx_paldither", "MFXDither" + MFXSlider "$MFX_PALDEPTH", "mfx_paldepth", 1, 6, 1, 0 SafeCommand "$MFX_RESET", "event resetmfxvars 7" } diff --git a/shaders/glsl/mfx_palette.fp b/shaders/glsl/mfx_palette.fp index 09ad352..8ea86cc 100644 --- a/shaders/glsl/mfx_palette.fp +++ b/shaders/glsl/mfx_palette.fp @@ -26,9 +26,16 @@ void main() hsv.y = clamp(hsv.y*palsat,0.,1.); hsv.z = pow(max(hsv.z,0.),palpow); res.rgb = hsv2rgb(hsv); - ivec2 dcoord = ivec2(int(coord.x*sfact.x)%8,int(coord.y*sfact.y)%8); - res.rgb += paldither*texelFetch(DitherTexture,dcoord,0).x-.5*paldither; - vec3 lc = clamp(floor(res.rgb*64),0,63); + float cstep = float(paldepth); + float cdiv = 1./cstep; + vec3 cl = floor(res.rgb*cstep)*cdiv; + vec3 ch = ceil(res.rgb*cstep)*cdiv; + vec3 cf = fract(res.rgb*cstep); + ivec2 dcoord = ivec2(int(coord.x*sfact.x)%dsize,int(coord.y*sfact.y)%dsize+doffset); + float dth = texelFetch(DitherTexture,dcoord,0).x*.9375+.03125; + vec3 thr = vec3(step(dth,cf.r),step(dth,cf.g),step(dth,cf.b)); + res.rgb = mix(cl,ch,thr); + vec3 lc = clamp(floor(res.rgb*64.),0.,63.); ivec2 lcoord = ivec2(lc.r,lc.g+lc.b*64); lcoord.x += 64*palnum; res.rgb = texelFetch(PalLUTTexture,lcoord,0).rgb; diff --git a/textures/mfxdirt.png b/textures/mfxdirt.png index f07f2c2..e695802 100644 Binary files a/textures/mfxdirt.png and b/textures/mfxdirt.png differ diff --git a/textures/mfxdither.png b/textures/mfxdither.png index 98f2f4e..2b313ef 100644 Binary files a/textures/mfxdither.png and b/textures/mfxdither.png differ diff --git a/textures/mfxlut.png b/textures/mfxlut.png index 3474f33..22ecad9 100644 Binary files a/textures/mfxlut.png and b/textures/mfxlut.png differ diff --git a/textures/mfxpal.png b/textures/mfxpal.png index 79f0e8c..9e0ddc1 100644 Binary files a/textures/mfxpal.png and b/textures/mfxpal.png differ diff --git a/textures/mfxvig.png b/textures/mfxvig.png index be7d604..b796c62 100644 Binary files a/textures/mfxvig.png and b/textures/mfxvig.png differ diff --git a/zscript/mfx_handler.zsc b/zscript/mfx_handler.zsc index 9345037..dde93f8 100644 --- a/zscript/mfx_handler.zsc +++ b/zscript/mfx_handler.zsc @@ -164,8 +164,31 @@ Class MariFXHandler : StaticEventHandler Shader.SetUniform2f(p,"mfx_palette","sfact",mfx_retroenable?bresl:rresl); Shader.SetUniform1f(p,"mfx_palette","palsat",mfx_palsat); Shader.SetUniform1f(p,"mfx_palette","palpow",mfx_palpow); + Shader.SetUniform1i(p,"mfx_palette","paldepth",mfx_paldepth); + switch ( mfx_paldither ) + { + case 1: + Shader.SetUniform1i(p,"mfx_palette","dsize",2); + Shader.SetUniform1i(p,"mfx_palette","doffset",2); + break; + case 2: + Shader.SetUniform1i(p,"mfx_palette","dsize",4); + Shader.SetUniform1i(p,"mfx_palette","doffset",4); + break; + case 3: + Shader.SetUniform1i(p,"mfx_palette","dsize",8); + Shader.SetUniform1i(p,"mfx_palette","doffset",8); + break; + case 4: + Shader.SetUniform1i(p,"mfx_palette","dsize",16); + Shader.SetUniform1i(p,"mfx_palette","doffset",16); + break; + default: + Shader.SetUniform1i(p,"mfx_palette","dsize",2); + Shader.SetUniform1i(p,"mfx_palette","doffset",0); + break; + } Shader.SetUniform1i(p,"mfx_palette","palnum",mfx_palnum); - Shader.SetUniform1f(p,"mfx_palette","paldither",mfx_paldither); } override void ConsoleProcess( ConsoleEvent e ) { @@ -297,6 +320,7 @@ Class MariFXHandler : StaticEventHandler CVar.FindCVar('mfx_palsat').ResetToDefault(); CVar.FindCVar('mfx_palpow').ResetToDefault(); CVar.FindCVar('mfx_paldither').ResetToDefault(); + CVar.FindCVar('mfx_paldepth').ResetToDefault(); break; case 8: CVar.FindCVar('mfx_lsharpenable').ResetToDefault();