remove extra clone

This commit is contained in:
Reid 2023-10-09 16:36:41 -07:00
parent 6b7683a143
commit 52f7164aa0
Signed by: reidlab
GPG key ID: 6C9EAA3364F962C8
5 changed files with 43 additions and 40 deletions

2
Cargo.lock generated
View file

@ -192,7 +192,7 @@ dependencies = [
[[package]] [[package]]
name = "gd-icon-renderer" name = "gd-icon-renderer"
version = "1.0.1" version = "1.0.2"
dependencies = [ dependencies = [
"image", "image",
"imageproc", "imageproc",

View file

@ -1,7 +1,7 @@
[package] [package]
name = "gd-icon-renderer" name = "gd-icon-renderer"
description = "A tool to render Geometry Dash icons." description = "A tool to render Geometry Dash icons."
version = "1.0.1" version = "1.0.2"
edition = "2021" edition = "2021"
license-file = "LICENSE" license-file = "LICENSE"
repository = "https://git.reidlab.online/reidlab/gd-icon-renderer" repository = "https://git.reidlab.online/reidlab/gd-icon-renderer"

View file

@ -42,6 +42,7 @@ Provide your `GJ_GameSheet02-uhd`, `GJ_GameSheetGlow-uhd`, `Robot_AnimDesc2`, an
## Todo ## Todo
- Add examples to the repo. - 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. - 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). - 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).

View file

@ -198,7 +198,7 @@ pub fn load_animations(path: &str) -> Animations {
pub fn get_sprite(spritesheet: Spritesheet, img: DynamicImage, key: String) -> Option<(DynamicImage, Sprite)> { pub fn get_sprite(spritesheet: Spritesheet, img: DynamicImage, key: String) -> Option<(DynamicImage, Sprite)> {
let sprite = spritesheet.sprites.get(&key); let sprite = spritesheet.sprites.get(&key);
let mut canvas = img.clone(); let mut canvas = img;
if sprite.is_none() { if sprite.is_none() {
return 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. /// 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)> { pub fn get_sprite_from_loaded(spritesheet: LoadedSpritesheet, key: String) -> Option<(DynamicImage, Sprite)> {
let texture = spritesheet.texture.clone(); let texture = spritesheet.texture;
let sprite = get_sprite(spritesheet.spritesheet.clone(), texture, key); let sprite = get_sprite(spritesheet.spritesheet, texture, key);
return sprite; return sprite;
} }

View file

@ -107,7 +107,7 @@ pub fn render_layered(images: Vec<DynamicImage>, positions: Vec<Option<(f32, f32
(bounding_box.0 as f32 / 2.0 + positions[0].0 as f32 - sizes[0].0 as f32 / 2.0) as u32, (bounding_box.0 as f32 / 2.0 + positions[0].0 as f32 - sizes[0].0 as f32 / 2.0) as u32,
(bounding_box.1 as f32 / 2.0 + positions[0].1 as f32 - sizes[0].1 as f32 / 2.0) as u32 (bounding_box.1 as f32 / 2.0 + positions[0].1 as f32 - sizes[0].1 as f32 / 2.0) as u32
).expect("couldnt copy from img"); ).expect("couldnt copy from img");
// stacking // stacking
for (i, image) in transformed.iter().enumerate().skip(1) { for (i, image) in transformed.iter().enumerate().skip(1) {
let x = (bounding_box.0 as f32 / 2.0 + positions[i].0 as f32 - image.width() as f32 / 2.0) as i64; let x = (bounding_box.0 as f32 / 2.0 + positions[i].0 as f32 - image.width() as f32 / 2.0) as i64;
@ -175,41 +175,43 @@ pub fn render_zany(basename: String, col1: [f32; 3], col2: [f32; 3], glow: bool,
let mut anim = animations.get("Robot_idle_001.png").unwrap_or_else(|| animations.get("Spider_idle_001.png").expect("no animations found")).clone(); let mut anim = animations.get("Robot_idle_001.png").unwrap_or_else(|| animations.get("Spider_idle_001.png").expect("no animations found")).clone();
anim.sort_by_key(|spr| spr.z); anim.sort_by_key(|spr| spr.z);
let mut layers = anim // TODO: this is a bit of a mess
.iter() // TODO: this is also very slow, but i dont think it can be helped
.map(|a| { // TODO: im not good at memory management so srry
let texture_name = a.texture.clone().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 { let mut layers: Vec<(Option<(DynamicImage, Sprite)>, (f32, f32), (f32, f32), f64, bool, Option<[f32; 3]>)> = Vec::new();
names.push(texture_name.replace("_001.png", "_glow_001.png"));
colors.push(Some(glow_col));
}
names.iter().enumerate().map(|(i, v)| for a in anim {
( let texture_name = a.texture.replace("spider_01", &basename).replace("robot_01", &basename);
assets::get_sprite_from_loaded(game_sheet_02.to_owned().clone(), v.clone()), let mut names = vec![
a.position, texture_name.replace("_001.png", "_2_001.png"),
flip(a.scale, a.flipped), texture_name.replace("_001.png", "_3_001.png"),
a.rotation, texture_name.clone(),
glow && i == names.len() - 1, texture_name.replace("_001.png", "_extra_001.png")
colors[i] ];
) let mut colors = vec![
).collect::<Vec<(Option<(DynamicImage, Sprite)>, (f32, f32), (f32, f32), f64, bool, Option<[f32; 3]>)>>() Some(col2),
}) None,
.flatten() Some(col1),
.collect::<Vec<(Option<(DynamicImage, Sprite)>, (f32, f32), (f32, f32), f64, bool, Option<[f32; 3]>)>>(); 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 // put glow b4 everything else
layers.sort_by_key(|t| if t.4 { 0 } else { 1 }); layers.sort_by_key(|t| if t.4 { 0 } else { 1 });