Skip to main content

oxihuman_viewer/
render_layer.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![allow(dead_code)]
4
5/// Priority for a render layer (lower = drawn first).
6#[allow(dead_code)]
7#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
8pub struct LayerPriority(pub u32);
9
10/// A named render layer with visibility and priority.
11#[allow(dead_code)]
12#[derive(Debug, Clone)]
13pub struct RenderLayer {
14    pub name: String,
15    pub priority: LayerPriority,
16    pub visible: bool,
17    pub draw_count: usize,
18}
19
20/// Create a new render layer.
21#[allow(dead_code)]
22pub fn new_render_layer_rl(name: &str, priority: u32) -> RenderLayer {
23    RenderLayer {
24        name: name.to_string(),
25        priority: LayerPriority(priority),
26        visible: true,
27        draw_count: 0,
28    }
29}
30
31/// Return the layer priority.
32#[allow(dead_code)]
33pub fn layer_priority(layer: &RenderLayer) -> u32 {
34    layer.priority.0
35}
36
37/// Check if the layer is visible.
38#[allow(dead_code)]
39pub fn layer_is_visible(layer: &RenderLayer) -> bool {
40    layer.visible
41}
42
43/// Set layer visibility.
44#[allow(dead_code)]
45pub fn set_layer_visible(layer: &mut RenderLayer, visible: bool) {
46    layer.visible = visible;
47}
48
49/// Return the draw count for this layer.
50#[allow(dead_code)]
51pub fn layer_draw_count(layer: &RenderLayer) -> usize {
52    layer.draw_count
53}
54
55/// Return the layer name.
56#[allow(dead_code)]
57pub fn layer_name_rl(layer: &RenderLayer) -> &str {
58    &layer.name
59}
60
61/// Serialize to JSON.
62#[allow(dead_code)]
63pub fn layer_to_json(layer: &RenderLayer) -> String {
64    format!(
65        "{{\"name\":\"{}\",\"priority\":{},\"visible\":{}}}",
66        layer.name, layer.priority.0, layer.visible
67    )
68}
69
70/// Clear the layer draw count.
71#[allow(dead_code)]
72pub fn layer_clear(layer: &mut RenderLayer) {
73    layer.draw_count = 0;
74}
75
76#[cfg(test)]
77mod tests {
78    use super::*;
79
80    #[test]
81    fn new_layer() {
82        let l = new_render_layer_rl("opaque", 0);
83        assert!(layer_is_visible(&l));
84    }
85
86    #[test]
87    fn priority_accessor() {
88        let l = new_render_layer_rl("transparent", 10);
89        assert_eq!(layer_priority(&l), 10);
90    }
91
92    #[test]
93    fn toggle_visibility() {
94        let mut l = new_render_layer_rl("x", 0);
95        set_layer_visible(&mut l, false);
96        assert!(!layer_is_visible(&l));
97    }
98
99    #[test]
100    fn draw_count_starts_zero() {
101        let l = new_render_layer_rl("x", 0);
102        assert_eq!(layer_draw_count(&l), 0);
103    }
104
105    #[test]
106    fn name_accessor() {
107        let l = new_render_layer_rl("overlay", 5);
108        assert_eq!(layer_name_rl(&l), "overlay");
109    }
110
111    #[test]
112    fn to_json() {
113        let l = new_render_layer_rl("test", 1);
114        let j = layer_to_json(&l);
115        assert!(j.contains("\"test\""));
116    }
117
118    #[test]
119    fn clear_draw_count() {
120        let mut l = new_render_layer_rl("x", 0);
121        l.draw_count = 42;
122        layer_clear(&mut l);
123        assert_eq!(layer_draw_count(&l), 0);
124    }
125
126    #[test]
127    fn priority_ordering() {
128        let a = LayerPriority(1);
129        let b = LayerPriority(10);
130        assert!(a < b);
131    }
132
133    #[test]
134    fn visible_by_default() {
135        let l = new_render_layer_rl("default", 0);
136        assert!(l.visible);
137    }
138
139    #[test]
140    fn set_visible_true() {
141        let mut l = new_render_layer_rl("x", 0);
142        set_layer_visible(&mut l, false);
143        set_layer_visible(&mut l, true);
144        assert!(layer_is_visible(&l));
145    }
146}