crt-resswitch-glitch-koko: general improvements (#525)

* crt-resswitch-glitch-koko: use % of screen as treshold and skip initial frames to avoid unwanted glitches on flyback core.

* crt-resswitch-glitch-koko: check for horizontal resolution too and code legibility improvement
This commit is contained in:
Antonio Orefice 2024-01-08 15:39:38 +01:00 committed by GitHub
parent 619eaa82a9
commit 5e1db94e0d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -24,10 +24,11 @@ layout(std140, set = 0, binding = 0) uniform UBO {
float RESSWITCH_GLITCH_TRESHOLD;
float RESSWITCH_GLITCH_BAR;
float RESSWITCH_GLITCH_SHAKE_MAX;
uint FrameCount;
} global;
#pragma parameter RESSWITCH_ENABLE "★ Resolution switch glitch enable? ==>" 1.0 0.0 1.0 1.0
#pragma parameter RESSWITCH_GLITCH_TRESHOLD " Glitch if vertical resolution changes at least by" 50.0 1.0 1000.0 5.0
#pragma parameter RESSWITCH_GLITCH_TRESHOLD " Glitch if vertical resolution changes at least by" 0.1 0.01 1.0 0.01
#pragma parameter RESSWITCH_GLITCH_BAR " Bright glitch bars strength" 0.2 0.0 1.0 0.01
#pragma parameter RESSWITCH_GLITCH_SHAKE_MAX " Screen shake amplitude" 0.2 0.0 1.0 0.01
@ -37,30 +38,48 @@ layout(location = 1) in vec2 TexCoord;
layout(location = 0) out vec2 vTexCoord;
layout(location = 1) out float vSwitchres_show_bar;
#define _3kHIST0 global.SourceSize.xy
#define _3kHIST1 global.OriginalHistorySize1.xy
#define _3kHIST2 global.OriginalHistorySize2.xy
#define _3kHIST3 global.OriginalHistorySize3.xy
#define _3kHIST4 global.OriginalHistorySize4.xy
#define _3kHIST5 global.OriginalHistorySize5.xy
bool changed_enough(vec2 current, vec2 past){
return (abs(current.y - past.y) / current.y > global.RESSWITCH_GLITCH_TRESHOLD) ||
(abs(current.x - past.x) / current.x > global.RESSWITCH_GLITCH_TRESHOLD);
}
void main() {
gl_Position = global.MVP * Position;
vTexCoord = TexCoord * 1.0001;
vSwitchres_show_bar = 0.0;
if (global.RESSWITCH_ENABLE > 0.5 ) {
if (abs(global.SourceSize.y - global.OriginalHistorySize1.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
// Skip a bunch of frames at the beginning to prevent unwanted glitches
// with flycast core and maybe with fast-forward too.
if (global.RESSWITCH_ENABLE > 0.5 && global.FrameCount > 10 ) {
if (changed_enough(_3kHIST0, _3kHIST1)) {
//first frame
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * +1.0 ;
}
else if (abs(global.SourceSize.y - global.OriginalHistorySize2.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
else if (changed_enough(_3kHIST0, _3kHIST2)) {
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * -1.0;
}
else if (abs(global.SourceSize.y - global.OriginalHistorySize3.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
else if (changed_enough(_3kHIST0, _3kHIST3)) {
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * +0.5;
}
else if (abs(global.SourceSize.y - global.OriginalHistorySize4.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
else if (changed_enough(_3kHIST0, _3kHIST4)) {
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * -0.5;
}
else if (abs(global.SourceSize.y - global.OriginalHistorySize5.y) > global.RESSWITCH_GLITCH_TRESHOLD) {
else if (changed_enough(_3kHIST0, _3kHIST5)) {
//last frame
vTexCoord.y += global.RESSWITCH_GLITCH_SHAKE_MAX * +0.25;
vSwitchres_show_bar = global.RESSWITCH_GLITCH_BAR;