mindustry logic execution, map- and schematic- parsing and rendering
add feature to disable map / schem shadows
| -rw-r--r-- | Cargo.toml | 34 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | src/data/map.rs | 6 | ||||
| -rw-r--r-- | src/data/renderer.rs | 8 | ||||
| -rw-r--r-- | src/utils/image.rs | 10 |
5 files changed, 35 insertions, 25 deletions
@@ -1,6 +1,6 @@ [package] name = "mindus" -version = "1.4.1" +version = "1.4.2" edition = "2021" description = "A library for working with mindustry data formats (eg schematics and maps) (fork of plandustry)" authors = [ @@ -11,23 +11,27 @@ repository = "https://github.com/bend-n/mindus.git" license = "GPL-3.0" exclude = [".github/", "items.py"] - [dependencies] flate2 = { version = "1.0", features = ["zlib"], default-features = false } -base64 = "0.21.2" -paste = "1.0.12" +base64 = "0.21" +paste = "1.0" strconv = "0.1" -image = { version = "0.24.6", features = ["png"], default-features = false } -const-str = "0.5.5" -color-hex = "0.2.0" -zip = { version = "0.6.6", features = ["zstd"], default-features = false } -tinyrand = "0.5.0" -tinyrand-std = "0.5.0" -dashmap = "5.4.0" -fast_image_resize = "2.7.3" -thiserror = "1.0.41" -bobbin-bits = "0.1.1" -blurslice = "0.1.0" +image = { version = "0.24", features = ["png"], default-features = false } +const-str = "0.5" +color-hex = "0.2" +zip = { version = "0.6", features = ["zstd"], default-features = false } +tinyrand = "0.5" +tinyrand-std = "0.5" +dashmap = "5.4" +fast_image_resize = "2.7" +thiserror = "1.0" +bobbin-bits = "0.1" +blurslice = { version = "0.1", optional = true } + +[features] +schem_shadow = ["dep:blurslice"] +map_shadow = ["dep:blurslice"] +default = ["schem_shadow", "map_shadow"] [build-dependencies] zip = { version = "0.6.6", features = ["zstd"], default-features = false } @@ -8,7 +8,7 @@ use mindus::*; let reg = build_registry(); let mut ss = SchematicSerializer(®); let s = ss.deserialize_base64("bXNjaAF4nD3SQW6DMBBA0bE94wF104vkDr1H1QVtWUQioTL0/oFJ/Fl9GXiy5ZFBhiJ6n26zvE9tv7T1f5/bZbtNyyJvv/P2065/+3W9i0hdpu952SR/fiWp29qOL4/lDzkfExkiEpWPGqMKpZRRlT/8VQkv4aXwnlUopYw6vRTVvRzeGJVYy1ShlDKqezk8O8+DV/AKXgkvRSllvK2sdU/xFE/xFE/xFE/xNLzxeRlU9wzPOK9xXsMzPMOr3EcNL0VlqlBKGVWpfh+O5+zPmRdnXpx5cebFmRd/eQ9KIReL")?; -let output = Renderer::render(&s); +let output = s.render(); output.save("output.png"); ``` diff --git a/src/data/map.rs b/src/data/map.rs index 04938d8..20b5a23 100644 --- a/src/data/map.rs +++ b/src/data/map.rs @@ -578,13 +578,11 @@ impl<'l> Serializer<Map<'l>> for MapSerializer<'l> { if central { let mut output = [0u8; 2]; output.copy_from_slice(&buff.data[..2]); - let n = u16::from_be_bytes(output) as usize; let _ = buff.read_chunk(false, |buff| { #[cfg(debug_assertions)] println!( - "reading {:?} {:?}", - map[i].build.as_ref().unwrap(), - &buff.data[1..n] + "reading {:?}", + map[i].build.as_ref().unwrap() ); let _ = buff.read_i8()?; diff --git a/src/data/renderer.rs b/src/data/renderer.rs index 06b2cc5..f020e5f 100644 --- a/src/data/renderer.rs +++ b/src/data/renderer.rs @@ -219,7 +219,9 @@ impl Renderable for Schematic<'_> { } #[cfg(debug_assertions)] println!("finishing up"); - image::imageops::overlay(&mut bg, canvas.shadow(), 0, 0); + #[cfg(feature = "schem_shadow")] + canvas.shadow(); + image::imageops::overlay(&mut bg, &canvas, 0, 0); bg } } @@ -282,7 +284,9 @@ impl Renderable for Map<'_> { ); } } - image::imageops::overlay(&mut floor, top.shadow(), 0, 0); + #[cfg(feature = "map_shadow")] + top.shadow(); + image::imageops::overlay(&mut floor, &top, 0, 0); floor } } diff --git a/src/utils/image.rs b/src/utils/image.rs index d120209..85a8266 100644 --- a/src/utils/image.rs +++ b/src/utils/image.rs @@ -1,6 +1,5 @@ -use blurslice::gaussian_blur_bytes; use fast_image_resize as fr; -use image::{GenericImageView, Rgb, Rgba, RgbaImage}; +use image::{Rgb, Rgba, RgbaImage}; use std::num::NonZeroU32; pub trait ImageUtils { @@ -13,8 +12,10 @@ pub trait ImageUtils { /// rotate fn rotate(&mut self, times: u8) -> &mut Self; /// shadow + #[cfg(any(feature = "map_shadow", feature = "schem_shadow"))] fn shadow(&mut self) -> &mut Self; /// silhouette + #[cfg(any(feature = "map_shadow", feature = "schem_shadow"))] fn silhouette(&mut self) -> &mut Self; /// scale a image /// @@ -88,6 +89,7 @@ impl ImageUtils for RgbaImage { RgbaImage::from_raw(to.get(), to.get(), dst.into_vec()).unwrap() } + #[cfg(any(feature = "map_shadow", feature = "schem_shadow"))] fn silhouette(&mut self) -> &mut Self { for pixel in self.pixels_mut() { if pixel[3] < 128 { @@ -99,11 +101,12 @@ impl ImageUtils for RgbaImage { self } + #[cfg(any(feature = "map_shadow", feature = "schem_shadow"))] fn shadow(&mut self) -> &mut Self { let mut shadow = self.clone(); shadow.silhouette(); let samples = shadow.as_flat_samples_mut(); - gaussian_blur_bytes::<4>( + blurslice::gaussian_blur_bytes::<4>( samples.samples, self.width() as usize, self.height() as usize, @@ -114,6 +117,7 @@ impl ImageUtils for RgbaImage { for y in 0..shadow.height() { let Rgba([r, g, b, a]) = self.get_pixel_mut(x, y); if *a == 0 { + use image::GenericImageView; // SAFETY: yes let p = unsafe { shadow.unsafe_get_pixel(x, y) }; *r = p[0]; |