Skip to main content

oxihuman_viewer/
bone_envelope_debug_view.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![allow(dead_code)]
4
5//! Bone deform envelope debug visualization view stub.
6
7/// Envelope display mode.
8#[derive(Debug, Clone, Copy, PartialEq)]
9pub enum EnvelopeDisplayMode {
10    Wireframe,
11    Solid,
12    SolidWithEdges,
13}
14
15/// Bone envelope debug view configuration.
16#[derive(Debug, Clone)]
17pub struct BoneEnvelopeDebugView {
18    pub display_mode: EnvelopeDisplayMode,
19    pub color: [f32; 4],
20    pub opacity: f32,
21    pub show_head_tail: bool,
22    pub enabled: bool,
23}
24
25impl BoneEnvelopeDebugView {
26    pub fn new() -> Self {
27        BoneEnvelopeDebugView {
28            display_mode: EnvelopeDisplayMode::Wireframe,
29            color: [0.0, 0.8, 0.2, 1.0],
30            opacity: 0.5,
31            show_head_tail: true,
32            enabled: true,
33        }
34    }
35}
36
37impl Default for BoneEnvelopeDebugView {
38    fn default() -> Self {
39        Self::new()
40    }
41}
42
43/// Create a new bone envelope debug view.
44pub fn new_bone_envelope_debug_view() -> BoneEnvelopeDebugView {
45    BoneEnvelopeDebugView::new()
46}
47
48/// Set display mode.
49pub fn bedv_set_display_mode(view: &mut BoneEnvelopeDebugView, mode: EnvelopeDisplayMode) {
50    view.display_mode = mode;
51}
52
53/// Set envelope color (RGBA).
54pub fn bedv_set_color(view: &mut BoneEnvelopeDebugView, color: [f32; 4]) {
55    view.color = color;
56}
57
58/// Set envelope opacity.
59pub fn bedv_set_opacity(view: &mut BoneEnvelopeDebugView, opacity: f32) {
60    view.opacity = opacity.clamp(0.0, 1.0);
61}
62
63/// Toggle head/tail markers.
64pub fn bedv_show_head_tail(view: &mut BoneEnvelopeDebugView, show: bool) {
65    view.show_head_tail = show;
66}
67
68/// Enable or disable.
69pub fn bedv_set_enabled(view: &mut BoneEnvelopeDebugView, enabled: bool) {
70    view.enabled = enabled;
71}
72
73/// Serialize to JSON-like string.
74pub fn bedv_to_json(view: &BoneEnvelopeDebugView) -> String {
75    let mode = match view.display_mode {
76        EnvelopeDisplayMode::Wireframe => "wireframe",
77        EnvelopeDisplayMode::Solid => "solid",
78        EnvelopeDisplayMode::SolidWithEdges => "solid_with_edges",
79    };
80    format!(
81        r#"{{"display_mode":"{}","opacity":{},"show_head_tail":{},"enabled":{}}}"#,
82        mode, view.opacity, view.show_head_tail, view.enabled
83    )
84}
85
86#[cfg(test)]
87mod tests {
88    use super::*;
89
90    #[test]
91    fn test_default_display_mode() {
92        let v = new_bone_envelope_debug_view();
93        assert_eq!(
94            v.display_mode,
95            EnvelopeDisplayMode::Wireframe /* default must be Wireframe */
96        );
97    }
98
99    #[test]
100    fn test_set_display_mode() {
101        let mut v = new_bone_envelope_debug_view();
102        bedv_set_display_mode(&mut v, EnvelopeDisplayMode::Solid);
103        assert_eq!(
104            v.display_mode,
105            EnvelopeDisplayMode::Solid /* mode must be set */
106        );
107    }
108
109    #[test]
110    fn test_opacity_clamp() {
111        let mut v = new_bone_envelope_debug_view();
112        bedv_set_opacity(&mut v, 2.0);
113        assert!((v.opacity - 1.0).abs() < 1e-6 /* opacity clamped to 1.0 */);
114    }
115
116    #[test]
117    fn test_show_head_tail() {
118        let mut v = new_bone_envelope_debug_view();
119        bedv_show_head_tail(&mut v, false);
120        assert!(!v.show_head_tail /* head_tail must be hidden */);
121    }
122
123    #[test]
124    fn test_set_color() {
125        let mut v = new_bone_envelope_debug_view();
126        bedv_set_color(&mut v, [1.0, 0.0, 0.0, 1.0]);
127        assert!((v.color[0] - 1.0).abs() < 1e-6 /* red channel must be 1.0 */);
128    }
129
130    #[test]
131    fn test_set_enabled() {
132        let mut v = new_bone_envelope_debug_view();
133        bedv_set_enabled(&mut v, false);
134        assert!(!v.enabled /* must be disabled */);
135    }
136
137    #[test]
138    fn test_to_json_has_display_mode() {
139        let v = new_bone_envelope_debug_view();
140        let j = bedv_to_json(&v);
141        assert!(j.contains("\"display_mode\"") /* JSON must have display_mode */);
142    }
143
144    #[test]
145    fn test_enabled_default() {
146        let v = new_bone_envelope_debug_view();
147        assert!(v.enabled /* must be enabled by default */);
148    }
149
150    #[test]
151    fn test_default_opacity() {
152        let v = new_bone_envelope_debug_view();
153        assert!((v.opacity - 0.5).abs() < 1e-6 /* default opacity must be 0.5 */);
154    }
155}