summaryrefslogtreecommitdiff
path: root/crates/renderer/src/overlay/tcg.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/renderer/src/overlay/tcg.rs')
-rw-r--r--crates/renderer/src/overlay/tcg.rs182
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(())
})();