{
  "name": "Frame tilt (LoFi Scale)",
  "type": "dynamic",
  "curve": "Quintic Out",
  "duration": 1,
  "passes": [
    {
      "name": "rotate in",
      "inputs": [
        "default"
      ],
      "glsl": "precision highp float;

               varying vec2 sourceTextureCoordinate;

               uniform vec2 outputSize; // size of the output fbo

               // default uniforms for transitions and video effects
               uniform float progress; // normalized 0-1

               #define PI 3.141592653589793

               mat2 rotate2d(float a){
                 float c = cos(a), s = sin(a);
                 return mat2(c, -s, s, c);
               }

               // effect uniforms
               void main() {

                 vec2 uv = sourceTextureCoordinate;
                 vec2 center = vec2(0.5);
                 vec2 ratio = vec2(outputSize.xy / outputSize.y);

                 float angle = mix(15.0 * (PI / 180.0), 0.0, progress);
                 float scale = mix(0.15, 1.0, progress);
                 center.x = 0.5 - (0.2 * progress);

                 vec2 p = uv - center;
                 p *= ratio;
                 p = rotate2d(angle) * p;
                 p /= scale;
                 p /= ratio;
                 p += center;


                 float m = step(0.0, p.x) * step(p.x, 1.0) * step(0.0, p.y) * step(p.y, 1.0);
                 vec4 base = sampleInput(p);
                 vec4 color = vec4(mix(vec3(0.0), base.rgb, m),1.0);
                 gl_FragColor = toOutputFormat(color);
               }
",
      "uniforms": {}
    }
  ]
}
