diff options
| author | LLLL Colonq <llll@colonq> | 2026-09-21 22:44:32 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2026-09-21 22:44:32 -0400 |
| commit | 44cbef39e79b48481d7a111954cd4367e3d6b9fe (patch) | |
| tree | a6cf4c588f69b068d4cfcae0bdf878281786c796 /crates/renderer/src/overlay/tcg.rs | |
| parent | ab5106e978c8c3d5cd2f97f4da1fb9e4275d7f61 (diff) | |
Diffstat (limited to 'crates/renderer/src/overlay/tcg.rs')
| -rw-r--r-- | crates/renderer/src/overlay/tcg.rs | 182 |
1 files changed, 92 insertions, 90 deletions
diff --git a/crates/renderer/src/overlay/tcg.rs b/crates/renderer/src/overlay/tcg.rs index e6cc34a..e550f45 100644 --- a/crates/renderer/src/overlay/tcg.rs +++ b/crates/renderer/src/overlay/tcg.rs @@ -30,25 +30,75 @@ impl std::fmt::Display for Error { impl std::error::Error for Error {} #[derive(Debug, Clone)] -struct Card { - frames: u32, encoded: String, - owner: String, owner_id: String, - name: String, - ty: String, - depicted_subject: String, - element: String, - color: glam::Vec4, - faction: String, - faction_color: glam::Vec4, - equity: i64, - boost_level: String, - rarity: String, - rarity_level: i64, - body_text: String, - base_image_name: String, - set: String, - minted_date: String, - flags: String, +pub struct Card { + pub frames: u32, pub encoded: String, + pub owner: String, pub owner_id: String, + pub name: String, + pub ty: String, + pub depicted_subject: String, + pub element: String, + pub color: glam::Vec4, + pub faction: String, + pub faction_color: glam::Vec4, + pub equity: i64, + pub boost_level: String, + pub rarity: String, + pub rarity_level: i64, + pub body_text: String, + pub base_image_name: String, + pub set: String, + pub minted_date: String, + pub flags: String, +} +impl Card { + pub fn parse(s: &str) -> Erm<Self> { + let mut sp = s.split("\t"); + let owner = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let owner_id = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let name = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let ty = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let depicted_subject = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let element = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let color = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let r = i64::from_str_radix(&color[1..=2], 16)?; + let g = i64::from_str_radix(&color[3..=4], 16)?; + let b = i64::from_str_radix(&color[5..=6], 16)?; + let faction = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let faction_color = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let f_r = i64::from_str_radix(&faction_color[1..=2], 16)?; + let f_g = i64::from_str_radix(&faction_color[3..=4], 16)?; + let f_b = i64::from_str_radix(&faction_color[5..=6], 16)?; + let equity = sp.next().ok_or(Error::NotEnoughFields)?.parse()?; + let boost_level = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let rarity = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let rarity_level = sp.next().ok_or(Error::NotEnoughFields)?.parse()?; + let body_text = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let base_image_name = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let set = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let minted_date = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let flags = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + let card = Card { + frames: 1, encoded: s.to_owned(), + owner, + owner_id, + name, + ty, + depicted_subject, + element, + color: glam::Vec4::new(r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0, 1.0), + faction, + faction_color: glam::Vec4::new(f_r as f32 / 255.0, f_g as f32 / 255.0, f_b as f32 / 255.0, 1.0), + equity, + boost_level, + rarity, rarity_level, + body_text, + base_image_name, + set, + minted_date, + flags, + }; + Ok(card) + } } struct RenderedCardSlot { @@ -111,7 +161,6 @@ impl RenderedCardSlot { } pub fn render_3d(&self, ctx: &context::Context, st: &mut state::State, ost: &mut overlay::State, - back: &texture::Texture, progress: f32, pos: glam::Mat4, ) { @@ -120,7 +169,7 @@ impl RenderedCardSlot { ost.assets.shader_tcg_screen.set_i32(ctx, "texture_front", 0); ost.assets.shader_tcg_screen.set_i32(ctx, "texture_back", 1); self.effect_fb.bind_texture(ctx); - back.bind_index(ctx, 1); + ost.assets.texture_cardback.bind_index(ctx, 1); ost.assets.shader_tcg_screen.set_position_3d(ctx, st, &pos); st.mesh_square.render(ctx); } @@ -170,7 +219,7 @@ impl ImageEncoder { } fn write_frame(&mut self, pixels: &[u8]) { if self.frames_left > 0 { - let _ = self.writer.write_image_data(&pixels); + let _ = self.writer.write_image_data(pixels); self.frames_left -= 1; } } @@ -212,16 +261,14 @@ impl MarqueeSlot { } fn render_3d(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut overlay::State, - back: &texture::Texture, progress: f32, pos: glam::Mat4, ) { - self.card.render_3d(ctx, st, ost, back, progress, pos); + self.card.render_3d(ctx, st, ost, progress, pos); self.write_frame(ctx); } } struct Marquee { - texture_back: texture::Texture, font: font::Bitmap, slots: [MarqueeSlot; CARD_SLOTS], next_slot: usize, @@ -232,7 +279,6 @@ struct Marquee { impl Marquee { pub fn new(ctx: &context::Context) -> Self { Self { - texture_back: texture::Texture::new(ctx, include_bytes!("../assets/textures/tcg/cardback.png")), font: font::Bitmap::from_image(ctx, 6, 12, 96, 72, include_bytes!("../assets/fonts/terminus.png")), slots: std::array::from_fn(|_| MarqueeSlot { card: RenderedCardSlot::new(ctx), @@ -301,7 +347,7 @@ impl Marquee { for s in self.slots.iter_mut() { if let Some(b) = s.encoder.take_if(|e| e.is_finished()).and_then(|enc| enc.finish()) { if let Some(c) = &s.card.card { - let _ = Self::upload_card(ctx, st, ost, &c, &b).expect("failed to upload"); + Self::upload_card(ctx, st, ost, c, &b).expect("failed to upload"); } } } @@ -335,7 +381,7 @@ impl Marquee { (p as u32 % c.frames) as f32 / c.frames as f32 } } else { 1.0 }; - s.render_3d(ctx, st, ost, &self.texture_back, progress, trans); + s.render_3d(ctx, st, ost, progress, trans); if let Some(c) = &s.card.card { let scale = 4.0; let owner_width = c.owner.len() as f32 * self.font.char_width as f32 * scale; @@ -344,7 +390,7 @@ impl Marquee { -200.0 + if s.height_offset { -50.0 } else { 0.0 }), &c.owner, font::BitmapParams { - color: &[glam::Vec3::new(1.0, 1.0, 1.0)], + color: &[glam::Vec4::new(1.0, 1.0, 1.0, 1.0)], scale: glam::Vec2::new(scale, scale), offset: glam::Vec2::ZERO, }, @@ -378,7 +424,7 @@ impl CardRenderer { 0, glow::RGBA, glow::UNSIGNED_BYTE, - Some(&img.as_bytes()), + Some(img.as_bytes()), ); ctx.gl.generate_mipmap(glow::TEXTURE_2D); Ok(()) @@ -413,7 +459,7 @@ impl CardRenderer { if Self::load_texture(&self.texture_art, ctx, st, &format!("/home/llll/src/wasp/assets/avatars/{}.png", card.depicted_subject.to_ascii_lowercase())).is_err() { let _ = Self::load_texture(&self.texture_art, ctx, st, "/home/llll/src/wasp/assets/avatars/jontest.png"); } - st.bind_framebuffer(ctx, &fb); + st.bind_framebuffer(ctx, fb); ctx.clear(); st.bind_2d(ctx, &ost.assets.shader_tcg_base); @@ -425,7 +471,7 @@ impl CardRenderer { // top bar self.draw_rectangle(ctx, st, ost, - card.color.clone(), + card.color, glam::Vec2::new(0.0, 0.0), glam::Vec2::new(WIDTH, 16.0), ); @@ -433,7 +479,7 @@ impl CardRenderer { glam::Vec2::new(8.0, 1.0), &card.name, font::BitmapParams { - color: &[glam::Vec3::new(0.0, 0.0, 0.0)], + color: &[glam::Vec4::new(0.0, 0.0, 0.0, 1.0)], scale: glam::Vec2::ONE, offset: glam::Vec2::ZERO, } @@ -442,7 +488,7 @@ impl CardRenderer { glam::Vec2::new(WIDTH - 8.0 * card.rarity.len() as f32, 1.0), &card.rarity, font::BitmapParams { - color: &[glam::Vec3::new(0.0, 0.0, 0.0)], + color: &[glam::Vec4::new(0.0, 0.0, 0.0, 1.0)], scale: glam::Vec2::ONE, offset: glam::Vec2::ZERO, } @@ -497,7 +543,7 @@ impl CardRenderer { boost_pos, &card.boost_level, font::BitmapParams { - color: &[glam::Vec3::new(0.1, 0.1, 0.1)], + color: &[glam::Vec4::new(0.1, 0.1, 0.1, 1.0)], scale: glam::Vec2::ONE, offset: glam::Vec2::ZERO, }, @@ -506,7 +552,7 @@ impl CardRenderer { boost_pos - glam::Vec2::new(1.0, 1.0), &card.boost_level, font::BitmapParams { - color: &[glam::Vec3::new(0.9, 0.9, 0.9)], + color: &[glam::Vec4::new(0.9, 0.9, 0.9, 1.0)], scale: glam::Vec2::ONE, offset: glam::Vec2::ZERO, }, @@ -519,7 +565,7 @@ impl CardRenderer { equity_pos + glam::Vec2::new(0.0, 10.0) * i as f32, "$", font::BitmapParams { - color: &[glam::Vec3::new(0.1, 0.1, 0.1)], + color: &[glam::Vec4::new(0.1, 0.1, 0.1, 1.0)], scale: glam::Vec2::ONE, offset: glam::Vec2::ZERO, }, @@ -536,9 +582,9 @@ impl CardRenderer { let line: String = cs.iter().collect(); self.font.render_text_at(ctx, st, glam::Vec2::new(5.0, 120.0 + 10.0 * i as f32), - &format!("{}", line), + &line, font::BitmapParams { - color: &[glam::Vec3::new(0.2, 0.2, 0.2)], + color: &[glam::Vec4::new(0.2, 0.2, 0.2, 1.0)], scale: glam::Vec2::ONE, offset: glam::Vec2::ZERO, }, @@ -553,18 +599,18 @@ impl CardRenderer { ); self.font.render_text_at(ctx, st, glam::Vec2::new(1.0, HEIGHT - 15.0), - &format!("{}", card.set), + &card.set, font::BitmapParams { - color: &[glam::Vec3::new(1.0, 1.0, 1.0)], + color: &[glam::Vec4::new(1.0, 1.0, 1.0, 1.0)], scale: glam::Vec2::ONE, offset: glam::Vec2::ZERO, } ); self.font.render_text_at(ctx, st, glam::Vec2::new(WIDTH - 7.0 * (card.minted_date.len() - 1) as f32, HEIGHT - 15.0), - &format!("{}", card.minted_date), + &card.minted_date, font::BitmapParams { - color: &[glam::Vec3::new(1.0, 1.0, 1.0)], + color: &[glam::Vec4::new(1.0, 1.0, 1.0, 1.0)], scale: glam::Vec2::ONE, offset: glam::Vec2::ZERO, } @@ -598,56 +644,12 @@ impl overlay::Overlay for Overlay { Ok(()) } fn handle_binary(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut overlay::State, msg: &net::fig::BinaryMessage) -> Erm<()> { + #[allow(clippy::single_match)] match &*msg.event { b"overlay tcg generate" => { let res: Erm<()> = (|| { - let s = std::str::from_utf8(&msg.data)?.to_owned(); - log::info!("msg: {}", s); - let mut sp = s.split("\t"); - let owner = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let owner_id = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let name = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let ty = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let depicted_subject = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let element = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let color = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let r = i64::from_str_radix(&color[1..=2], 16)?; - let g = i64::from_str_radix(&color[3..=4], 16)?; - let b = i64::from_str_radix(&color[5..=6], 16)?; - let faction = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let faction_color = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let f_r = i64::from_str_radix(&faction_color[1..=2], 16)?; - let f_g = i64::from_str_radix(&faction_color[3..=4], 16)?; - let f_b = i64::from_str_radix(&faction_color[5..=6], 16)?; - let equity = sp.next().ok_or(Error::NotEnoughFields)?.parse()?; - let boost_level = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let rarity = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let rarity_level = sp.next().ok_or(Error::NotEnoughFields)?.parse()?; - let body_text = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let base_image_name = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let set = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let minted_date = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let flags = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); - let card = Card { - frames: 1, encoded: s.clone(), - owner, - owner_id, - name, - ty, - depicted_subject, - element, - color: glam::Vec4::new(r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0, 1.0), - faction, - faction_color: glam::Vec4::new(f_r as f32 / 255.0, f_g as f32 / 255.0, f_b as f32 / 255.0, 1.0), - equity, - boost_level, - rarity, rarity_level, - body_text, - base_image_name, - set, - minted_date, - flags, - }; + let s = std::str::from_utf8(&msg.data)?; + let card = Card::parse(s)?; self.marquee.add(ctx, st, ost, &self.renderer, card); Ok(()) })(); |
