agentvfx 0.0.0-stage → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +8 -0
- package/GEMINI.md +1 -0
- package/LICENSE +202 -0
- package/README.md +228 -2
- package/package.json +35 -4
- package/skills/agentvfx/LICENSE +202 -0
- package/skills/agentvfx/NOTICE +50 -0
- package/skills/agentvfx/SKILL.md +90 -0
- package/skills/agentvfx/engine/core/constants.mjs +84 -0
- package/skills/agentvfx/engine/core/flash-constants.mjs +23 -0
- package/skills/agentvfx/engine/core/flash.mjs +240 -0
- package/skills/agentvfx/engine/core/mark.mjs +25 -0
- package/skills/agentvfx/engine/core/palettes.mjs +36 -0
- package/skills/agentvfx/engine/core/schedule.mjs +85 -0
- package/skills/agentvfx/engine/core/templates.mjs +43 -0
- package/skills/agentvfx/engine/core/util.mjs +167 -0
- package/skills/agentvfx/engine/core/validate.mjs +334 -0
- package/skills/agentvfx/engine/node/analysis.mjs +172 -0
- package/skills/agentvfx/engine/node/audio.mjs +621 -0
- package/skills/agentvfx/engine/node/board.mjs +24 -0
- package/skills/agentvfx/engine/node/chrome.mjs +349 -0
- package/skills/agentvfx/engine/node/encode.mjs +110 -0
- package/skills/agentvfx/engine/node/eye.mjs +77 -0
- package/skills/agentvfx/engine/node/footage.mjs +129 -0
- package/skills/agentvfx/engine/node/frame-worker.mjs +39 -0
- package/skills/agentvfx/engine/node/host.mjs +31 -0
- package/skills/agentvfx/engine/node/job.mjs +181 -0
- package/skills/agentvfx/engine/node/png.mjs +112 -0
- package/skills/agentvfx/engine/node/render.mjs +161 -0
- package/skills/agentvfx/engine/node/stage-capture.mjs +187 -0
- package/skills/agentvfx/engine/node/stage-serve.mjs +72 -0
- package/skills/agentvfx/engine/node/stills.mjs +100 -0
- package/skills/agentvfx/engine/node/ws-server.mjs +132 -0
- package/skills/agentvfx/engine/web/gl.mjs +319 -0
- package/skills/agentvfx/engine/web/glsl-common.mjs +78 -0
- package/skills/agentvfx/engine/web/init.js +23 -0
- package/skills/agentvfx/engine/web/prelude.mjs +150 -0
- package/skills/agentvfx/engine/web/render.html +11 -0
- package/skills/agentvfx/engine/web/render.mjs +388 -0
- package/skills/agentvfx/engine/web/scale.mjs +15 -0
- package/skills/agentvfx/engine/web/text.mjs +158 -0
- package/skills/agentvfx/plates/terminalcore/README.md +61 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/crt.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/font.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/gallery.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/gallery_mats.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/gallery_room.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/materials.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/nodekit.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/room.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/shots.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/textures.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/__pycache__/wall.cpython-313.pyc +0 -0
- package/skills/agentvfx/plates/terminalcore/crt.py +143 -0
- package/skills/agentvfx/plates/terminalcore/font.py +80 -0
- package/skills/agentvfx/plates/terminalcore/gallery.py +61 -0
- package/skills/agentvfx/plates/terminalcore/gallery_mats.py +144 -0
- package/skills/agentvfx/plates/terminalcore/gallery_room.py +126 -0
- package/skills/agentvfx/plates/terminalcore/materials.py +170 -0
- package/skills/agentvfx/plates/terminalcore/nodekit.py +87 -0
- package/skills/agentvfx/plates/terminalcore/room.py +82 -0
- package/skills/agentvfx/plates/terminalcore/scene.py +219 -0
- package/skills/agentvfx/plates/terminalcore/shots.py +48 -0
- package/skills/agentvfx/plates/terminalcore/textures.py +79 -0
- package/skills/agentvfx/plates/terminalcore/wall.py +103 -0
- package/skills/agentvfx/references/plates.md +22 -0
- package/skills/agentvfx/references/template-format.md +149 -0
- package/skills/agentvfx/references/web.md +63 -0
- package/skills/agentvfx/runtime/agentvfx.js +708 -0
- package/skills/agentvfx/schemas/fx-score.schema.json +98 -0
- package/skills/agentvfx/scripts/export-web.mjs +157 -0
- package/skills/agentvfx/scripts/loop.mjs +129 -0
- package/skills/agentvfx/scripts/make-beat.mjs +133 -0
- package/skills/agentvfx/scripts/plate.mjs +82 -0
- package/skills/agentvfx/scripts/vfx.mjs +173 -0
- package/skills/agentvfx/templates/_test/feedback-counter/fx.json +11 -0
- package/skills/agentvfx/templates/_test/feedback-counter/main.frag +4 -0
- package/skills/agentvfx/templates/_test/feedback-counter/pass0.frag +4 -0
- package/skills/agentvfx/templates/_test/gradient/fx.json +23 -0
- package/skills/agentvfx/templates/_test/gradient/main.frag +5 -0
- package/skills/agentvfx/templates/_test/identity/fx.json +10 -0
- package/skills/agentvfx/templates/_test/identity/main.frag +4 -0
- package/skills/agentvfx/templates/_test/strobe/fx.json +14 -0
- package/skills/agentvfx/templates/_test/strobe/main.frag +6 -0
- package/skills/agentvfx/templates/_test/text-probe/fx.json +15 -0
- package/skills/agentvfx/templates/_test/text-probe/main.frag +6 -0
- package/skills/agentvfx/templates/brutal/NOTES.md +14 -0
- package/skills/agentvfx/templates/brutal/_src/boot-log/def.mjs +57 -0
- package/skills/agentvfx/templates/brutal/_src/boot-log/main.src.frag +129 -0
- package/skills/agentvfx/templates/brutal/_src/build.mjs +33 -0
- package/skills/agentvfx/templates/brutal/_src/halftone-field/def.mjs +72 -0
- package/skills/agentvfx/templates/brutal/_src/halftone-field/main.src.frag +94 -0
- package/skills/agentvfx/templates/brutal/_src/hud-deck/deck-left.src.glsl +100 -0
- package/skills/agentvfx/templates/brutal/_src/hud-deck/deck-right.src.glsl +61 -0
- package/skills/agentvfx/templates/brutal/_src/hud-deck/deck-tiles.src.glsl +153 -0
- package/skills/agentvfx/templates/brutal/_src/hud-deck/def.mjs +82 -0
- package/skills/agentvfx/templates/brutal/_src/hud-deck/main.src.frag +110 -0
- package/skills/agentvfx/templates/brutal/_src/hud-deck/pass0.src.frag +38 -0
- package/skills/agentvfx/templates/brutal/_src/shared/defs.mjs +28 -0
- package/skills/agentvfx/templates/brutal/_src/shared/icons.glsl +72 -0
- package/skills/agentvfx/templates/brutal/_src/shared/lib.glsl +115 -0
- package/skills/agentvfx/templates/brutal/_src/shared/screen.glsl +43 -0
- package/skills/agentvfx/templates/brutal/boot-log/demo-acid.json +1 -0
- package/skills/agentvfx/templates/brutal/boot-log/demo-phosphor.json +1 -0
- package/skills/agentvfx/templates/brutal/boot-log/demo-ultramarine.json +1 -0
- package/skills/agentvfx/templates/brutal/boot-log/fx.json +257 -0
- package/skills/agentvfx/templates/brutal/boot-log/main.frag +242 -0
- package/skills/agentvfx/templates/brutal/collage/_src/00-lib.glsl +73 -0
- package/skills/agentvfx/templates/brutal/collage/_src/10-spectrum-scope.glsl +73 -0
- package/skills/agentvfx/templates/brutal/collage/_src/20-meter-readout-cross.glsl +87 -0
- package/skills/agentvfx/templates/brutal/collage/_src/30-footage-fillers.glsl +92 -0
- package/skills/agentvfx/templates/brutal/collage/_src/40-editorial.glsl +232 -0
- package/skills/agentvfx/templates/brutal/collage/_src/50-typefx.glsl +163 -0
- package/skills/agentvfx/templates/brutal/collage/_src/60-scene-lib.glsl +104 -0
- package/skills/agentvfx/templates/brutal/collage/_src/61-scene-specimen.glsl +71 -0
- package/skills/agentvfx/templates/brutal/collage/_src/62-scene-wiring.glsl +96 -0
- package/skills/agentvfx/templates/brutal/collage/_src/63-scene-fieldcut.glsl +119 -0
- package/skills/agentvfx/templates/brutal/collage/_src/64-scene-pattern.glsl +64 -0
- package/skills/agentvfx/templates/brutal/collage/_src/641-scene-anatomy.glsl +49 -0
- package/skills/agentvfx/templates/brutal/collage/_src/642-scene-deck.glsl +78 -0
- package/skills/agentvfx/templates/brutal/collage/_src/643-scene-bootlog.glsl +60 -0
- package/skills/agentvfx/templates/brutal/collage/_src/644-scene-tunnel.glsl +48 -0
- package/skills/agentvfx/templates/brutal/collage/_src/645-scene-runner.glsl +42 -0
- package/skills/agentvfx/templates/brutal/collage/_src/646-scene-ascii.glsl +66 -0
- package/skills/agentvfx/templates/brutal/collage/_src/647-scene-cubewall.glsl +80 -0
- package/skills/agentvfx/templates/brutal/collage/_src/648-scene-vortex.glsl +46 -0
- package/skills/agentvfx/templates/brutal/collage/_src/649-scene-sticker.glsl +72 -0
- package/skills/agentvfx/templates/brutal/collage/_src/65-scene-main.glsl +1 -0
- package/skills/agentvfx/templates/brutal/collage/_src/650-scene-ribbon.glsl +55 -0
- package/skills/agentvfx/templates/brutal/collage/_src/651-scene-slab.glsl +38 -0
- package/skills/agentvfx/templates/brutal/collage/_src/652-scene-framedial.glsl +79 -0
- package/skills/agentvfx/templates/brutal/collage/_src/653-scene-tilt.glsl +40 -0
- package/skills/agentvfx/templates/brutal/collage/_src/654-scene-marquee.glsl +45 -0
- package/skills/agentvfx/templates/brutal/collage/_src/655-scene-lens.glsl +57 -0
- package/skills/agentvfx/templates/brutal/collage/_src/656-scene-liquid.glsl +35 -0
- package/skills/agentvfx/templates/brutal/collage/_src/657-scene-panelgrid.glsl +75 -0
- package/skills/agentvfx/templates/brutal/collage/_src/658-scene-mirror.glsl +49 -0
- package/skills/agentvfx/templates/brutal/collage/_src/66-scene-main.glsl +27 -0
- package/skills/agentvfx/templates/brutal/collage/_src/90-main.glsl +120 -0
- package/skills/agentvfx/templates/brutal/collage/_src/build.mjs +24 -0
- package/skills/agentvfx/templates/brutal/collage/_src/sync-presets.mjs +16 -0
- package/skills/agentvfx/templates/brutal/collage/demo-bone-lime.json +1 -0
- package/skills/agentvfx/templates/brutal/collage/demo-lime-sparse.json +1 -0
- package/skills/agentvfx/templates/brutal/collage/demo-orange-dense.json +1 -0
- package/skills/agentvfx/templates/brutal/collage/demo-ultra-slow.json +1 -0
- package/skills/agentvfx/templates/brutal/collage/fx.json +4882 -0
- package/skills/agentvfx/templates/brutal/collage/layout.mjs +97 -0
- package/skills/agentvfx/templates/brutal/collage/layouts.json +366 -0
- package/skills/agentvfx/templates/brutal/collage/main.frag +2367 -0
- package/skills/agentvfx/templates/brutal/collage/pass0.frag +265 -0
- package/skills/agentvfx/templates/brutal/halftone-field/demo-acid.json +1 -0
- package/skills/agentvfx/templates/brutal/halftone-field/demo-ascii.json +1 -0
- package/skills/agentvfx/templates/brutal/halftone-field/demo-dither.json +1 -0
- package/skills/agentvfx/templates/brutal/halftone-field/demo-orange.json +1 -0
- package/skills/agentvfx/templates/brutal/halftone-field/demo-phosphor.json +1 -0
- package/skills/agentvfx/templates/brutal/halftone-field/demo-ultramarine.json +1 -0
- package/skills/agentvfx/templates/brutal/halftone-field/fx.json +474 -0
- package/skills/agentvfx/templates/brutal/halftone-field/main.frag +248 -0
- package/skills/agentvfx/templates/brutal/hud-deck/demo-acid.json +1 -0
- package/skills/agentvfx/templates/brutal/hud-deck/demo-night.json +1 -0
- package/skills/agentvfx/templates/brutal/hud-deck/demo-octagon.json +1 -0
- package/skills/agentvfx/templates/brutal/hud-deck/demo-ultramarine.json +1 -0
- package/skills/agentvfx/templates/brutal/hud-deck/fx.json +601 -0
- package/skills/agentvfx/templates/brutal/hud-deck/main.frag +645 -0
- package/skills/agentvfx/templates/brutal/hud-deck/pass0.frag +38 -0
- package/skills/agentvfx/templates/brutal/lattice/demo-cobalt-fine.json +1 -0
- package/skills/agentvfx/templates/brutal/lattice/demo-ink-yellow.json +1 -0
- package/skills/agentvfx/templates/brutal/lattice/demo-vermilion.json +1 -0
- package/skills/agentvfx/templates/brutal/lattice/demo-violet-slow.json +1 -0
- package/skills/agentvfx/templates/brutal/lattice/fx.json +130 -0
- package/skills/agentvfx/templates/brutal/lattice/main.frag +175 -0
- package/skills/agentvfx/templates/brutal/lattice/pass0.frag +29 -0
- package/skills/agentvfx/templates/glitch/block-glitch/demo-mosaic.json +1 -0
- package/skills/agentvfx/templates/glitch/block-glitch/demo-onset.json +1 -0
- package/skills/agentvfx/templates/glitch/block-glitch/demo-static.json +1 -0
- package/skills/agentvfx/templates/glitch/block-glitch/demo-tear.json +1 -0
- package/skills/agentvfx/templates/glitch/block-glitch/fx.json +54 -0
- package/skills/agentvfx/templates/glitch/block-glitch/main.frag +132 -0
- package/skills/agentvfx/templates/glitch/block-glitch/pass0.frag +12 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/NOTES.md +13 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/build-passes.mjs +162 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/demo-chunk.json +1 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/demo-hue.json +1 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/demo-kick.json +1 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/demo-streak.json +1 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/demo-vertical.json +1 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/fx.json +60 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/main.frag +83 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/pass0.frag +64 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/pass1.frag +66 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/pass2.frag +66 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/pass3.frag +66 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/pass4.frag +66 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/pass5.frag +66 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/pass6.frag +66 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/pass7.frag +66 -0
- package/skills/agentvfx/templates/glitch/pixel-sort/pass8.frag +66 -0
- package/skills/agentvfx/templates/glitch/rgb-split/demo-diagonal-stutter.json +1 -0
- package/skills/agentvfx/templates/glitch/rgb-split/demo-hard.json +1 -0
- package/skills/agentvfx/templates/glitch/rgb-split/demo-kick.json +1 -0
- package/skills/agentvfx/templates/glitch/rgb-split/demo-radial.json +1 -0
- package/skills/agentvfx/templates/glitch/rgb-split/fx.json +46 -0
- package/skills/agentvfx/templates/glitch/rgb-split/main.frag +76 -0
- package/skills/agentvfx/templates/glitch/vhs/demo-clean.json +1 -0
- package/skills/agentvfx/templates/glitch/vhs/demo-crash.json +1 -0
- package/skills/agentvfx/templates/glitch/vhs/demo-tape.json +1 -0
- package/skills/agentvfx/templates/glitch/vhs/demo-worn.json +1 -0
- package/skills/agentvfx/templates/glitch/vhs/fx.json +46 -0
- package/skills/agentvfx/templates/glitch/vhs/main.frag +96 -0
- package/skills/agentvfx/templates/impact/impact-1bit/demo-onebit-bayer.json +1 -0
- package/skills/agentvfx/templates/impact/impact-1bit/fx.json +45 -0
- package/skills/agentvfx/templates/impact/impact-1bit/main.frag +64 -0
- package/skills/agentvfx/templates/impact/impact-invert/demo-invert-snap.json +1 -0
- package/skills/agentvfx/templates/impact/impact-invert/fx.json +37 -0
- package/skills/agentvfx/templates/impact/impact-invert/main.frag +44 -0
- package/skills/agentvfx/templates/impact/punch-shake/demo-punch-hard.json +1 -0
- package/skills/agentvfx/templates/impact/punch-shake/fx.json +36 -0
- package/skills/agentvfx/templates/impact/punch-shake/main.frag +62 -0
- package/skills/agentvfx/templates/impact/rgb-hit/demo-rgb-slam.json +1 -0
- package/skills/agentvfx/templates/impact/rgb-hit/fx.json +39 -0
- package/skills/agentvfx/templates/impact/rgb-hit/main.frag +62 -0
- package/skills/agentvfx/templates/impact/signal-cut/demo-lime-hold.json +1 -0
- package/skills/agentvfx/templates/impact/signal-cut/demo-lime.json +1 -0
- package/skills/agentvfx/templates/impact/signal-cut/demo-orange.json +1 -0
- package/skills/agentvfx/templates/impact/signal-cut/demo-ultramarine.json +1 -0
- package/skills/agentvfx/templates/impact/signal-cut/fx.json +83 -0
- package/skills/agentvfx/templates/impact/signal-cut/main.frag +101 -0
- package/skills/agentvfx/templates/impact/signal-cut/pass0.frag +68 -0
- package/skills/agentvfx/templates/impact/speedline-burst/demo-speed-white.json +1 -0
- package/skills/agentvfx/templates/impact/speedline-burst/fx.json +44 -0
- package/skills/agentvfx/templates/impact/speedline-burst/main.frag +68 -0
- package/skills/agentvfx/templates/impact/strobe-burst/demo-strobe-white-16.json +1 -0
- package/skills/agentvfx/templates/impact/strobe-burst/fx.json +42 -0
- package/skills/agentvfx/templates/impact/strobe-burst/main.frag +43 -0
- package/skills/agentvfx/templates/light/anamorphic-streak/demo-anamorphic-cinema.json +10 -0
- package/skills/agentvfx/templates/light/anamorphic-streak/demo-data.json +10 -0
- package/skills/agentvfx/templates/light/anamorphic-streak/fx.json +47 -0
- package/skills/agentvfx/templates/light/anamorphic-streak/main.frag +45 -0
- package/skills/agentvfx/templates/light/anamorphic-streak/pass0.frag +22 -0
- package/skills/agentvfx/templates/light/anamorphic-streak/pass1.frag +16 -0
- package/skills/agentvfx/templates/light/anamorphic-streak/pass2.frag +16 -0
- package/skills/agentvfx/templates/light/anamorphic-streak/pass3.frag +16 -0
- package/skills/agentvfx/templates/light/bloom-glow/demo-clip01-low.json +11 -0
- package/skills/agentvfx/templates/light/bloom-glow/demo-neon-night.json +10 -0
- package/skills/agentvfx/templates/light/bloom-glow/demo-phosphor.json +11 -0
- package/skills/agentvfx/templates/light/bloom-glow/fx.json +53 -0
- package/skills/agentvfx/templates/light/bloom-glow/main.frag +85 -0
- package/skills/agentvfx/templates/light/bloom-glow/pass0.frag +21 -0
- package/skills/agentvfx/templates/light/bloom-glow/pass1.frag +50 -0
- package/skills/agentvfx/templates/light/bloom-glow/pass2.frag +44 -0
- package/skills/agentvfx/templates/light/bloom-glow/pass3.frag +32 -0
- package/skills/agentvfx/templates/light/bloom-glow/pass4.frag +48 -0
- package/skills/agentvfx/templates/light/bloom-glow/pass5.frag +46 -0
- package/skills/agentvfx/templates/light/god-rays/demo-golden-hour.json +10 -0
- package/skills/agentvfx/templates/light/god-rays/demo-point-lamp.json +10 -0
- package/skills/agentvfx/templates/light/god-rays/fx.json +39 -0
- package/skills/agentvfx/templates/light/god-rays/main.frag +54 -0
- package/skills/agentvfx/templates/light/lens-flare/demo-clip01-bar.json +11 -0
- package/skills/agentvfx/templates/light/lens-flare/demo-eye-bar.json +10 -0
- package/skills/agentvfx/templates/light/lens-flare/demo-sun-ghosts.json +10 -0
- package/skills/agentvfx/templates/light/lens-flare/fx.json +49 -0
- package/skills/agentvfx/templates/light/lens-flare/main.frag +86 -0
- package/skills/agentvfx/templates/light/lens-flare/pass0.frag +24 -0
- package/skills/agentvfx/templates/light/light-leak/demo-slit.json +10 -0
- package/skills/agentvfx/templates/light/light-leak/demo-vintage-burn.json +10 -0
- package/skills/agentvfx/templates/light/light-leak/fx.json +40 -0
- package/skills/agentvfx/templates/light/light-leak/main.frag +46 -0
- package/skills/agentvfx/templates/light/light-stage/fx.json +29 -0
- package/skills/agentvfx/templates/light/light-stage/main.frag +56 -0
- package/skills/agentvfx/templates/light/light-sweep/demo-hard-bar.json +12 -0
- package/skills/agentvfx/templates/light/light-sweep/demo-logo-sweep.json +10 -0
- package/skills/agentvfx/templates/light/light-sweep/demo-onset.json +11 -0
- package/skills/agentvfx/templates/light/light-sweep/fx.json +45 -0
- package/skills/agentvfx/templates/light/light-sweep/main.frag +29 -0
- package/skills/agentvfx/templates/light/light-sweep/pass0.frag +17 -0
- package/skills/agentvfx/templates/light/light-sweep/pass1.frag +15 -0
- package/skills/agentvfx/templates/light/neon-saber/demo-hairline.json +10 -0
- package/skills/agentvfx/templates/light/neon-saber/demo-saber-laser.json +10 -0
- package/skills/agentvfx/templates/light/neon-saber/fx.json +48 -0
- package/skills/agentvfx/templates/light/neon-saber/main.frag +27 -0
- package/skills/agentvfx/templates/light/neon-saber/pass0.frag +46 -0
- package/skills/agentvfx/templates/light/neon-saber/pass1.frag +15 -0
- package/skills/agentvfx/templates/psychedelic/echo-flow/demo-trail.json +1 -0
- package/skills/agentvfx/templates/psychedelic/echo-flow/fx.json +38 -0
- package/skills/agentvfx/templates/psychedelic/echo-flow/main.frag +19 -0
- package/skills/agentvfx/templates/psychedelic/echo-flow/pass0.frag +16 -0
- package/skills/agentvfx/templates/psychedelic/echo-flow/pass1.frag +20 -0
- package/skills/agentvfx/templates/psychedelic/echo-flow/pass2.frag +11 -0
- package/skills/agentvfx/templates/psychedelic/echo-flow/pass3.frag +4 -0
- package/skills/agentvfx/templates/psychedelic/hologram-scan/demo-cyan.json +1 -0
- package/skills/agentvfx/templates/psychedelic/hologram-scan/fx.json +36 -0
- package/skills/agentvfx/templates/psychedelic/hologram-scan/main.frag +30 -0
- package/skills/agentvfx/templates/psychedelic/kaleido-fold/demo-six.json +1 -0
- package/skills/agentvfx/templates/psychedelic/kaleido-fold/fx.json +37 -0
- package/skills/agentvfx/templates/psychedelic/kaleido-fold/main.frag +10 -0
- package/skills/agentvfx/templates/psychedelic/kaleido-fold/pass0.frag +34 -0
- package/skills/agentvfx/templates/psychedelic/mosh-melt/demo-classic.json +1 -0
- package/skills/agentvfx/templates/psychedelic/mosh-melt/fx.json +38 -0
- package/skills/agentvfx/templates/psychedelic/mosh-melt/main.frag +20 -0
- package/skills/agentvfx/templates/psychedelic/mosh-melt/pass0.frag +22 -0
- package/skills/agentvfx/templates/psychedelic/sacred/NOTES.md +13 -0
- package/skills/agentvfx/templates/psychedelic/sacred/demo-classic.json +1 -0
- package/skills/agentvfx/templates/psychedelic/sacred/demo-halo.json +1 -0
- package/skills/agentvfx/templates/psychedelic/sacred/demo-slow-tide.json +1 -0
- package/skills/agentvfx/templates/psychedelic/sacred/demo-thermal.json +1 -0
- package/skills/agentvfx/templates/psychedelic/sacred/fx.json +263 -0
- package/skills/agentvfx/templates/psychedelic/sacred/main.frag +109 -0
- package/skills/agentvfx/templates/psychedelic/sacred/pass0.frag +25 -0
- package/skills/agentvfx/templates/psychedelic/sacred/pass1.frag +23 -0
- package/skills/agentvfx/templates/psychedelic/tidal-bands/demo-classic.json +1 -0
- package/skills/agentvfx/templates/psychedelic/tidal-bands/fx.json +37 -0
- package/skills/agentvfx/templates/psychedelic/tidal-bands/main.frag +54 -0
- package/skills/agentvfx/templates/scope/_chrome.glsl +242 -0
- package/skills/agentvfx/templates/scope/goniometer/demo-boot-green.json +1 -0
- package/skills/agentvfx/templates/scope/goniometer/demo-field-lime.json +1 -0
- package/skills/agentvfx/templates/scope/goniometer/demo-field-ultramarine.json +1 -0
- package/skills/agentvfx/templates/scope/goniometer/demo-glow-phosphor.json +1 -0
- package/skills/agentvfx/templates/scope/goniometer/demo-hud-black.json +1 -0
- package/skills/agentvfx/templates/scope/goniometer/fx.json +635 -0
- package/skills/agentvfx/templates/scope/goniometer/main.frag +33 -0
- package/skills/agentvfx/templates/scope/goniometer/pass0.frag +58 -0
- package/skills/agentvfx/templates/scope/goniometer/pass1.frag +43 -0
- package/skills/agentvfx/templates/scope/goniometer/pass2.frag +12 -0
- package/skills/agentvfx/templates/scope/goniometer/pass3.frag +12 -0
- package/skills/agentvfx/templates/scope/goniometer/pass4.frag +12 -0
- package/skills/agentvfx/templates/scope/goniometer/pass5.frag +12 -0
- package/skills/agentvfx/templates/scope/goniometer/pass6.frag +251 -0
- package/skills/agentvfx/templates/scope/scope-polar/demo-boot-green.json +1 -0
- package/skills/agentvfx/templates/scope/scope-polar/demo-field-lime.json +1 -0
- package/skills/agentvfx/templates/scope/scope-polar/demo-field-ultramarine.json +1 -0
- package/skills/agentvfx/templates/scope/scope-polar/demo-glow-phosphor.json +1 -0
- package/skills/agentvfx/templates/scope/scope-polar/demo-hud-black.json +1 -0
- package/skills/agentvfx/templates/scope/scope-polar/fx.json +686 -0
- package/skills/agentvfx/templates/scope/scope-polar/main.frag +39 -0
- package/skills/agentvfx/templates/scope/scope-polar/pass0.frag +84 -0
- package/skills/agentvfx/templates/scope/scope-polar/pass1.frag +49 -0
- package/skills/agentvfx/templates/scope/scope-polar/pass2.frag +12 -0
- package/skills/agentvfx/templates/scope/scope-polar/pass3.frag +12 -0
- package/skills/agentvfx/templates/scope/scope-polar/pass4.frag +12 -0
- package/skills/agentvfx/templates/scope/scope-polar/pass5.frag +12 -0
- package/skills/agentvfx/templates/scope/scope-polar/pass6.frag +251 -0
- package/skills/agentvfx/templates/scope/scope-triggered/demo-boot-green.json +1 -0
- package/skills/agentvfx/templates/scope/scope-triggered/demo-field-lime.json +1 -0
- package/skills/agentvfx/templates/scope/scope-triggered/demo-field-ultramarine.json +1 -0
- package/skills/agentvfx/templates/scope/scope-triggered/demo-glow-phosphor.json +1 -0
- package/skills/agentvfx/templates/scope/scope-triggered/demo-hud-black.json +1 -0
- package/skills/agentvfx/templates/scope/scope-triggered/fx.json +712 -0
- package/skills/agentvfx/templates/scope/scope-triggered/main.frag +36 -0
- package/skills/agentvfx/templates/scope/scope-triggered/pass0.frag +78 -0
- package/skills/agentvfx/templates/scope/scope-triggered/pass1.frag +50 -0
- package/skills/agentvfx/templates/scope/scope-triggered/pass2.frag +12 -0
- package/skills/agentvfx/templates/scope/scope-triggered/pass3.frag +12 -0
- package/skills/agentvfx/templates/scope/scope-triggered/pass4.frag +12 -0
- package/skills/agentvfx/templates/scope/scope-triggered/pass5.frag +12 -0
- package/skills/agentvfx/templates/scope/scope-triggered/pass6.frag +251 -0
- package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-boot-green.json +1 -0
- package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-field-lime.json +1 -0
- package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-field-ultramarine.json +1 -0
- package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-glow-phosphor.json +1 -0
- package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-hud-black.json +1 -0
- package/skills/agentvfx/templates/scope/spectrogram-scroll/fx.json +595 -0
- package/skills/agentvfx/templates/scope/spectrogram-scroll/main.frag +83 -0
- package/skills/agentvfx/templates/scope/spectrogram-scroll/pass0.frag +52 -0
- package/skills/agentvfx/templates/scope/spectrogram-scroll/pass1.frag +251 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/demo-boot-green.json +1 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/demo-field-lime.json +1 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/demo-field-ultramarine.json +1 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/demo-glow-phosphor.json +1 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/demo-hud-black.json +1 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/fx.json +642 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/main.frag +33 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/pass0.frag +56 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/pass1.frag +44 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/pass2.frag +12 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/pass3.frag +12 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/pass4.frag +12 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/pass5.frag +12 -0
- package/skills/agentvfx/templates/scope/xy-phosphor/pass6.frag +251 -0
- package/skills/agentvfx/templates/spectrum/_src/bars-linear/fx.src.json +61 -0
- package/skills/agentvfx/templates/spectrum/_src/bars-linear/main.src.frag +112 -0
- package/skills/agentvfx/templates/spectrum/_src/bars-linear/pass0.src.frag +2 -0
- package/skills/agentvfx/templates/spectrum/_src/bars-mirror/fx.src.json +51 -0
- package/skills/agentvfx/templates/spectrum/_src/bars-mirror/main.src.frag +72 -0
- package/skills/agentvfx/templates/spectrum/_src/bars-mirror/pass0.src.frag +2 -0
- package/skills/agentvfx/templates/spectrum/_src/bass-circle/fx.src.json +56 -0
- package/skills/agentvfx/templates/spectrum/_src/bass-circle/main.src.frag +136 -0
- package/skills/agentvfx/templates/spectrum/_src/bass-circle/pass0.src.frag +2 -0
- package/skills/agentvfx/templates/spectrum/_src/build.mjs +68 -0
- package/skills/agentvfx/templates/spectrum/_src/label-bars/fx.src.json +54 -0
- package/skills/agentvfx/templates/spectrum/_src/label-bars/main.src.frag +102 -0
- package/skills/agentvfx/templates/spectrum/_src/label-bars/pass0.src.frag +2 -0
- package/skills/agentvfx/templates/spectrum/_src/shared/bars-fn.glsl +64 -0
- package/skills/agentvfx/templates/spectrum/_src/shared/bars-pass.glsl +22 -0
- package/skills/agentvfx/templates/spectrum/_src/shared/clock.glsl +7 -0
- package/skills/agentvfx/templates/spectrum/_src/shared/hud.glsl +50 -0
- package/skills/agentvfx/templates/spectrum/_src/shared/stage.glsl +74 -0
- package/skills/agentvfx/templates/spectrum/_src/spectrum-particles/fx.src.json +58 -0
- package/skills/agentvfx/templates/spectrum/_src/spectrum-particles/main.src.frag +119 -0
- package/skills/agentvfx/templates/spectrum/_src/spectrum-particles/pass0.src.frag +33 -0
- package/skills/agentvfx/templates/spectrum/_src/spectrum-radial/fx.src.json +56 -0
- package/skills/agentvfx/templates/spectrum/_src/spectrum-radial/main.src.frag +95 -0
- package/skills/agentvfx/templates/spectrum/_src/spectrum-radial/pass0.src.frag +2 -0
- package/skills/agentvfx/templates/spectrum/_src/waveform-line/fx.src.json +60 -0
- package/skills/agentvfx/templates/spectrum/_src/waveform-line/main.src.frag +98 -0
- package/skills/agentvfx/templates/spectrum/_src/waveform-line/pass0.src.frag +43 -0
- package/skills/agentvfx/templates/spectrum/bars-linear/demo-graph-acid.json +1 -0
- package/skills/agentvfx/templates/spectrum/bars-linear/demo-graph-black.json +1 -0
- package/skills/agentvfx/templates/spectrum/bars-linear/fx.json +632 -0
- package/skills/agentvfx/templates/spectrum/bars-linear/main.frag +233 -0
- package/skills/agentvfx/templates/spectrum/bars-linear/pass0.frag +91 -0
- package/skills/agentvfx/templates/spectrum/bars-mirror/demo-field-acid.json +1 -0
- package/skills/agentvfx/templates/spectrum/bars-mirror/demo-field-ultramarine.json +1 -0
- package/skills/agentvfx/templates/spectrum/bars-mirror/fx.json +539 -0
- package/skills/agentvfx/templates/spectrum/bars-mirror/main.frag +193 -0
- package/skills/agentvfx/templates/spectrum/bars-mirror/pass0.frag +91 -0
- package/skills/agentvfx/templates/spectrum/bass-circle/demo-bracket-black.json +1 -0
- package/skills/agentvfx/templates/spectrum/bass-circle/demo-bracket-ultramarine.json +1 -0
- package/skills/agentvfx/templates/spectrum/bass-circle/fx.json +552 -0
- package/skills/agentvfx/templates/spectrum/bass-circle/main.frag +258 -0
- package/skills/agentvfx/templates/spectrum/bass-circle/pass0.frag +91 -0
- package/skills/agentvfx/templates/spectrum/label-bars/demo-deck-black.json +1 -0
- package/skills/agentvfx/templates/spectrum/label-bars/demo-deck-ultramarine.json +1 -0
- package/skills/agentvfx/templates/spectrum/label-bars/fx.json +552 -0
- package/skills/agentvfx/templates/spectrum/label-bars/main.frag +223 -0
- package/skills/agentvfx/templates/spectrum/label-bars/pass0.frag +91 -0
- package/skills/agentvfx/templates/spectrum/spectrum-particles/demo-cloud-black.json +1 -0
- package/skills/agentvfx/templates/spectrum/spectrum-particles/demo-cloud-ultramarine.json +1 -0
- package/skills/agentvfx/templates/spectrum/spectrum-particles/fx.json +584 -0
- package/skills/agentvfx/templates/spectrum/spectrum-particles/main.frag +240 -0
- package/skills/agentvfx/templates/spectrum/spectrum-particles/pass0.frag +101 -0
- package/skills/agentvfx/templates/spectrum/spectrum-radial/demo-starburst-black.json +1 -0
- package/skills/agentvfx/templates/spectrum/spectrum-radial/demo-starburst-ultramarine.json +1 -0
- package/skills/agentvfx/templates/spectrum/spectrum-radial/fx.json +566 -0
- package/skills/agentvfx/templates/spectrum/spectrum-radial/main.frag +217 -0
- package/skills/agentvfx/templates/spectrum/spectrum-radial/pass0.frag +91 -0
- package/skills/agentvfx/templates/spectrum/waveform-line/demo-strip-acid.json +1 -0
- package/skills/agentvfx/templates/spectrum/waveform-line/demo-strip-black.json +1 -0
- package/skills/agentvfx/templates/spectrum/waveform-line/fx.json +481 -0
- package/skills/agentvfx/templates/spectrum/waveform-line/main.frag +219 -0
- package/skills/agentvfx/templates/spectrum/waveform-line/pass0.frag +48 -0
- package/skills/agentvfx/templates/spectrum/waveform-line/pass1.frag +86 -0
- package/skills/agentvfx/test/_render_light.mjs +38 -0
- package/skills/agentvfx/test/audio-stereo.test.mjs +45 -0
- package/skills/agentvfx/test/audio.test.mjs +257 -0
- package/skills/agentvfx/test/brutal.test.mjs +190 -0
- package/skills/agentvfx/test/concept-collage-layout.test.mjs +236 -0
- package/skills/agentvfx/test/concept-collage-scenes.test.mjs +305 -0
- package/skills/agentvfx/test/concept-collage-typefx.test.mjs +153 -0
- package/skills/agentvfx/test/concept-collage.test.mjs +84 -0
- package/skills/agentvfx/test/concept-lattice.test.mjs +133 -0
- package/skills/agentvfx/test/concept-signal-cut.test.mjs +172 -0
- package/skills/agentvfx/test/credit-overlay.test.mjs +58 -0
- package/skills/agentvfx/test/credit.test.mjs +54 -0
- package/skills/agentvfx/test/doctor.test.mjs +31 -0
- package/skills/agentvfx/test/encode.test.mjs +22 -0
- package/skills/agentvfx/test/fixtures/r7-collage-LAYOUTS.json +5780 -0
- package/skills/agentvfx/test/fixtures/score-bad-duration.json +7 -0
- package/skills/agentvfx/test/fixtures/score-bad-safety.json +8 -0
- package/skills/agentvfx/test/fixtures/score-identity-footage.json +8 -0
- package/skills/agentvfx/test/fixtures/score-missing-template.json +7 -0
- package/skills/agentvfx/test/fixtures/score-ok.json +8 -0
- package/skills/agentvfx/test/fixtures/score-strobe-12hz.json +8 -0
- package/skills/agentvfx/test/fixtures/score-text-probe.json +1 -0
- package/skills/agentvfx/test/flash-audit.test.mjs +150 -0
- package/skills/agentvfx/test/flash.test.mjs +83 -0
- package/skills/agentvfx/test/footage.test.mjs +88 -0
- package/skills/agentvfx/test/glitch.test.mjs +272 -0
- package/skills/agentvfx/test/impact.test.mjs +231 -0
- package/skills/agentvfx/test/imports.test.mjs +39 -0
- package/skills/agentvfx/test/light.test.mjs +200 -0
- package/skills/agentvfx/test/loop.test.mjs +80 -0
- package/skills/agentvfx/test/psychedelic.test.mjs +99 -0
- package/skills/agentvfx/test/render.test.mjs +73 -0
- package/skills/agentvfx/test/sacred.test.mjs +175 -0
- package/skills/agentvfx/test/schema.test.mjs +103 -0
- package/skills/agentvfx/test/scope.test.mjs +306 -0
- package/skills/agentvfx/test/spectrum.test.mjs +165 -0
- package/skills/agentvfx/test/text.test.mjs +142 -0
- package/skills/agentvfx/test/web.test.mjs +400 -0
- package/skills/agentvfx/test-media/SOURCES.md +39 -0
- package/skills/agentvfx/test-media/beat-132.mp3 +0 -0
- package/skills/agentvfx/test-media/clip-01.mp4 +0 -0
- package/skills/agentvfx/test-media/clip-02.mp4 +0 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
// boot-log: monospace boot log typing over a field, dot-matrix emblem, corner + marks, side readouts,
|
|
2
|
+
// progress bar, then a decode headline. Scanlines, slight bloom, phosphor flicker and beat tears.
|
|
3
|
+
// brutal family shared GLSL (written fresh). Layout units are "design pixels" of a 1920x1080 frame:
|
|
4
|
+
// U real pixels per design unit, D the fragment position in design units (origin top-left, y down).
|
|
5
|
+
// Distance functions after the standard analytic forms (circle, box, segment, ellipse, equilateral
|
|
6
|
+
// triangle: Inigo Quilez, https://iquilezles.org/articles/distfunctions2d/); the 3x5 digit font, the
|
|
7
|
+
// dot screen, the Bayer matrix and the glyph icons are original.
|
|
8
|
+
float U;
|
|
9
|
+
vec2 D;
|
|
10
|
+
const float TAU = 6.28318530718;
|
|
11
|
+
|
|
12
|
+
void initDesign() {
|
|
13
|
+
U = RENDERSIZE.y / 1080.0;
|
|
14
|
+
D = vec2(gl_FragCoord.x, RENDERSIZE.y - gl_FragCoord.y) / U;
|
|
15
|
+
}
|
|
16
|
+
float designWidth() { return RENDERSIZE.x / U; }
|
|
17
|
+
|
|
18
|
+
float fillAA(float d) { return clamp(0.5 - d * U, 0.0, 1.0); }
|
|
19
|
+
float strokeAA(float d, float w) { return clamp((0.5 * w - abs(d)) * U + 0.5, 0.0, 1.0); }
|
|
20
|
+
float sdBox(vec2 p, vec2 h) { vec2 q = abs(p) - h; return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0); }
|
|
21
|
+
float sdRound(vec2 p, vec2 h, float r) { return sdBox(p, h - r) - r; }
|
|
22
|
+
// chamfered (octagon) rectangle: box cut by a diamond; c is the leg of each 45 degree corner cut
|
|
23
|
+
float sdChamfer(vec2 p, vec2 h, float c, float r) {
|
|
24
|
+
vec2 hh = h - r;
|
|
25
|
+
return max(sdBox(p, hh), (abs(p.x) + abs(p.y) - (hh.x + hh.y - c)) * 0.70710678) - r;
|
|
26
|
+
}
|
|
27
|
+
float sdSeg(vec2 p, vec2 a, vec2 b) {
|
|
28
|
+
vec2 pa = p - a;
|
|
29
|
+
vec2 ba = b - a;
|
|
30
|
+
return length(pa - ba * clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0));
|
|
31
|
+
}
|
|
32
|
+
float sdEll(vec2 p, vec2 r) {
|
|
33
|
+
float k0 = length(p / r);
|
|
34
|
+
float k1 = length(p / (r * r));
|
|
35
|
+
return k0 * (k0 - 1.0) / max(k1, 1e-4);
|
|
36
|
+
}
|
|
37
|
+
float sdTri(vec2 p, float r) {
|
|
38
|
+
const float k = 1.7320508;
|
|
39
|
+
p.x = abs(p.x) - r;
|
|
40
|
+
p.y = p.y + r / k;
|
|
41
|
+
if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;
|
|
42
|
+
p.x -= clamp(p.x, -2.0 * r, 0.0);
|
|
43
|
+
return -length(p) * sign(p.y);
|
|
44
|
+
}
|
|
45
|
+
float sdRhomb(vec2 p, vec2 h) { return (abs(p.x) / h.x + abs(p.y) / h.y - 1.0) * min(h.x, h.y) * 0.9; }
|
|
46
|
+
|
|
47
|
+
float plusMark(vec2 p, float arm) {
|
|
48
|
+
return max(strokeAA(sdSeg(p, vec2(-arm, 0.0), vec2(arm, 0.0)), 1.5), strokeAA(sdSeg(p, vec2(0.0, -arm), vec2(0.0, arm)), 1.5));
|
|
49
|
+
}
|
|
50
|
+
// radial lines between r0 and r1, n of them; spin rotates the whole burst, twist curls them
|
|
51
|
+
float burst(vec2 p, float r0, float r1, float n, float w, float spin, float twist) {
|
|
52
|
+
float r = length(p);
|
|
53
|
+
float a = atan(p.y, p.x) + spin + twist * r / max(r1, 1.0);
|
|
54
|
+
float sec = TAU / n;
|
|
55
|
+
float da = mod(a + 0.5 * sec, sec) - 0.5 * sec;
|
|
56
|
+
return strokeAA(r * sin(da), w) * step(r0, r) * step(r, r1);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// pixel-snapped origin, so the pixel fonts stay crisp
|
|
60
|
+
vec2 snapPx(vec2 o) { return floor(o * U + 0.5) / U; }
|
|
61
|
+
float cellPx(float cell) { return max(1.0, floor(cell * U + 0.5)) / U; }
|
|
62
|
+
|
|
63
|
+
// 3x5 digit font: 0-9, '-' (10), '.' (11); rows top to bottom, 3 bits per row
|
|
64
|
+
const int F3[12] = int[12](0x7B6F, 0x2C97, 0x73E7, 0x73CF, 0x5BC9, 0x79CF, 0x79EF, 0x7292, 0x7BEF, 0x7BCF, 0x01C0, 0x0002);
|
|
65
|
+
float glyph3(vec2 p, int g, float cell) {
|
|
66
|
+
ivec2 c = ivec2(floor(p / cell));
|
|
67
|
+
if (c.x < 0 || c.x > 2 || c.y < 0 || c.y > 4) return 0.0;
|
|
68
|
+
return float((F3[g] >> ((4 - c.y) * 3 + (2 - c.x))) & 1);
|
|
69
|
+
}
|
|
70
|
+
int digitOf(float a, int power) { return int(mod(floor(a * pow(10.0, -float(power))), 10.0)); }
|
|
71
|
+
// fixed-width number: sign slot, nInt integer digits, then '.' and nDec decimals; p from the top-left
|
|
72
|
+
float printNum(vec2 p, float v, int nInt, int nDec, float cell) {
|
|
73
|
+
float adv = 4.0 * cell;
|
|
74
|
+
int total = 1 + nInt + (nDec > 0 ? 1 + nDec : 0);
|
|
75
|
+
if (p.x < 0.0 || p.x >= float(total) * adv || p.y < 0.0 || p.y >= 5.0 * cell) return 0.0;
|
|
76
|
+
int idx = int(floor(p.x / adv));
|
|
77
|
+
vec2 q = vec2(p.x - float(idx) * adv, p.y);
|
|
78
|
+
int g = 11;
|
|
79
|
+
if (idx == 0) {
|
|
80
|
+
if (v >= 0.0) return 0.0;
|
|
81
|
+
g = 10;
|
|
82
|
+
} else if (idx <= nInt) {
|
|
83
|
+
g = digitOf(abs(v), nInt - idx);
|
|
84
|
+
} else if (idx > nInt + 1) {
|
|
85
|
+
g = digitOf(abs(v), -(idx - nInt - 1));
|
|
86
|
+
}
|
|
87
|
+
return glyph3(q, g, cell);
|
|
88
|
+
}
|
|
89
|
+
float numWidth(int nInt, int nDec, float cell) { return float(1 + nInt + (nDec > 0 ? 1 + nDec : 0)) * 4.0 * cell; }
|
|
90
|
+
|
|
91
|
+
// 8x8 Bayer threshold 0..1 for an integer pixel cell
|
|
92
|
+
float bayer8(vec2 cell) {
|
|
93
|
+
ivec2 i = ivec2(mod(floor(cell), 8.0));
|
|
94
|
+
int x = i.x;
|
|
95
|
+
int xy = i.x ^ i.y;
|
|
96
|
+
int v = ((xy & 1) << 5) | ((x & 1) << 4) | ((xy & 2) << 2) | ((x & 2) << 1) | ((xy & 4) >> 1) | ((x & 4) >> 2);
|
|
97
|
+
return (float(v) + 0.5) / 64.0;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
float beatPulse(float rate) { return AUDIO_BPM > 1.0 ? exp(-AUDIO_BEATPHASE * rate) : 0.0; }
|
|
101
|
+
|
|
102
|
+
// cover-fit UV into inputImage for a design-space point p inside a box (centre c, full size s)
|
|
103
|
+
vec2 coverUV(vec2 p, vec2 c, vec2 s) {
|
|
104
|
+
vec2 tex = IMG_SIZE(inputImage);
|
|
105
|
+
float ta = tex.x / tex.y;
|
|
106
|
+
float wa = s.x / s.y;
|
|
107
|
+
vec2 q = (p - c) / s;
|
|
108
|
+
q.y = -q.y;
|
|
109
|
+
vec2 vis = wa > ta ? vec2(1.0, ta / wa) : vec2(wa / ta, 1.0);
|
|
110
|
+
return 0.5 + q * vis;
|
|
111
|
+
}
|
|
112
|
+
vec3 mediaRaw(vec2 uv) {
|
|
113
|
+
if (HAS_INPUT) return texture(inputImage, uv).rgb;
|
|
114
|
+
float n = fbm(uv * 3.6 + vec2(TIME * 0.06, 0.0), 4);
|
|
115
|
+
float m = fbm(uv * 7.0 - vec2(0.0, TIME * 0.05) + 3.1, 3);
|
|
116
|
+
return vec3(smoothstep(0.3, 0.75, n) * (0.35 + 0.65 * m)) * vec3(1.0, 0.9, 0.78);
|
|
117
|
+
}
|
|
118
|
+
// dot-matrix emblem: a mirrored 13x13 cell pattern that re-rolls on beats, inside a bracket frame
|
|
119
|
+
float emblem(vec2 p, vec2 o, float pitch, float rollSeed) {
|
|
120
|
+
vec2 q = (p - o) / pitch;
|
|
121
|
+
vec2 id = floor(q);
|
|
122
|
+
if (id.x < 0.0 || id.y < 0.0 || id.x > 12.0 || id.y > 12.0) return 0.0;
|
|
123
|
+
vec2 m = vec2(abs(id.x - 6.0), id.y);
|
|
124
|
+
float reach = max(abs(id.x - 6.0), abs(id.y - 6.0));
|
|
125
|
+
float body = step(0.5, hash12(m + vec2(rollSeed * 1.7, 3.0)));
|
|
126
|
+
float rim = step(0.35, hash12(m + vec2(1.0, rollSeed)));
|
|
127
|
+
float on = mix(body, rim, step(5.5, reach));
|
|
128
|
+
on = max(on, step(reach, 1.5) * step(0.4, hash12(m + 9.0)));
|
|
129
|
+
vec2 f = fract(q) - 0.5;
|
|
130
|
+
return on * fillAA((length(f) - 0.34) * pitch);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// side readout column: rows of 4-digit codes that scroll and re-roll
|
|
134
|
+
float sideColumn(vec2 p, float x0, float y0, float seed, float cell) {
|
|
135
|
+
float rowH = 7.4 * cell;
|
|
136
|
+
float r = floor((p.y - y0) / rowH);
|
|
137
|
+
if (r < 0.0 || r > 38.0) return 0.0;
|
|
138
|
+
float scroll = floor(TIME * 6.0 + seed);
|
|
139
|
+
float v = floor(hash12(vec2(r + scroll, seed)) * 9999.0);
|
|
140
|
+
vec2 o = snapPx(vec2(x0, y0 + r * rowH));
|
|
141
|
+
float fade = step(0.18, hash12(vec2(r, seed + 4.0)));
|
|
142
|
+
return printNum(p - o, v, 4, 0, cell) * fade;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
float bloomTaps(vec2 uv, float rad) {
|
|
146
|
+
float s = 0.0;
|
|
147
|
+
for (int i = 0; i < 12; i++) {
|
|
148
|
+
float a = float(i) * 0.5236 + rad;
|
|
149
|
+
s += texture(TEXTMASK, uv + vec2(cos(a), sin(a)) * rad * U / RENDERSIZE).r;
|
|
150
|
+
}
|
|
151
|
+
return s * 0.0833;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
void main() {
|
|
155
|
+
initDesign();
|
|
156
|
+
float W = designWidth();
|
|
157
|
+
float pulse = beatPulse(9.0);
|
|
158
|
+
float beatOn = step(0.3, pulse);
|
|
159
|
+
vec2 uv = vUv;
|
|
160
|
+
// beat tear: row blocks slide
|
|
161
|
+
float row = floor(D.y / 16.0);
|
|
162
|
+
float f2 = float(FRAMEINDEX / 2);
|
|
163
|
+
uv.x += beatOn * tearAmount * (hash12(vec2(row, f2)) - 0.5) * 0.06 * step(0.7, hash12(vec2(row, f2 + 5.0)));
|
|
164
|
+
|
|
165
|
+
vec4 tm = HAS_TEXT ? texture(TEXTMASK, uv) : vec4(0.0);
|
|
166
|
+
float bloom = HAS_TEXT ? 0.4 * bloomTaps(uv, 3.0) + 0.35 * bloomTaps(uv, 8.0) + 0.25 * bloomTaps(uv, 16.0) : 0.0;
|
|
167
|
+
float tInk = tm.r;
|
|
168
|
+
bool headlineZone = D.y > 740.0 && D.y < 930.0;
|
|
169
|
+
|
|
170
|
+
vec3 col = fieldColor.rgb;
|
|
171
|
+
float ink = 0.0;
|
|
172
|
+
float dim = 0.0;
|
|
173
|
+
|
|
174
|
+
// pixel dust (clustered) and glowing data streaks
|
|
175
|
+
vec2 dc = floor(D / 8.0);
|
|
176
|
+
float cluster = smoothstep(0.55, 0.8, fbm(dc * 0.07 + vec2(TIME * 0.05, 0.0), 3));
|
|
177
|
+
dim = max(dim, cluster * step(0.955, hash12(dc + floor(TIME * 8.0))) * dustAmount);
|
|
178
|
+
for (int k = 0; k < 3; k++) {
|
|
179
|
+
float seedK = floor(TIME * 9.0) + float(k) * 13.0;
|
|
180
|
+
float yS = 240.0 + 640.0 * hash12(vec2(seedK, 1.0));
|
|
181
|
+
float x0 = W * hash12(vec2(seedK, 2.0));
|
|
182
|
+
float len = 120.0 + 520.0 * hash12(vec2(seedK, 3.0));
|
|
183
|
+
float on = step(0.45, hash12(vec2(seedK, 4.0))) * step(x0, D.x) * step(D.x, x0 + len);
|
|
184
|
+
float core = strokeAA(D.y - yS, 1.6) * on;
|
|
185
|
+
dim = max(dim, core * streakAmount);
|
|
186
|
+
col += inkColor.rgb * exp(-abs(D.y - yS) * 0.12) * on * streakAmount * 0.18 * (1.0 + pulse);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// emblem + brackets
|
|
190
|
+
float rv = clamp((TIME * 1000.0 - introMs * 0.2) / 140.0, 0.0, 1.0);
|
|
191
|
+
float roll = floor(TIME * 2.0) + float(FRAMEINDEX / 8) * beatOn;
|
|
192
|
+
ink = max(ink, emblem(D, vec2(64.0, 64.0), 10.0, roll) * rv);
|
|
193
|
+
vec2 ec = vec2(64.0 + 65.0, 64.0 + 65.0);
|
|
194
|
+
vec2 eq = abs(D - ec) / 74.0;
|
|
195
|
+
ink = max(ink, strokeAA(sdBox(D - ec, vec2(74.0)), 1.5) * step(0.62, min(eq.x, eq.y)) * rv);
|
|
196
|
+
|
|
197
|
+
// corner + marks
|
|
198
|
+
for (int i = 0; i < 4; i++) {
|
|
199
|
+
vec2 c = vec2(i % 2 == 0 ? 36.0 : W - 36.0, i < 2 ? 74.0 : 1006.0);
|
|
200
|
+
ink = max(ink, plusMark(D - c, 10.0));
|
|
201
|
+
}
|
|
202
|
+
// side readouts (right and a thin left tick column)
|
|
203
|
+
float cell = cellPx(2.6);
|
|
204
|
+
dim = max(dim, sideColumn(D, W - 150.0, 262.0, 3.0, cell) * rv);
|
|
205
|
+
dim = max(dim, sideColumn(D, W - 90.0, 262.0, 11.0, cell) * rv * 0.7);
|
|
206
|
+
for (int i = 0; i < 24; i++) {
|
|
207
|
+
float yT = 262.0 + float(i) * 29.6;
|
|
208
|
+
dim = max(dim, strokeAA(sdSeg(D, vec2(W - 170.0, yT), vec2(W - 170.0 + (i % 4 == 0 ? 14.0 : 7.0), yT)), 1.2));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// progress bar: dot-matrix blocks, completes with the log
|
|
212
|
+
float prog = clamp((TIME - 0.2) / max(logDone - 0.2, 0.1), 0.0, 1.0);
|
|
213
|
+
vec2 bo = vec2(64.0, 936.0);
|
|
214
|
+
vec2 bp = D - bo;
|
|
215
|
+
float blocks = step(0.0, bp.x) * step(bp.x, 640.0) * step(0.0, bp.y) * step(bp.y, 16.0);
|
|
216
|
+
float bi = floor(bp.x / 10.0);
|
|
217
|
+
float full = step(bi, prog * 64.0 - 1.0);
|
|
218
|
+
float cellIn = step(fract(bp.x / 10.0), 0.78) * step(2.0, bp.y) * step(bp.y, 14.0);
|
|
219
|
+
ink = max(ink, blocks * cellIn * full);
|
|
220
|
+
dim = max(dim, blocks * cellIn * (1.0 - full) * 0.6);
|
|
221
|
+
ink = max(ink, strokeAA(sdBox(bp - vec2(320.0, 8.0), vec2(324.0, 12.0)), 1.3));
|
|
222
|
+
ink = max(ink, printNum(D - snapPx(vec2(700.0, 936.0)), floor(prog * 100.0), 2, 0, cellPx(3.2)) * 1.0);
|
|
223
|
+
|
|
224
|
+
col = mix(col, inkColor.rgb, clamp(dim, 0.0, 1.0) * 0.55);
|
|
225
|
+
float t = tInk * clamp((TIME * 1000.0 - introMs * 0.05) / 100.0, 0.0, 1.0);
|
|
226
|
+
vec3 textCol = headlineZone ? hotColor.rgb : inkColor.rgb;
|
|
227
|
+
col = mix(col, inkColor.rgb, clamp(ink, 0.0, 1.0));
|
|
228
|
+
col = mix(col, textCol, clamp(t, 0.0, 1.0));
|
|
229
|
+
col = mix(col, inkColor.rgb, clamp(bloom * bloomAmount, 0.0, 1.0) * (1.0 - t) * 0.6);
|
|
230
|
+
|
|
231
|
+
// CRT: scanlines, flicker, vignette, curved letterbox
|
|
232
|
+
float scan = 1.0 - scanAmount * 0.5 * (1.0 + sin(gl_FragCoord.y * 3.14159));
|
|
233
|
+
float flick = 1.0 - flickerAmount * hash12(vec2(float(FRAMEINDEX), 3.0)) * (0.4 + pulse);
|
|
234
|
+
vec2 vq = vUv * 2.0 - 1.0;
|
|
235
|
+
float vig = 1.0 - vignette * dot(vq * vec2(0.7, 0.9), vq * vec2(0.7, 0.9));
|
|
236
|
+
col *= scan * flick * vig;
|
|
237
|
+
float u2 = pow(2.0 * vUv.x - 1.0, 2.0);
|
|
238
|
+
float edge = letterbox * (1.0 - 0.5 * (1.0 - u2));
|
|
239
|
+
float yd = min(D.y, 1080.0 - D.y);
|
|
240
|
+
col = mix(vec3(0.0), col, clamp((yd - edge) * U + 0.5, 0.0, 1.0));
|
|
241
|
+
fragColor = vec4(col, 1.0);
|
|
242
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// collage main (generated from _src/*.glsl by _src/build.mjs; edit the parts, not this file).
|
|
2
|
+
// A collage on a 32 x 18 grid. Pass 0 decodes up to 16 cells (cell0.., style0.., src0.. inputs; or a seeded
|
|
3
|
+
// partition rebuilt on every cut in reshuffle mode) into the state texture; this pass draws them in list order.
|
|
4
|
+
// A cell is either the old boxed "tile" panel (gutter, header strip, frame) or an editorial cell with no box
|
|
5
|
+
// of its own: footage, hairline spectrum / scope / meters, live numbers, registration marks, rules and "type"
|
|
6
|
+
// cells that window the engine text sheet. Pixel units: U = pixels per design pixel at 1080p. Cells hold their
|
|
7
|
+
// place; only the instruments move, and nothing eases.
|
|
8
|
+
float U;
|
|
9
|
+
float HW;
|
|
10
|
+
const int MAXL = 16;
|
|
11
|
+
const float HEAD = 22.0;
|
|
12
|
+
|
|
13
|
+
float hlw(float d, float w) { return clamp(w * 0.5 - abs(d) + 0.5, 0.0, 1.0); }
|
|
14
|
+
float hl(float d) { return hlw(d, HW); }
|
|
15
|
+
float cov(float d) { return clamp(0.5 - d, 0.0, 1.0); }
|
|
16
|
+
float inBox(vec2 p, vec2 lo, vec2 hi) { return step(lo.x, p.x) * step(p.x, hi.x) * step(lo.y, p.y) * step(p.y, hi.y); }
|
|
17
|
+
float boxLnW(vec2 p, vec2 lo, vec2 hi, float w) {
|
|
18
|
+
vec2 q = abs(p - (lo + hi) * 0.5) - (hi - lo) * 0.5;
|
|
19
|
+
return hlw(max(q.x, q.y), w);
|
|
20
|
+
}
|
|
21
|
+
float dashed(float x, float period, float duty) { return step(fract(x / (period * U)), duty); }
|
|
22
|
+
float plusAt(vec2 p, vec2 c, float arm) {
|
|
23
|
+
vec2 d = abs(p - c);
|
|
24
|
+
return max(hl(d.y) * step(d.x, arm), hl(d.x) * step(d.y, arm));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
vec4 stClock() { return texelFetch(state, ivec2(0, 0), 0); }
|
|
28
|
+
vec4 stLevel() { return texelFetch(state, ivec2(1, 0), 0); }
|
|
29
|
+
vec4 stHit() { return texelFetch(state, ivec2(3, 0), 0); }
|
|
30
|
+
float stBand(int i) { return texelFetch(state, ivec2(i, 1), 0).r; }
|
|
31
|
+
|
|
32
|
+
// 3 x 5 pixel font, 3 bits per row, row 0 at the top. Index: 0-9, A-Z (10..35), . - + / : % (36..41).
|
|
33
|
+
//@FONT@
|
|
34
|
+
int fontIndex(int ch) {
|
|
35
|
+
if (ch >= 48 && ch <= 57) { return ch - 48; }
|
|
36
|
+
if (ch >= 65 && ch <= 90) { return ch - 55; }
|
|
37
|
+
if (ch == 46) { return 36; }
|
|
38
|
+
if (ch == 45) { return 37; }
|
|
39
|
+
if (ch == 43) { return 38; }
|
|
40
|
+
if (ch == 47) { return 39; }
|
|
41
|
+
if (ch == 58) { return 40; }
|
|
42
|
+
if (ch == 37) { return 41; }
|
|
43
|
+
return -1;
|
|
44
|
+
}
|
|
45
|
+
float cellPx(float c) { return max(1.0, floor(c + 0.5)); }
|
|
46
|
+
float glyphAt(vec2 p, int ch, float cell) {
|
|
47
|
+
int gi = fontIndex(ch);
|
|
48
|
+
if (gi < 0 || p.x < 0.0 || p.y < 0.0) { return 0.0; }
|
|
49
|
+
ivec2 c = ivec2(floor(p / cell));
|
|
50
|
+
if (c.x > 2 || c.y > 4) { return 0.0; }
|
|
51
|
+
return float((FONT[gi] >> ((4 - c.y) * 3 + (2 - c.x))) & 1);
|
|
52
|
+
}
|
|
53
|
+
// up to four characters (ASCII codes, 0 = none) from the top-left o; advance is 4 cells
|
|
54
|
+
float txt4(vec2 p, vec2 o, float cell, int a, int b, int c, int d) {
|
|
55
|
+
vec2 q = p - o;
|
|
56
|
+
if (q.x < 0.0 || q.y < 0.0) { return 0.0; }
|
|
57
|
+
float adv = 4.0 * cell;
|
|
58
|
+
int i = int(floor(q.x / adv));
|
|
59
|
+
if (i > 3) { return 0.0; }
|
|
60
|
+
int ch = i == 0 ? a : (i == 1 ? b : (i == 2 ? c : d));
|
|
61
|
+
return glyphAt(vec2(q.x - float(i) * adv, q.y), ch, cell);
|
|
62
|
+
}
|
|
63
|
+
// non-negative integer with nd digits
|
|
64
|
+
float numTxt(vec2 p, vec2 o, float cell, float v, int nd) {
|
|
65
|
+
vec2 q = p - o;
|
|
66
|
+
if (q.x < 0.0 || q.y < 0.0) { return 0.0; }
|
|
67
|
+
float adv = 4.0 * cell;
|
|
68
|
+
int i = int(floor(q.x / adv));
|
|
69
|
+
if (i >= nd) { return 0.0; }
|
|
70
|
+
int dg = int(mod(floor(v / pow(10.0, float(nd - 1 - i)) + 0.001), 10.0));
|
|
71
|
+
return glyphAt(vec2(q.x - float(i) * adv, q.y), 48 + dg, cell);
|
|
72
|
+
}
|
|
73
|
+
float numW(int nd, float cell) { return float(nd) * 4.0 * cell - cell; }
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Panels return vec3(ink, accent, negative) coverage; q is in pixels from the panel's top-left, S its size.
|
|
2
|
+
|
|
3
|
+
// spectrum steps: columns of dashes that light in whole rows, accent on the top row of each column
|
|
4
|
+
vec3 pSpectrum(vec2 q, vec2 S) {
|
|
5
|
+
float pad = 10.0 * U;
|
|
6
|
+
vec2 lo = vec2(pad, HEAD * U + pad);
|
|
7
|
+
vec2 hi = vec2(S.x - pad, S.y - pad - 14.0 * U);
|
|
8
|
+
vec2 sz = hi - lo;
|
|
9
|
+
float ink = 0.0;
|
|
10
|
+
float acc = 0.0;
|
|
11
|
+
float xr = step(lo.x, q.x) * step(q.x, hi.x);
|
|
12
|
+
for (int r = 1; r < 4; r++) {
|
|
13
|
+
float yr = hi.y - sz.y * float(r) / 4.0;
|
|
14
|
+
ink = max(ink, hl(q.y - yr) * dashed(q.x, 6.0, 0.35) * xr * 0.4);
|
|
15
|
+
}
|
|
16
|
+
ink = max(ink, hl(q.y - hi.y) * xr);
|
|
17
|
+
float pitch = sz.x / float(bands);
|
|
18
|
+
float cx = q.x - lo.x;
|
|
19
|
+
int b = int(floor(cx / pitch));
|
|
20
|
+
if (cx >= 0.0 && b < bands) {
|
|
21
|
+
float rows = max(floor(sz.y / (6.0 * U)), 4.0);
|
|
22
|
+
float rowH = sz.y / rows;
|
|
23
|
+
float lit = floor(stBand(b) * rows + 0.5);
|
|
24
|
+
float y = hi.y - q.y;
|
|
25
|
+
float xin = mod(cx, pitch);
|
|
26
|
+
float on = step(0.0, y) * step(floor(y / rowH), lit - 1.0) * step(U, xin) * step(xin, pitch - U) * step(fract(y / rowH), 0.7) * step(0.5, lit);
|
|
27
|
+
ink = max(ink, on * 0.6);
|
|
28
|
+
acc = max(acc, on * step(lit - 1.5, floor(y / rowH)));
|
|
29
|
+
}
|
|
30
|
+
float span = log(endFreq / startFreq);
|
|
31
|
+
for (int k = 0; k < 3; k++) {
|
|
32
|
+
float f = k == 0 ? 100.0 : (k == 1 ? 1000.0 : 10000.0);
|
|
33
|
+
float tx = log(f / startFreq) / span;
|
|
34
|
+
if (tx <= 0.0 || tx >= 1.0) { continue; }
|
|
35
|
+
float x = lo.x + tx * sz.x;
|
|
36
|
+
ink = max(ink, hl(q.x - x) * step(hi.y, q.y) * step(q.y, hi.y + 5.0 * U));
|
|
37
|
+
float c = cellPx(2.0 * U);
|
|
38
|
+
ink = max(ink, k == 0 ? txt4(q, vec2(x + 3.0 * U, hi.y + 5.0 * U), c, 49, 48, 48, 0) : (k == 1 ? txt4(q, vec2(x + 3.0 * U, hi.y + 5.0 * U), c, 49, 75, 0, 0) : txt4(q, vec2(x + 3.0 * U, hi.y + 5.0 * U), c, 49, 48, 75, 0)));
|
|
39
|
+
}
|
|
40
|
+
return vec3(ink, acc, 0.0);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
float waveAt(float i) { return texture(audio, vec2((clamp(i, 0.0, 511.0) + 0.5) / 512.0, 0.25)).r - 0.5; }
|
|
44
|
+
float waveI(float i) {
|
|
45
|
+
float f = floor(i);
|
|
46
|
+
return mix(waveAt(f), waveAt(f + 1.0), i - f);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// scope trace: dashed graticule, centre axis with ticks, a trigger-aligned trace drawn as the vertical
|
|
50
|
+
// extent of the wave across each pixel column so steep edges stay solid
|
|
51
|
+
vec3 pScope(vec2 q, vec2 S) {
|
|
52
|
+
float pad = 10.0 * U;
|
|
53
|
+
vec2 lo = vec2(pad, HEAD * U + pad);
|
|
54
|
+
vec2 hi = S - vec2(pad);
|
|
55
|
+
vec2 sz = hi - lo;
|
|
56
|
+
float yc = (lo.y + hi.y) * 0.5;
|
|
57
|
+
float inb = inBox(q, lo, hi);
|
|
58
|
+
float ink = 0.0;
|
|
59
|
+
for (int k = 1; k < 8; k++) { ink = max(ink, hl(q.x - (lo.x + sz.x * float(k) / 8.0)) * dashed(q.y, 6.0, 0.3) * inb * 0.35); }
|
|
60
|
+
for (int k = 1; k < 4; k++) { ink = max(ink, hl(q.y - (lo.y + sz.y * float(k) / 4.0)) * dashed(q.x, 6.0, 0.3) * inb * 0.35); }
|
|
61
|
+
float tick = step(abs(q.y - yc), (fract((q.x - lo.x) / (sz.x / 40.0) + 0.5) < 0.1 ? 3.0 : 0.0) * U) * inb;
|
|
62
|
+
ink = max(ink, max(hl(q.y - yc) * inb * 0.7, tick * 0.7));
|
|
63
|
+
ink = max(ink, max(hl(q.x - lo.x + 5.0 * U), 0.0) * step(abs(q.y - yc), 4.0 * U) * step(q.x, lo.x));
|
|
64
|
+
float dx = 0.5 / sz.x * 511.0;
|
|
65
|
+
float t = (q.x - lo.x) / sz.x * 511.0;
|
|
66
|
+
float yA = yc - waveI(t - dx) * scopeGain * sz.y;
|
|
67
|
+
float yB = yc - waveI(t + dx) * scopeGain * sz.y;
|
|
68
|
+
float yMin = clamp(min(yA, yB), lo.y, hi.y);
|
|
69
|
+
float yMax = clamp(max(yA, yB), lo.y, hi.y);
|
|
70
|
+
float d = max(max(yMin - q.y, q.y - yMax), 0.0);
|
|
71
|
+
float acc = hlw(d, HW * 1.15) * step(lo.x, q.x) * step(q.x, hi.x);
|
|
72
|
+
return vec3(ink, acc, 0.0);
|
|
73
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// level meter: four segmented channels (bass, mid, treble, rms) that fill in whole segments, accent on the
|
|
2
|
+
// top lit segment and the clip zone; the long side of the panel is the scale
|
|
3
|
+
vec3 pMeter(vec2 q, vec2 S) {
|
|
4
|
+
vec4 lv = stLevel();
|
|
5
|
+
float pad = 10.0 * U;
|
|
6
|
+
vec2 lo = vec2(pad, HEAD * U + pad);
|
|
7
|
+
vec2 hi = vec2(S.x - pad, S.y - pad - 12.0 * U);
|
|
8
|
+
vec2 a = q - lo;
|
|
9
|
+
vec2 sz = hi - lo;
|
|
10
|
+
bool vert = S.y >= S.x * 0.75;
|
|
11
|
+
float len = vert ? sz.y : sz.x;
|
|
12
|
+
float wid = vert ? sz.x : sz.y;
|
|
13
|
+
float along = vert ? sz.y - a.y : a.x;
|
|
14
|
+
float across = vert ? a.x : a.y;
|
|
15
|
+
float chW = wid / 4.0;
|
|
16
|
+
float c = cellPx(2.0 * U);
|
|
17
|
+
vec2 lp = q - vec2(lo.x, hi.y + 4.0 * U);
|
|
18
|
+
int lc = int(clamp(floor(lp.x / chW), 0.0, 3.0));
|
|
19
|
+
vec2 lo_ = vec2(lp.x - float(lc) * chW - (chW * 0.5 - 6.0 * c), lp.y);
|
|
20
|
+
float labels = !vert || lp.x < 0.0 ? 0.0 : (lc == 0 ? txt4(lo_, vec2(0.0), c, 66, 83, 83, 0) : (lc == 1 ? txt4(lo_, vec2(0.0), c, 77, 73, 68, 0) : (lc == 2 ? txt4(lo_, vec2(0.0), c, 84, 82, 66, 0) : txt4(lo_, vec2(0.0), c, 82, 77, 83, 0))));
|
|
21
|
+
if (along < 0.0 || across < 0.0 || along >= len || across >= wid) { return vec3(labels, 0.0, 0.0); }
|
|
22
|
+
int ch = int(floor(across / chW));
|
|
23
|
+
float within = fract(across / chW);
|
|
24
|
+
float nseg = max(floor(len / (6.0 * U)), 8.0);
|
|
25
|
+
float segLen = len / nseg;
|
|
26
|
+
float seg = floor(along / segLen);
|
|
27
|
+
float lit = floor(lv[ch] * nseg + 0.5);
|
|
28
|
+
float shape = step(fract(along / segLen), 0.68) * step(0.16, within) * step(within, 0.84);
|
|
29
|
+
float on = shape * step(seg, lit - 1.0) * step(0.5, lit);
|
|
30
|
+
float off = shape * (1.0 - on) * 0.16;
|
|
31
|
+
float clip = step(nseg * 0.8, seg);
|
|
32
|
+
float top = step(lit - 1.5, seg);
|
|
33
|
+
float acc = on * max(clip, top);
|
|
34
|
+
float ink = max(on * (1.0 - acc) * 0.85, off);
|
|
35
|
+
return vec3(max(ink, labels), acc, 0.0);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// readout: one large three digit number (rms x 999), then smaller rows for tempo, cut index and frame
|
|
39
|
+
vec3 pReadout(vec2 q, vec2 S, vec4 clk) {
|
|
40
|
+
vec4 lv = stLevel();
|
|
41
|
+
float pad = 10.0 * U;
|
|
42
|
+
float top = HEAD * U + pad;
|
|
43
|
+
float big = cellPx(min((S.x - 2.0 * pad) / 11.0, (S.y - top) * 0.42 / 5.0));
|
|
44
|
+
float ink = numTxt(q, vec2(pad, top), big, floor(lv.a * 999.0), 3);
|
|
45
|
+
float small = cellPx(min(4.0 * U, big * 0.5));
|
|
46
|
+
float rowStep = 5.0 * small + 8.0 * U;
|
|
47
|
+
float y0 = S.y - pad - 5.0 * small - 2.0 * rowStep;
|
|
48
|
+
ink = max(ink, hl(q.y - (y0 - 6.0 * U)) * step(pad, q.x) * step(q.x, S.x - pad) * 0.6);
|
|
49
|
+
float valX = pad + 16.0 * small;
|
|
50
|
+
ink = max(ink, txt4(q, vec2(pad, y0), small, 66, 80, 77, 0) + numTxt(q, vec2(valX, y0), small, floor(AUDIO_BPM), 3));
|
|
51
|
+
ink = max(ink, txt4(q, vec2(pad, y0 + rowStep), small, 67, 85, 84, 0) + numTxt(q, vec2(valX, y0 + rowStep), small, mod(clk.x, 1000.0), 3));
|
|
52
|
+
ink = max(ink, txt4(q, vec2(pad, y0 + 2.0 * rowStep), small, 70, 82, 77, 0) + numTxt(q, vec2(valX, y0 + 2.0 * rowStep), small, mod(float(FRAMEINDEX), 1000.0), 3));
|
|
53
|
+
float pulse = step(float(FRAMEINDEX) - clk.w, 1.5) * step(0.5, clk.z);
|
|
54
|
+
float lamp = inBox(q, vec2(S.x - pad - 10.0 * U, top), vec2(S.x - pad, top + 10.0 * U));
|
|
55
|
+
return vec3(min(ink, 1.0), lamp * pulse, 0.0);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// crosshair: hairlines through a target that follows the spectral balance (x) and loudness (y), tick
|
|
59
|
+
// scales, a ring that tracks rms and a second ring that steps outward for three frames after each onset
|
|
60
|
+
vec3 pCross(vec2 q, vec2 S, vec4 clk) {
|
|
61
|
+
vec4 lv = stLevel();
|
|
62
|
+
float pad = 10.0 * U;
|
|
63
|
+
vec2 lo = vec2(pad, HEAD * U + pad);
|
|
64
|
+
vec2 hi = S - vec2(pad);
|
|
65
|
+
vec2 ctr = (lo + hi) * 0.5;
|
|
66
|
+
vec2 half_ = (hi - lo) * 0.5;
|
|
67
|
+
vec2 tp = ctr + half_ * vec2(0.6 * (lv.b - lv.r), -0.7 * (lv.a * 1.8 - 0.7));
|
|
68
|
+
tp = clamp(tp, lo + 8.0 * U, hi - 8.0 * U);
|
|
69
|
+
float inb = inBox(q, lo, hi);
|
|
70
|
+
vec2 d = q - tp;
|
|
71
|
+
float ink = max(hl(d.y) * inb, hl(d.x) * inb) * 0.8;
|
|
72
|
+
float tickX = step(abs(d.y), (fract(d.x / (8.0 * U) + 0.5) < 0.12 ? (fract(d.x / (40.0 * U) + 0.5) < 0.12 ? 7.0 : 3.5) : 0.0) * U);
|
|
73
|
+
float tickY = step(abs(d.x), (fract(d.y / (8.0 * U) + 0.5) < 0.12 ? (fract(d.y / (40.0 * U) + 0.5) < 0.12 ? 7.0 : 3.5) : 0.0) * U);
|
|
74
|
+
ink = max(ink, max(tickX, tickY) * inb);
|
|
75
|
+
float r = length(d);
|
|
76
|
+
float base = min(half_.x, half_.y);
|
|
77
|
+
float ringA = hl(r - base * (0.2 + 0.45 * lv.a));
|
|
78
|
+
float hitF = float(FRAMEINDEX) - clk.w;
|
|
79
|
+
float ringB = hitF < 3.0 && clk.z > 0.5 ? hl(r - base * (0.8 + 0.3 * hitF)) : 0.0;
|
|
80
|
+
float dot_ = inBox(d, vec2(-3.0 * U), vec2(3.0 * U));
|
|
81
|
+
float mid = hl(length(q - ctr) - base * 0.75) * dashed(atan(q.y - ctr.y, q.x - ctr.x) * base * 0.75, 7.0, 0.35) * 0.4;
|
|
82
|
+
float acc = max(max(ringA, ringB), dot_) * inb;
|
|
83
|
+
float c = cellPx(2.0 * U);
|
|
84
|
+
float xy = numTxt(q, vec2(lo.x + 4.0 * U, hi.y - 12.0 * U), c, floor(clamp((tp.x - lo.x) / (hi.x - lo.x), 0.0, 1.0) * 999.0), 3)
|
|
85
|
+
+ numTxt(q, vec2(hi.x - numW(3, c) - 4.0 * U, hi.y - 12.0 * U), c, floor(clamp(1.0 - (tp.y - lo.y) / (hi.y - lo.y), 0.0, 1.0) * 999.0), 3);
|
|
86
|
+
return vec3(min(max(ink, max(mid, xy)), 1.0), acc, 0.0);
|
|
87
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// footage: cover-fit into the cell below `top` (the tile header height, 0 for editorial cells), contrast curve,
|
|
2
|
+
// optional single-tone mix, saturation and dim, scanlines. Variants 1..4 lay a dark scrim over it (bottom, top,
|
|
3
|
+
// left, vignette, bottom plus vignette) so type reads on top. Without an input the cell shows a crossed empty-media mark.
|
|
4
|
+
vec3 footageBody(vec2 q, vec2 S, float top, int variant) {
|
|
5
|
+
vec2 lo = vec2(0.0, top);
|
|
6
|
+
vec2 sz = S - lo;
|
|
7
|
+
vec2 d = (q - (lo + S) * 0.5) / sz;
|
|
8
|
+
vec2 tex = IMG_SIZE(inputImage);
|
|
9
|
+
float ta = tex.x / tex.y;
|
|
10
|
+
float wa = sz.x / sz.y;
|
|
11
|
+
vec2 vis = wa > ta ? vec2(1.0, ta / wa) : vec2(wa / ta, 1.0);
|
|
12
|
+
vec3 c = texture(inputImage, vec2(0.5 + d.x * vis.x, 0.5 - d.y * vis.y)).rgb;
|
|
13
|
+
c = max((c - 0.18) * footageContrast + 0.18, 0.0);
|
|
14
|
+
vec3 duo = mix(groundColor.rgb, inkColor.rgb, smoothstep(0.02, 0.6, luma(c)));
|
|
15
|
+
c = mix(c, duo, footageTone);
|
|
16
|
+
c = mix(vec3(luma(c)), c, footageSat) * (1.0 - footageDim);
|
|
17
|
+
vec2 u = (q - lo) / sz;
|
|
18
|
+
float scrim = 1.0;
|
|
19
|
+
if (variant == 1) { scrim = smoothstep(0.32, 1.0, u.y); }
|
|
20
|
+
if (variant == 2) { scrim = smoothstep(0.68, 0.0, u.y); }
|
|
21
|
+
if (variant == 3) { scrim = smoothstep(0.7, 0.0, u.x); }
|
|
22
|
+
if (variant == 4) { scrim = smoothstep(0.35, 1.0, length((u - 0.5) * vec2(1.0, 1.15)) * 1.6); }
|
|
23
|
+
if (variant == 5) { scrim = max(smoothstep(0.3, 0.95, u.y), smoothstep(0.3, 1.0, length((u - 0.5) * vec2(1.0, 1.25)) * 1.5) * 0.85); }
|
|
24
|
+
if (variant == 6) { scrim = 0.93; }
|
|
25
|
+
if (variant == 7) { scrim = 0.55; }
|
|
26
|
+
c *= mix(1.0, 0.1, scrim * step(0.5, float(variant)));
|
|
27
|
+
return c * (1.0 - footageScan * step(0.5, fract(q.y / (3.0 * U))));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
float hatch(vec2 q, float pitch) { return hl(mod(q.x + q.y, pitch * U) - pitch * 0.5 * U); }
|
|
31
|
+
|
|
32
|
+
// fillers: 7 = ruler or pixel cluster, 8 = accent plate with the cut number or hatching, 9 = sparse hatch
|
|
33
|
+
vec3 pFiller(int role, vec2 q, vec2 S, float hs, vec4 clk) {
|
|
34
|
+
float pad = 10.0 * U;
|
|
35
|
+
float top = HEAD * U;
|
|
36
|
+
bool wide = S.x >= S.y;
|
|
37
|
+
if (role == 7 && hs < 0.5) {
|
|
38
|
+
float along = wide ? q.x : S.y - q.y;
|
|
39
|
+
float across = wide ? S.y - q.y : q.x;
|
|
40
|
+
float k = floor(along / (8.0 * U) + 0.5);
|
|
41
|
+
float len = (mod(k, 5.0) < 0.5 ? 14.0 : 6.0) * U;
|
|
42
|
+
float tk = step(abs(along - k * 8.0 * U), HW * 0.5 + 0.5) * step(across, len) * step(top, q.y) * step(pad * 0.5, along);
|
|
43
|
+
float base = hl(across) * step(top, q.y);
|
|
44
|
+
float c = cellPx(2.0 * U);
|
|
45
|
+
float mj = floor((along - 3.0 * U) / (40.0 * U));
|
|
46
|
+
vec2 o = wide ? vec2(mj * 40.0 * U + 3.0 * U, S.y - 18.0 * U - 5.0 * c) : vec2(18.0 * U, S.y - (mj * 40.0 * U + 3.0 * U) - 5.0 * c);
|
|
47
|
+
float nTxt = mj >= 0.0 ? numTxt(q, o, c, mod(mj, 100.0), 2) * step(top + 3.0 * U, q.y) : 0.0;
|
|
48
|
+
return vec3(max(max(tk, base) * 0.8, nTxt), 0.0, 0.0);
|
|
49
|
+
}
|
|
50
|
+
if (role == 7) {
|
|
51
|
+
vec2 g = (q - vec2(pad, top + pad)) / (11.0 * U);
|
|
52
|
+
vec2 id = floor(g + 0.5);
|
|
53
|
+
float lit = step(0.72, fract(sin(dot(id + clk.x * 1.7, vec2(12.9898, 78.233))) * 43758.5453));
|
|
54
|
+
float dotc = cov(length((g - id) * 11.0 * U) - (1.2 + 1.3 * lit) * U) * inBox(q, vec2(pad, top + pad), S - vec2(pad));
|
|
55
|
+
return vec3(dotc * (1.0 - lit) * 0.7, dotc * lit, 0.0);
|
|
56
|
+
}
|
|
57
|
+
if (role == 8 && hs < 0.6 && plateAmount > 0.5) {
|
|
58
|
+
float cn = cellPx(min(S.x * 0.78 / 11.0, S.y * 0.5 / 5.0));
|
|
59
|
+
vec2 o = vec2(pad, S.y - pad - 5.0 * cn);
|
|
60
|
+
return vec3(0.0, 1.0, numTxt(q, o, cn, mod(clk.x, 1000.0), 3));
|
|
61
|
+
}
|
|
62
|
+
float hp = role == 8 ? 9.0 : 16.0;
|
|
63
|
+
float amt = role == 8 ? 0.5 : 0.28;
|
|
64
|
+
float h = hatch(q, hp) * step(top, q.y) * amt;
|
|
65
|
+
float cr = role == 9 ? plusAt(q, (vec2(0.0, top) + S) * 0.5, min(S.x, S.y) * 0.12) : 0.0;
|
|
66
|
+
return vec3(max(h, cr), 0.0, 0.0);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// header strip: frame, rule under the label, role tag, and the cut number (or timecode for the footage panel)
|
|
70
|
+
vec3 panelHead(int role, float hs, vec2 q, vec2 S, vec4 clk, float snap) {
|
|
71
|
+
float w = snap > 0.5 ? HW * 3.0 : HW;
|
|
72
|
+
float frame = boxLnW(q, vec2(0.0), S, w);
|
|
73
|
+
float rule = hl(q.y - HEAD * U) * step(0.0, q.x) * step(q.x, S.x);
|
|
74
|
+
float c = cellPx(2.5 * U);
|
|
75
|
+
vec2 o = vec2(8.0 * U, (HEAD * U - 5.0 * c) * 0.5);
|
|
76
|
+
float tag = role == 1 ? txt4(q, o, c, 83, 82, 67, 0) : (role == 2 ? txt4(q, o, c, 70, 70, 84, 0) : (role == 3 ? txt4(q, o, c, 79, 83, 67, 0)
|
|
77
|
+
: (role == 4 ? txt4(q, o, c, 76, 86, 76, 0) : (role == 5 ? txt4(q, o, c, 78, 85, 77, 0) : (role == 6 ? txt4(q, o, c, 88, 72, 82, 0)
|
|
78
|
+
: (role == 7 ? (hs < 0.5 ? txt4(q, o, c, 82, 85, 76, 0) : txt4(q, o, c, 80, 73, 88, 0)) : txt4(q, o, c, 72, 67, 72, 0)))))));
|
|
79
|
+
float right = 0.0;
|
|
80
|
+
if (role == 1) {
|
|
81
|
+
float tc = TIME;
|
|
82
|
+
float x0 = S.x - 8.0 * U - 31.0 * c;
|
|
83
|
+
vec2 p = vec2(x0, o.y);
|
|
84
|
+
right = numTxt(q, p, c, floor(tc / 60.0), 2) + glyphAt(q - p - vec2(8.0 * c, 0.0), 58, c)
|
|
85
|
+
+ numTxt(q, p + vec2(12.0 * c, 0.0), c, mod(floor(tc), 60.0), 2) + glyphAt(q - p - vec2(20.0 * c, 0.0), 58, c)
|
|
86
|
+
+ numTxt(q, p + vec2(24.0 * c, 0.0), c, mod(float(FRAMEINDEX), 30.0), 2);
|
|
87
|
+
} else {
|
|
88
|
+
right = numTxt(q, vec2(S.x - 8.0 * U - numW(3, c), o.y), c, mod(clk.x, 1000.0), 3);
|
|
89
|
+
}
|
|
90
|
+
float ink = max(max(frame, rule * (role == 8 ? 0.0 : 1.0)), max(tag, min(right, 1.0)));
|
|
91
|
+
return vec3(ink, snap > 0.5 ? frame : 0.0, 0.0);
|
|
92
|
+
}
|