diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-15 15:00:27 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-15 15:00:27 +0200 |
commit | 340aa47c4652fe2f0ec5b0e4f293cfff407a0e6c (patch) | |
tree | 1d0aad02c54a223b092eb74d065dfbc68cba56f6 /light-client | |
parent | d3101bbfd9adf84ef8f0061383272eeaecf224d3 (diff) | |
download | hurrycurry-340aa47c4652fe2f0ec5b0e4f293cfff407a0e6c.tar hurrycurry-340aa47c4652fe2f0ec5b0e4f293cfff407a0e6c.tar.bz2 hurrycurry-340aa47c4652fe2f0ec5b0e4f293cfff407a0e6c.tar.zst |
add texture import/export system for light client
Diffstat (limited to 'light-client')
-rw-r--r-- | light-client/Cargo.toml | 4 | ||||
-rw-r--r-- | light-client/src/game.rs | 4 | ||||
-rw-r--r-- | light-client/src/main.rs | 4 | ||||
-rw-r--r-- | light-client/src/network.rs | 51 | ||||
-rw-r--r-- | light-client/textures/.gitignore | 1 | ||||
-rw-r--r-- | light-client/textures/makefile | 16 | ||||
-rw-r--r-- | light-client/textures/palette.csv | 121 | ||||
-rw-r--r-- | light-client/textures/tiles/counter.ta | 36 | ||||
-rw-r--r-- | light-client/textures/tiles/crate_back.ta | 36 | ||||
-rw-r--r-- | light-client/textures/tiles/crate_front.ta | 36 | ||||
-rw-r--r-- | light-client/textures/tiles/cutting_board.ta | 36 | ||||
-rw-r--r-- | light-client/textures/tiles/plate.ta | 36 | ||||
-rw-r--r-- | light-client/textures/tiles/player.ta | 38 | ||||
-rw-r--r-- | light-client/textures/tiles/tomato.ta | 36 | ||||
-rw-r--r-- | light-client/textures/tiles/tomato_slice.ta | 36 | ||||
-rw-r--r-- | light-client/tools/Cargo.toml | 11 | ||||
-rw-r--r-- | light-client/tools/src/bin/tex_export.rs | 58 | ||||
-rw-r--r-- | light-client/tools/src/bin/tex_import.rs | 58 | ||||
-rw-r--r-- | light-client/tools/src/bin/tex_pack.rs | 77 | ||||
-rw-r--r-- | light-client/tools/src/lib.rs | 0 |
20 files changed, 692 insertions, 3 deletions
diff --git a/light-client/Cargo.toml b/light-client/Cargo.toml index a7cb5199..ad50130c 100644 --- a/light-client/Cargo.toml +++ b/light-client/Cargo.toml @@ -7,3 +7,7 @@ edition = "2021" sdl2 = { version = "0.37.0", features = ["image", "ttf"] } hurrycurry-protocol = { path = "../server/protocol" } tungstenite = "0.23.0" +serde_json = "1.0.120" +bincode = "2.0.0-rc.3" +log = "0.4.22" +env_logger = "0.11.3" diff --git a/light-client/src/game.rs b/light-client/src/game.rs new file mode 100644 index 00000000..fd045f53 --- /dev/null +++ b/light-client/src/game.rs @@ -0,0 +1,4 @@ + +pub struct Game { + +} diff --git a/light-client/src/main.rs b/light-client/src/main.rs index 03c2fd76..85254ef4 100644 --- a/light-client/src/main.rs +++ b/light-client/src/main.rs @@ -1,3 +1,4 @@ +use network::Network; /* Hurry Curry! - a game about cooking Copyright 2024 metamuffin @@ -24,8 +25,11 @@ use sdl2::{ }; pub mod network; +pub mod game; fn main() { + let net = Network::connect("ws://127.0.0.1:27032/"); + let sdl_context = sdl2::init().unwrap(); let video_subsystem = sdl_context.video().unwrap(); let _image_context = sdl2::image::init(InitFlag::WEBP).unwrap(); diff --git a/light-client/src/network.rs b/light-client/src/network.rs index 2a185b73..dc6e894f 100644 --- a/light-client/src/network.rs +++ b/light-client/src/network.rs @@ -1,7 +1,52 @@ -pub struct Network {} +use hurrycurry_protocol::{PacketC, PacketS, BINCODE_CONFIG}; +use log::warn; +use std::{collections::VecDeque, net::TcpStream}; +use tungstenite::{stream::MaybeTlsStream, Message, WebSocket}; + +pub struct Network { + sock: WebSocket<MaybeTlsStream<TcpStream>>, + queue_in: VecDeque<PacketC>, + queue_out: VecDeque<PacketS>, +} impl Network { - pub fn connect(addr: &str) { - let (sock, resp) = tungstenite::connect(addr).unwrap(); + pub fn connect(addr: &str) -> Self { + let (sock, _resp) = tungstenite::connect(addr).unwrap(); + Self { + sock, + queue_in: VecDeque::new(), + queue_out: VecDeque::new(), + } + } + pub fn poll(&mut self) { + self.queue_in.extend(match self.sock.read() { + Ok(Message::Text(packet)) => match serde_json::from_str(&packet) { + Ok(p) => Some(p), + Err(e) => { + warn!("invalid json packet: {e:?}"); + None + } + }, + Ok(Message::Binary(packet)) => { + match bincode::decode_from_slice(&packet, BINCODE_CONFIG) { + Ok((p, _)) => Some(p), + Err(e) => { + warn!("invalid bincode packet: {e:?}"); + None + } + } + } + Ok(_) => None, + Err(e) => { + warn!("{e:?}"); + None + } + }); + + for packet in self.queue_out.drain(..) { + self.sock + .write(Message::Text(serde_json::to_string(&packet).unwrap())) + .unwrap(); + } } } diff --git a/light-client/textures/.gitignore b/light-client/textures/.gitignore new file mode 100644 index 00000000..e33609d2 --- /dev/null +++ b/light-client/textures/.gitignore @@ -0,0 +1 @@ +*.png diff --git a/light-client/textures/makefile b/light-client/textures/makefile new file mode 100644 index 00000000..1dd60ff4 --- /dev/null +++ b/light-client/textures/makefile @@ -0,0 +1,16 @@ + + +ALL_TA = $(patsubst %.png,%.ta,$(shell find -name '*.png')) +ALL_PNG = $(patsubst %.ta,%.png,$(shell find -name '*.ta')) + +.PHONY: tex_export tex_import clean +tex_import: $(ALL_TA) +tex_export: $(ALL_PNG) +clean: + rm $(ALL_PNG) + +%.ta: %.png + ../../target/release/tex_import $< $@ +%.png: %.ta + ../../target/release/tex_export $< $@ + diff --git a/light-client/textures/palette.csv b/light-client/textures/palette.csv new file mode 100644 index 00000000..985d23ab --- /dev/null +++ b/light-client/textures/palette.csv @@ -0,0 +1,121 @@ + ,0,0,0,0 +a,255,255,255,255 +b,242,242,242,255 +c,230,230,230,255 +d,217,217,217,255 +e,204,204,204,255 +f,191,191,191,255 +g,178,178,178,255 +h,166,166,166,255 +i,153,153,153,255 +j,140,140,140,255 +k,128,128,128,255 +l,115,115,115,255 +m,102,102,102,255 +n,89,89,89,255 +o,76,76,76,255 +p,64,64,64,255 +q,51,51,51,255 +r,38,38,38,255 +s,26,26,26,255 +t,0,0,0,255 +u,242,252,36,255 +v,255,234,0,255 +w,254,167,17,255 +x,254,139,104,255 +y,251,59,2,255 +z,254,53,33,255 +A,208,0,0,255 +B,168,31,61,255 +C,120,4,34,255 +D,43,0,0,255 +E,241,226,197,255 +F,254,228,179,255 +G,254,218,187,255 +H,254,194,142,255 +I,216,143,87,255 +J,189,99,64,255 +K,162,64,43,255 +L,99,53,45,255 +M,107,40,51,255 +N,52,18,12,255 +O,231,203,143,255 +P,209,179,139,255 +Q,193,177,127,255 +R,215,152,11,255 +S,255,177,0,255 +T,254,139,0,255 +U,255,106,0,255 +V,183,65,0,255 +W,95,62,29,255 +X,59,35,0,255 +Y,254,202,218,255 +Z,254,101,203,255 +0,254,19,146,255 +1,221,48,98,255 +2,192,74,109,255 +3,137,22,136,255 +4,77,38,137,255 +5,68,21,33,255 +6,44,17,57,255 +7,36,20,34,255 +8,255,255,125,255 +9,255,255,0,255 +!,255,127,0,255 +",255,125,125,255 +§,255,125,255,255 +$,255,0,254,255 +%,255,0,127,255 +&,255,0,0,255 +/,127,0,0,255 +(,10,10,0,255 +),246,253,255,255 +=,233,247,255,255 +?,207,230,254,255 +[,170,199,254,255 +],119,179,254,255 +{,30,116,253,255 +},0,70,170,255 +^,47,68,118,255 ++,0,48,82,255 +-,14,14,37,255 +*,238,245,240,255 +~,214,229,222,255 +#,172,216,185,255 +',108,173,198,255 +.,66,169,175,255 +:,0,127,127,255 +;,73,103,92,255 +\,46,78,78,255 +<,29,50,57,255 +>,15,28,33,255 +|,216,255,244,255 +ö,184,244,245,255 +ä,174,204,181,255 +ü,118,197,120,255 +Ö,53,135,87,255 +Ä,64,155,104,255 +Ü,70,135,104,255 +ß,31,81,43,255 +¿,42,60,55,255 +¡,18,46,29,255 +ẞ,239,255,201,255 +Æ,230,243,133,255 +æ,188,245,28,255 +€,212,220,24,255 +Ø,130,211,34,255 +ł,92,127,0,255 +Ł,89,147,43,255 +Ω,41,127,0,255 +€,0,67,32,255 +«,28,51,34,255 +»,0,255,127,255 +‹,0,255,0,255 +›,125,255,125,255 +„,125,255,255,255 +“,0,255,255,255 +@,125,125,255,255 +Ŧ,127,0,255,255 +ŧ,0,0,255,255 +ø,63,0,127,255 +¤,0,0,127,255 diff --git a/light-client/textures/tiles/counter.ta b/light-client/textures/tiles/counter.ta new file mode 100644 index 00000000..846fdbe3 --- /dev/null +++ b/light-client/textures/tiles/counter.ta @@ -0,0 +1,36 @@ +KKKJJJJJJJJJJJJJJJJJJJJJJJJJJKKK +KJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK +KJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK +JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +KJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ +KJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJK +JJKKKKKJJJJJJJJJJJJJJJJJJJKKKKKK +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII +IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPI +IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP +IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP +IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP +PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP +IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPI +IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPI +IPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPI +IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII diff --git a/light-client/textures/tiles/crate_back.ta b/light-client/textures/tiles/crate_back.ta new file mode 100644 index 00000000..2f434d67 --- /dev/null +++ b/light-client/textures/tiles/crate_back.ta @@ -0,0 +1,36 @@ +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN +NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN +NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN +NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN +NNNNNNNLNNNNNNNNLNNNNNNNLNNNNNNN +NNNNNNNLNNNNNNNLLNNNNNNNLNNNNNNN +NNNNNNNLNNNNNNNLNNNNNNNNLNNNNNNN +NNNNNNNLNNNNNNNLNNNNNNNNLNNNNNNN +NNNNNNNLNNNNNNNLNNNNNNNNLNNNNNNN +NNNNNNNLNNNNNNNLNNNNNNNNLNNNNNNN +NNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN diff --git a/light-client/textures/tiles/crate_front.ta b/light-client/textures/tiles/crate_front.ta new file mode 100644 index 00000000..ff6e2d83 --- /dev/null +++ b/light-client/textures/tiles/crate_front.ta @@ -0,0 +1,36 @@ +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +L L +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +LKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKL +KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +L L +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +LKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKL +KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +L L +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +LKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKL diff --git a/light-client/textures/tiles/cutting_board.ta b/light-client/textures/tiles/cutting_board.ta new file mode 100644 index 00000000..e6137c94 --- /dev/null +++ b/light-client/textures/tiles/cutting_board.ta @@ -0,0 +1,36 @@ + + + xPPxxxxxxxxxxxxxxxxxxPPP + xxxxxxxxxxxxxxxxxxxxxxxP + PxxxxxxxxxxxxxxxxxxxxxxP + Pxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx + Pxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxP + Pxxxxxxxxxxxxxxxxxxxxxxx + xxxxxxxxxxxxxxxxxxxxxxxP + xxxxxxxxxxxxxxxxxxxxxxxP + PxxxxxxxxxxxxxxxxxxxxxxP + PPPxxxxxxxxxxxxxxxxxxPPP + LLLLLLLLLLLLLLLLLLLLLLLL + + + + + + + + + + + + + + + diff --git a/light-client/textures/tiles/plate.ta b/light-client/textures/tiles/plate.ta new file mode 100644 index 00000000..6766989f --- /dev/null +++ b/light-client/textures/tiles/plate.ta @@ -0,0 +1,36 @@ + + ffffffffffff + fffjjjjjjjjfff + fffjjjjjjjjjjjjfff + fffjjjjjjjjjjjjjjjff + fffjjjffffffffffffjjff + fffjjfffffffffffffffjjff + ffjjfffffffffffffffffjjff + ffjfffffffffffffffffffjff + ffffffffffffffffffffffffff + fffffffffffffffffffffffffff + fffffffffffffffffffffffffff + fffffffffffffffffffffffffff + fffffffffffffffffffffffffff + fffffffffffffffffffffffffff + ffffffffffffffffffffffffff + fffffffffffffffffffffffjf + fjfffffffffffffffffffffj + jjfffffffffffffffffffj + jjfffffffffffffffffj + jjffffffffffffffjj + jjjffffffffffjjj + jjjjjjjjjjjj + jjjjjj + + + + + + + + + + + + diff --git a/light-client/textures/tiles/player.ta b/light-client/textures/tiles/player.ta new file mode 100644 index 00000000..065a3255 --- /dev/null +++ b/light-client/textures/tiles/player.ta @@ -0,0 +1,38 @@ + eeeeeecccee + ececcccceaee + ecaeeeeccaae + eaaaaaaacaae + eacaaacaaace + eacacacaaace + eaceeeeeeeee + eeeevvvvvvv + vvvvvvvvvvvv + vvvvvvvvvvvv + vvvvvvvvvvvv + vvvvvvvvvvv + Rvvvvvvvvvv + RvvvvvvvvvR + RvvvvvvvR + RRvvvRR + wwwwRRwww + wwwwwwwvvvv + wwwwvvvvvvvv + vvwvvvvvvvvvv + vvvvvvvvvvvvvv + vvvvvvvvvvvvvvvv + vvvvvvvvvvvvvvvvvv + vvvvvvvvvvvvvvvvvvv + vvvvvvvvvvvvvvvvvvvvv + vvvvvvvvvvvvvvvvvvvvvv + vvvvvvvvvvvvvvvvvvvvvvvv + vvvvvvvvvvvvvvvvvvvvvvvv + vvvvvvvvvvvvvvvvvvvvvvvvvv + wvvvvvvvvvvvvvvvvvvvvvvvvw + wwvvvvvvvvvvvvvvvvvvvvvvww + wwwvvvvvvvvvvvvvvvvvvvwww + wwwwwvvvvvvvvvvvvvvvwwww + wwwwwwwvvvvvvvvvvwwwww + wwwwwwwwwwwwwwwwwwww + wwwwwwwwwwwwwwww + wwwwwwwwwwwwww + wwwwwwwwwwww diff --git a/light-client/textures/tiles/tomato.ta b/light-client/textures/tiles/tomato.ta new file mode 100644 index 00000000..694cbb80 --- /dev/null +++ b/light-client/textures/tiles/tomato.ta @@ -0,0 +1,36 @@ + + + + ßßÖÄ + ßßßßß + €ß €Ö + z€ßÄ€z + zÖz€¡ß€yzA + zzÄ€€€€€yAAA + zzAyy€AA€AAAAA + zAAxx€yyy€Azzz + zAAxxy€xAAzzzzy + AAAAxyxyAAzzAAy + zzAAAAAAAAzzAAy + yzzAAAAAAAzzAy + yyzzAAAAAAyAAy + yyzzAAAAyyAy + yyzzAyyyyy + yyyyyyyy + yyy + + + + + + + + + + + + + + + + diff --git a/light-client/textures/tiles/tomato_slice.ta b/light-client/textures/tiles/tomato_slice.ta new file mode 100644 index 00000000..199a3d99 --- /dev/null +++ b/light-client/textures/tiles/tomato_slice.ta @@ -0,0 +1,36 @@ + + + + + + AAAJ + AAzzAAJHAAAA + AA///zA/HAAAAAAJ + A//x//AHHA////AA + A/////zÆHA/x//AA + A/////zzÆA/////A + AA///zAzzA//x//A + Ax/zAAzz/////AA + A//zA/zz////zA + A//A//zz/x/zz + A/A//z///zzz + AAA///AAAzz + AAA//zzzz + Azzz + + + + + + + + + + + + + + + + + diff --git a/light-client/tools/Cargo.toml b/light-client/tools/Cargo.toml new file mode 100644 index 00000000..2a1dacb9 --- /dev/null +++ b/light-client/tools/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "tools" +version = "0.1.0" +edition = "2021" + +[dependencies] +image = "0.25.1" +anyhow = "1.0.86" +log = "0.4.22" +env_logger = "0.11.3" +clap = { version = "4.5.9", features = ["derive"] } diff --git a/light-client/tools/src/bin/tex_export.rs b/light-client/tools/src/bin/tex_export.rs new file mode 100644 index 00000000..2132b5ed --- /dev/null +++ b/light-client/tools/src/bin/tex_export.rs @@ -0,0 +1,58 @@ +use clap::Parser; +use image::Rgba; +use std::{ + collections::HashMap, + fs::File, + io::{BufRead, BufReader}, + path::PathBuf, +}; + +#[derive(Parser)] +struct Args { + input: PathBuf, + output: PathBuf, +} + +fn main() { + let Args { + input, + output: out_path, + } = Args::parse(); + + let palette = include_str!("../../../textures/palette.csv") + .split('\n') + .filter(|l| !l.is_empty()) + .map(|s| { + let (c, s) = s.split_once(",").unwrap(); + let (r, s) = s.split_once(",").unwrap(); + let (g, s) = s.split_once(",").unwrap(); + let (b, a) = s.split_once(",").unwrap(); + ( + c.chars().next().unwrap(), + [ + r.parse().unwrap(), + g.parse().unwrap(), + b.parse().unwrap(), + a.parse().unwrap(), + ], + ) + }) + .collect::<HashMap<_, _>>(); + + let file = BufReader::new(File::open(&input).unwrap()); + let tex = file.lines().map(Result::unwrap).collect::<Vec<String>>(); + let (width, height) = (tex[0].len(), tex.len()); + + let mut output = image::ImageBuffer::<Rgba<u8>, Vec<_>>::new(width as u32, height as u32); + + for (y, line) in tex.iter().enumerate() { + if line.is_empty() { + continue; + } + for (x, char) in line.chars().enumerate() { + output.put_pixel(x as u32, y as u32, Rgba(*palette.get(&char).unwrap())); + } + } + + output.save(out_path).unwrap(); +} diff --git a/light-client/tools/src/bin/tex_import.rs b/light-client/tools/src/bin/tex_import.rs new file mode 100644 index 00000000..89cbc8c9 --- /dev/null +++ b/light-client/tools/src/bin/tex_import.rs @@ -0,0 +1,58 @@ +use clap::Parser; +use std::{ + collections::HashMap, + fs::File, + io::{BufWriter, Write}, + path::PathBuf, + process::exit, +}; + +#[derive(Parser)] +struct Args { + input: PathBuf, + output: PathBuf, +} + +fn main() { + let Args { input, output } = Args::parse(); + + let palette = include_str!("../../../textures/palette.csv") + .split('\n') + .filter(|l| !l.is_empty()) + .map(|s| { + let (c, s) = s.split_once(",").unwrap(); + let (r, s) = s.split_once(",").unwrap(); + let (g, s) = s.split_once(",").unwrap(); + let (b, a) = s.split_once(",").unwrap(); + ( + [ + r.parse().unwrap(), + g.parse().unwrap(), + b.parse().unwrap(), + a.parse().unwrap(), + ], + c.chars().next().unwrap(), + ) + }) + .collect::<HashMap<_, _>>(); + + let input = image::open(input).unwrap().to_rgba8(); + let mut output = BufWriter::new(File::create(output).unwrap()); + + for y in 0..input.height() { + for x in 0..input.width() { + let mut c = input.get_pixel(x, y).0; + if c[3] == 0 { + c = [0, 0, 0, 0]; + } + let Some(char) = palette.get(&c) else { + eprintln!("color at {x},{y} not in palette: {c:?}"); + exit(1); + }; + write!(output, "{char}").unwrap(); + } + writeln!(output).unwrap(); + } + output.flush().unwrap(); + output.into_inner().unwrap().flush().unwrap() +} 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(); + } +} diff --git a/light-client/tools/src/lib.rs b/light-client/tools/src/lib.rs new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/light-client/tools/src/lib.rs |