aboutsummaryrefslogtreecommitdiff
path: root/light-client/tools/src/bin/tex_pack.rs
diff options
context:
space:
mode:
Diffstat (limited to 'light-client/tools/src/bin/tex_pack.rs')
-rw-r--r--light-client/tools/src/bin/tex_pack.rs77
1 files changed, 77 insertions, 0 deletions
diff --git a/light-client/tools/src/bin/tex_pack.rs b/light-client/tools/src/bin/tex_pack.rs
new file mode 100644
index 00000000..23056608
--- /dev/null
+++ b/light-client/tools/src/bin/tex_pack.rs
@@ -0,0 +1,77 @@
+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();
+
+ for path in inputs {
+ let file = BufReader::new(File::open(&path).unwrap());
+ let tex = file.lines().map(Result::unwrap).collect::<Vec<String>>();
+ let (width, height) = (tex[0].len(), tex.len());
+
+ 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(atlas_size);
+ let texcoord = [cursor_x, cursor_y];
+
+ 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,
+ path.file_stem().unwrap().to_str().unwrap().to_string(),
+ ));
+
+ cursor_x += atlas_size;
+ }
+
+ 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], name) in metadata {
+ writeln!(atlas_meta_out, "{x},{y},{name}").unwrap();
+ }
+}