// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.

CCEffect %{
  techniques:
  - passes:
    - vert: vs
      frag: fs
      blendState:
        targets:
        - blend: true
      rasterizerState:
        cullMode: none
      properties:
        texture: { value: white }
        time: {value: 0}
}%

CCProgram vs %{
  precision highp float;

  #include <cc-global>
  #include <cc-local>

  in vec3 a_position;
  in vec4 a_color;
  out vec4 v_color;

  #if USE_TEXTURE
  in vec2 a_uv0;
  out vec2 v_uv0;
  #endif

  void main () {
    vec4 pos = vec4(a_position, 1);

    #if CC_USE_MODEL
    pos = cc_matViewProj * cc_matWorld * pos;
    #else
    pos = cc_matViewProj * pos;
    #endif

    #if USE_TEXTURE
    v_uv0 = a_uv0;
    #endif

    v_color = a_color;

    gl_Position = pos;
  }
}%

CCProgram fs %{
  precision highp float;
  uniform sampler2D texture;
  uniform sampler2D texture2;
  uniform Common {
    float time;
  };
  float progress = time;
  in mediump vec2 v_uv0;
  in vec4 v_color;

  vec4 getFromColor(vec2 uv) {
    return texture(texture, uv);
  }
  vec4 getToColor(vec2 uv) {
    return texture(texture2, uv);
  }

  vec4 transition(vec2 p) {
    // 计算块索引，每个块大小为16x16
    vec2 block = floor(p.xy / vec2(16));
    // 计算UV噪声，根据进度调整UV噪声
    vec2 uv_noise = block / vec2(64);
    uv_noise += floor(vec2(progress) * vec2(1200.0, 3500.0)) / vec2(64);
    // 计算扭曲距离，并算出各颜色通道的偏移值
    vec2 dist = progress > 0.0 ? (fract(uv_noise) - 0.5) * 0.3 * (1.0 - progress) : vec2(0.0);
    vec2 red = p + dist * 0.2;
    vec2 green = p + dist * 0.3;
    vec2 blue = p + dist * 0.5;

    return vec4(
        mix(getFromColor(red).r, getToColor(red).r, progress),
        mix(getFromColor(green).g, getToColor(green).g, progress),
        mix(getFromColor(blue).b, getToColor(blue).b, progress),
        1.0
    );
}


  void main () {
      gl_FragColor = v_color * transition(v_uv0);
  }
}%
