diff --git a/Cargo.lock b/Cargo.lock index 4a2131d..a8d58e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -192,7 +192,7 @@ dependencies = [ [[package]] name = "gd-icon-renderer" -version = "1.0.1" +version = "1.0.2" dependencies = [ "image", "imageproc", diff --git a/Cargo.toml b/Cargo.toml index 9e286ae..8ddccef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "gd-icon-renderer" description = "A tool to render Geometry Dash icons." -version = "1.0.1" +version = "1.0.2" edition = "2021" license-file = "LICENSE" repository = "https://git.reidlab.online/reidlab/gd-icon-renderer" diff --git a/readme.md b/readme.md index 4e9581c..9792140 100644 --- a/readme.md +++ b/readme.md @@ -42,6 +42,7 @@ Provide your `GJ_GameSheet02-uhd`, `GJ_GameSheetGlow-uhd`, `Robot_AnimDesc2`, an ## Todo - Add examples to the repo. -- Swap to a custom `plist` parser. Current one is **SLOW**. +- Swap to a custom `plist` parser. Current one is kinda slow. +- Stop the fucking cloning. Majority of speed lost from cloning is @ [`./src/renderer.rs:178`](./src/renderer.rs) - Trim extra alpha space on the final result. - I think theres some weird shifting and offsets going on, please investigate 🥺. Really big on `spider_16` for some reason?? Related issue on the inspired project [here](https://github.com/oatmealine/gd-icon-renderer/issues/2). \ No newline at end of file diff --git a/src/assets.rs b/src/assets.rs index e3b814a..fc78488 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -198,7 +198,7 @@ pub fn load_animations(path: &str) -> Animations { pub fn get_sprite(spritesheet: Spritesheet, img: DynamicImage, key: String) -> Option<(DynamicImage, Sprite)> { let sprite = spritesheet.sprites.get(&key); - let mut canvas = img.clone(); + let mut canvas = img; if sprite.is_none() { return None; @@ -226,7 +226,7 @@ pub fn get_sprite(spritesheet: Spritesheet, img: DynamicImage, key: String) -> O /// Trims out a sprite from an image according to a LoadedSpritesheet object. pub fn get_sprite_from_loaded(spritesheet: LoadedSpritesheet, key: String) -> Option<(DynamicImage, Sprite)> { - let texture = spritesheet.texture.clone(); - let sprite = get_sprite(spritesheet.spritesheet.clone(), texture, key); + let texture = spritesheet.texture; + let sprite = get_sprite(spritesheet.spritesheet, texture, key); return sprite; } \ No newline at end of file diff --git a/src/renderer.rs b/src/renderer.rs index 6b26c78..4eb8139 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -107,7 +107,7 @@ pub fn render_layered(images: Vec, positions: Vec, (f32, f32), (f32, f32), f64, bool, Option<[f32; 3]>)> = Vec::new(); - names.iter().enumerate().map(|(i, v)| - ( - assets::get_sprite_from_loaded(game_sheet_02.to_owned().clone(), v.clone()), - a.position, - flip(a.scale, a.flipped), - a.rotation, - glow && i == names.len() - 1, - colors[i] - ) - ).collect::, (f32, f32), (f32, f32), f64, bool, Option<[f32; 3]>)>>() - }) - .flatten() - .collect::, (f32, f32), (f32, f32), f64, bool, Option<[f32; 3]>)>>(); + for a in anim { + let texture_name = a.texture.replace("spider_01", &basename).replace("robot_01", &basename); + let mut names = vec![ + texture_name.replace("_001.png", "_2_001.png"), + texture_name.replace("_001.png", "_3_001.png"), + texture_name.clone(), + texture_name.replace("_001.png", "_extra_001.png") + ]; + let mut colors = vec![ + Some(col2), + None, + Some(col1), + None + ]; + + if glow { + names.push(texture_name.replace("_001.png", "_glow_001.png")); + colors.push(Some(glow_col)); + } + + layers.extend(names.iter().enumerate().map(|(i, v)| { + ( + assets::get_sprite_from_loaded(game_sheet_02.clone(), v.clone()), + a.position, + flip(a.scale, a.flipped), + a.rotation, + glow && i == names.len() - 1, + colors[i] + ) + })) + } // put glow b4 everything else layers.sort_by_key(|t| if t.4 { 0 } else { 1 });