1import package::render::{ 2 mesh_types::MESH_FLAGS_SHADOW_RECEIVER_BIT, 3 pbr_types::{STANDARD_MATERIAL_FLAGS_FOG_ENABLED_BIT, STANDARD_MATERIAL_FLAGS_UNLIT_BIT}, 7const DEFERRED_FLAGS_UNLIT_BIT: u32 = 1u << 0u; 8const DEFERRED_FLAGS_FOG_ENABLED_BIT: u32 = 1u << 1u; 9const DEFERRED_MESH_FLAGS_SHADOW_RECEIVER_BIT: u32 = 1u << 2u; 11fn deferred_flags_from_mesh_material_flags(mesh_flags: u32, mat_flags: u32) -> u32 { 13 flags |= u32((mesh_flags & MESH_FLAGS_SHADOW_RECEIVER_BIT) != 0u) * DEFERRED_MESH_FLAGS_SHADOW_RECEIVER_BIT; 14 flags |= u32((mat_flags & STANDARD_MATERIAL_FLAGS_FOG_ENABLED_BIT) != 0u) * DEFERRED_FLAGS_FOG_ENABLED_BIT; 15 flags |= u32((mat_flags & STANDARD_MATERIAL_FLAGS_UNLIT_BIT) != 0u) * DEFERRED_FLAGS_UNLIT_BIT; 19fn mesh_material_flags_from_deferred_flags(deferred_flags: u32) -> vec2<u32> { 22 mesh_flags |= u32((deferred_flags & DEFERRED_MESH_FLAGS_SHADOW_RECEIVER_BIT) != 0u) * MESH_FLAGS_SHADOW_RECEIVER_BIT; 23 mat_flags |= u32((deferred_flags & DEFERRED_FLAGS_FOG_ENABLED_BIT) != 0u) * STANDARD_MATERIAL_FLAGS_FOG_ENABLED_BIT; 24 mat_flags |= u32((deferred_flags & DEFERRED_FLAGS_UNLIT_BIT) != 0u) * STANDARD_MATERIAL_FLAGS_UNLIT_BIT; 25 return vec2(mesh_flags, mat_flags); 28const U12MAXF = 4095.0; 29const U16MAXF = 65535.0; 30const U20MAXF = 1048575.0; 37fn pack_24bit_normal_and_flags(octahedral_normal: vec2<f32>, flags: u32) -> u32 { 38 let unorm1 = u32(saturate(octahedral_normal.x) * U12MAXF + 0.5); 39 let unorm2 = u32(saturate(octahedral_normal.y) * U12MAXF + 0.5); 40 return (unorm1 & 0xFFFu) | ((unorm2 & 0xFFFu) << 12u) | ((flags & 0xFFu) << 24u); 43fn unpack_24bit_normal(packed: u32) -> vec2<f32> { 44 let unorm1 = packed & 0xFFFu; 45 let unorm2 = (packed >> 12u) & 0xFFFu; 46 return vec2(f32(unorm1) / U12MAXF, f32(unorm2) / U12MAXF); 49fn unpack_flags(packed: u32) -> u32 { 50 return (packed >> 24u) & 0xFFu; 56fn unpack_unorm4x8_(v: u32) -> vec4<f32> { 59 f32((v >> 8u) & 0xFFu), 60 f32((v >> 16u) & 0xFFu), 61 f32((v >> 24u) & 0xFFu) 67fn pack_unorm4x8_(values: vec4<f32>) -> u32 { 68 let v = vec4<u32>(saturate(values) * 255.0 + 0.5); 69 return (v.w << 24u) | (v.z << 16u) | (v.y << 8u) | v.x; 73fn pack_unorm3x4_plus_unorm_20_(v: vec4<f32>) -> u32 { 74 let sm = vec3<u32>(saturate(v.xyz) * 15.0 + 0.5); 75 let bg = u32(saturate(v.w) * U20MAXF + 0.5); 76 return (bg << 12u) | (sm.z << 8u) | (sm.y << 4u) | sm.x; 80fn unpack_unorm3x4_plus_unorm_20_(v: u32) -> vec4<f32> { 83 f32((v >> 4u) & 0xFu) / 15.0, 84 f32((v >> 8u) & 0xFu) / 15.0, 85 f32((v >> 12u) & 0xFFFFFFu) / U20MAXF,