// 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 }
        strength: {value: 0.1}
        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 strength;
    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) {
    // 获取起始颜色和目标颜色
    vec4 ca = getFromColor(p);
    vec4 cb = getToColor(p);

    // 计算起始和目标颜色的偏移向量
    vec2 oa = (((ca.rg + ca.b) * 0.5) * 2.0 - 1.0);
    vec2 ob = (((cb.rg + cb.b) * 0.5) * 2.0 - 1.0);
    // 在起始和目标偏移向量之间进行插值，并乘以强度
    vec2 oc = mix(oa, ob, 0.5) * strength;

    // 根据进度计算权重
    float w0 = progress;
    float w1 = 1.0 - w0;
    // 使用混合函数混合起始颜色和目标颜色，根据进度进行插值
    return mix(getFromColor(p + oc * w0), getToColor(p - oc * w1), progress);
  }

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