pub const MAX_PROBES: usize = 8;
const _: () = assert!(crate::render::reflection_probe::AUTO_SEED_BUDGET <= MAX_PROBES);
#[derive(Copy, Clone, bytemuck::Zeroable, bytemuck::Pod)]
#[repr(C)]
pub struct ProbeUniforms {
pub box_min: [f32; 4],
pub box_max: [f32; 4],
pub probe_pos: [f32; 4],
}
impl ProbeUniforms {
pub const DISABLED: ProbeUniforms = ProbeUniforms {
box_min: [0.0; 4],
box_max: [0.0; 4],
probe_pos: [0.0; 4],
};
}
#[derive(Copy, Clone, bytemuck::NoUninit)]
#[repr(C)]
pub struct ProbeSet {
pub count: u32,
pub _pad: [u32; 3],
pub probes: [ProbeUniforms; MAX_PROBES],
}
impl ProbeSet {
pub const EMPTY: ProbeSet = ProbeSet {
count: 0,
_pad: [0; 3],
probes: [ProbeUniforms::DISABLED; MAX_PROBES],
};
}
#[derive(Copy, Clone, bytemuck::NoUninit)]
#[repr(C)]
pub struct ProbePrefilterParams {
pub dst_size: u32,
pub src_size: u32,
pub sample_count: u32,
pub src_mip: u32,
pub roughness: f32,
pub clamp_lum: f32,
pub src_mip_count: f32,
pub _pad: f32,
}
#[cfg(test)]
mod tests {
use super::*;
use core::mem::{offset_of, size_of};
#[test]
fn probe_prefilter_params_layout_matches_the_shader() {
assert_eq!(size_of::<ProbePrefilterParams>(), 32);
assert_eq!(offset_of!(ProbePrefilterParams, dst_size), 0);
assert_eq!(offset_of!(ProbePrefilterParams, src_size), 4);
assert_eq!(offset_of!(ProbePrefilterParams, sample_count), 8);
assert_eq!(offset_of!(ProbePrefilterParams, src_mip), 12);
assert_eq!(offset_of!(ProbePrefilterParams, roughness), 16);
assert_eq!(offset_of!(ProbePrefilterParams, clamp_lum), 20);
assert_eq!(offset_of!(ProbePrefilterParams, src_mip_count), 24);
assert_eq!(offset_of!(ProbePrefilterParams, _pad), 28);
}
}