mindustry logic execution, map- and schematic- parsing and rendering
| -rw-r--r-- | mindus/src/data/map.rs | 124 | ||||
| -rw-r--r-- | mindus/src/data/renderer.rs | 31 |
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); }, |