#version 150 //OVE shader_name: Swap //OVE shader_description: by gre (Licence MIT) //OVE main_input_name: From uniform sampler2D tex_in; //OVE name: To //OVE type: TEXTURE //OVE flag: NOT_KEYFRAMABLE //OVE description: destination uniform sampler2D tex_out; //OVE name: Progress //OVE type: FLOAT //OVE flag: NOT_CONNECTABLE //OVE min: 0.0 //OVE max: 1.0 //OVE default: 0.5 //OVE description: uniform float progress; //OVE name: Reflection //OVE type: FLOAT //OVE flag: NOT_CONNECTABLE //OVE min: 0.0 //OVE max: 1.0 //OVE default: 0.4 //OVE description: uniform float reflection; // = 0.4 //OVE name: Perspective //OVE type: FLOAT //OVE flag: NOT_CONNECTABLE //OVE min: 0.0 //OVE max: 1.0 //OVE default: 0.2 //OVE description: uniform float perspective; // = 0.2 //OVE name: Depth //OVE type: FLOAT //OVE flag: NOT_CONNECTABLE //OVE min: 0.0 //OVE max: 50 //OVE default: 3 //OVE description: uniform float depth; // = 3.0 //OVE end #define LINEAR_CURVE 0 #define EXPONENTIAL_CURVE 1 #define LOGARITHMIC_CURVE 2 uniform sampler2D out_block_in; uniform sampler2D in_block_in; uniform bool out_block_in_enabled; uniform bool in_block_in_enabled; uniform int curve_in; /* animated from 0 to 1 */ uniform float ove_tprog_all; in vec2 ove_texcoord; out vec4 frag_color; vec4 getFromColor( vec2 p) { return texture( in_block_in, p); } vec4 getToColor( vec2 p) { return texture( out_block_in, p); } float TransformCurve(float linear) { if (curve_in == EXPONENTIAL_CURVE) { return linear * linear; } else if (curve_in == LOGARITHMIC_CURVE) { return sqrt(linear); } else { return linear; } } const vec4 black = vec4(0.0, 0.0, 0.0, 1.0); const vec2 boundMin = vec2(0.0, 0.0); const vec2 boundMax = vec2(1.0, 1.0); bool inBounds (vec2 p) { return all(lessThan(boundMin, p)) && all(lessThan(p, boundMax)); } //vec2 project (vec2 p) { // return vec2(p.x, 1. - p.y) * vec2(1.0, 1.2) + vec2(0.0, 1.03); //} #define SCALE_FAC 0.8 #define LIFT 0.04 vec2 project (vec2 p) { return vec2(p.x, - p.y) * vec2(1.0, SCALE_FAC) + vec2(0.0, 1.0 + SCALE_FAC + LIFT); } vec4 bgColor (vec2 p, vec2 pfr, vec2 pto) { vec4 c = black; pfr = project(pfr); if (inBounds(pfr)) { c += mix(black, getFromColor(pfr), reflection * mix(1.0, 0.0, 1.0 - pfr.y)); } pto = project(pto); if (inBounds(pto)) { c += mix(black, getToColor(pto), reflection * mix(1.0, 0.0, 1.0 - pto.y)); } return c; } vec4 transition(vec2 p, float progress) { vec2 pfr, pto = vec2(-1.); float size = mix(1.0, depth, progress); float persp = perspective * progress; pfr = (p + vec2(-0.0, -0.5)) * vec2(size/(1.0-perspective*progress), size/(1.0-size*persp*p.x)) + vec2(0.0, 0.5); size = mix(1.0, depth, 1.-progress); persp = perspective * (1.-progress); pto = (p + vec2(-1.0, -0.5)) * vec2(size/(1.0-perspective*(1.0-progress)), size/(1.0-size*persp*(0.5-p.x))) + vec2(1.0, 0.5); if (progress < 0.5) { if (inBounds(pfr)) { return getFromColor(pfr); } if (inBounds(pto)) { return getToColor(pto); } } if (inBounds(pto)) { return getToColor(pto); } if (inBounds(pfr)) { return getFromColor(pfr); } return bgColor(p, pfr, pto); } void main(void) { frag_color = transition( ove_texcoord.xy, TransformCurve(1.0 - ove_tprog_all)); }