mindustry logic execution, map- and schematic- parsing and rendering
thin image
| -rw-r--r-- | mindus/Cargo.toml | 4 | ||||
| -rw-r--r-- | mindus/src/data/map.rs | 8 | ||||
| -rw-r--r-- | mindus/src/data/renderer.rs | 16 | ||||
| -rw-r--r-- | mindus/src/utils/image/holder.rs | 12 |
4 files changed, 28 insertions, 12 deletions
diff --git a/mindus/Cargo.toml b/mindus/Cargo.toml index c5cdc49..413aba3 100644 --- a/mindus/Cargo.toml +++ b/mindus/Cargo.toml @@ -24,14 +24,14 @@ thiserror = "1.0" bobbin-bits = "0.1" enum_dispatch = "0.3" phf = { version = "0.11", features = ["macros"] } -fimg = { version = "0.4.23", features = ["scale", "blur", "save"], default-features = false } +fimg = { version = "0.4.31", features = ["scale", "blur", "save"], default-features = false } [features] bin = ["fimg/save"] default = ["bin"] [build-dependencies] -fimg = { version = "0.4.26", features = ["scale", "save", "blur"], default-features = false } +fimg = { version = "0.4.31", features = ["scale", "save", "blur"], default-features = false } walkdir = "2" [[bin]] diff --git a/mindus/src/data/map.rs b/mindus/src/data/map.rs index 3def550..6eb9b26 100644 --- a/mindus/src/data/map.rs +++ b/mindus/src/data/map.rs @@ -99,7 +99,7 @@ pub struct Tile { macro_rules! lo { ($v:expr => [$(|)? $($k:literal $(|)?)+], $scale: ident) => { paste::paste! { match $v { - $(BlockEnum::[<$k:camel>] => load!($k, $scale),)+ + $(BlockEnum::[<$k:camel>] => load!(raw $k, $scale),)+ n => unreachable!("{n:?}"), } } }; @@ -144,7 +144,7 @@ impl Tile { } #[inline] - pub(crate) fn floor(&self, s: Scale) -> ImageHolder<3> { + pub(crate) fn floor(&self, s: Scale) -> Image<&'static [u8], 3> { lo!(self.floor => [ | "darksand" | "sand-floor" @@ -185,7 +185,7 @@ impl Tile { #[must_use] #[inline] - pub(crate) fn ore(&self, s: Scale) -> ImageHolder<4> { + pub(crate) fn ore(&self, s: Scale) -> Image<&'static [u8], 4> { lo!(self.ore => ["ore-copper" | "ore-beryllium" | "ore-lead" | "ore-scrap" | "ore-coal" | "ore-thorium" | "ore-titanium" | "ore-tungsten" | "pebbles" | "tendrils" | "ore-wall-tungsten" | "ore-wall-beryllium" | "ore-wall-thorium" | "spawn" | "ore-crystal-thorium"], s) } @@ -198,7 +198,7 @@ impl Tile { /// Draw the floor of this tile #[must_use] pub fn floor_image(&self, s: Scale) -> ImageHolder<3> { - let mut floor = self.floor(s); + let mut floor = ImageHolder::from(self.floor(s)); if self.has_ore() { unsafe { floor.overlay(&self.ore(s)) }; } diff --git a/mindus/src/data/renderer.rs b/mindus/src/data/renderer.rs index 410ed48..72d29d4 100644 --- a/mindus/src/data/renderer.rs +++ b/mindus/src/data/renderer.rs @@ -40,6 +40,13 @@ impl std::ops::Mul<u32> for Scale { #[macro_export] macro_rules! load { + (raw $name: literal, $scale:expr) => { + paste::paste! { match $scale { + $crate::data::renderer::Scale::Quarter => $crate::data::renderer::quar::[<$name:snake:upper>], + $crate::data::renderer::Scale::Eigth => $crate::data::renderer::eigh::[<$name:snake:upper>], + $crate::data::renderer::Scale::Full => $crate::data::renderer::full::[<$name:snake:upper>], + } + } }; ($name:literal, $scale:expr) => { paste::paste! { $crate::utils::image::ImageHolder::from(match $scale { $crate::data::renderer::Scale::Quarter => &$crate::data::renderer::quar::[<$name:snake:upper>], @@ -173,16 +180,13 @@ impl Renderable for Map { let y = self.height - y - 1; // println!("draw {tile:?} ({x}, {y})"); unsafe { - img.as_mut().overlay_at( - &tile.floor(scale).borrow(), - scale * x as u32, - scale * y as u32, - ) + img.as_mut() + .overlay_at(&tile.floor(scale), scale * x as u32, scale * y as u32) }; if tile.has_ore() { unsafe { img.as_mut().overlay_at( - &tile.ore(scale).borrow(), + &tile.ore(scale), scale * x as u32, scale * y as u32, ) diff --git a/mindus/src/utils/image/holder.rs b/mindus/src/utils/image/holder.rs index 2e18724..63c8e81 100644 --- a/mindus/src/utils/image/holder.rs +++ b/mindus/src/utils/image/holder.rs @@ -61,6 +61,18 @@ impl OverlayAt<ImageHolder<4>> for ImageHolder<4> { } } +impl OverlayAt<Image<&[u8], 3>> for ImageHolder<3> { + unsafe fn overlay_at(&mut self, with: &Image<&[u8], 3>, x: u32, y: u32) -> &mut Self { + make!(self.overlay_at(with, x, y)) + } +} + +impl Overlay<Image<&[u8], 4>> for ImageHolder<3> { + unsafe fn overlay(&mut self, with: &Image<&[u8], 4>) -> &mut Self { + make!(self.overlay(with)) + } +} + impl Overlay<ImageHolder<4>> for ImageHolder<3> { unsafe fn overlay(&mut self, with: &ImageHolder<4>) -> &mut Self { make!(self.overlay(&with.borrow())) |