#pragma clang diagnostic ignored "-Wmissing-prototypes"

#include <metal_stdlib>
#include <simd/simd.h>

using namespace metal;

struct FragmentOut
{
    float4 gl_FragColor [[color(0)]];
};

struct FragmentIn
{
    float2 uv [[user(locn0)]];
    float4 color [[user(locn1)]];
    float eyedist [[user(locn2)]];
};

static inline __attribute__((always_inline))
float computeLinearFogFactor(thread float fog_end_unif, thread float& eyedist, thread float fog_start_unif)
{
    float factor = (fog_end_unif - eyedist) / (fog_end_unif - fog_start_unif);
    factor = fast::clamp(factor, 0.0, 1.0);
    return factor;
}

fragment FragmentOut fragmentShader(FragmentIn in [[stage_in]], constant float& fog_end_unif [[buffer(0)]], constant float& fog_start_unif [[buffer(1)]], constant float4& fog_color_unif [[buffer(2)]], texture2d<float> tex_unif [[texture(0)]], sampler tex_unifSmplr [[sampler(0)]])
{
    FragmentOut out = {};
    out.gl_FragColor = mix(fog_color_unif, tex_unif.sample(tex_unifSmplr, in.uv) * in.color, float4(computeLinearFogFactor(fog_end_unif, in.eyedist, fog_start_unif)));
    bool uvLessZero = in.uv.y < 0.0;
    bool uvGreaterEqualOne;
    if (!uvLessZero)
    {
        uvGreaterEqualOne = in.uv.y >= 1.0;
    }
    else
    {
        uvGreaterEqualOne = uvLessZero;
    }
    if (uvGreaterEqualOne)
    {
        discard_fragment();
    }
    return out;
}

