/*{
"CATEGORIES": [
"Wipe",
"Distortion"
],
"CREDIT": "Automatically converted from https://www.github.com/gl-transitions/gl-transitions/tree/master/cube.glsl",
"DESCRIPTION": "",
"INPUTS": [
{
"NAME": "startImage",
"TYPE": "image"
},
{
"NAME": "endImage",
"TYPE": "image"
},
{
"DEFAULT": 0,
"MAX": 1,
"MIN": 0,
"NAME": "progress",
"TYPE": "float"
},
{
"DEFAULT": 0.4,
"MAX": 1,
"MIN": 0,
"NAME": "reflection",
"TYPE": "float"
},
{
"DEFAULT": 0.7,
"MAX": 1,
"MIN": 0,
"NAME": "persp",
"TYPE": "float"
},
{
"DEFAULT": 0.3,
"MAX": 1,
"MIN": 0,
"NAME": "unzoom",
"TYPE": "float"
},
{
"DEFAULT": 3,
"MAX": 10,
"MIN": 0,
"NAME": "floating",
"TYPE": "float"
}
],
"ISFVSN": "2"
}
*/
vec4 getFromColor(vec2 inUV) {
return IMG_NORM_PIXEL(startImage, inUV);
}
vec4 getToColor(vec2 inUV) {
return IMG_NORM_PIXEL(endImage, inUV);
}
// Author: gre
// License: MIT
vec2 project (vec2 p) {
return p * vec2(1.0, -1.2) + vec2(0.0, -floating/100.);
}
bool inBounds (vec2 p) {
return all(lessThan(vec2(0.0), p)) && all(lessThan(p, vec2(1.0)));
}
vec4 bgColor (vec2 p, vec2 pfr, vec2 pto) {
vec4 c = vec4(0.0, 0.0, 0.0, 1.0);
pfr = project(pfr);
// FIXME avoid branching might help perf!
if (inBounds(pfr)) {
c += mix(vec4(0.0), getFromColor(pfr), reflection * mix(1.0, 0.0, pfr.y));
}
pto = project(pto);
if (inBounds(pto)) {
c += mix(vec4(0.0), getToColor(pto), reflection * mix(1.0, 0.0, pto.y));
}
return c;
}
// p : the position
// persp : the perspective in [ 0, 1 ]
// center : the xcenter in [0, 1] \ 0.5 excluded
vec2 xskew (vec2 p, float persp, float center) {
float x = mix(p.x, 1.0-p.x, center);
return (
(
vec2( x, (p.y - 0.5*(1.0-persp) * x) / (1.0+(persp-1.0)*x) )
- vec2(0.5-distance(center, 0.5), 0.0)
)
* vec2(0.5 / distance(center, 0.5) * (center<0.5 ? 1.0 : -1.0), 1.0)
+ vec2(center<0.5 ? 0.0 : 1.0, 0.0)
);
}
vec4 transition(vec2 op) {
float uz = unzoom * 2.0*(0.5-distance(0.5, progress));
vec2 p = -uz*0.5+(1.0+uz) * op;
vec2 fromP = xskew(
(p - vec2(progress, 0.0)) / vec2(1.0-progress, 1.0),
1.0-mix(progress, 0.0, persp),
0.0
);
vec2 toP = xskew(
p / vec2(progress, 1.0),
mix(pow(progress, 2.0), 1.0, persp),
1.0
);
// FIXME avoid branching might help perf!
if (inBounds(fromP)) {
return getFromColor(fromP);
}
else if (inBounds(toP)) {
return getToColor(toP);
}
return bgColor(op, fromP, toP);
}
void main() {
gl_FragColor = transition(isf_FragNormCoord.xy);
}