mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/data/renderer.rs')
-rw-r--r--src/data/renderer.rs53
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
+ }
+}