From 5add0a5c9acf673e588022d2ab82a9f0c34eb8f0 Mon Sep 17 00:00:00 2001 From: Speak2Erase Date: Wed, 22 Dec 2021 22:13:27 -0800 Subject: [PATCH] I think I actually added a shader in like under 15 minutes --- CMakeLists.txt | 1 + Dockerfile-windows | 23 +++++++------- binding-mri/viewport-binding.cpp | 13 ++++++++ shader/binary_glitch.frag | 53 ++++++++++++++++++++++++++++++++ src/graphics/headers/scene.h | 3 +- src/graphics/source/graphics.cpp | 34 +++++++++++++++++++- src/opengl/headers/shader.h | 11 +++++++ src/opengl/headers/viewport.h | 1 + src/opengl/source/shader.cpp | 15 +++++++++ src/opengl/source/viewport.cpp | 8 +++-- 10 files changed, 147 insertions(+), 15 deletions(-) create mode 100644 shader/binary_glitch.frag diff --git a/CMakeLists.txt b/CMakeLists.txt index 6642a66e..2baa0e1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -236,6 +236,7 @@ set(EMBEDDED_INPUT shader/cubic_lens.frag shader/water.frag shader/zoom.vert + shader/binary_glitch.frag assets/icon.png assets/gamecontrollerdb.txt ) diff --git a/Dockerfile-windows b/Dockerfile-windows index a4a995df..ffb67e3c 100644 --- a/Dockerfile-windows +++ b/Dockerfile-windows @@ -5,24 +5,25 @@ FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-ltsc2019 # install vs community (not vs buildtools because we need devenv to upgrade vs solutions ADD https://aka.ms/vs/16/release/vs_community.exe /vs_community.exe -RUN C:\vs_community.exe --quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended +RUN C:\vs_community.exe --quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended --add Microsoft.VisualStudio.Workload.C++ # install chocolatey and use it to install cmake, git, conan, vim (vim for xxd only, since installing cygwin breaks docker) -RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -RUN iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) -RUN choco install -y cmake git conan vim +RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; ` +iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')); ` +choco install -y cmake git conan vim; # configure path (add xxd and cmake), conan remotes, and fix windows path size limits for conan -RUN [Environment]::SetEnvironmentVariable('Path', $env:Path + ';C:\Program Files\CMake\bin;C:\tools\vim\vim82', 'Machine') -RUN conan remote add eliza https://rkevin.jfrog.io/artifactory/api/conan/eliza -RUN conan remote add bincrafters https://bincrafters.jfrog.io/artifactory/api/conan/public-conan -RUN conan remote add astrabit https://rkevin.jfrog.io/artifactory/api/conan/astrabit -RUN conan config set general.revisions_enabled=1 -RUN setx CONAN_USE_ALWAYS_SHORT_PATHS 1 +RUN [Environment]::SetEnvironmentVariable('Path', $env:Path + ';C:\Program Files\CMake\bin;C:\tools\vim\vim82', 'Machine'); ` +conan remote add eliza https://rkevin.jfrog.io/artifactory/api/conan/eliza; ` +conan remote add bincrafters https://bincrafters.jfrog.io/artifactory/api/conan/public-conan; ` +conan remote add astrabit https://rkevin.jfrog.io/artifactory/api/conan/astrabit; ` +conan config set general.revisions_enabled=1; ` +conan profile new default --detect; ` +setx CONAN_USE_ALWAYS_SHORT_PATHS 1; # prebuild all dependencies using the conanfile in this commit COPY conanfile.py C:/Temp/install_deps/ -RUN conan install --build=missing C:\Temp\install_deps +RUN conan install --build=missing C:\Temp\install_deps -s compiler.cppstd=20 -s compiler.runtime=static # finally, we build oneshot when we run the container ENTRYPOINT ["C:\\work\\src\\build-entrypoint-windows.bat"] diff --git a/binding-mri/viewport-binding.cpp b/binding-mri/viewport-binding.cpp index 505f4ceb..6901586d 100644 --- a/binding-mri/viewport-binding.cpp +++ b/binding-mri/viewport-binding.cpp @@ -102,6 +102,18 @@ RB_METHOD(setCubicTime) return Qnil; } +RB_METHOD(setBinaryStrength) +{ + int strength; + rb_get_args(argc, argv, "i", &strength); + + Viewport *v = getPrivateData(self); + + v->setBinaryStrength(strength); + + return Qnil; +} + RB_METHOD(setWaterTime) { double time; @@ -148,6 +160,7 @@ viewportBindingInit() _rb_define_method(klass, "setRGBOffset", setRGBOffset); _rb_define_method(klass, "setZoom", setZoom); _rb_define_method(klass, "setCubicTime", setCubicTime); + _rb_define_method(klass, "setBinaryStrength", setBinaryStrength); _rb_define_method(klass, "setWaterTime", setWaterTime); INIT_PROP_BIND( Viewport, Rect, "rect" ); diff --git a/shader/binary_glitch.frag b/shader/binary_glitch.frag new file mode 100644 index 00000000..90d1d291 --- /dev/null +++ b/shader/binary_glitch.frag @@ -0,0 +1,53 @@ + +// Binary Glitch - based on Luminosity. +// use the Mouse to effect the strength. + + +// by D34N 4L3X +// dean@neuroid.co.uk + +uniform sampler2D texture; +uniform int strength +varying vec2 v_texCoord; + +void main() +{ + vec2 uv = v_texCoord; +// uv.t = 1.0 - uv.t; + + float x = uv.s; + float y = uv.t; + + // + float glitchStrength = 10. - float(strength); + + // get snapped position + float psize = 0.04 * glitchStrength; + float psq = 1.0 / psize; + + float px = floor( x * psq + 0.5) * psize; + float py = floor( y * psq + 0.5) * psize; + + vec4 colSnap = texture2D( texture, vec2( px,py) ); + + float lum = pow( 1.0 - (colSnap.r + colSnap.g + colSnap.b) / 3.0, glitchStrength ); // remove the minus one if you want to invert luma + + + + // do move with lum as multiplying factor + float qsize = psize * lum; + + float qsq = 1.0 / qsize; + + float qx = floor( x * qsq + 0.5) * qsize; + float qy = floor( y * qsq + 0.5) * qsize; + + float rx = (px - qx) * lum + x; + float ry = (py - qy) * lum + y; + + vec4 colMove = texture2D( texture, vec2( rx,ry) ); + + + // final color + gl_FragColor = colMove; +} \ No newline at end of file diff --git a/src/graphics/headers/scene.h b/src/graphics/headers/scene.h index eab0abc6..8d989c9b 100644 --- a/src/graphics/headers/scene.h +++ b/src/graphics/headers/scene.h @@ -63,7 +63,8 @@ class Scene const Vec4 /* rbg */, const Vec2 /* zoom */, const float /* cubic */, - const float /* water */) {} + const float /* water */, + const int /* binary */) {} const Geometry &getGeometry() const { return geometry; } diff --git a/src/graphics/source/graphics.cpp b/src/graphics/source/graphics.cpp index 4cf51686..4001b83c 100644 --- a/src/graphics/source/graphics.cpp +++ b/src/graphics/source/graphics.cpp @@ -178,7 +178,7 @@ class ScreenScene : public Scene } } - void requestViewportRender(const Vec4 &c, const Vec4 &f, const Vec4 &t, const bool s, const Vec4 rx, const Vec4 ry, const Vec2 z, const float cubic, const float water) + void requestViewportRender(const Vec4 &c, const Vec4 &f, const Vec4 &t, const bool s, const Vec4 rx, const Vec4 ry, const Vec2 z, const float cubic, const float water, const int binary) { const IntRect &viewpRect = glState.scissorBox.get(); const IntRect &screenRect = geometry.rect; @@ -192,6 +192,7 @@ class ScreenScene : public Scene const bool rgbOffset = rx.xyzNotNull() || ry.xyzNotNull() && !toneGrayEffect && !s && !(z.x != 1 || z.y != 1) && !cubicEffect; const bool scannedEffect = s && !t.w != 0 && !rgbOffset && !(z.x != 1 || z.y != 1) && !cubicEffect; const bool zoomEffect = (z.x != 1 || z.y != 1) && !scannedEffect && !rgbOffset && !cubicEffect; + const bool binaryEffect = binary != 0; if (toneGrayEffect) { @@ -215,6 +216,37 @@ class ScreenScene : public Scene GrayShader &shader = shState->shaders().gray; shader.bind(); shader.setGray(t.w); + /* shader.applyViewportProj(); */ + shader.setTexSize(viewpRect.size()); + + TEX::bind(pp.backBuffer().tex); + + glState.blend.pushSet(false); + screenQuad.draw(); + glState.blend.pop(); + } + + if (binaryEffect) + { + pp.swapRender(); + + if (!viewpRect.encloses(screenRect)) + { + /* Scissor test _does_ affect FBO blit operations, + * and since we're inside the draw cycle, it will + * be turned on, so turn it off temporarily */ + glState.scissorTest.pushSet(false); + + GLMeta::blitBegin(pp.frontBuffer()); + GLMeta::blitSource(pp.backBuffer()); + GLMeta::blitRectangle(geometry.rect, Vec2i()); + GLMeta::blitEnd(); + + glState.scissorTest.pop(); + } + + BinaryShader &shader = shState->shaders().binary; + shader.bind(); shader.applyViewportProj(); shader.setTexSize(viewpRect.size()); diff --git a/src/opengl/headers/shader.h b/src/opengl/headers/shader.h index 5e92a24e..cf16fb99 100644 --- a/src/opengl/headers/shader.h +++ b/src/opengl/headers/shader.h @@ -394,6 +394,16 @@ class WaterShader : public ShaderBase GLint u_iTime, u_opacity; }; +class BinaryShader : public ShaderBase +{ +public: + BinaryShader(); + + void setStrength(const int value); +private: + GLint u_strength; +}; + /* Global object containing all available shaders */ struct ShaderSet @@ -423,6 +433,7 @@ struct ShaderSet ZoomShader zoom; CubicShader cubic; WaterShader water; + BinaryShader binary; }; #endif // SHADER_H diff --git a/src/opengl/headers/viewport.h b/src/opengl/headers/viewport.h index 125e6549..05c0361d 100644 --- a/src/opengl/headers/viewport.h +++ b/src/opengl/headers/viewport.h @@ -48,6 +48,7 @@ class Viewport : public Scene, public SceneElement, public Flashable, public Dis DECL_ATTR( RGBOffsetx, Vec4 ) DECL_ATTR( RGBOffsety, Vec4 ) DECL_ATTR( CubicTime, float ) + DECL_ATTR( BinaryStrength, int ) DECL_ATTR( WaterTime, float ) DECL_ATTR( Zoom, Vec2 ) diff --git a/src/opengl/source/shader.cpp b/src/opengl/source/shader.cpp index 9726de39..137d01f6 100644 --- a/src/opengl/source/shader.cpp +++ b/src/opengl/source/shader.cpp @@ -58,6 +58,7 @@ #include "crt_sprite.frag.xxd" #include "cubic_lens.frag.xxd" #include "water.frag.xxd" +#include "binary_glitch.frag.xxd" #include "chronos.frag.xxd" #include "zoom.vert.xxd" @@ -757,4 +758,18 @@ void WaterShader::setiTime(const float value) void WaterShader::setOpacity(const float value) { gl.Uniform1f(u_opacity, value); +} + +BinaryShader::BinaryShader() +{ + INIT_SHADER(simple, binary, BinaryShader); + + ShaderBase::init(); + + GET_U(strength); +} + +void BinaryShader::setStrength(const int value) +{ + gl.Uniform1i(u_strength, value); } \ No newline at end of file diff --git a/src/opengl/source/viewport.cpp b/src/opengl/source/viewport.cpp index f31a8067..9d504c1f 100644 --- a/src/opengl/source/viewport.cpp +++ b/src/opengl/source/viewport.cpp @@ -55,6 +55,8 @@ struct ViewportPrivate float waterTime; + int binaryStrength; + Vec2 zoom; EtcTemps tmp; @@ -70,6 +72,7 @@ struct ViewportPrivate rgbOffsety(Vec4(0, 0, 0, 0)), cubicTime(0.0), waterTime(0.0), + binaryStrength(0), zoom(Vec2(1.0, 1.0)) { rect->set(x, y, width, height); @@ -110,7 +113,7 @@ struct ViewportPrivate bool needsEffectRender(bool flashing) { bool rectEffective = !rect->isEmpty(); - bool colorToneEffective = color->hasEffect() || tone->hasEffect() || flashing || scanned || rgbOffsetx.xyzNotNull() || rgbOffsety.xyzNotNull() || zoom.x != 1 || zoom.y != 1 || cubicTime != 0.0 || waterTime != 0.0; + bool colorToneEffective = color->hasEffect() || tone->hasEffect() || flashing || scanned || rgbOffsetx.xyzNotNull() || rgbOffsety.xyzNotNull() || zoom.x != 1 || zoom.y != 1 || cubicTime != 0.0 || waterTime != 0.0 || binaryStrength != 0; return (rectEffective && colorToneEffective && isOnScreen); } @@ -169,6 +172,7 @@ DEF_ATTR_SIMPLE(Viewport, Color, Color&, *p->color) DEF_ATTR_SIMPLE(Viewport, Tone, Tone&, *p->tone) DEF_ATTR_SIMPLE(Viewport, Scanned, bool, p->scanned) DEF_ATTR_SIMPLE(Viewport, CubicTime, float, p->cubicTime) +DEF_ATTR_SIMPLE(Viewport, BinaryStrength, int, p->binaryStrength) DEF_ATTR_SIMPLE(Viewport, WaterTime, float, p->waterTime) DEF_ATTR_SIMPLE(Viewport, RGBOffsetx, Vec4, p->rgbOffsetx) DEF_ATTR_SIMPLE(Viewport, RGBOffsety, Vec4, p->rgbOffsety) @@ -226,7 +230,7 @@ void Viewport::composite() * render them. */ if (renderEffect) scene->requestViewportRender - (p->color->norm, flashColor, p->tone->norm, p->scanned, p->rgbOffsetx, p->rgbOffsety, p->zoom, p->cubicTime, p->waterTime); + (p->color->norm, flashColor, p->tone->norm, p->scanned, p->rgbOffsetx, p->rgbOffsety, p->zoom, p->cubicTime, p->waterTime, p->binaryStrength); glState.scissorBox.pop(); glState.scissorTest.pop();