#![allow(dead_code)]
#[derive(Debug, Clone)]
pub struct DepthPeelView {
pub enabled: bool,
pub layer_count: u32,
pub alpha: f32,
}
pub fn new_depth_peel_view() -> DepthPeelView {
DepthPeelView {
enabled: false,
layer_count: 4,
alpha: 0.5,
}
}
pub fn dpv_enable(v: &mut DepthPeelView) {
v.enabled = true;
}
pub fn dpv_set_layer_count(v: &mut DepthPeelView, n: u32) {
v.layer_count = n.clamp(1, 16);
}
pub fn dpv_set_alpha(v: &mut DepthPeelView, a: f32) {
v.alpha = a.clamp(0.0, 1.0);
}
pub fn dpv_layer_alpha(v: &DepthPeelView, layer: u32) -> f32 {
let t = if v.layer_count <= 1 {
1.0
} else {
1.0 - layer as f32 / (v.layer_count - 1) as f32
};
(v.alpha * t).clamp(0.0, 1.0)
}
pub fn dpv_layer_color(layer: u32, total: u32) -> [f32; 3] {
let t = if total == 0 {
0.0
} else {
layer as f32 / total as f32
};
[t, 0.5, 1.0 - t]
}
pub fn dpv_to_json(v: &DepthPeelView) -> String {
format!(
r#"{{"enabled":{},"layer_count":{},"alpha":{:.4}}}"#,
v.enabled, v.layer_count, v.alpha
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_defaults() {
let v = new_depth_peel_view();
assert_eq!(v.layer_count, 4);
assert!((v.alpha - 0.5).abs() < 1e-6);
}
#[test]
fn test_enable() {
let mut v = new_depth_peel_view();
dpv_enable(&mut v);
assert!(v.enabled);
}
#[test]
fn test_set_layer_count() {
let mut v = new_depth_peel_view();
dpv_set_layer_count(&mut v, 8);
assert_eq!(v.layer_count, 8);
}
#[test]
fn test_layer_count_clamp_max() {
let mut v = new_depth_peel_view();
dpv_set_layer_count(&mut v, 100);
assert_eq!(v.layer_count, 16);
}
#[test]
fn test_layer_count_clamp_min() {
let mut v = new_depth_peel_view();
dpv_set_layer_count(&mut v, 0);
assert_eq!(v.layer_count, 1);
}
#[test]
fn test_alpha_set() {
let mut v = new_depth_peel_view();
dpv_set_alpha(&mut v, 0.7);
assert!((v.alpha - 0.7).abs() < 1e-6);
}
#[test]
fn test_layer_alpha_first() {
let v = new_depth_peel_view();
let a = dpv_layer_alpha(&v, 0);
assert!((a - v.alpha).abs() < 1e-6);
}
#[test]
fn test_layer_color_range() {
let c = dpv_layer_color(2, 4);
for ch in c {
assert!((0.0..=1.0).contains(&ch));
}
}
#[test]
fn test_to_json() {
assert!(dpv_to_json(&new_depth_peel_view()).contains("layer_count"));
}
}