summaryrefslogtreecommitdiff
path: root/crates/shader/src/lib.rs
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-08-15 04:45:02 -0400
committerLLLL Colonq <llll@colonq>2025-08-15 04:45:02 -0400
commit891a8a79f200413f2b1ac6e158f26163d6c66f64 (patch)
treed2ef73072d2c5c8a9661c5a606a7049e3bf35b8e /crates/shader/src/lib.rs
parente4ded2c09e6c378040f80e80886aa9c087fe14b4 (diff)
Refactor overlay
Diffstat (limited to 'crates/shader/src/lib.rs')
-rw-r--r--crates/shader/src/lib.rs84
1 files changed, 84 insertions, 0 deletions
diff --git a/crates/shader/src/lib.rs b/crates/shader/src/lib.rs
new file mode 100644
index 0000000..8c9aa50
--- /dev/null
+++ b/crates/shader/src/lib.rs
@@ -0,0 +1,84 @@
+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 Visualizer {
+ pub tickset: u64,
+ pub timeset: f64,
+ pub author: String,
+ pub shader: Option<shader::Shader>,
+}
+impl Visualizer {
+ pub fn new() -> Self {
+ Self {
+ tickset: 0,
+ timeset: 0.0,
+ author: String::new(),
+ shader: None,
+ }
+ }
+ pub fn set(&mut self, ctx: &context::Context, st: &state::State, src: &str) -> Result<(), String> {
+ let fsrc = format!("{}\n{}\n", FRAG, src);
+ self.tickset = st.tick;
+ self.timeset = 0.0;
+ #[cfg(not(target_arch = "wasm32"))]
+ if let Ok(dur) = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH) {
+ self.timeset = dur.as_secs_f64();
+ }
+ if let Some(s) = &mut self.shader {
+ s.replace(ctx, VERT, &fsrc)?;
+ } else {
+ self.shader = Some(shader::Shader::new_helper(ctx, VERT, &fsrc)?);
+ }
+ Ok(())
+ }
+}
+
+cfg_if::cfg_if! {
+ if #[cfg(target_arch = "wasm32")] {
+ struct Game {
+ throwshade: ThrowShade,
+ }
+ impl Game {
+ pub fn new(_ctx: &context::Context) -> Self {
+ Self {
+ throwshade: ThrowShade::new(),
+ }
+ }
+ }
+ impl state::Game for Game {
+ fn render(&mut self, ctx: &context::Context, st: &mut state::State) -> Erm<()> {
+ if let Some(s) = &self.throwshade.shader {
+ ctx.clear_color(glam::Vec4::new(0.0, 0.0, 0.0, 0.0));
+ ctx.clear();
+ s.bind(ctx);
+ s.set_f32(ctx, "opacity", 0.5);
+ s.set_vec2(ctx, "resolution", &glam::Vec2::new(ctx.render_width, ctx.render_height));
+ let elapsed = (st.tick - self.throwshade.tickset) as f32 / 60.0;
+ s.set_f32(ctx, "time", elapsed);
+ ctx.render_no_geometry();
+ }
+ Ok(())
+ }
+ }
+
+ use wasm_bindgen::prelude::*;
+ #[wasm_bindgen]
+ pub fn main_js() {
+ teleia::run(1920, 1080, teleia::Options::NORESIZE, Game::new);
+ }
+ #[wasm_bindgen]
+ pub async fn set_shader(s: &str) -> Result<(), String> {
+ contextualize(|ctx, st, g: &mut Game| {
+ log::info!("set shader: {}", s);
+ if let Err(e) = g.throwshade.set(ctx, st, &s) {
+ log::warn!("error compiling shader: {}", e);
+ g.throwshade.shader = None;
+ return Err(format!("{}", e));
+ }
+ Ok(())
+ })
+ }
+ }
+}