mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/data/renderer.rs')
| -rw-r--r-- | src/data/renderer.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/data/renderer.rs b/src/data/renderer.rs new file mode 100644 index 0000000..3a7713b --- /dev/null +++ b/src/data/renderer.rs @@ -0,0 +1,53 @@ +use std::io::BufReader; +use std::path::Path; + +use image::codecs::png::PngDecoder; +use image::imageops::overlay; +use image::{DynamicImage, RgbaImage}; + +use super::schematic::Schematic; + +pub fn load(category: &str, name: &str) -> Option<RgbaImage> { + let mut p = Path::new("assets/blocks").join(category).join(name); + p.set_extension("png"); + let f = std::fs::File::open(p).ok()?; + let r = PngDecoder::new(BufReader::new(f)).unwrap(); + Some(DynamicImage::from_decoder(r).unwrap().into_rgba8()) +} + +const SUFFIXES: &[&str; 8] = &[ + "bottom", "mid", "", "-base", "-left", "-right", "-top", "-over", +]; +pub fn read<S>(category: &str, name: &str, size: S) -> RgbaImage +where + S: Into<u32> + Copy, +{ + let mut c = RgbaImage::new(size.into() * 32, size.into() * 32); + for suffix in SUFFIXES { + let mut p = Path::new("assets/blocks") + .join(category) + .join(format!("{name}{suffix}")); + p.set_extension("png"); + if let Some(p) = load(category, &format!("{name}{suffix}")) { + image::imageops::overlay(&mut c, &p, 0, 0); + } + } + c +} + +pub struct Renderer {} +impl<'l> Renderer { + pub fn render(s: &'l Schematic<'_>) -> RgbaImage { + let mut canvas = RgbaImage::new((s.width * 32).into(), (s.height * 32).into()); + for tile in s.block_iter() { + let mut x = tile.pos.0 as i64; + let mut y = tile.pos.1 as i64; + if tile.block.get_size() != 1 && tile.block.get_size() % 2 != 0 { + x -= 1; + y -= 1; + } + overlay(&mut canvas, &tile.image(), x * 32, y * 32); + } + canvas + } +} |