#![allow(dead_code)]
#[derive(Debug, Clone, PartialEq)]
pub enum SelectionMaskMode {
PerVertex,
PerFace,
}
#[derive(Debug, Clone)]
pub struct SelectionMaskView {
pub enabled: bool,
pub mode: SelectionMaskMode,
pub highlight_color: [f32; 3],
pub alpha: f32,
}
pub fn new_selection_mask_view() -> SelectionMaskView {
SelectionMaskView {
enabled: false,
mode: SelectionMaskMode::PerVertex,
highlight_color: [0.2, 0.6, 1.0],
alpha: 0.5,
}
}
pub fn smkv_set_mode(v: &mut SelectionMaskView, mode: SelectionMaskMode) {
v.mode = mode;
}
pub fn smkv_set_alpha(v: &mut SelectionMaskView, a: f32) {
v.alpha = a.clamp(0.0, 1.0);
}
pub fn smkv_enable(v: &mut SelectionMaskView) {
v.enabled = true;
}
pub fn smkv_overlay_color(v: &SelectionMaskView, selected: bool) -> [f32; 4] {
if selected {
[
v.highlight_color[0],
v.highlight_color[1],
v.highlight_color[2],
v.alpha,
]
} else {
[0.0, 0.0, 0.0, 0.0]
}
}
pub fn smkv_is_enabled(v: &SelectionMaskView) -> bool {
v.enabled
}
pub fn smkv_to_json(v: &SelectionMaskView) -> String {
let mode_str = match v.mode {
SelectionMaskMode::PerVertex => "per_vertex",
SelectionMaskMode::PerFace => "per_face",
};
format!(
r#"{{"enabled":{},"mode":"{}","alpha":{:.4}}}"#,
v.enabled, mode_str, v.alpha
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_defaults() {
let v = new_selection_mask_view();
assert!(!v.enabled);
assert_eq!(v.mode, SelectionMaskMode::PerVertex);
assert!((v.alpha - 0.5).abs() < 1e-6);
}
#[test]
fn test_set_mode() {
let mut v = new_selection_mask_view();
smkv_set_mode(&mut v, SelectionMaskMode::PerFace);
assert_eq!(v.mode, SelectionMaskMode::PerFace);
}
#[test]
fn test_set_alpha() {
let mut v = new_selection_mask_view();
smkv_set_alpha(&mut v, 0.8);
assert!((v.alpha - 0.8).abs() < 1e-6);
}
#[test]
fn test_set_alpha_clamp() {
let mut v = new_selection_mask_view();
smkv_set_alpha(&mut v, 2.0);
assert_eq!(v.alpha, 1.0);
}
#[test]
fn test_enable() {
let mut v = new_selection_mask_view();
smkv_enable(&mut v);
assert!(smkv_is_enabled(&v));
}
#[test]
fn test_overlay_color_selected() {
let v = new_selection_mask_view();
let c = smkv_overlay_color(&v, true);
assert!((c[3] - 0.5).abs() < 1e-6);
}
#[test]
fn test_overlay_color_unselected() {
let v = new_selection_mask_view();
let c = smkv_overlay_color(&v, false);
assert_eq!(c, [0.0, 0.0, 0.0, 0.0]);
}
#[test]
fn test_to_json() {
let v = new_selection_mask_view();
assert!(smkv_to_json(&v).contains("mode"));
}
#[test]
fn test_clone() {
let v = new_selection_mask_view();
let v2 = v.clone();
assert_eq!(v.mode, v2.mode);
}
}