summaryrefslogtreecommitdiff
path: root/crates/renderer/src/overlay
diff options
context:
space:
mode:
Diffstat (limited to 'crates/renderer/src/overlay')
-rw-r--r--crates/renderer/src/overlay/automata.rs2
-rw-r--r--crates/renderer/src/overlay/drawing.rs2
-rw-r--r--crates/renderer/src/overlay/irish.rs4
-rw-r--r--crates/renderer/src/overlay/loopback.rs7
-rw-r--r--crates/renderer/src/overlay/model.rs4
-rw-r--r--crates/renderer/src/overlay/shader.rs2
-rw-r--r--crates/renderer/src/overlay/tcg.rs166
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(())
+ }
+}