#!/bin/bash set -euo pipefail HOST=localhost PORT=9000 TSV_SRC=test-vid # ensure relatively predictable timing for spawn() cargo build PIDS=() cleanup() { for pid in "${PIDS[@]}"; do kill "$pid" 2>/dev/null || true done wait 2>/dev/null } trap cleanup EXIT spawn() { BIN="$1" shift cargo run --bin "$BIN" -- "$@" & PIDS+=($!) } spawn tsv-video-buffer --name "$TSV_SRC" --frames 60 -- \ -f lavfi -i "testsrc=size=1920x1080:rate=60" spawn wgsl-render sleep 2 SHADER=' @group(1) @binding(0) var time: f32; @group(1) @binding(1) var video: texture_3d; @group(1) @binding(2) var s: sampler; @fragment fn fs_main(@location(0) uv: vec2) -> @location(0) vec4 { let dims = textureDimensions(video); let frame = fract(time / f32(dims.z)); return textureSampleLevel(video, s, vec3f(uv, frame), 0.0); } ' oscsend "$HOST" "$PORT" /texture/tex1 s "$TSV_SRC" oscsend "$HOST" "$PORT" /sampler/samp1 ss nearest repeat oscsend "$HOST" "$PORT" /module/package::main s "$SHADER" oscsend "$HOST" "$PORT" /entrypoint s package::main oscsend "$HOST" "$PORT" /binding/package::main/video s /texture/tex1 oscsend "$HOST" "$PORT" /binding/package::main/s s /sampler/samp1 spawn tsv-view echo "Playing video buffer (Ctrl+C to stop)..." T=0 while true; do oscsend "$HOST" "$PORT" /uniform/package::main/time f "$T" T=$((T+1 % 60)) sleep 0.016 done