summaryrefslogtreecommitdiff
path: root/crates/renderer/src/overlay/automata.rs
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-11-06 23:50:33 -0500
committerLLLL Colonq <llll@colonq>2025-11-06 23:50:33 -0500
commite8bf4d7dde7d4f450458deb0612eb3bc14994901 (patch)
tree5ce52d534aff87bcbdb017fd62c6695597c01515 /crates/renderer/src/overlay/automata.rs
parent0e8b1dded85602aa2dc15f27c3c89800e4c3402b (diff)
Update
Diffstat (limited to 'crates/renderer/src/overlay/automata.rs')
-rw-r--r--crates/renderer/src/overlay/automata.rs51
1 files changed, 24 insertions, 27 deletions
diff --git a/crates/renderer/src/overlay/automata.rs b/crates/renderer/src/overlay/automata.rs
index 2677fcd..8354a4a 100644
--- a/crates/renderer/src/overlay/automata.rs
+++ b/crates/renderer/src/overlay/automata.rs
@@ -1,9 +1,8 @@
use teleia::*;
use glow::HasContext;
-use lexpr::sexp;
-use base64::prelude::*;
use rand::Rng;
+use byteorder::{LE, ReadBytesExt};
use crate::overlay;
@@ -237,26 +236,6 @@ impl Overlay {
ctx.gl.generate_mipmap(glow::TEXTURE_2D);
}
}
- pub fn handle_spawn(&mut self, msg: fig::SexpMessage) -> Option<()> {
- let bs = BASE64_STANDARD.decode(msg.data.get(0)?.as_str()?).ok()?;
- let s = std::str::from_utf8(&bs).ok()?;
- let bcol = BASE64_STANDARD.decode(msg.data.get(2)?.as_str()?).ok()?;
- let scol = std::str::from_utf8(&bcol).ok()?.trim().strip_prefix("#")?;
- let col = u32::from_str_radix(scol, 16).ok()?;
- let r = (col >> 16 & 0xff) as u8;
- let g = (col >> 8 & 0xff) as u8;
- let b = (col & 0xff) as u8;
- if let Some(pat) = Pattern::from_rle(s) {
- let mut rng = rand::thread_rng();
- let x = rng.gen_range(0..WIDTH);
- let y = rng.gen_range(0..HEIGHT);
- self.rules[self.next_rule] = CellRule { color: [r, g, b, 0xff] };
- self.spawn(x as i32, y as i32, self.next_rule as u8, &pat);
- self.next_rule = (self.next_rule + 1) % 256;
- if self.next_rule == 0 { self.next_rule = 1; }
- }
- Some(())
- }
}
impl overlay::Overlay for Overlay {
fn reset(&mut self, ctx: &context::Context, st: &mut state::State, _ost: &mut overlay::State) -> Erm<()> {
@@ -268,13 +247,31 @@ impl overlay::Overlay for Overlay {
}
Ok(())
}
- fn handle(
+ fn handle_binary(
&mut self, ctx: &context::Context, st: &mut state::State, _ost: &mut overlay::State,
- msg: fig::SexpMessage,
+ msg: &fig::BinaryMessage,
) -> Erm<()> {
- let malformed = format!("malformed {} data: {}", msg.event, msg.data);
- if msg.event == sexp!((avatar automata spawn)) {
- if self.handle_spawn(msg).is_none() { log::warn!("{}", malformed) }
+ if msg.event == b"overlay automata spawn" {
+ let res: Erm<()> = (|| {
+ let mut reader = std::io::Cursor::new(&msg.data);
+ let rle = fig::read_length_prefixed_utf8(&mut reader)?;
+ let _user = fig::read_length_prefixed_utf8(&mut reader)?;
+ let col = reader.read_u32::<LE>()?;
+ let r = (col >> 16 & 0xff) as u8;
+ let g = (col >> 8 & 0xff) as u8;
+ let b = (col & 0xff) as u8;
+ if let Some(pat) = Pattern::from_rle(&rle) {
+ let mut rng = rand::thread_rng();
+ let x = rng.gen_range(0..WIDTH);
+ let y = rng.gen_range(0..HEIGHT);
+ self.rules[self.next_rule] = CellRule { color: [r, g, b, 0xff] };
+ self.spawn(x as i32, y as i32, self.next_rule as u8, &pat);
+ self.next_rule = (self.next_rule + 1) % 256;
+ if self.next_rule == 0 { self.next_rule = 1; }
+ }
+ Ok(())
+ })();
+ if let Err(e) = res { log::warn!("malformed automata spawn update: {}", e); }
}
Ok(())
}