#version 330 core

layout(location = 0) out vec4 out_gbuffer0;
layout(location = 1) out vec4 out_gbuffer1;
layout(location = 2) out vec4 out_gbuffer2;
layout(location = 3) out vec3 out_gbuffer3;

// normal_encoding.glsl
vec2 encode_normal(vec3 n);

/*
 * Write the given surface properties to the G-buffer.
 * See the HDR pipeline definition in $FG_ROOT/Compositor/HDR/hdr.xml for the
 * G-buffer layout.
 */
void gbuffer_pack(vec3 normal, vec3 base_color, float metallic, float roughness,
                  float occlusion, vec3 emissive, uint mat_id)
{
    out_gbuffer0.rg  = encode_normal(normal);
    out_gbuffer0.b   = roughness;
    out_gbuffer0.a   = float(mat_id) * (1.0 / 3.0);
    out_gbuffer1.rgb = base_color;
    out_gbuffer1.a   = metallic;
    out_gbuffer2.rgb = vec3(0.0); // unused
    out_gbuffer2.a   = occlusion;
    out_gbuffer3.rgb = emissive;
}