#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
{
    float4 color [[user(locn0)]];
    float eyedist [[user(locn1)]];
};

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)]])
{
    FragmentOut out = {};
    out.gl_FragColor = mix(fog_color_unif, in.color, float4(computeLinearFogFactor(fog_end_unif, in.eyedist, fog_start_unif)));
    return out;
}

