<@if not DEFERRED_BUFFER_SLH@> <@def DEFERRED_BUFFER_SLH@> <@include DefaultMaterials.slh@> <@include gpu/PackedNormal.slh@> // Unpack the metallic-mode value const float FRAG_PACK_SHADED_NON_METALLIC = 0.0; const float FRAG_PACK_SHADED_METALLIC = 0.1; const float FRAG_PACK_SHADED_RANGE_INV = 1.0 / (FRAG_PACK_SHADED_METALLIC - FRAG_PACK_SHADED_NON_METALLIC); const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.2; const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.3; const float FRAG_PACK_LIGHTMAPPED_RANGE_INV = 1.0 / (FRAG_PACK_LIGHTMAPPED_METALLIC - FRAG_PACK_LIGHTMAPPED_NON_METALLIC); const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.4; const float FRAG_PACK_SCATTERING_METALLIC = 0.5; const float FRAG_PACK_SCATTERING_RANGE_INV = 1.0 / (FRAG_PACK_SCATTERING_METALLIC - FRAG_PACK_SCATTERING_NON_METALLIC); const float FRAG_PACK_UNLIT = 0.6; const float FRAG_PACK_MTOON = 0.7; const int FRAG_MODE_UNLIT = 0; const int FRAG_MODE_SHADED = 1; const int FRAG_MODE_LIGHTMAPPED = 2; const int FRAG_MODE_SCATTERING = 3; const int FRAG_MODE_MTOON = 4; void unpackModeMetallic(float rawValue, out int mode, out float metallic) { if (rawValue <= FRAG_PACK_SHADED_METALLIC) { mode = FRAG_MODE_SHADED; metallic = clamp((rawValue - FRAG_PACK_SHADED_NON_METALLIC) * FRAG_PACK_SHADED_RANGE_INV, 0.0, 1.0); } else if (rawValue <= FRAG_PACK_LIGHTMAPPED_METALLIC) { mode = FRAG_MODE_LIGHTMAPPED; metallic = clamp((rawValue - FRAG_PACK_LIGHTMAPPED_NON_METALLIC) * FRAG_PACK_LIGHTMAPPED_RANGE_INV, 0.0, 1.0); } else if (rawValue <= FRAG_PACK_SCATTERING_METALLIC) { mode = FRAG_MODE_SCATTERING; metallic = clamp((rawValue - FRAG_PACK_SCATTERING_NON_METALLIC) * FRAG_PACK_SCATTERING_RANGE_INV, 0.0, 1.0); } else if (rawValue <= FRAG_PACK_UNLIT) { mode = FRAG_MODE_UNLIT; metallic = 0.0; } else if (rawValue >= FRAG_PACK_MTOON) { mode = FRAG_MODE_MTOON; metallic = DEFAULT_METALLIC; // TODO: mtoon currently assumes DEFAULT_METALLIC always because the spec doesn't define how metallic is used } } float packShadedMetallic(float metallic) { return mix(FRAG_PACK_SHADED_NON_METALLIC, FRAG_PACK_SHADED_METALLIC, metallic); } float packLightmappedMetallic(float metallic) { return mix(FRAG_PACK_LIGHTMAPPED_NON_METALLIC, FRAG_PACK_LIGHTMAPPED_METALLIC, metallic); } float packScatteringMetallic(float metallic) { return mix(FRAG_PACK_SCATTERING_NON_METALLIC, FRAG_PACK_SCATTERING_METALLIC, metallic); } float packUnlit() { <@if not HIFI_USE_MTOON@> return FRAG_PACK_UNLIT; <@else@> return FRAG_PACK_MTOON; <@endif@> } <@endif@>