mindustry logic execution, map- and schematic- parsing and rendering
thin image
bendn 2024-01-22
parent ff120ce · commit 824438a
-rw-r--r--mindus/Cargo.toml4
-rw-r--r--mindus/src/data/map.rs8
-rw-r--r--mindus/src/data/renderer.rs16
-rw-r--r--mindus/src/utils/image/holder.rs12
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()))