use egui_kittest::wgpu::{create_render_state, default_wgpu_setup};
use siplot::{CameraFace, ScalarFieldView, Vec3};
const N: usize = 5;
fn ramp_z() -> Vec<f32> {
let mut data = vec![0.0f32; N * N * N];
for z in 0..N {
for y in 0..N {
for x in 0..N {
data[(z * N + y) * N + x] = z as f32;
}
}
}
data
}
fn front_field_view(id: u64, cut_z: f32, visible: bool) -> ScalarFieldView {
let rs = create_render_state(default_wgpu_setup());
let mut view = ScalarFieldView::new(&rs, id);
assert!(
view.set_data(&rs, &ramp_z(), N, N, N),
"5³ ramp is valid data"
);
{
let plane = view.field_mut().cut_plane_mut();
plane.set_normal(Vec3::new(0.0, 0.0, 1.0));
plane.set_point(Vec3::new(0.0, 0.0, cut_z));
plane.set_visible(visible);
}
view.rebuild(&rs);
view.scene_mut().set_viewpoint(CameraFace::Front); view.scene_mut().camera_mut().set_size((200.0, 200.0));
view
}
#[test]
fn pick_hits_the_visible_cut_plane_and_samples_its_value() {
let view = front_field_view(31, 2.5, true);
let pick = view
.pick((0.0, 0.0))
.expect("centre ray crosses the visible cut plane inside the box");
assert!(
(pick.position.z - 2.5).abs() < 1e-3,
"hit lies on the z = 2.5 plane, got z = {}",
pick.position.z
);
assert!(
(pick.position.x - 2.5).abs() < 0.6 && (pick.position.y - 2.5).abs() < 0.6,
"hit near box centre, got ({}, {})",
pick.position.x,
pick.position.y
);
let value = pick.value.expect("hit is inside the box → has a value");
assert!(
(value - 2.0).abs() < 1e-4,
"ramp value on the z = 2.5 slice is 2.0, got {value}"
);
}
#[test]
fn pick_returns_none_when_nothing_is_pickable() {
let view = front_field_view(32, 2.5, false);
assert!(
view.pick((0.0, 0.0)).is_none(),
"a hidden cut plane with no iso-surface leaves nothing to pick"
);
}