mindustry logic execution, map- and schematic- parsing and rendering
big table
bendn 6 months ago
parent 80eaf5e · commit 504c8a8
-rw-r--r--mindus/src/data/map.rs124
-rw-r--r--mindus/src/data/renderer.rs31
2 files changed, 63 insertions, 92 deletions
diff --git a/mindus/src/data/map.rs b/mindus/src/data/map.rs
index 6550ced..266afa3 100644
--- a/mindus/src/data/map.rs
+++ b/mindus/src/data/map.rs
@@ -108,68 +108,57 @@ pub struct Tile {
pub nd: [u8; 7],
}
-macro_rules! lo {
- ($v:expr => [$(|)? $($k:literal $(|)?)+], $scale: ident) => { paste::paste! {
- match $v {
- $(BlockEnum::[<$k:camel>] => Some(DynImage::from(load!(raw $k, $scale))),)+
- _ => None,
- }
- } };
-}
-
-#[inline]
-pub(crate) fn ore(ore: BlockEnum, s: Scale) -> DynImage<&'static [u8]> {
- lo!(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).unwrap_or_else(|| floor(ore, s))
-}
-
-#[inline]
-pub(crate) fn floor(tile: BlockEnum, s: Scale) -> DynImage<&'static [u8]> {
- macro_rules! x {
- ($($x:literal)+) => { paste::paste! {
- match tile {
- $(BlockEnum::[<$x:camel>] => return DynImage::from(load!(raw $x, s)),)+
- _ => {}
- }
- }};
- }
- x!("colored-floor" "colored-wall" "metal-tiles-1" "metal-tiles-2" "metal-tiles-3" "metal-tiles-4" "metal-tiles-5" "metal-tiles-6" "metal-tiles-7" "metal-tiles-8" "metal-tiles-9" "metal-tiles-10" "metal-tiles-11" "metal-tiles-12");
- lo!(tile => [
- | "darksand"
- | "sand-floor"
- | "dacite"
- | "dirt"
- | "arkycite-floor"
- | "basalt" | "basalt-vent"
- | "moss"
- | "mud"
- | "ice-snow" | "snow" | "salt" | "ice"
- | "hotrock" | "char" | "magmarock" | "molten-slag"
- | "shale"
- | "metal-floor" | "metal-floor-2" | "metal-floor-3" | "metal-floor-4" | "metal-floor-5" | "metal-floor-damaged"
- | "dark-panel-1" | "dark-panel-2" | "dark-panel-3" | "dark-panel-4" | "dark-panel-5" | "dark-panel-6"
- | "darksand-tainted-water" | "darksand-water" | "deep-tainted-water" | "deep-water" | "sand-water" | "shallow-water" | "tainted-water"
- | "tar" | "pooled-cryofluid"
- | "space"
- | "stone" | "stone-vent"
- | "bluemat"
- | "ferric-craters"
- | "beryllic-stone"
- | "grass"
- | "rhyolite" | "rough-rhyolite" | "rhyolite-crater" | "rhyolite-vent"
- | "core-zone"
- | "crater-stone"
- | "redmat"
- | "red-ice"
- | "spore-moss"
- | "regolith"
- | "ferric-stone"
- | "arkyic-stone" | "arkyic-vent"
- | "yellow-stone" | "yellow-stone-plates" | "yellow-stone-vent"
- | "red-stone" | "red-stone-vent" | "dense-red-stone"
- | "carbon-stone" | "carbon-vent"
- | "crystal-floor" | "crystalline-stone" | "crystalline-vent"
- | "empty"], s).unwrap_or_else(|| ore(tile, s))
-}
+pub static FLOOR_TABLE: [[DynImage<&'static [u8]>; BlockEnum::ALL.len()]; 3] = {
+ let mut table_f = [DynImage::from(load!(raw "empty", Scale::Full)); BlockEnum::ALL.len()];
+ let mut table_q = [DynImage::from(load!(raw "empty", Scale::Quarter)); BlockEnum::ALL.len()];
+ let mut table_e = [DynImage::from(load!(raw "empty", Scale::Eigth)); BlockEnum::ALL.len()];
+ macro_rules! image {
+ (| $($x:literal $(|)?)+) => { paste::paste! {
+ $(table_f[BlockEnum::[<$x:camel>] as usize] = DynImage::from(load!(raw $x, Scale::Full));)+
+ $(table_q[BlockEnum::[<$x:camel>] as usize] = DynImage::from(load!(raw $x, Scale::Quarter));)+
+ $(table_e[BlockEnum::[<$x:camel>] as usize] = DynImage::from(load!(raw $x, Scale::Eigth));)+
+ } }
+ }
+ image! {
+ | "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"
+ | "colored-floor" | "colored-wall" | "metal-tiles-1" | "metal-tiles-2" | "metal-tiles-3" | "metal-tiles-4" | "metal-tiles-5" | "metal-tiles-6" | "metal-tiles-7" | "metal-tiles-8" | "metal-tiles-9" | "metal-tiles-10" | "metal-tiles-11" | "metal-tiles-12"
+ | "darksand"
+ | "sand-floor"
+ | "dacite"
+ | "dirt"
+ | "arkycite-floor"
+ | "basalt" | "basalt-vent"
+ | "moss"
+ | "mud"
+ | "ice-snow" | "snow" | "salt" | "ice"
+ | "hotrock" | "char" | "magmarock" | "molten-slag"
+ | "shale"
+ | "metal-floor" | "metal-floor-2" | "metal-floor-3" | "metal-floor-4" | "metal-floor-5" | "metal-floor-damaged"
+ | "dark-panel-1" | "dark-panel-2" | "dark-panel-3" | "dark-panel-4" | "dark-panel-5" | "dark-panel-6"
+ | "darksand-tainted-water" | "darksand-water" | "deep-tainted-water" | "deep-water" | "sand-water" | "shallow-water" | "tainted-water"
+ | "tar" | "pooled-cryofluid"
+ | "space"
+ | "stone" | "stone-vent"
+ | "bluemat"
+ | "ferric-craters"
+ | "beryllic-stone"
+ | "grass"
+ | "rhyolite" | "rough-rhyolite" | "rhyolite-crater" | "rhyolite-vent"
+ | "core-zone"
+ | "crater-stone"
+ | "redmat"
+ | "red-ice"
+ | "spore-moss"
+ | "regolith"
+ | "ferric-stone"
+ | "arkyic-stone" | "arkyic-vent"
+ | "yellow-stone" | "yellow-stone-plates" | "yellow-stone-vent"
+ | "red-stone" | "red-stone-vent" | "dense-red-stone"
+ | "carbon-stone" | "carbon-vent"
+ | "crystal-floor" | "crystalline-stone" | "crystalline-vent"
+ };
+ [table_f, table_q, table_e]
+};
impl Tile {
#[must_use]
@@ -210,17 +199,6 @@ impl Tile {
self.build.as_ref().map_or(1, |v| v.block.get_size())
}
- #[inline]
- pub(crate) fn floor(&self, s: Scale) -> DynImage<&'static [u8]> {
- floor(self.floor, s)
- }
-
- #[must_use]
- #[inline]
- pub(crate) fn ore(&self, s: Scale) -> DynImage<&'static [u8]> {
- ore(self.ore, s)
- }
-
#[must_use]
#[inline]
pub fn has_ore(&self) -> bool {
diff --git a/mindus/src/data/renderer.rs b/mindus/src/data/renderer.rs
index 0452fa7..90c06c3 100644
--- a/mindus/src/data/renderer.rs
+++ b/mindus/src/data/renderer.rs
@@ -319,6 +319,7 @@ impl Renderable for Map {
} else {
Scale::Eigth
};
+ let table = &crate::data::map::FLOOR_TABLE[scale as usize];
let mut img = uninit::Image::<_, 3>::new(
(scale * self.width as u32).try_into().unwrap(),
(scale * self.height as u32).try_into().unwrap(),
@@ -371,16 +372,15 @@ impl Renderable for Map {
unsafe { img.overlay_at(i, scale * x as u32, scale * y as u32) };
}
} else {
- match tile.floor(scale) {
- DynImage::Rgba(i) => unsafe {
- img.overlay_at(&i, scale * x as u32, scale * y as u32);
- },
- DynImage::Rgb(i) => unsafe {
- img.overlay_at(&i, scale * x as u32, scale * y as u32);
- },
- _ => unreachable!(),
+ unsafe {
+ img.overlay_at(
+ &table[tile.floor as usize],
+ scale * x as u32,
+ scale * y as u32,
+ );
}
}
+
if tile.has_ore() {
if tile.ore == Type::CharacterOverlay || tile.ore == Type::CharacterOverlayWhite
{
@@ -400,7 +400,7 @@ impl Renderable for Map {
)
};
} else {
- match tile.ore(scale) {
+ match table[tile.ore as usize] {
DynImage::Rgba(i) => unsafe {
img.overlay_at(&i, scale * x as u32, scale * y as u32);
},
@@ -621,6 +621,7 @@ pub fn draw_map_single(
(scale * w as u32).try_into().unwrap(),
(scale * h as u32).try_into().unwrap(),
);
+ let table = crate::data::map::FLOOR_TABLE[scale as usize];
// loop1 draws the floor
for y in 0..h {
for x in 0..w {
@@ -631,17 +632,9 @@ pub fn draw_map_single(
};
let y = h - y - 1;
// println!("draw tile {floor} {ore} @ {x} {y}");
- match crate::data::map::floor(floor, scale) {
- DynImage::Rgba(i) => unsafe {
- img.overlay_at(&i, scale * x as u32, scale * y as u32);
- },
- DynImage::Rgb(i) => unsafe {
- img.overlay_at(&i, scale * x as u32, scale * y as u32);
- },
- _ => unreachable!(),
- }
+ unsafe { img.overlay_at(&table[floor as usize], scale * x as u32, scale * y as u32) };
if ore != Type::Air {
- match crate::data::map::ore(ore, scale) {
+ match table[floor as usize] {
DynImage::Rgba(i) => unsafe {
img.overlay_at(&i, scale * x as u32, scale * y as u32);
},