assembly_maps/raw/
reader.rs1use super::file::*;
2use super::parser;
3use assembly_core::reader::FileResult;
4use assembly_core::{nom::Finish, reader::ParseAt};
5use byteorder::{ReadBytesExt, LE};
6
7use std::io::prelude::*;
8
9pub trait TerrainReader: Read {
10 fn read_terrain_header(&mut self) -> FileResult<TerrainHeader> {
11 let mut header_bytes = [0 as u8; 15];
12 self.read_exact(&mut header_bytes)?;
13 let (_, header) = parser::parse_terrain_header(&header_bytes)
14 .finish()
15 .at(0xbeef, &header_bytes)?;
16 Ok(header)
17 }
18
19 fn read_terrain_chunk(&mut self) -> FileResult<TerrainChunk> {
20 let index = self.read_u32::<LE>()?;
21 Ok(TerrainChunk { index })
22 }
23
24 fn read_height_map_header(&mut self) -> FileResult<HeightMapHeader> {
25 let mut header_bytes = [0 as u8; 36];
26 self.read_exact(&mut header_bytes)?;
27 let (_, header) = parser::parse_height_map_header(&header_bytes)
28 .finish()
29 .at(0xbeef, &header_bytes)?;
30 Ok(header)
31 }
32
33 fn read_height_map_data(&mut self, width: u32, height: u32) -> FileResult<Vec<f32>> {
34 let len = (width * height) as usize;
35 let mut bytes = Vec::with_capacity(len);
36 bytes.resize(len, 0.0);
37 self.read_f32_into::<LE>(bytes.as_mut_slice())?;
38 Ok(bytes)
39 }
40
41 fn read_color_map_data(&mut self) -> FileResult<Vec<u32>> {
42 let len = self.read_u32::<LE>()? as usize;
43 let len = len * len;
44 let mut bytes = vec![0; len];
45 self.read_u32_into::<LE>(bytes.as_mut_slice())?;
46 Ok(bytes)
47 }
48
49 fn read_embedded_file(&mut self) -> FileResult<Vec<u8>> {
50 let len = self.read_u32::<LE>()? as usize;
51 let mut bytes = vec![0; len];
52 self.read_exact(bytes.as_mut_slice())?;
53 Ok(bytes)
54 }
55}
56
57impl<T> TerrainReader for T where T: Read {}