spring_cartographer_rs/
lib.rs

1//! # spring-cartographer-rs
2//! 
3
4use self::{smf::SMF, smt::SMT};
5
6pub mod smf;
7pub mod smt;
8
9pub fn extract_texture_32(smf: &SMF, smt: &SMT) -> Vec<u8> {
10    let mm = 32_usize;
11
12    let tile_columns = (smf.header.width / 4) as usize;
13    let tile_rows = (smf.header.length / 4) as usize;
14
15    let mut data = vec![0; ((tile_columns * mm * 4) * (tile_rows * mm)) as usize];
16    let mut tile_i = 0;
17    let mut max = usize::MIN;
18    for row in 0..(tile_rows as usize) {
19        for col in 0..(tile_columns as usize) {
20            let tile_index = smf.smt_file_info.tile_index.0[tile_i];
21            let dxt1 = &smt.tiles[tile_index as usize].mip_map32;
22
23            let mut tile_buf = vec![0; mm * mm * 4];
24            let format = texpresso::Format::Bc1;
25
26            format.decompress(dxt1, mm, mm, &mut tile_buf);
27
28            for (n, color) in tile_buf.chunks(4).enumerate() {
29                let width = tile_columns * mm;
30                let i = (row * width * mm * 4)
31                    + ((n / mm) * width * 4)
32                    + (col * mm * 4)
33                    + ((n % mm) * 4);
34
35                data[i + 0] = color[0];
36                data[i + 1] = color[1];
37                data[i + 2] = color[2];
38                data[i + 3] = color[3];
39
40                max = max.max(i);
41            }
42            tile_i += 1;
43        }
44    }
45
46    data
47}
48
49
50
51
52
53
54#[cfg(test)]
55mod test {
56    use binrw::BinRead;
57    use image::ImageFormat;
58
59    use super::*;
60
61    #[test]
62    fn smf() {
63        let smf_raw = include_bytes!("../.temp/great_divide_v1/maps/Great_Divide.smf");
64
65        let mut c = std::io::Cursor::new(smf_raw);
66
67        let smf = SMF::read(&mut c).unwrap();
68
69        dbg!(smf.header);
70
71        dbg!(smf.smt_file_info.header);
72        dbg!(smf.smt_file_info.smt_file_info);
73        dbg!(smf.features);
74    }
75
76    #[test]
77    fn smt() {
78        let smt_raw = include_bytes!("../.temp/great_divide_v1/maps/Great_Divide.smt");
79
80        let mut c = std::io::Cursor::new(smt_raw);
81
82        let smt = SMT::read(&mut c).unwrap();
83
84        dbg!(smt.header);
85        dbg!(smt.tiles.len());
86    }
87
88    #[test]
89    fn both() {
90        let smf = {
91            let smf_raw =
92                include_bytes!("../.temp/throne_v8/maps/Throne_v8.smf");
93
94            let mut c = std::io::Cursor::new(smf_raw);
95
96            SMF::read(&mut c).unwrap()
97        };
98
99        let smt = {
100            let smt_raw =
101                include_bytes!("../.temp/throne_v8/maps/Throne_v8.smt");
102            let mut c = std::io::Cursor::new(smt_raw);
103            SMT::read(&mut c).unwrap()
104        };
105
106        let data = extract_texture_32(&smf, &smt);
107
108        image::save_buffer_with_format(
109            format!("assets/.temp/tiles/test.png"),
110            &data,
111            smf.header.width / 4 * 32,
112            smf.header.length / 4 * 32,
113            image::ColorType::Rgba8,
114            ImageFormat::Png,
115        )
116        .unwrap();
117    }
118}