summaryrefslogtreecommitdiff
path: root/crates/renderer
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-11-06 18:01:09 -0500
committerLLLL Colonq <llll@colonq>2025-11-06 18:01:09 -0500
commit0e8b1dded85602aa2dc15f27c3c89800e4c3402b (patch)
treec54f665b7dca44972a243d3f70b80d1de39b926b /crates/renderer
parentaff8a500d2807187cdb6c3fa3d58206fad5dd9a1 (diff)
Update
Diffstat (limited to 'crates/renderer')
-rw-r--r--crates/renderer/src/assets/shaders/color/frag.glsl8
-rw-r--r--crates/renderer/src/assets/shaders/color/vert.glsl4
-rw-r--r--crates/renderer/src/assets/shaders/tcg/frag.glsl15
-rw-r--r--crates/renderer/src/assets/shaders/tcg/vert.glsl4
-rw-r--r--crates/renderer/src/assets/shaders/tcg_screen/frag.glsl15
-rw-r--r--crates/renderer/src/assets/shaders/tcg_screen/vert.glsl4
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/adrenaline.pngbin0 -> 103027 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/anh.pngbin0 -> 286626 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/bigman.pngbin0 -> 265354 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/blueeyes.pngbin0 -> 308691 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/bugatti.pngbin0 -> 147540 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/cowtools.pngbin0 -> 41467 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/die.pngbin0 -> 190728 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/dragonball.pngbin0 -> 205573 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/droll.pngbin0 -> 63572 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/germanguyontopofpotofgreed.pngbin0 -> 220990 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/goyf.pngbin0 -> 280668 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/midlife.pngbin0 -> 206362 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/monstermunch.pngbin0 -> 245131 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/noise.pngbin0 -> 268938 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/recall.pngbin0 -> 280044 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/samosas.pngbin0 -> 224985 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/sleepydragon.pngbin0 -> 196801 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/sol.pngbin0 -> 311086 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/theking.pngbin0 -> 148821 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/trent.pngbin0 -> 288257 bytes
-rw-r--r--crates/renderer/src/assets/textures/tcg/bases/vlad.pngbin0 -> 272839 bytes
-rw-r--r--crates/renderer/src/main.rs3
-rw-r--r--crates/renderer/src/overlay.rs13
-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
36 files changed, 238 insertions, 15 deletions
diff --git a/crates/renderer/src/assets/shaders/color/frag.glsl b/crates/renderer/src/assets/shaders/color/frag.glsl
new file mode 100644
index 0000000..7b6b51b
--- /dev/null
+++ b/crates/renderer/src/assets/shaders/color/frag.glsl
@@ -0,0 +1,8 @@
+uniform sampler2D texture_data;
+
+uniform vec4 color;
+
+void main()
+{
+ frag_color = color;
+}
diff --git a/crates/renderer/src/assets/shaders/color/vert.glsl b/crates/renderer/src/assets/shaders/color/vert.glsl
new file mode 100644
index 0000000..e324f7e
--- /dev/null
+++ b/crates/renderer/src/assets/shaders/color/vert.glsl
@@ -0,0 +1,4 @@
+void main()
+{
+ default_main();
+} \ No newline at end of file
diff --git a/crates/renderer/src/assets/shaders/tcg/frag.glsl b/crates/renderer/src/assets/shaders/tcg/frag.glsl
new file mode 100644
index 0000000..cab840d
--- /dev/null
+++ b/crates/renderer/src/assets/shaders/tcg/frag.glsl
@@ -0,0 +1,15 @@
+uniform sampler2D texture_data;
+
+uniform float transparency;
+
+void main()
+{
+ float opacity = 1.0 - clamp(transparency, 0.0, 1.0);
+ vec2 tcfull = vec2(vertex_texcoord.x, 1.0 - vertex_texcoord.y);
+ vec4 texel = texture(texture_data, tcfull);
+ if (texel.a != 1.0) {
+ discard;
+ }
+ texel.a *= opacity;
+ frag_color = texel;
+}
diff --git a/crates/renderer/src/assets/shaders/tcg/vert.glsl b/crates/renderer/src/assets/shaders/tcg/vert.glsl
new file mode 100644
index 0000000..e324f7e
--- /dev/null
+++ b/crates/renderer/src/assets/shaders/tcg/vert.glsl
@@ -0,0 +1,4 @@
+void main()
+{
+ default_main();
+} \ No newline at end of file
diff --git a/crates/renderer/src/assets/shaders/tcg_screen/frag.glsl b/crates/renderer/src/assets/shaders/tcg_screen/frag.glsl
new file mode 100644
index 0000000..2a14860
--- /dev/null
+++ b/crates/renderer/src/assets/shaders/tcg_screen/frag.glsl
@@ -0,0 +1,15 @@
+uniform sampler2D texture_data;
+
+uniform float transparency;
+
+void main()
+{
+ float opacity = 1.0 - clamp(transparency, 0.0, 1.0);
+ vec2 tcfull = vec2(vertex_texcoord.x, vertex_texcoord.y);
+ vec4 texel = texture(texture_data, tcfull);
+ if (texel.a != 1.0) {
+ discard;
+ }
+ texel.a *= opacity;
+ frag_color = texel;
+}
diff --git a/crates/renderer/src/assets/shaders/tcg_screen/vert.glsl b/crates/renderer/src/assets/shaders/tcg_screen/vert.glsl
new file mode 100644
index 0000000..e324f7e
--- /dev/null
+++ b/crates/renderer/src/assets/shaders/tcg_screen/vert.glsl
@@ -0,0 +1,4 @@
+void main()
+{
+ default_main();
+} \ No newline at end of file
diff --git a/crates/renderer/src/assets/textures/tcg/bases/adrenaline.png b/crates/renderer/src/assets/textures/tcg/bases/adrenaline.png
new file mode 100644
index 0000000..3020606
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/adrenaline.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/anh.png b/crates/renderer/src/assets/textures/tcg/bases/anh.png
new file mode 100644
index 0000000..170d581
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/anh.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/bigman.png b/crates/renderer/src/assets/textures/tcg/bases/bigman.png
new file mode 100644
index 0000000..df71c8e
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/bigman.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/blueeyes.png b/crates/renderer/src/assets/textures/tcg/bases/blueeyes.png
new file mode 100644
index 0000000..eaf9b36
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/blueeyes.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/bugatti.png b/crates/renderer/src/assets/textures/tcg/bases/bugatti.png
new file mode 100644
index 0000000..3136dc6
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/bugatti.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/cowtools.png b/crates/renderer/src/assets/textures/tcg/bases/cowtools.png
new file mode 100644
index 0000000..63125b7
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/cowtools.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/die.png b/crates/renderer/src/assets/textures/tcg/bases/die.png
new file mode 100644
index 0000000..4812db2
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/die.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/dragonball.png b/crates/renderer/src/assets/textures/tcg/bases/dragonball.png
new file mode 100644
index 0000000..4d0c123
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/dragonball.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/droll.png b/crates/renderer/src/assets/textures/tcg/bases/droll.png
new file mode 100644
index 0000000..4db4b88
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/droll.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/germanguyontopofpotofgreed.png b/crates/renderer/src/assets/textures/tcg/bases/germanguyontopofpotofgreed.png
new file mode 100644
index 0000000..032812a
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/germanguyontopofpotofgreed.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/goyf.png b/crates/renderer/src/assets/textures/tcg/bases/goyf.png
new file mode 100644
index 0000000..3c28128
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/goyf.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/midlife.png b/crates/renderer/src/assets/textures/tcg/bases/midlife.png
new file mode 100644
index 0000000..cf0ea6d
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/midlife.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/monstermunch.png b/crates/renderer/src/assets/textures/tcg/bases/monstermunch.png
new file mode 100644
index 0000000..4f235aa
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/monstermunch.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/noise.png b/crates/renderer/src/assets/textures/tcg/bases/noise.png
new file mode 100644
index 0000000..6235500
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/noise.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/recall.png b/crates/renderer/src/assets/textures/tcg/bases/recall.png
new file mode 100644
index 0000000..01842e1
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/recall.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/samosas.png b/crates/renderer/src/assets/textures/tcg/bases/samosas.png
new file mode 100644
index 0000000..07682d4
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/samosas.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/sleepydragon.png b/crates/renderer/src/assets/textures/tcg/bases/sleepydragon.png
new file mode 100644
index 0000000..cbc7e31
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/sleepydragon.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/sol.png b/crates/renderer/src/assets/textures/tcg/bases/sol.png
new file mode 100644
index 0000000..3102a5b
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/sol.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/theking.png b/crates/renderer/src/assets/textures/tcg/bases/theking.png
new file mode 100644
index 0000000..6d7cf46
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/theking.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/trent.png b/crates/renderer/src/assets/textures/tcg/bases/trent.png
new file mode 100644
index 0000000..4ef7467
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/trent.png
Binary files differ
diff --git a/crates/renderer/src/assets/textures/tcg/bases/vlad.png b/crates/renderer/src/assets/textures/tcg/bases/vlad.png
new file mode 100644
index 0000000..57589ce
--- /dev/null
+++ b/crates/renderer/src/assets/textures/tcg/bases/vlad.png
Binary files differ
diff --git a/crates/renderer/src/main.rs b/crates/renderer/src/main.rs
index b6103fc..35111f2 100644
--- a/crates/renderer/src/main.rs
+++ b/crates/renderer/src/main.rs
@@ -31,8 +31,9 @@ pub fn main() -> Erm<()> {
Box::new(overlay::shader::Overlay::new(ctx)),
Box::new(overlay::drawing::Overlay::new(ctx)),
Box::new(overlay::irish::Overlay::new(ctx)),
+ Box::new(overlay::tcg::Overlay::new(ctx)),
// Box::new(overlay::model::Overlay::new(ctx)),
- Box::new(overlay::loopback::Overlay::new(ctx)),
+ // Box::new(overlay::loopback::Overlay::new(ctx)),
])
})?;
},
diff --git a/crates/renderer/src/overlay.rs b/crates/renderer/src/overlay.rs
index 38e75c5..bd0a24d 100644
--- a/crates/renderer/src/overlay.rs
+++ b/crates/renderer/src/overlay.rs
@@ -3,6 +3,7 @@ pub mod shader;
pub mod drawing;
pub mod automata;
pub mod irish;
+pub mod tcg;
pub mod loopback;
use teleia::*;
@@ -78,7 +79,8 @@ impl State {
sexp!((overlay irish save)),
]),
fig_binary: fig::BinaryClient::new("shiro:32051", false, &[
- b"background frame"
+ b"background frame",
+ b"overlay tcg generate",
]),
tracking_eyes: (1.0, 1.0),
tracking_mouth: 0.0,
@@ -169,6 +171,9 @@ pub trait Overlay {
fn handle(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut State, msg: fig::SexpMessage) -> Erm<()> {
Ok(())
}
+ fn handle_binary(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut State, msg: fig::BinaryMessage) -> Erm<()> {
+ Ok(())
+ }
fn render(&mut self, ctx: &context::Context, st: &mut state::State, ost: &mut State) -> Erm<()> {
Ok(())
}
@@ -235,8 +240,10 @@ impl teleia::state::Game for Overlays {
log::warn!("failed to parse frame");
}
},
- ev => {
- log::info!("unhandled event: {:?}", ev);
+ _ => {
+ for ov in self.overlays.iter_mut() {
+ ov.handle_binary(ctx, st, &mut self.state, msg.clone())?;
+ }
},
}
}
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(())
+ }
+}