oxihuman_export/
subsurface_map_export.rs1#![allow(dead_code)]
4
5pub struct SubsurfaceMap {
6 pub width: u32,
7 pub height: u32,
8 pub radius: Vec<[f32; 3]>,
9 pub color: Vec<[f32; 3]>,
10}
11
12pub fn new_subsurface_map(w: u32, h: u32) -> SubsurfaceMap {
13 let n = (w * h) as usize;
14 SubsurfaceMap {
15 width: w,
16 height: h,
17 radius: vec![[1.0, 0.2, 0.1]; n],
18 color: vec![[1.0, 0.8, 0.7]; n],
19 }
20}
21
22pub fn sss_set(m: &mut SubsurfaceMap, x: u32, y: u32, radius: [f32; 3], color: [f32; 3]) {
23 if x < m.width && y < m.height {
24 let idx = (y * m.width + x) as usize;
25 m.radius[idx] = radius;
26 m.color[idx] = color;
27 }
28}
29
30pub fn sss_get_radius(m: &SubsurfaceMap, x: u32, y: u32) -> [f32; 3] {
31 if x < m.width && y < m.height {
32 m.radius[(y * m.width + x) as usize]
33 } else {
34 [0.0; 3]
35 }
36}
37
38pub fn sss_get_color(m: &SubsurfaceMap, x: u32, y: u32) -> [f32; 3] {
39 if x < m.width && y < m.height {
40 m.color[(y * m.width + x) as usize]
41 } else {
42 [0.0; 3]
43 }
44}
45
46pub fn sss_to_bytes(m: &SubsurfaceMap) -> Vec<u8> {
47 let mut b = Vec::new();
48 b.extend_from_slice(&m.width.to_le_bytes());
49 b.extend_from_slice(&m.height.to_le_bytes());
50 for (r, c) in m.radius.iter().zip(m.color.iter()) {
51 for &v in r {
52 b.extend_from_slice(&v.to_le_bytes());
53 }
54 for &v in c {
55 b.extend_from_slice(&v.to_le_bytes());
56 }
57 }
58 b
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[test]
66 fn test_new_subsurface_map() {
67 let m = new_subsurface_map(4, 4);
69 assert_eq!(m.radius.len(), 16);
70 }
71
72 #[test]
73 fn test_sss_set_get_radius() {
74 let mut m = new_subsurface_map(4, 4);
76 sss_set(&mut m, 1, 1, [2.0, 1.0, 0.5], [1.0, 0.5, 0.3]);
77 let r = sss_get_radius(&m, 1, 1);
78 assert!((r[0] - 2.0).abs() < 1e-6);
79 }
80
81 #[test]
82 fn test_sss_get_color() {
83 let mut m = new_subsurface_map(2, 2);
85 sss_set(&mut m, 0, 0, [1.0; 3], [0.5, 0.6, 0.7]);
86 let c = sss_get_color(&m, 0, 0);
87 assert!((c[1] - 0.6).abs() < 1e-5);
88 }
89
90 #[test]
91 fn test_sss_to_bytes() {
92 let m = new_subsurface_map(2, 2);
94 let b = sss_to_bytes(&m);
95 assert!(!b.is_empty());
96 }
97
98 #[test]
99 fn test_sss_get_oob() {
100 let m = new_subsurface_map(2, 2);
102 assert_eq!(sss_get_radius(&m, 99, 99), [0.0f32; 3]);
103 }
104}