summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-02-14 19:40:28 -0500
committerLLLL Colonq <llll@colonq>2025-02-14 19:40:28 -0500
commit472eadbc178ed70a4acc9339d34f0bb2fa04b0a1 (patch)
tree61a9d70b5d6428509809cc016a8c8a5fdec3267a
parentc4f96d2b3f3b3878d6e0bbca7e0c4cd3f5d8bc85 (diff)
Before fucked up undo situation
-rw-r--r--Cargo.toml3
-rw-r--r--src/common/overlay.rs69
-rw-r--r--src/common/overlay/assets/shaders/throwshade/frag.glsl13
-rw-r--r--src/common/overlay/assets/shaders/throwshade/vert.glsl22
-rw-r--r--src/common/overlay/throwshade.rs23
5 files changed, 105 insertions, 25 deletions
diff --git a/Cargo.toml b/Cargo.toml
index ea54f9f..2c16291 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -14,6 +14,9 @@ path = "src/main.rs"
[profile.release]
opt-level = 2
codegen-units = 1
+# split-debuginfo = "packed"
+strip = true
+# debug = "full"
[profile.dev.package."*"]
opt-level = 2
diff --git a/src/common/overlay.rs b/src/common/overlay.rs
index 492f1bd..9698f2c 100644
--- a/src/common/overlay.rs
+++ b/src/common/overlay.rs
@@ -2,6 +2,7 @@
mod assets;
mod terminal;
mod fig;
+mod throwshade;
use teleia::*;
use termion::raw::IntoRawMode;
@@ -26,6 +27,7 @@ pub struct Overlay {
tracking_eyes: (f32, f32),
tracking_mouth: f32,
tracking_neck: glam::Quat,
+ throwshade: throwshade::ThrowShade,
}
impl Overlay {
@@ -52,10 +54,12 @@ impl Overlay {
sexp!((avatar frame)),
sexp!((avatar reset)),
sexp!((avatar tracking)),
+ sexp!((overlay shader)),
]),
tracking_eyes: (1.0, 1.0),
tracking_mouth: 0.0,
tracking_neck: glam::Quat::IDENTITY,
+ throwshade: throwshade::ThrowShade::new(),
}
}
pub async fn overlay(ctx: &context::Context) -> Self {
@@ -98,6 +102,41 @@ impl Overlay {
}
Some(())
}
+ pub fn handle_shader(&mut self, ctx: &context::Context, msg: fig::Message) -> Option<()> {
+ let bs = BASE64_STANDARD.decode(msg.data.get(0)?.as_str()?).ok()?;
+ let s = String::from_utf8_lossy(&bs);
+ self.throwshade.set(ctx, &s);
+ Some(())
+ }
+ fn render_model_terminal(&mut self, ctx: &context::Context, st: &mut state::State) -> Option<()> {
+ self.model_fb.bind(ctx);
+ ctx.clear_color(glam::Vec4::new(0.0, 0.0, 0.0, 0.0));
+ ctx.clear();
+ st.bind_3d(ctx, &self.assets.shader_scene);
+ self.assets.shader_scene.set_position_3d(
+ ctx,
+ &glam::Mat4::from_translation(
+ glam::Vec3::new(0.0, -1.63, 0.42),
+ ),
+ );
+ self.model.render(ctx, &self.assets.shader_scene);
+ st.render_framebuffer.bind(ctx);
+ self.terminal.update(ctx, &self.model_fb);
+ match &mut self.mode {
+ RenderMode::Overlay => {
+ self.terminal.render(ctx, &glam::Vec2::new(12.0, 250.0));
+ },
+ RenderMode::Terminal(stdout) => if st.tick % 10 == 0 {
+ self.terminal.write_tty(stdout);
+ },
+ }
+ // self.model_fb.blit(
+ // ctx, &st.render_framebuffer,
+ // &glam::Vec2::new(ctx.render_width / 2.0 - 512.0, ctx.render_height / 2.0 - 512.0),
+ // &glam::Vec2::new(128.0, 128.0)
+ // );
+ Some(())
+ }
}
impl teleia::state::Game for Overlay {
@@ -127,6 +166,8 @@ impl teleia::state::Game for Overlay {
if self.handle_text(msg).is_none() { log::warn!("{}", malformed) }
} else if msg.event == sexp!((avatar frame)) {
if self.handle_frame(msg).is_none() { log::warn!("{}", malformed) }
+ } else if msg.event == sexp!((overlay shader)) {
+ if self.handle_shader(ctx, msg).is_none() { log::warn!("{}", malformed) }
} else {
log::info!("received unhandled event {} with data: {}", msg.event, msg.data);
}
@@ -137,32 +178,10 @@ impl teleia::state::Game for Overlay {
Some(())
}
fn render(&mut self, ctx: &context::Context, st: &mut state::State) -> Option<()> {
- self.model_fb.bind(ctx);
- ctx.clear_color(glam::Vec4::new(0.0, 0.0, 0.0, 0.0));
- ctx.clear();
- st.bind_3d(ctx, &self.assets.shader_scene);
- self.assets.shader_scene.set_position_3d(
- ctx,
- &glam::Mat4::from_translation(
- glam::Vec3::new(0.0, -1.63, 0.42),
- ),
- );
- self.model.render(ctx, &self.assets.shader_scene);
- st.render_framebuffer.bind(ctx);
- self.terminal.update(ctx, &self.model_fb);
- match &mut self.mode {
- RenderMode::Overlay => {
- self.terminal.render(ctx, &glam::Vec2::new(12.0, 250.0));
- },
- RenderMode::Terminal(stdout) => if st.tick % 10 == 0 {
- self.terminal.write_tty(stdout);
- },
+ if let Some(s) = &self.throwshade.shader {
+ s.bind(ctx);
+ ctx.render_no_geometry();
}
- // self.model_fb.blit(
- // ctx, &st.render_framebuffer,
- // &glam::Vec2::new(ctx.render_width / 2.0 - 512.0, ctx.render_height / 2.0 - 512.0),
- // &glam::Vec2::new(128.0, 128.0)
- // );
Some(())
}
}
diff --git a/src/common/overlay/assets/shaders/throwshade/frag.glsl b/src/common/overlay/assets/shaders/throwshade/frag.glsl
new file mode 100644
index 0000000..36f1023
--- /dev/null
+++ b/src/common/overlay/assets/shaders/throwshade/frag.glsl
@@ -0,0 +1,13 @@
+#version 300 es
+precision highp float;
+
+in vec2 vertex_texcoord;
+out vec4 frag_color;
+
+vec4 shade(vec2);
+
+void main() {
+ frag_color = shade(vertex_texcoord);
+}
+
+// "The Cutoff"
diff --git a/src/common/overlay/assets/shaders/throwshade/vert.glsl b/src/common/overlay/assets/shaders/throwshade/vert.glsl
new file mode 100644
index 0000000..e05bbb6
--- /dev/null
+++ b/src/common/overlay/assets/shaders/throwshade/vert.glsl
@@ -0,0 +1,22 @@
+#version 300 es
+precision highp float;
+
+out vec2 vertex_texcoord;
+
+void main() {
+ const vec2 positions[4] = vec2[](
+ vec2(-1, -1),
+ vec2(+1, -1),
+ vec2(-1, +1),
+ vec2(+1, +1)
+ );
+ const vec2 coords[4] = vec2[](
+ vec2(0, 0),
+ vec2(1, 0),
+ vec2(0, 1),
+ vec2(1, 1)
+ );
+
+ vertex_texcoord = coords[gl_VertexID];
+ gl_Position = vec4(positions[gl_VertexID], 0.0, 1.0);
+}
diff --git a/src/common/overlay/throwshade.rs b/src/common/overlay/throwshade.rs
new file mode 100644
index 0000000..d7ac430
--- /dev/null
+++ b/src/common/overlay/throwshade.rs
@@ -0,0 +1,23 @@
+use teleia::*;
+
+const VERT: &'static str = include_str!("assets/shaders/throwshade/vert.glsl");
+const FRAG: &'static str = include_str!("assets/shaders/throwshade/frag.glsl");
+
+pub struct ThrowShade {
+ pub shader: Option<shader::Shader>,
+}
+impl ThrowShade {
+ pub fn new() -> Self {
+ Self {
+ shader: None,
+ }
+ }
+ pub fn set(&mut self, ctx: &context::Context, src: &str) {
+ let fsrc = format!("{}\n{}\n", FRAG, src);
+ if let Some(s) = &mut self.shader {
+ s.replace(ctx, VERT, &fsrc);
+ } else {
+ self.shader = Some(shader::Shader::new_nolib(ctx, VERT, &fsrc));
+ }
+ }
+}