/*{ "CATEGORIES": [ "Wipe" ], "CREDIT": "Automatically converted from https://www.github.com/gl-transitions/gl-transitions/tree/master/GridFlip.glsl", "DESCRIPTION": "", "INPUTS": [ { "NAME": "startImage", "TYPE": "image" }, { "NAME": "endImage", "TYPE": "image" }, { "DEFAULT": 0, "MAX": 1, "MIN": 0, "NAME": "progress", "TYPE": "float" }, { "DEFAULT": 0.1, "MAX": 1, "MIN": 0, "NAME": "pause", "TYPE": "float" }, { "DEFAULT": 0.05, "MAX": 1, "MIN": 0, "NAME": "dividerWidth", "TYPE": "float" }, { "DEFAULT": 0.1, "MAX": 1, "MIN": 0, "NAME": "randomness", "TYPE": "float" }, { "DEFAULT": [ 0, 0, 0, 1 ], "NAME": "bgcolor", "TYPE": "color" }, { "DEFAULT": [ 4, 4 ], "MAX": [ 10, 10 ], "MIN": [ 0, 0 ], "NAME": "size", "TYPE": "point2D" } ], "ISFVSN": "2" } */ vec4 getFromColor(vec2 inUV) { return IMG_NORM_PIXEL(startImage, inUV); } vec4 getToColor(vec2 inUV) { return IMG_NORM_PIXEL(endImage, inUV); } // License: MIT // Author: TimDonselaar // ported by gre from https://gist.github.com/TimDonselaar/9bcd1c4b5934ba60087bdb55c2ea92e5 float rand (vec2 co) { return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); } float getDelta(vec2 p) { vec2 rectanglePos = floor(vec2(size) * p); vec2 rectangleSize = vec2(1.0 / vec2(size).x, 1.0 / vec2(size).y); float top = rectangleSize.y * (rectanglePos.y + 1.0); float bottom = rectangleSize.y * rectanglePos.y; float left = rectangleSize.x * rectanglePos.x; float right = rectangleSize.x * (rectanglePos.x + 1.0); float minX = min(abs(p.x - left), abs(p.x - right)); float minY = min(abs(p.y - top), abs(p.y - bottom)); return min(minX, minY); } float getDividerSize() { vec2 rectangleSize = vec2(1.0 / vec2(size).x, 1.0 / vec2(size).y); return min(rectangleSize.x, rectangleSize.y) * dividerWidth; } vec4 transition(vec2 p) { if(progress < pause) { float currentProg = progress / pause; float a = 1.0; if(getDelta(p) < getDividerSize()) { a = 1.0 - currentProg; } return mix(bgcolor, getFromColor(p), a); } else if(progress < 1.0 - pause){ if(getDelta(p) < getDividerSize()) { return bgcolor; } else { float currentProg = (progress - pause) / (1.0 - pause * 2.0); vec2 q = p; vec2 rectanglePos = floor(vec2(size) * q); float r = rand(rectanglePos) - randomness; float cp = smoothstep(0.0, 1.0 - r, currentProg); float rectangleSize = 1.0 / vec2(size).x; float delta = rectanglePos.x * rectangleSize; float offset = rectangleSize / 2.0 + delta; p.x = (p.x - offset)/abs(cp - 0.5)*0.5 + offset; vec4 a = getFromColor(p); vec4 b = getToColor(p); float s = step(abs(vec2(size).x * (q.x - delta) - 0.5), abs(cp - 0.5)); return mix(bgcolor, mix(b, a, step(cp, 0.5)), s); } } else { float currentProg = (progress - 1.0 + pause) / pause; float a = 1.0; if(getDelta(p) < getDividerSize()) { a = currentProg; } return mix(bgcolor, getToColor(p), a); } } void main() { gl_FragColor = transition(isf_FragNormCoord.xy); }