summaryrefslogtreecommitdiff
path: root/pixel-client/tools/src/bin/tex_pack.rs
diff options
context:
space:
mode:
Diffstat (limited to 'pixel-client/tools/src/bin/tex_pack.rs')
-rw-r--r--pixel-client/tools/src/bin/tex_pack.rs95
1 files changed, 95 insertions, 0 deletions
diff --git a/pixel-client/tools/src/bin/tex_pack.rs b/pixel-client/tools/src/bin/tex_pack.rs
new file mode 100644
index 00000000..5022d561
--- /dev/null
+++ b/pixel-client/tools/src/bin/tex_pack.rs
@@ -0,0 +1,95 @@
+/*
+ Hurry Curry! - a game about cooking
+ Copyright 2024 metamuffin
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, version 3 of the License only.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+*/
+use clap::Parser;
+use std::{
+ fs::File,
+ io::{BufRead, BufReader, BufWriter, Write},
+ path::PathBuf,
+};
+
+#[derive(Parser)]
+struct Args {
+ atlas_out: PathBuf,
+ atlas_meta_out: PathBuf,
+ inputs: Vec<PathBuf>,
+}
+
+fn main() {
+ let Args {
+ inputs,
+ atlas_meta_out,
+ atlas_out,
+ } = Args::parse();
+
+ let atlas_size = 1024;
+
+ let mut cursor_x = 0;
+ let mut cursor_y = 0;
+ let mut row_height = 0;
+
+ let mut texels = vec![vec![' '; atlas_size]; atlas_size];
+ let mut metadata = Vec::new();
+
+ println!(" savepack {atlas_out:?}");
+ for path in inputs {
+ let file = BufReader::new(File::open(&path).unwrap());
+ let tex = file.lines().map(Result::unwrap).collect::<Vec<String>>();
+ let name = path.file_stem().unwrap().to_str().unwrap().to_string();
+ let (width, height) = (tex[0].chars().count(), tex.len());
+
+ println!(" + {width}x{height} {name}");
+
+ if cursor_x + width > atlas_size {
+ cursor_y += row_height;
+ row_height = 0;
+ cursor_x = 0;
+ }
+ if cursor_y + height > atlas_size {
+ panic!("texture too big or atlas full");
+ }
+ row_height = row_height.max(height);
+ let texcoord = [cursor_x, cursor_y, width, height];
+
+ for (y, line) in tex.iter().enumerate() {
+ if line.is_empty() {
+ continue;
+ }
+ for (x, char) in line.chars().enumerate() {
+ texels[cursor_y + y][cursor_x + x] = char;
+ }
+ }
+
+ metadata.push((texcoord, name));
+
+ cursor_x += width;
+ }
+
+ let mut atlas_out = BufWriter::new(File::create(atlas_out).unwrap());
+ let mut atlas_meta_out = BufWriter::new(File::create(atlas_meta_out).unwrap());
+
+ for line in texels {
+ for char in line {
+ write!(atlas_out, "{char}").unwrap()
+ }
+ writeln!(atlas_out).unwrap();
+ }
+
+ for ([x, y, w, h], name) in metadata {
+ writeln!(atlas_meta_out, "{x},{y},{w},{h},{name}").unwrap();
+ }
+}