spring_cartographer_rs/
lib.rs1use 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}