assembly_maps/raw/
reader.rs

1use 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 {}