mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/data/renderer.rs')
-rw-r--r--src/data/renderer.rs98
1 files changed, 58 insertions, 40 deletions
diff --git a/src/data/renderer.rs b/src/data/renderer.rs
index 2ae8ac8..c06fb44 100644
--- a/src/data/renderer.rs
+++ b/src/data/renderer.rs
@@ -1,5 +1,7 @@
//! schematic drawing
pub(crate) use super::autotile::*;
+use super::schematic::Schematic;
+use super::GridPos;
use crate::block::environment::METAL_FLOOR;
use crate::block::Rotation;
pub(crate) use crate::utils::{ImageUtils, Overlay, Repeat};
@@ -9,27 +11,9 @@ pub(crate) use image::{
};
pub(crate) use std::borrow::{Borrow, BorrowMut};
use std::ops::{Deref, DerefMut};
-use std::sync::LazyLock;
-
-use super::schematic::Schematic;
-use super::GridPos;
-
-macro_rules! r {
- ($v:expr) => {{
- static TMP: LazyLock<RgbaImage> = LazyLock::new(|| $v);
- &TMP
- }};
-}
-
-type Images = phf::Map<&'static str, &'static LazyLock<RgbaImage>>;
-static EMPTY_FULL: LazyLock<RgbaImage> = LazyLock::new(|| RgbaImage::new(32, 32));
-static EMPTY_QUAR: LazyLock<RgbaImage> = LazyLock::new(|| RgbaImage::new(8, 8));
-static EMPTY_EIGH: LazyLock<RgbaImage> = LazyLock::new(|| RgbaImage::new(4, 4));
-
-static FULL: Images = include!(concat!(env!("OUT_DIR"), "/full.rs"));
-// static HALF: Images = include!(concat!(env!("OUT_DIR"), "/half.rs"));
-static QUAR: Images = include!(concat!(env!("OUT_DIR"), "/quar.rs"));
-static EIGH: Images = include!(concat!(env!("OUT_DIR"), "/eigh.rs"));
+include!(concat!(env!("OUT_DIR"), "/full.rs"));
+include!(concat!(env!("OUT_DIR"), "/quar.rs"));
+include!(concat!(env!("OUT_DIR"), "/eigh.rs"));
pub enum ImageHolder {
Borrow(&'static RgbaImage),
@@ -101,6 +85,7 @@ impl From<RgbaImage> for ImageHolder {
}
#[derive(Debug, Copy, Clone)]
+#[repr(u8)]
pub enum Scale {
Full,
// Half,
@@ -125,22 +110,57 @@ impl std::ops::Mul<u32> for Scale {
}
}
-pub(crate) fn try_load(name: &str, scale: Scale) -> Option<&'static RgbaImage> {
- match scale {
- Scale::Quarter => QUAR.get(name).map(|v| LazyLock::force(v)),
- Scale::Eigth => EIGH.get(name).map(|v| LazyLock::force(v)),
- Scale::Full => FULL.get(name).map(|v| LazyLock::force(v)),
- // Scale::Half => HALF.get(&name).map(|v| LazyLock::force(v)),
- }
-}
-
-#[track_caller]
-pub(crate) fn load(name: &str, scale: Scale) -> ImageHolder {
- let Some(i) = try_load(name, scale) else {
- panic!("failed to load {name}")
+#[macro_export]
+macro_rules! load {
+ ($name:literal, $scale:ident) => { paste::paste! {
+ ImageHolder::from(std::sync::LazyLock::force(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) => { paste::paste! {
+ [crate::data::renderer::full::[<$name:snake:upper>], crate::data::renderer::quar::[<$name:snake:upper>], crate::data::renderer::eigh::[<$name:snake:upper>]]
+ } };
+ (from $v:ident which is [$($k:literal $(|)?)+], $scale: ident) => {
+ crate::data::renderer::load!($scale -> match $v {
+ $($k => $k,)+
+ })
+ };
+ // turn load!(s -> match x { "v" => "y" }) into match x { "v" => load!("y", s) }
+ ($scale:ident -> match $v:ident { $($k:pat => $nam:literal $(,)?)+ }) => {
+ match $v {
+ $($k => crate::data::renderer::load!($nam, $scale),)+
+ #[allow(unreachable_patterns)]
+ n => unreachable!("{n:?}"),
+ }
};
- ImageHolder::from(i)
+ (concat $x:expr => $v:ident which is [$($k:literal $(|)?)+], $scale: ident) => { paste::paste! {
+ match $v {
+ $($k =>
+ ImageHolder::from(std::sync::LazyLock::force(match $scale {
+ crate::data::renderer::Scale::Quarter => crate::data::renderer::quar::[<$k:snake:upper _ $x:snake:upper>],
+ crate::data::renderer::Scale::Eigth => crate::data::renderer::eigh::[<$k:snake:upper _ $x:snake:upper>],
+ crate::data::renderer::Scale::Full => crate::data::renderer::full::[<$k:snake:upper _ $x:snake:upper>],
+ })),
+ )+
+ #[allow(unreachable_patterns)]
+ n => unreachable!("{n:?}"),
+ }
+ } };
+ // (concat $x:expr, to $v:ident which is [$($k:literal $(|)?)+], $scale: ident) => { paste::paste! {
+ // match $v {
+ // $($k =>
+ // ImageHolder::from(**match $scale {
+ // crate::data::renderer::Scale::Quarter => crate::data::renderer::quar::[<$k:snake:upper $x:snake:upper>],
+ // crate::data::renderer::Scale::Eigth => crate::data::renderer::eigh::[<$k:snake:upper $x:snake:upper>],
+ // crate::data::renderer::Scale::Full => crate::data::renderer::full::[<$k:snake:upper $x:snake:upper>],
+ // }),
+ // )+
+ // }
+ // } }
}
+pub(crate) use load;
/// trait for renderable objects
pub trait Renderable {
@@ -278,11 +298,9 @@ impl Renderable for Map<'_> {
/// Loads all the images into memory (about 300mb)
pub fn warmup() {
- for map in [&FULL, &QUAR, &EIGH] {
- for val in map.values() {
- LazyLock::force(val);
- }
- }
+ full::warmup();
+ quar::warmup();
+ eigh::warmup();
}
#[test]