Back to shaders
Shader test bench
BowTieWithParameter
runnable transition
GLSL transition function. Stronghold supplies two demo textures and progress/time uniforms.
Code
// Author: KMojek
// License: MIT
uniform float adjust; // = 0.5
uniform bool reverse; // = false
float check(vec2 p1, vec2 p2, vec2 p3)
{
return (p1.x - p3.x) * (p2.y - p3.y) - (p2.x - p3.x) * (p1.y - p3.y);
}
bool pointInTriangle(vec2 pt, vec2 p1, vec2 p2, vec2 p3)
{
bool b1 = check(pt, p1, p2) < 0.0;
bool b2 = check(pt, p2, p3) < 0.0;
bool b3 = check(pt, p3, p1) < 0.0;
return b1 == b2 && b2 == b3;
}
const float height = 0.5;
vec4 transition_firstHalf( vec2 uv, float prog )
{
if ( uv.y < 0.5 )
{
vec2 botLeft = vec2( -0., prog-height );
vec2 botRight = vec2( 1., prog-height );
vec2 tip = vec2( adjust, prog );
if ( pointInTriangle( uv, botLeft, botRight, tip ) )
return getToColor(uv);
}
else
{
vec2 topLeft = vec2( -0., 1.-prog+height );
vec2 topRight = vec2( 1., 1.-prog+height );
vec2 tip = vec2( adjust, 1.-prog );
if ( pointInTriangle( uv, topLeft, topRight, tip ) )
return getToColor( uv );
}
return getFromColor( uv );
}
vec4 transition_secondHalf( vec2 uv, float prog )
{
if ( uv.x > adjust )
{
vec2 top = vec2( prog + height, 1. );
vec2 bot = vec2( prog + height, -0. );
vec2 tip = vec2( mix( adjust, 1.0, 2.0 * (prog - 0.5) ), 0.5 );
if ( pointInTriangle( uv, top, bot, tip) )
return getFromColor( uv );
}
else
{
vec2 top = vec2( 1.0-prog - height, 1. );
vec2 bot = vec2( 1.0-prog - height, -0. );
vec2 tip = vec2( mix( adjust, 0.0, 2.0 * (prog - 0.5) ), 0.5 );
if ( pointInTriangle( uv, top, bot, tip) )
return getFromColor( uv );
}
return getToColor( uv );
}
vec4 transition (vec2 uv) {
if ( reverse )
return ( progress < 0.5 ) ? transition_secondHalf( uv, 1.-progress ) : transition_firstHalf( uv, 1.-progress );
else
return ( progress < 0.5 ) ? transition_firstHalf( uv, progress ) : transition_secondHalf( uv, progress );
}