diff options
| author | LLLL Colonq <llll@colonq> | 2025-11-06 18:01:09 -0500 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2025-11-06 18:01:09 -0500 |
| commit | 0e8b1dded85602aa2dc15f27c3c89800e4c3402b (patch) | |
| tree | c54f665b7dca44972a243d3f70b80d1de39b926b /crates/renderer/src/overlay | |
| parent | aff8a500d2807187cdb6c3fa3d58206fad5dd9a1 (diff) | |
Update
Diffstat (limited to 'crates/renderer/src/overlay')
| -rw-r--r-- | crates/renderer/src/overlay/automata.rs | 2 | ||||
| -rw-r--r-- | crates/renderer/src/overlay/drawing.rs | 2 | ||||
| -rw-r--r-- | crates/renderer/src/overlay/irish.rs | 4 | ||||
| -rw-r--r-- | crates/renderer/src/overlay/loopback.rs | 7 | ||||
| -rw-r--r-- | crates/renderer/src/overlay/model.rs | 4 | ||||
| -rw-r--r-- | crates/renderer/src/overlay/shader.rs | 2 | ||||
| -rw-r--r-- | crates/renderer/src/overlay/tcg.rs | 166 |
7 files changed, 176 insertions, 11 deletions
diff --git a/crates/renderer/src/overlay/automata.rs b/crates/renderer/src/overlay/automata.rs index fbbc138..2677fcd 100644 --- a/crates/renderer/src/overlay/automata.rs +++ b/crates/renderer/src/overlay/automata.rs @@ -289,7 +289,7 @@ impl overlay::Overlay for Overlay { st.bind_2d(ctx, &self.shader); self.tex.bind(ctx); self.shader.set_position_2d( - ctx, + ctx, st, &glam::Vec2::new(0.0, 0.0), &glam::Vec2::new(1920.0, 1080.0) ); diff --git a/crates/renderer/src/overlay/drawing.rs b/crates/renderer/src/overlay/drawing.rs index 1d5ca96..93bf85b 100644 --- a/crates/renderer/src/overlay/drawing.rs +++ b/crates/renderer/src/overlay/drawing.rs @@ -121,7 +121,7 @@ impl overlay::Overlay for Overlay { self.tex.bind(ctx); ost.backgrounds.drawing.bind_index(ctx, 1); self.shader_background.set_position_2d( - ctx, + ctx, st, &glam::Vec2::new(0.0, 0.0), &glam::Vec2::new(1920.0, 1080.0) ); diff --git a/crates/renderer/src/overlay/irish.rs b/crates/renderer/src/overlay/irish.rs index 6cf3d52..d2ee909 100644 --- a/crates/renderer/src/overlay/irish.rs +++ b/crates/renderer/src/overlay/irish.rs @@ -3,7 +3,7 @@ use teleia::*; use lexpr::sexp; use base64::prelude::*; -use crate::{fig, overlay, toggle}; +use crate::{fig, overlay}; pub const WIDTH: f32 = 500.0; pub const HEIGHT: f32 = 700.0; @@ -102,7 +102,7 @@ impl overlay::Overlay for Overlay { st.bind_2d(ctx, &self.shader); self.fb.bind_texture(ctx); self.shader.set_position_2d( - ctx, + ctx, st, &glam::Vec2::new(1000.0, 200.0), &glam::Vec2::new(WIDTH, HEIGHT) ); diff --git a/crates/renderer/src/overlay/loopback.rs b/crates/renderer/src/overlay/loopback.rs index 0346ce7..063601d 100644 --- a/crates/renderer/src/overlay/loopback.rs +++ b/crates/renderer/src/overlay/loopback.rs @@ -16,10 +16,10 @@ fn ffmpeg_to_adts(sample_rate: u32, samples: &[f32]) -> Option<Vec<u8>> { "-ac", "2", "-i", "pipe:0", "-vn", - "-frame_size:a", "1024", "-c:a", "aac", - "-ar:a", "48000", - "-f", "mpegts", + "-f", "adts", + "-ar", "48000", + "-ac", "2", "pipe:1" ]) .stdin(process::Stdio::piped()) @@ -43,7 +43,6 @@ fn upload_sample(conn: &mut redis::Connection, sequence: u32, sample_rate: u32, let max: f32 = *sample.iter().max_by(|x, y| f32::total_cmp(x, y)).unwrap(); let cells = (max / 0.1) as usize; let adts = ffmpeg_to_adts(sample_rate, sample).unwrap(); - println!("{} {} {}", sample.len(), adts.len(), "#".repeat(cells)); let _: () = conn.lpush("hlssamples", adts).unwrap(); let _: () = conn.ltrim("hlssamples", 0, 10).unwrap(); let _: () = conn.set("hlssequence", sequence).unwrap(); diff --git a/crates/renderer/src/overlay/model.rs b/crates/renderer/src/overlay/model.rs index 26c06bf..9714f09 100644 --- a/crates/renderer/src/overlay/model.rs +++ b/crates/renderer/src/overlay/model.rs @@ -42,7 +42,7 @@ impl teleia::state::Game for Terminal { ctx.clear(); st.bind_3d(ctx, &self.ost.assets.shader_scene); self.ost.assets.shader_scene.set_position_3d( - ctx, + ctx, st, &glam::Mat4::from_translation( glam::Vec3::new(0.0, -1.63, 0.42), ), @@ -109,7 +109,7 @@ impl overlay::Overlay for Overlay { ctx.clear(); st.bind_3d(ctx, &ost.assets.shader_scene); ost.assets.shader_scene.set_position_3d( - ctx, + ctx, st, &glam::Mat4::from_translation( glam::Vec3::new(0.0, -1.63, 0.42), ), diff --git a/crates/renderer/src/overlay/shader.rs b/crates/renderer/src/overlay/shader.rs index dd35031..379cfd8 100644 --- a/crates/renderer/src/overlay/shader.rs +++ b/crates/renderer/src/overlay/shader.rs @@ -79,7 +79,7 @@ impl overlay::Overlay for Overlay { let tr = 1.0 - ((st.tick - t.set_time) as f32 / 60.0).clamp(0.0, 1.0); ost.assets.shader_flat.set_f32(ctx, "transparency", tr); ost.assets.shader_flat.set_position_2d( - ctx, + ctx, st, &glam::Vec2::new(1100.0, 300.0), &glam::Vec2::new(800.0, 600.0) ); diff --git a/crates/renderer/src/overlay/tcg.rs b/crates/renderer/src/overlay/tcg.rs new file mode 100644 index 0000000..1ec74ca --- /dev/null +++ b/crates/renderer/src/overlay/tcg.rs @@ -0,0 +1,166 @@ +use teleia::*; +use image::EncodableLayout; +use glow::HasContext; + +use crate::{fig, overlay}; + +pub const WIDTH: f32 = 320.0; +pub const HEIGHT: f32 = 450.0; + +#[derive(Debug, Clone)] +enum Error { + NotEnoughFields, +} +impl std::fmt::Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::NotEnoughFields => write!(f, "not enough fields"), + } + } +} +impl std::error::Error for Error {} + +struct Card { + name: String, + ty: String, + depicted_subject: String, + element: String, + color: glam::Vec4, + faction: String, + equity: i64, + boost_level: i64, + rarity: String, + rarity_level: i64, + body_text: String, + base_image_name: String, + flags: String, +} + +pub struct Overlay { + fb: framebuffer::Framebuffer, + texture: texture::Texture, + shader_color: shader::Shader, + shader_screen: shader::Shader, + shader: shader::Shader, + font: font::TrueType, + card: Option<Card>, +} + +impl Overlay { + pub fn new(ctx: &context::Context) -> Self { + Self { + fb: framebuffer::Framebuffer::new(ctx, &glam::Vec2::new(WIDTH, HEIGHT), &glam::Vec2::new(0.0, 0.0)), + texture: texture::Texture::new_empty(ctx), + shader_color: shader::Shader::new(ctx, include_str!("../assets/shaders/color/vert.glsl"), include_str!("../assets/shaders/color/frag.glsl")), + shader_screen: shader::Shader::new(ctx, include_str!("../assets/shaders/tcg_screen/vert.glsl"), include_str!("../assets/shaders/tcg_screen/frag.glsl")), + shader: shader::Shader::new(ctx, include_str!("../assets/shaders/tcg/vert.glsl"), include_str!("../assets/shaders/tcg/frag.glsl")), + font: font::TrueType::new(ctx, 20.0, include_bytes!("../assets/fonts/iosevka-comfy-regular.ttf")), + card: None, + } + } +} + +impl overlay::Overlay for Overlay { + fn reset(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut overlay::State) -> Erm<()> { + Ok(()) + } + fn handle_binary(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut overlay::State, msg: fig::BinaryMessage) -> Erm<()> { + match &*msg.event { + b"overlay tcg generate" => { + let s = std::str::from_utf8(&msg.data)?.to_owned(); + let mut sp = s.split("\t"); + let 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(); + log::info!("{} {} {}", &color[1..=2], &color[3..=4], &color[5..=6]); + 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 equity = sp.next().ok_or(Error::NotEnoughFields)?.parse()?; + let boost_level = sp.next().ok_or(Error::NotEnoughFields)?.parse()?; + 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 flags = sp.next().ok_or(Error::NotEnoughFields)?.to_owned(); + unsafe { + let img = image::ImageReader::open(format!("crates/renderer/src/assets/textures/tcg/bases/{}.png", base_image_name))?.decode()?.into_rgba8(); + self.texture.bind(ctx); + ctx.gl.tex_image_2d( + glow::TEXTURE_2D, + 0, + glow::RGBA as i32, + img.width() as i32, + img.height() as i32, + 0, + glow::RGBA, + glow::UNSIGNED_BYTE, + Some(&img.as_bytes()), + ); + ctx.gl.generate_mipmap(glow::TEXTURE_2D); + } + self.card = Some(Card { + 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, + equity, + boost_level, + rarity, + rarity_level, + body_text, + base_image_name, + flags, + }); + }, + _ => {}, + } + Ok(()) + } + fn render(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut overlay::State) -> Erm<()> { + if let Some(card) = &self.card { + st.bind_framebuffer(ctx, &self.fb); + ctx.clear(); + + st.bind_2d(ctx, &ost.assets.shader_flat); + self.texture.bind(ctx); + ost.assets.shader_flat.set_f32(ctx, "transparency", 0.0); + ost.assets.shader_flat.set_mat4(ctx, "view", &glam::Mat4::IDENTITY); + ost.assets.shader_flat.set_mat4(ctx, "position", &glam::Mat4::IDENTITY); + st.mesh_square.render(ctx); + + st.bind_2d(ctx, &self.shader_color); + self.shader_color.set_vec4(ctx, "color", &glam::Vec4::new(1.0, 0.0, 0.0, 1.0)); + self.shader_color.set_position_2d( + ctx, st, + &glam::Vec2::new(0.0, 10.0), + &glam::Vec2::new(WIDTH, 32.0) + ); + st.mesh_square.render(ctx); + + self.font.render_text_helper(ctx, st, + &glam::Vec2::new(0.0, 0.0), + &glam::Vec2::new(21.0, 40.0), + &card.name, + &[] + ); + + st.bind_render_framebuffer(ctx); + st.bind_2d(ctx, &self.shader_screen); + self.fb.bind_texture(ctx); + self.shader_screen.set_position_2d( + ctx, st, + &glam::Vec2::new(1000.0, 200.0), + &glam::Vec2::new(WIDTH, HEIGHT) + ); + st.mesh_square.render(ctx); + } + Ok(()) + } +} |
