#version 330 core

uniform sampler2D gbuffer0_tex;
uniform sampler2D gbuffer1_tex;
uniform sampler2D gbuffer2_tex;
uniform sampler2D gbuffer3_tex;

// normal_encoding.glsl
vec3 decode_normal(vec2 f);

/*
 * Read the given surface properties from the G-Buffer.
 * See the HDR pipeline definition in $FG_ROOT/Compositor/HDR/hdr.xml for the
 * G-buffer layout.
 */
void gbuffer_unpack(in vec2 texcoord,
                    out vec3 normal, out vec3 base_color, out float metallic,
                    out float roughness, out float occlusion, out vec3 emissive,
                    out uint mat_id)
{
    vec4 gbuffer0 = texture(gbuffer0_tex, texcoord);
    vec4 gbuffer1 = texture(gbuffer1_tex, texcoord);
    vec4 gbuffer2 = texture(gbuffer2_tex, texcoord);
    vec3 gbuffer3 = texture(gbuffer3_tex, texcoord).rgb;

    normal     = decode_normal(gbuffer0.rg);
    roughness  = gbuffer0.b;
    mat_id     = uint(gbuffer0.a * 3.0);
    base_color = gbuffer1.rgb;
    metallic   = gbuffer1.a;
    //           gbuffer2.rgb unused
    occlusion  = gbuffer2.a;
    emissive   = gbuffer3.rgb;
}