mod common;
use common::gpu_or_skip;
use eulumdat_rt::*;
#[test]
fn render_opal_cover_scene() {
let Some(camera) = gpu_or_skip(GpuCamera::new()) else {
return;
};
let cover = eulumdat_goniosim::catalog::opal_pmma_3mm();
let gpu_mat = GpuMaterial::from_material_params(&cover);
let gpu_prim = GpuPrimitive::sheet(
[0.0, -0.04, 0.0], [0.0, 1.0, 0.0], [1.0, 0.0, 0.0], 0.3,
0.3, 0.003, 0,
);
let image = pollster::block_on(camera.render(
256,
256, 4, [0.5, 0.3, 0.5], [0.0, 0.0, 0.0], 60.0, &[gpu_prim],
&[gpu_mat],
100.0, [0.0, 0.0, 0.0], ));
assert_eq!(image.width, 256);
assert_eq!(image.height, 256);
assert_eq!(image.pixels.len(), 256 * 256);
let non_zero = image
.pixels
.iter()
.filter(|p| p[0] > 0.001 || p[1] > 0.001 || p[2] > 0.001)
.count();
eprintln!(
"Non-zero pixels: {} / {} ({:.1}%)",
non_zero,
image.pixels.len(),
non_zero as f64 / image.pixels.len() as f64 * 100.0
);
assert!(non_zero > 100, "Should have some visible pixels");
let bytes = image.to_srgb_bytes();
eprintln!(
"Image rendered: {}x{}, {} bytes",
image.width,
image.height,
bytes.len()
);
let ppm = format!("P6\n{} {}\n255\n", image.width, image.height);
let ppm_bytes: Vec<u8> = bytes
.chunks(4)
.flat_map(|rgba| [rgba[0], rgba[1], rgba[2]])
.collect();
let out_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| ".".into());
let out_path = format!("{out_dir}/../../tmp/camera_test.ppm");
std::fs::write(&out_path, {
let mut data = ppm.into_bytes();
data.extend_from_slice(&ppm_bytes);
data
})
.ok(); eprintln!("Wrote {out_path}");
}
#[test]
fn render_empty_scene() {
let Some(camera) = gpu_or_skip(GpuCamera::new()) else {
return;
};
let image = pollster::block_on(camera.render(
64,
64,
1,
[0.0, 0.0, 2.0],
[0.0, 0.0, 0.0],
60.0,
&[],
&[],
0.0,
[0.0, 0.0, 0.0],
));
assert_eq!(image.pixels.len(), 64 * 64);
let has_color = image.pixels.iter().any(|p| p[2] > 0.01);
eprintln!("Empty scene has sky: {has_color}");
assert!(has_color, "Empty scene should show sky gradient");
}