aboutsummaryrefslogtreecommitdiff
path: root/light-client/tools/src/bin
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-07-15 20:49:45 +0200
committermetamuffin <metamuffin@disroot.org>2024-07-15 20:49:45 +0200
commit53bd35b77a1240bc0d571d1e7cff3591ca6fde9a (patch)
tree49646c59e3786436655b809c09d113e6124eaa63 /light-client/tools/src/bin
parentc82a2bf203f3495865fd40527fa41a9e32f7aa9c (diff)
downloadhurrycurry-53bd35b77a1240bc0d571d1e7cff3591ca6fde9a.tar
hurrycurry-53bd35b77a1240bc0d571d1e7cff3591ca6fde9a.tar.bz2
hurrycurry-53bd35b77a1240bc0d571d1e7cff3591ca6fde9a.tar.zst
texture compose system
Diffstat (limited to 'light-client/tools/src/bin')
-rw-r--r--light-client/tools/src/bin/tex_compose.rs138
-rw-r--r--light-client/tools/src/bin/tex_export.rs2
-rw-r--r--light-client/tools/src/bin/tex_import.rs2
-rw-r--r--light-client/tools/src/bin/tex_pack.rs3
4 files changed, 142 insertions, 3 deletions
diff --git a/light-client/tools/src/bin/tex_compose.rs b/light-client/tools/src/bin/tex_compose.rs
new file mode 100644
index 00000000..77e69c45
--- /dev/null
+++ b/light-client/tools/src/bin/tex_compose.rs
@@ -0,0 +1,138 @@
+/*
+ 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::{
+ collections::HashMap,
+ fs::{read_to_string, File},
+ io::{BufRead, BufReader, BufWriter, Write},
+ path::PathBuf,
+};
+
+#[derive(Parser)]
+struct Args {
+ catalogue: PathBuf,
+ texture_dir: PathBuf,
+ output_dir: PathBuf,
+}
+
+fn main() {
+ let Args {
+ catalogue,
+ texture_dir,
+ output_dir,
+ } = Args::parse();
+
+ for line in read_to_string(catalogue).unwrap().lines() {
+ let (line, _) = line.split_once(";").unwrap_or((line, ""));
+ let line = line.trim();
+ if line.is_empty() {
+ continue;
+ }
+
+ let (name, rest) = line.split_once("=").unwrap();
+ let (connects, rest) = rest.split_once(":").unwrap_or(("", rest));
+ eprintln!(" compose {name:?} ({connects})");
+
+ let mut texels = HashMap::new();
+
+ for part in rest.split(",") {
+ let mut mods = part.split("~");
+ let texname = mods.next().unwrap();
+
+ let mut hflip = false;
+ let mut vflip = true;
+ let mut xoff = 0;
+ let mut yoff = 0;
+
+ for m in mods {
+ if m == "hflip" {
+ hflip = !hflip
+ }
+ if m == "vflip" {
+ vflip = !vflip
+ }
+ if let Some(m) = m.strip_prefix("x") {
+ xoff += m.parse::<i32>().unwrap();
+ }
+ if let Some(m) = m.strip_prefix("y") {
+ yoff += m.parse::<i32>().unwrap();
+ }
+ }
+
+ let texpath = texture_dir.join(texname).with_extension("ta");
+ eprintln!(" + {texpath:?}");
+ let file = BufReader::new(File::open(&texpath).unwrap());
+ let tex = file.lines().map(Result::unwrap).collect::<Vec<String>>();
+ let (width, height) = (tex[0].chars().count(), tex.len());
+
+ for (mut y, line) in tex.iter().enumerate() {
+ if line.is_empty() {
+ continue;
+ }
+ if vflip {
+ y = height - y - 1
+ }
+ for (mut x, char) in line.chars().enumerate() {
+ if hflip {
+ x = width - x - 1
+ }
+ let e = texels
+ .entry((x as i32 + xoff, y as i32 + yoff))
+ .or_insert(' ');
+ if char != ' ' {
+ *e = char
+ }
+ }
+ }
+ }
+
+ let mut min_x = 0;
+ let mut min_y = 0;
+ let mut max_x = 0;
+ let mut max_y = 0;
+ for (x, y) in texels.keys() {
+ min_x = min_x.min(*x);
+ min_y = min_y.min(*y);
+ max_x = max_x.max(*x);
+ max_y = max_y.max(*y);
+ }
+
+ let width = max_x - min_x;
+ let height = max_y - min_y;
+
+ let mut name = name.to_string();
+ if !connects.is_empty() {
+ name += "+";
+ name += connects;
+ }
+ let outpath = output_dir.join(name).with_extension("ta");
+ let mut output = BufWriter::new(File::create(outpath).unwrap());
+
+ for y in 0..height {
+ for x in 0..width {
+ write!(
+ output,
+ "{}",
+ texels.get(&(x + min_x, max_y - y - 1)).unwrap_or(&' ')
+ )
+ .unwrap();
+ }
+ writeln!(output).unwrap();
+ }
+ }
+}
diff --git a/light-client/tools/src/bin/tex_export.rs b/light-client/tools/src/bin/tex_export.rs
index d325d912..248990e6 100644
--- a/light-client/tools/src/bin/tex_export.rs
+++ b/light-client/tools/src/bin/tex_export.rs
@@ -36,7 +36,7 @@ fn main() {
output: out_path,
} = Args::parse();
- let palette = include_str!("../../../textures/palette.csv")
+ let palette = include_str!("../../../assets/palette.csv")
.split('\n')
.filter(|l| !l.is_empty())
.map(|s| {
diff --git a/light-client/tools/src/bin/tex_import.rs b/light-client/tools/src/bin/tex_import.rs
index 21d1403e..a5dad499 100644
--- a/light-client/tools/src/bin/tex_import.rs
+++ b/light-client/tools/src/bin/tex_import.rs
@@ -33,7 +33,7 @@ struct Args {
fn main() {
let Args { input, output } = Args::parse();
- let palette = include_str!("../../../textures/palette.csv")
+ let palette = include_str!("../../../assets/palette.csv")
.split('\n')
.filter(|l| !l.is_empty())
.map(|s| {
diff --git a/light-client/tools/src/bin/tex_pack.rs b/light-client/tools/src/bin/tex_pack.rs
index aadd9e16..e6d73ab3 100644
--- a/light-client/tools/src/bin/tex_pack.rs
+++ b/light-client/tools/src/bin/tex_pack.rs
@@ -45,13 +45,14 @@ fn main() {
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!("adding {width}x{height} {name}");
+ println!(" + {width}x{height} {name}");
if cursor_x + width > atlas_size {
cursor_y += row_height;