1#define_import_path bevy_pbr::rgb9e5 3const RGB9E5_EXPONENT_BITS = 5u; 4const RGB9E5_MANTISSA_BITS = 9; 5const RGB9E5_MANTISSA_BITSU = 9u; 6const RGB9E5_EXP_BIAS = 15; 7const RGB9E5_MAX_VALID_BIASED_EXP = 31u; 15const MAX_RGB9E5_EXP = 16u; 16const RGB9E5_MANTISSA_VALUES = 512; 17const MAX_RGB9E5_MANTISSA = 511; 18const MAX_RGB9E5_MANTISSAU = 511u; 19const MAX_RGB9E5_ = 65408.0; 20const EPSILON_RGB9E5_ = 0.000000059604645; 22fn floor_log2_(x: f32) -> i32 { 23 let f = bitcast<u32>(x); 24 let biasedexponent = (f & 0x7F800000u) >> 23u; 25 return i32(biasedexponent) - 127; 29fn vec3_to_rgb9e5_(rgb_in: vec3<f32>) -> u32 { 30 let rgb = clamp(rgb_in, vec3(0.0), vec3(MAX_RGB9E5_)); 32 let maxrgb = max(rgb.r, max(rgb.g, rgb.b)); 33 var exp_shared = max(-RGB9E5_EXP_BIAS - 1, floor_log2_(maxrgb)) + 1 + RGB9E5_EXP_BIAS; 34 var denom = exp2(f32(exp_shared - RGB9E5_EXP_BIAS - RGB9E5_MANTISSA_BITS)); 36 let maxm = i32(floor(maxrgb / denom + 0.5)); 37 if (maxm == RGB9E5_MANTISSA_VALUES) { 42 let n = vec3<u32>(floor(rgb / denom + 0.5)); 44 return (u32(exp_shared) << 27u) | (n.b << 18u) | (n.g << 9u) | (n.r << 0u); 49fn extract_bits(value: u32, offset: u32, bits: u32) -> u32 { 50 let mask = (1u << bits) - 1u; 51 return (value >> offset) & mask; 54fn rgb9e5_to_vec3_(v: u32) -> vec3<f32> { 55 let exponent = i32(extract_bits(v, 27u, RGB9E5_EXPONENT_BITS)) - RGB9E5_EXP_BIAS - RGB9E5_MANTISSA_BITS; 56 let scale = exp2(f32(exponent)); 59 f32(extract_bits(v, 0u, RGB9E5_MANTISSA_BITSU)), 60 f32(extract_bits(v, 9u, RGB9E5_MANTISSA_BITSU)), 61 f32(extract_bits(v, 18u, RGB9E5_MANTISSA_BITSU))