Skip to main content

oxihuman_viewer/
fire_debug_view.rs

1// Copyright (C) 2026 COOLJAPAN OU (Team KitaSan)
2// SPDX-License-Identifier: Apache-2.0
3#![allow(dead_code)]
4
5//! Fire simulation debug view — heat temperature and fuel density display.
6
7/// Fire debug view configuration.
8#[derive(Debug, Clone)]
9pub struct FireDebugView {
10    pub enabled: bool,
11    pub show_temperature: bool,
12    pub show_fuel: bool,
13    pub temp_min: f32,
14    pub temp_max: f32,
15}
16
17impl FireDebugView {
18    pub fn new() -> Self {
19        Self {
20            enabled: false,
21            show_temperature: true,
22            show_fuel: false,
23            temp_min: 300.0,
24            temp_max: 2000.0,
25        }
26    }
27}
28
29impl Default for FireDebugView {
30    fn default() -> Self {
31        Self::new()
32    }
33}
34
35/// Create a new fire debug view.
36pub fn new_fire_debug_view() -> FireDebugView {
37    FireDebugView::new()
38}
39
40/// Enable or disable fire debug display.
41pub fn frdv_set_enabled(v: &mut FireDebugView, enabled: bool) {
42    v.enabled = enabled;
43}
44
45/// Toggle temperature visualization.
46pub fn frdv_set_show_temperature(v: &mut FireDebugView, show: bool) {
47    v.show_temperature = show;
48}
49
50/// Toggle fuel density visualization.
51pub fn frdv_set_show_fuel(v: &mut FireDebugView, show: bool) {
52    v.show_fuel = show;
53}
54
55/// Set minimum displayed temperature (Kelvin).
56pub fn frdv_set_temp_min(v: &mut FireDebugView, t: f32) {
57    v.temp_min = t.max(0.0);
58}
59
60/// Set maximum displayed temperature (Kelvin).
61pub fn frdv_set_temp_max(v: &mut FireDebugView, t: f32) {
62    v.temp_max = t.max(v.temp_min + 1.0);
63}
64
65/// Normalize a temperature value to 0-1 range for display.
66pub fn frdv_normalize_temp(v: &FireDebugView, temp: f32) -> f32 {
67    let range = v.temp_max - v.temp_min;
68    if range < 1e-6 {
69        return 0.0;
70    }
71    ((temp - v.temp_min) / range).clamp(0.0, 1.0)
72}
73
74/// Serialize to JSON-like string.
75pub fn fire_debug_view_to_json(v: &FireDebugView) -> String {
76    format!(
77        r#"{{"enabled":{},"show_temperature":{},"show_fuel":{},"temp_min":{:.2},"temp_max":{:.2}}}"#,
78        v.enabled, v.show_temperature, v.show_fuel, v.temp_min, v.temp_max
79    )
80}
81
82#[cfg(test)]
83mod tests {
84    use super::*;
85
86    #[test]
87    fn test_defaults() {
88        let v = new_fire_debug_view();
89        assert!(!v.enabled);
90        assert!(v.show_temperature);
91        assert!(!v.show_fuel);
92    }
93
94    #[test]
95    fn test_enable() {
96        let mut v = new_fire_debug_view();
97        frdv_set_enabled(&mut v, true);
98        assert!(v.enabled);
99    }
100
101    #[test]
102    fn test_toggle_fuel() {
103        let mut v = new_fire_debug_view();
104        frdv_set_show_fuel(&mut v, true);
105        assert!(v.show_fuel);
106    }
107
108    #[test]
109    fn test_temp_min_clamped() {
110        let mut v = new_fire_debug_view();
111        frdv_set_temp_min(&mut v, -100.0);
112        assert_eq!(v.temp_min, 0.0);
113    }
114
115    #[test]
116    fn test_temp_max_set() {
117        let mut v = new_fire_debug_view();
118        frdv_set_temp_max(&mut v, 3000.0);
119        assert!((v.temp_max - 3000.0).abs() < 1e-4);
120    }
121
122    #[test]
123    fn test_normalize_mid() {
124        let v = new_fire_debug_view(); /* range 300-2000 */
125        let n = frdv_normalize_temp(&v, 1150.0);
126        assert!((n - 0.5).abs() < 0.01); /* midpoint */
127    }
128
129    #[test]
130    fn test_normalize_clamp_below() {
131        let v = new_fire_debug_view();
132        assert_eq!(frdv_normalize_temp(&v, 0.0), 0.0);
133    }
134
135    #[test]
136    fn test_json_keys() {
137        let v = new_fire_debug_view();
138        let s = fire_debug_view_to_json(&v);
139        assert!(s.contains("temp_max"));
140    }
141
142    #[test]
143    fn test_clone() {
144        let v = new_fire_debug_view();
145        let v2 = v.clone();
146        assert!((v2.temp_min - v.temp_min).abs() < 1e-4);
147    }
148}