#include "aorii_util.slang"

struct FontParams {
    float smoothing;      // 平滑度
    float thickness;      // 字体粗细
    float outline_width;   // 描边宽度
    float4 outline_color;  // 描边颜色
}
ParameterBlock<FontParams> font_param : register(b1);

struct PSInput {
    float4 position : SV_Position;
    float2 uv : TEXCOORD0;
    float4 color : COLOR0;
    float2 altas_uv : TEXCOORD1;
    float altas_index : TEXCOORD2;
    float2 char_size : TEXCOORD3;
};

struct Constants {
    matrix transform;
};
ParameterBlock<Constants> param_buffer : register(b0);

PSInput vertex_main(VSInput input) {
    float2 altas_uv = input.param_a.xy;
    float2 char_size = input.param_b.xy;

    PSInput output;
    output.position = mul(float4(input.position, 0.0f, 1.0f), param_buffer.transform);
    output.uv = input.uv;
    output.color = input.color;
    output.altas_uv = altas_uv;
    output.altas_index = input.param_a.z;
    output.char_size = char_size;
    return output;
}

Texture2DArray atlas_texture : register(t0);
SamplerState sampler_state : register(s0);

float4 pixel_main(PSInput input) : SV_Target {
    float2 uv = input.altas_uv + input.char_size * input.uv;
    float distance = atlas_texture.Sample(sampler_state, float3(uv, input.altas_index)).r;
    // return float4(distance, distance, distance, 1.0);
    float range = 0.2;
    float alpha = smoothstep(0.3, 0.6, distance);

    float4 color = input.color;
    color.a *= alpha;
    return color;
}