#![allow(dead_code)]
#[derive(Debug, Clone)]
pub struct ProbeVolumeViewConfig {
pub sphere_radius: f32,
pub show_validity: bool,
pub max_probes: u32,
}
impl Default for ProbeVolumeViewConfig {
fn default() -> Self {
Self { sphere_radius: 0.1, show_validity: true, max_probes: 512 }
}
}
#[derive(Debug, Clone)]
pub struct ProbeVolumeView {
pub config: ProbeVolumeViewConfig,
pub enabled: bool,
pub probe_count: u32,
}
impl Default for ProbeVolumeView {
fn default() -> Self {
Self { config: ProbeVolumeViewConfig::default(), enabled: false, probe_count: 0 }
}
}
pub fn pvv_enable(view: &mut ProbeVolumeView) {
view.enabled = true;
}
pub fn pvv_disable(view: &mut ProbeVolumeView) {
view.enabled = false;
}
pub fn pvv_set_radius(view: &mut ProbeVolumeView, radius: f32) {
view.config.sphere_radius = radius.clamp(0.001, 10.0);
}
pub fn pvv_set_probe_count(view: &mut ProbeVolumeView, count: u32) {
view.probe_count = count.min(view.config.max_probes);
}
pub fn pvv_probe_color(validity: f32) -> [f32; 4] {
let v = validity.clamp(0.0, 1.0);
[1.0 - v, v, 0.0, 1.0]
}
pub fn pvv_budget_exceeded(view: &ProbeVolumeView) -> bool {
view.probe_count >= view.config.max_probes
}
pub fn pvv_to_json(view: &ProbeVolumeView) -> String {
format!(
r#"{{"sphere_radius":{:.3},"max_probes":{},"probe_count":{},"enabled":{}}}"#,
view.config.sphere_radius, view.config.max_probes, view.probe_count, view.enabled
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_disabled() {
let v = ProbeVolumeView::default();
assert!(!v.enabled);
}
#[test]
fn test_enable_disable() {
let mut v = ProbeVolumeView::default();
pvv_enable(&mut v);
assert!(v.enabled);
pvv_disable(&mut v);
assert!(!v.enabled);
}
#[test]
fn test_set_radius() {
let mut v = ProbeVolumeView::default();
pvv_set_radius(&mut v, 0.5);
assert!((v.config.sphere_radius - 0.5).abs() < 1e-6);
}
#[test]
fn test_radius_min_clamp() {
let mut v = ProbeVolumeView::default();
pvv_set_radius(&mut v, 0.0);
assert!(v.config.sphere_radius > 0.0);
}
#[test]
fn test_set_probe_count() {
let mut v = ProbeVolumeView::default();
pvv_set_probe_count(&mut v, 100);
assert_eq!(v.probe_count, 100);
}
#[test]
fn test_probe_count_clamp() {
let mut v = ProbeVolumeView::default();
pvv_set_probe_count(&mut v, 99999);
assert!(v.probe_count <= v.config.max_probes);
}
#[test]
fn test_probe_color_valid() {
let c = pvv_probe_color(1.0);
assert!(c[1] > c[0]);
}
#[test]
fn test_probe_color_invalid() {
let c = pvv_probe_color(0.0);
assert!(c[0] > c[1]);
}
#[test]
fn test_budget_exceeded() {
let mut v = ProbeVolumeView::default();
let max = v.config.max_probes;
pvv_set_probe_count(&mut v, max);
assert!(pvv_budget_exceeded(&v));
}
}