#[derive(Copy, Clone, bytemuck::NoUninit)]
#[repr(C)]
pub struct ViewUniforms {
pub vp: [[f32; 4]; 4],
pub view: [[f32; 4]; 4],
pub elapsed: f32,
pub reflections_enabled: f32,
pub cam_pos: [f32; 3],
pub prefilter_mip_count: f32,
pub shade_mode: f32,
pub _end_pad: f32,
pub sky_rot: [[f32; 4]; 3],
}
#[derive(Copy, Clone, bytemuck::NoUninit)]
#[repr(C)]
pub struct GBufferView {
pub jittered_vp: [[f32; 4]; 4],
pub cur_vp: [[f32; 4]; 4],
pub prev_vp: [[f32; 4]; 4],
pub view: [[f32; 4]; 4],
}
#[cfg(test)]
mod tests {
use super::*;
use core::mem::{offset_of, size_of};
#[test]
fn view_uniforms_layout_matches_msl() {
assert_eq!(size_of::<ViewUniforms>(), 208);
assert_eq!(offset_of!(ViewUniforms, vp), 0);
assert_eq!(offset_of!(ViewUniforms, view), 64);
assert_eq!(offset_of!(ViewUniforms, elapsed), 128);
assert_eq!(offset_of!(ViewUniforms, reflections_enabled), 132);
assert_eq!(offset_of!(ViewUniforms, cam_pos), 136);
assert_eq!(offset_of!(ViewUniforms, prefilter_mip_count), 148);
assert_eq!(offset_of!(ViewUniforms, shade_mode), 152);
assert_eq!(offset_of!(ViewUniforms, _end_pad), 156);
assert_eq!(offset_of!(ViewUniforms, sky_rot), 160);
assert_eq!(size_of::<ViewUniforms>() % 16, 0);
}
#[test]
fn gbuffer_view_layout_matches_the_shader() {
assert_eq!(size_of::<GBufferView>(), 256);
assert_eq!(offset_of!(GBufferView, jittered_vp), 0);
assert_eq!(offset_of!(GBufferView, cur_vp), 64);
assert_eq!(offset_of!(GBufferView, prev_vp), 128);
assert_eq!(offset_of!(GBufferView, view), 192);
}
}