// Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
CCEffect %{
  techniques:
  - passes:
    - vert: sprite-vs:vert
      frag: sprite-fs:frag
      depthStencilState:
        depthTest: false
        depthWrite: false
      blendState:
        targets:
        - blend: true
          blendSrc: src_alpha
          blendDst: one_minus_src_alpha
          blendDstAlpha: one_minus_src_alpha
      rasterizerState:
        cullMode: none
      properties:
        alphaThreshold: { value: 0.5 }
        uvScale: { value: [1.0,1.0]}
        halfMapSize: { value: [2500.0,2500.0]}
        fadeOutRange: { value: 1000.0}
        edgeColor: { value: [1.0,0.0,0.0,1.0] }
        edgeFactor: { value: 1.0 }
}%

CCProgram sprite-vs %{
  precision highp float;
  #include <builtin/uniforms/cc-global>
  #if USE_LOCAL
    #include <builtin/uniforms/cc-local>
  #endif
  #if SAMPLE_FROM_RT
    #include <common/common-define>
  #endif
  in vec3 a_position;
  in vec2 a_texCoord;
  in vec4 a_color;

  out vec4 color;
  out vec2 uv0;
  out vec4 worldPos;

  uniform ConstantsVS{
    vec2 uvScale;
  };

  vec4 vert () {
    vec4 pos = vec4(a_position, 1);

    #if USE_LOCAL
      pos = cc_matWorld * pos;
    #endif

    worldPos = pos;

    #if USE_PIXEL_ALIGNMENT
      pos = cc_matView * pos;
      pos.xyz = floor(pos.xyz);
      pos = cc_matProj * pos;
    #else
      pos = cc_matViewProj * pos;
    #endif

    uv0 = a_texCoord;
    uv0 = uv0 * uvScale;
    #if SAMPLE_FROM_RT
      CC_HANDLE_RT_SAMPLE_FLIP(uv0);
    #endif
    color = a_color;

    return pos;
  }
}%

CCProgram sprite-fs %{
  precision highp float;
  #include <builtin/internal/embedded-alpha>
  #include <builtin/internal/alpha-test>
  #include <cc-global>

  in vec4 color;
  in vec4 worldPos;
  
  #if USE_TEXTURE
    in vec2 uv0;
    #pragma builtin(local)
    layout(set = 2, binding = 12) uniform sampler2D cc_spriteTexture;
  #endif

  uniform Constants{
    vec4 edgeColor;
    vec2 halfMapSize;
    float fadeOutRange;
    float edgeFactor;
  };

  vec4 frag () {
    vec4 o = vec4(1, 1, 1, 1);

    #if USE_TEXTURE
      o *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv0);
      #if IS_GRAY
        float gray  = 0.2126 * o.r + 0.7152 * o.g + 0.0722 * o.b;
        o.r = o.g = o.b = gray;
      #endif
    #endif

    o *= color;

    if(edgeFactor >= 0.0){
      float halfWidth = halfMapSize.x;
      float halfHeight = halfMapSize.y;

      float edgeAlpha = 0.0;

      float gap1 = (-halfWidth - worldPos.x);
      float gap2 = (worldPos.x - halfWidth);
      float gap3 = (-halfHeight - worldPos.y);
      float gap4 = (worldPos.y - halfHeight);

      float gap = max(max(gap1,gap2),max(gap3,gap4));
      edgeAlpha = 0.0;
      if(gap > 0.0 ){
        if(gap < 4.0){
          edgeAlpha = 1.0 * edgeFactor;
          o.a = 1.0;
        }
        else{
        edgeAlpha = min(1.0,1.0 - gap / fadeOutRange) * edgeFactor * 0.6;
        edgeAlpha = pow(edgeAlpha,2.0);
        }
      }
      o.rgb = mix(o.rgb,edgeColor.rgb,edgeAlpha);
      if(gap > 0.0){
        //o.a = max(0.0,1.0 - gap / fadeOutRange);
      }
    }
  
    ALPHA_TEST(o);
    return o;
  }
}%
