From f0cfe7cb8a13c134c34519bd6df654c691d49e85 Mon Sep 17 00:00:00 2001 From: Piotr Siuszko Date: Tue, 7 Jan 2025 13:46:06 +0100 Subject: [PATCH] Start work on real version --- .github/workflows/rust.yml | 27 ++++----- output.png | Bin 0 -> 31844 bytes src/app.rs | 110 +++++++++++++++++++++++++------------ 3 files changed, 85 insertions(+), 52 deletions(-) create mode 100644 output.png diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index ad18598..f54d231 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -3,19 +3,18 @@ on: [push, pull_request] name: CI env: - # This is required to enable the web_sys clipboard API which egui_web uses + # --cfg=web_sys_unstable_apis is required to enable the web_sys clipboard API which egui_web uses # https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html # https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html - RUSTFLAGS: --cfg=web_sys_unstable_apis + RUSTFLAGS: -D warnings --cfg=web_sys_unstable_apis + RUSTDOCFLAGS: -D warnings jobs: check: name: Check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: "[Ubuntu] install dependencies" - run: sudo apt update && sudo apt install libgtk-3-dev + - uses: actions/checkout@v4 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -30,7 +29,7 @@ jobs: name: Check wasm32 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -46,9 +45,7 @@ jobs: name: Test Suite runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: "[Ubuntu] install dependencies" - run: sudo apt update && sudo apt install libgtk-3-dev + - uses: actions/checkout@v4 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -64,7 +61,7 @@ jobs: name: Rustfmt runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -80,9 +77,7 @@ jobs: name: Clippy runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: "[Ubuntu] install dependencies" - run: sudo apt update && sudo apt install libgtk-3-dev + - uses: actions/checkout@v4 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -98,13 +93,11 @@ jobs: name: trunk runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: "[Ubuntu] install dependencies" - run: sudo apt update && sudo apt install libgtk-3-dev + - uses: actions/checkout@v4 - uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.72.0 + toolchain: 1.81.0 target: wasm32-unknown-unknown override: true - name: Download and install Trunk binary diff --git a/output.png b/output.png new file mode 100644 index 0000000000000000000000000000000000000000..91a5637da9b20d94995c597feb9b6e2413d2614b GIT binary patch literal 31844 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 literal 0 HcmV?d00001 diff --git a/src/app.rs b/src/app.rs index 68fc287..31e80f3 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,7 +2,6 @@ use std::{collections::HashMap, io::Cursor}; use egui::{CollapsingHeader, Color32, DroppedFile, FontFamily, FontId, Image, RichText, Vec2}; use image::DynamicImage; - use serde_json::Value; use texture_packer::{importer::ImageImporter, TexturePacker, TexturePackerConfig}; pub const MY_ACCENT_COLOR32: Color32 = Color32::from_rgb(230, 102, 1); @@ -11,11 +10,24 @@ pub const HEADER_HEIGHT: f32 = 45.0; pub const TOP_BUTTON_WIDTH: f32 = 150.0; pub const GIT_HASH: &str = env!("GIT_HASH"); +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct AtlasFrame { + pub key: String, + pub frame: SerializableRect, +} + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct AtlasAsset { + pub size: [u32; 2], + pub name: String, + pub frames: Vec, +} + #[derive(Clone)] pub struct Spritesheet { pub data: Vec, pub frames: HashMap>, - pub frames_json: Value, + pub atlas_asset_json: Value, pub size: (u32, u32), } @@ -90,11 +102,6 @@ impl From for SerializableRect { #[derive(serde::Deserialize, serde::Serialize)] #[serde(default)] // if we add new fields, give them default values when deserializing old state pub struct TemplateApp { - // Example stuff: - label: String, - - #[serde(skip)] // This how you opt-out of serialization of a field - value: f32, #[serde(skip)] dropped_files: Vec, #[serde(skip)] @@ -113,9 +120,6 @@ pub struct TemplateApp { impl Default for TemplateApp { fn default() -> Self { Self { - // Example stuff: - label: "Hello World!".to_owned(), - value: 2.7, dropped_files: vec![], config: TexturePackerConfig { max_width: 512, @@ -149,12 +153,38 @@ impl TemplateApp { Default::default() } + fn get_common_prefix(paths: &[DroppedFile]) -> String { + if paths.is_empty() { + return String::new(); + } + let mut prefix = file_path(&paths[0]); + + for s in paths.iter().skip(1) { + let s = file_path(s); + while !s.starts_with(&prefix) { + prefix.pop(); // Remove the last character of the prefix + if prefix.is_empty() { + return String::new(); + } + } + } + + prefix + } + fn build_atlas(&mut self, ctx: &egui::Context) { self.error = None; let mut packer = TexturePacker::new_skyline(self.config); - + let prefix = Self::get_common_prefix(&self.dropped_files); + println!("Prefix: {}", prefix); for file in &self.dropped_files { - let id = id_for_file(file); + let base_id = file_path(file); + let id = base_id + .strip_prefix(&prefix) + .unwrap_or(&base_id) + .to_owned() + .replace("\\", "/"); + println!("Base id: {}, ID: {}", &base_id, &id); let texture = dynamic_image_from_file(file); let can_pack = packer.can_pack(&texture); @@ -178,19 +208,33 @@ impl TemplateApp { img.write_to(&mut Cursor::new(&mut out_vec), image::ImageFormat::Png) .unwrap(); + let atlas = AtlasAsset { + size: [img.width(), img.height()], + name: "Atlas".to_owned(), + frames: packer + .get_frames() + .values() + .map(|v| -> AtlasFrame { + AtlasFrame { + key: v.key.clone(), + frame: SerializableRect { + x: v.frame.x, + y: v.frame.y, + w: v.frame.w, + h: v.frame.h, + }, + } + }) + .collect(), + }; + let frames_string = serde_json::to_string_pretty(&atlas).unwrap(); - let frames_info: Vec = packer - .get_frames() - .values() - .map(|v| -> SerializableFrame { (*v).clone().into() }) - .collect(); - let frames_string = serde_json::to_string_pretty(&frames_info).unwrap(); - let frames_json = serde_json::from_str(&frames_string).unwrap(); + let atlas_asset_json = serde_json::from_str(&frames_string).unwrap(); self.data = Some(Spritesheet { data: out_vec.clone(), frames: packer.get_frames().clone(), size: (img.width(), img.height()), - frames_json, + atlas_asset_json, }); let id = format!("bytes://output_{}.png", self.counter); self.image = None; @@ -343,9 +387,15 @@ impl eframe::App for TemplateApp { }); ctx.input(|i| { if !i.raw.dropped_files.is_empty() { - self.dropped_files = i.raw.dropped_files.clone(); + let mut extra = i.raw.dropped_files.clone(); + self.dropped_files.append(&mut extra); } }); + egui::TopBottomPanel::bottom("bottom_panel") + .frame(egui::Frame::canvas(&ctx.style())) + .show(ctx, |ui| { + powered_by_egui_and_eframe(ui); + }); egui::CentralPanel::default().show(ctx, |ui| { if let Some(error) = &self.error { @@ -390,12 +440,12 @@ impl eframe::App for TemplateApp { ui.label(format!("{} frames, size: {}x{}",data.frames.len(),data.size.0,data.size.1)); }); ui.label(RichText::new("Frames JSON").strong()); - egui_json_tree::JsonTree::new("simple-tree", &data.frames_json).show(ui); + egui_json_tree::JsonTree::new("simple-tree", &data.atlas_asset_json).show(ui); if ui .add(egui::Button::new("Copy JSON to Clipboard")) .clicked() { - ui.output_mut(|o| o.copied_text = data.frames_json.to_string()); + ui.output_mut(|o| o.copied_text = data.atlas_asset_json.to_string()); }; } ui.separator(); @@ -439,25 +489,15 @@ impl eframe::App for TemplateApp { }); } }); - egui::TopBottomPanel::bottom("bottom_panel") - .frame(egui::Frame::canvas(&ctx.style())) - .show(ctx, |ui| { - powered_by_egui_and_eframe(ui); - }); } } -fn id_for_file(file: &DroppedFile) -> String { +fn file_path(file: &DroppedFile) -> String { let id; #[cfg(not(target_arch = "wasm32"))] { let path = file.path.as_ref().unwrap().clone(); - id = path - .file_name() - .unwrap() - .to_os_string() - .into_string() - .unwrap(); + id = path.to_str().unwrap().to_owned(); } #[cfg(target_arch = "wasm32")] {