agentvfx 0.0.0-stage → 0.3.4
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 +172 -0
- package/README.md +236 -2
- package/package.json +35 -4
- package/skills/agentvfx/LICENSE +172 -0
- package/skills/agentvfx/NOTICE +44 -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 +28 -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 +155 -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 +42 -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 +397 -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,232 @@
|
|
|
1
|
+
// Editorial roles. The engine text layer (TEXTMASK) is a "sheet" of type slots (see fx.json X_AGENTVFX.text);
|
|
2
|
+
// a type cell shows a window of that sheet, scaled and optionally turned 90 degrees, and the shader only
|
|
3
|
+
// colours it. Live numbers and labels come from the mono "atlas" row of the sheet (digits, colon, A..Z).
|
|
4
|
+
// Every role below returns vec3(ink, hot, 0) coverage in the cell's own pixel space (q from its top-left).
|
|
5
|
+
const float ATLAS_X = 0.35938;
|
|
6
|
+
const float ATLAS_Y = 0.93333;
|
|
7
|
+
const float ATLAS_PX = 0.05;
|
|
8
|
+
const float MONO_ADV = 0.602;
|
|
9
|
+
vec2 UN;
|
|
10
|
+
|
|
11
|
+
// one text-sheet channel (0 R the editorial sheet, 1 G, 2 B) at sheet pixel sp (origin top left)
|
|
12
|
+
float sheetC(vec2 sp, int ch) {
|
|
13
|
+
vec2 res = RENDERSIZE;
|
|
14
|
+
if (!HAS_TEXT || sp.x < 0.0 || sp.y < 0.0 || sp.x >= res.x || sp.y >= res.y) { return 0.0; }
|
|
15
|
+
vec3 t = texture(TEXTMASK, vec2(sp.x, res.y - sp.y) / res).rgb;
|
|
16
|
+
return ch == 1 ? t.g : (ch == 2 ? t.b : t.r);
|
|
17
|
+
}
|
|
18
|
+
float sheetAt(vec2 sp) { return sheetC(sp, 0); }
|
|
19
|
+
|
|
20
|
+
int aIdx(int ch) {
|
|
21
|
+
if (ch >= 48 && ch <= 57) { return ch - 48; }
|
|
22
|
+
if (ch == 58) { return 10; }
|
|
23
|
+
if (ch >= 65 && ch <= 90) { return ch - 54; }
|
|
24
|
+
return -1;
|
|
25
|
+
}
|
|
26
|
+
// one atlas glyph; p is in pixels from the top-left of its character box (MONO_ADV * fs wide, fs high)
|
|
27
|
+
float aGlyph(vec2 p, int ch, float fs) {
|
|
28
|
+
int idx = aIdx(ch);
|
|
29
|
+
if (idx < 0 || p.x < 0.0 || p.y < 0.0 || p.x >= MONO_ADV * fs || p.y >= fs) { return 0.0; }
|
|
30
|
+
float apx = ATLAS_PX * RENDERSIZE.y;
|
|
31
|
+
vec2 o = vec2(ATLAS_X * RENDERSIZE.x + float(idx) * MONO_ADV * apx, ATLAS_Y * RENDERSIZE.y);
|
|
32
|
+
return sheetAt(o + p * (apx / fs));
|
|
33
|
+
}
|
|
34
|
+
float aTxt(vec2 p, float fs, int a, int b, int c, int d) {
|
|
35
|
+
if (p.x < 0.0) { return 0.0; }
|
|
36
|
+
float adv = MONO_ADV * fs;
|
|
37
|
+
int i = int(floor(p.x / adv));
|
|
38
|
+
if (i > 3) { return 0.0; }
|
|
39
|
+
int ch = i == 0 ? a : (i == 1 ? b : (i == 2 ? c : d));
|
|
40
|
+
return aGlyph(vec2(p.x - float(i) * adv, p.y), ch, fs);
|
|
41
|
+
}
|
|
42
|
+
float aNum(vec2 p, float fs, float v, int nd) {
|
|
43
|
+
if (p.x < 0.0) { return 0.0; }
|
|
44
|
+
float adv = MONO_ADV * fs;
|
|
45
|
+
int i = int(floor(p.x / adv));
|
|
46
|
+
if (i >= nd) { return 0.0; }
|
|
47
|
+
int dg = int(mod(floor(v / pow(10.0, float(nd - 1 - i)) + 0.001), 10.0));
|
|
48
|
+
return aGlyph(vec2(p.x - float(i) * adv, p.y), 48 + dg, fs);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
float bandAt(float x) {
|
|
52
|
+
float f = x * float(bands) - 0.5;
|
|
53
|
+
float i0 = floor(f);
|
|
54
|
+
return mix(stBand(clamp(int(i0), 0, bands - 1)), stBand(clamp(int(i0) + 1, 0, bands - 1)), f - i0);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// spectrum, hairline family. 1: one line over the bands; 2: comb of single-pixel bars. Both stand on a
|
|
58
|
+
// baseline with a tick scale under it and an accent dot on the loudest band.
|
|
59
|
+
vec3 pSpecHair(vec2 q, vec2 S, int v) {
|
|
60
|
+
float y0 = S.y - 14.0 * U;
|
|
61
|
+
float amp = y0 - 2.0 * U;
|
|
62
|
+
float inx = step(0.0, q.x) * step(q.x, S.x);
|
|
63
|
+
float pitch = S.x / float(bands);
|
|
64
|
+
float ink = hl(q.y - y0) * inx * 0.85;
|
|
65
|
+
float tk = floor(q.x / pitch + 0.5);
|
|
66
|
+
float isMaj = mod(tk, 5.0) < 0.5 ? 1.0 : 0.0;
|
|
67
|
+
ink = max(ink, step(abs(q.x - tk * pitch), HW * 0.5 + 0.25) * step(y0, q.y) * step(q.y, y0 + (3.0 + 3.5 * isMaj) * U) * 0.8);
|
|
68
|
+
float hot = 0.0;
|
|
69
|
+
if (v == 2) {
|
|
70
|
+
int b = int(clamp(floor(q.x / pitch), 0.0, float(bands - 1)));
|
|
71
|
+
float top = y0 - stBand(b) * amp;
|
|
72
|
+
float bar = hl(q.x - (float(b) + 0.5) * pitch) * step(top, q.y) * step(q.y, y0) * inx;
|
|
73
|
+
ink = max(ink, bar * 0.8);
|
|
74
|
+
hot = max(hot, bar * step(q.y, top + 3.0 * U));
|
|
75
|
+
} else {
|
|
76
|
+
float yA = y0 - bandAt((q.x - 0.5) / S.x) * amp;
|
|
77
|
+
float yB = y0 - bandAt((q.x + 0.5) / S.x) * amp;
|
|
78
|
+
float d = max(max(min(yA, yB) - q.y, q.y - max(yA, yB)), 0.0);
|
|
79
|
+
ink = max(ink, hlw(d, HW * 1.15) * inx);
|
|
80
|
+
}
|
|
81
|
+
vec4 pk = texelFetch(state, ivec2(2, 0), 0);
|
|
82
|
+
vec2 pp = vec2((pk.x + 0.5) * pitch, y0 - pk.y * amp);
|
|
83
|
+
float lit = step(0.06, pk.y);
|
|
84
|
+
hot = max(hot, lit * max(inBox(q - pp, vec2(-3.0 * U), vec2(3.0 * U)), hl(q.x - pp.x) * step(q.y, pp.y - 3.0 * U) * step(pp.y - 12.0 * U, q.y)));
|
|
85
|
+
return vec3(ink, hot, 0.0);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// scope as one line crossing the cell: faint axis, trigger-free wave trace. 1: trace hot; 2: trace ink
|
|
89
|
+
vec3 pScopeLine(vec2 q, vec2 S, int v) {
|
|
90
|
+
float yc = S.y * 0.5;
|
|
91
|
+
float inx = step(0.0, q.x) * step(q.x, S.x);
|
|
92
|
+
float dx = 0.5 / S.x * 511.0;
|
|
93
|
+
float t = q.x / S.x * 511.0;
|
|
94
|
+
float yA = yc - waveI(t - dx) * scopeGain * S.y;
|
|
95
|
+
float yB = yc - waveI(t + dx) * scopeGain * S.y;
|
|
96
|
+
float d = max(max(clamp(min(yA, yB), 0.0, S.y) - q.y, q.y - clamp(max(yA, yB), 0.0, S.y)), 0.0);
|
|
97
|
+
float tr = hlw(d, HW * 1.15) * inx;
|
|
98
|
+
float axis = hl(q.y - yc) * inx * 0.22;
|
|
99
|
+
return vec3(max(axis, v == 2 ? tr : 0.0), v == 2 ? 0.0 : tr, 0.0);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// hairline track with a heavier fill up to the level and a cap tick, along the long side of the cell
|
|
103
|
+
vec3 levelBar(vec2 q, vec2 S, int ch) {
|
|
104
|
+
float lv = stLevel()[ch];
|
|
105
|
+
bool wide = S.x >= S.y;
|
|
106
|
+
float len = wide ? S.x : S.y;
|
|
107
|
+
float along = wide ? q.x : S.y - q.y;
|
|
108
|
+
float across = wide ? q.y - S.y * 0.5 : q.x - S.x * 0.5;
|
|
109
|
+
if (along < -1.0 || along > len + 1.0) { return vec3(0.0); }
|
|
110
|
+
float track = hl(across) * 0.3;
|
|
111
|
+
float fillv = hlw(across, HW * 2.4) * step(0.0, along) * step(along, lv * len);
|
|
112
|
+
float cap = step(abs(along - lv * len), HW * 0.75 + 0.5) * step(abs(across), 5.0 * U) * step(0.04, lv);
|
|
113
|
+
float ends = step(abs(along), HW * 0.5 + 0.25) * step(abs(across), 3.0 * U);
|
|
114
|
+
return vec3(max(max(track, fillv), ends * 0.6), cap, 0.0);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// four thin level bars (bass, mid, treble, rms) with mono labels: rows in a wide cell, columns in a tall one
|
|
118
|
+
vec3 pMeterEd(vec2 q, vec2 S) {
|
|
119
|
+
bool wide = S.x >= S.y * 1.2;
|
|
120
|
+
if (wide) {
|
|
121
|
+
float rh = S.y / 4.0;
|
|
122
|
+
int ch = int(clamp(floor(q.y / rh), 0.0, 3.0));
|
|
123
|
+
vec2 lq = vec2(q.x, q.y - float(ch) * rh);
|
|
124
|
+
float fs = min(rh * 0.8, 15.0 * U);
|
|
125
|
+
float lw = 4.2 * MONO_ADV * fs;
|
|
126
|
+
vec2 gp = lq - vec2(0.0, (rh - fs) * 0.5);
|
|
127
|
+
float lab = ch == 0 ? aTxt(gp, fs, 66, 83, 83, 0) : (ch == 1 ? aTxt(gp, fs, 77, 73, 68, 0) : (ch == 2 ? aTxt(gp, fs, 84, 82, 66, 0) : aTxt(gp, fs, 82, 77, 83, 0)));
|
|
128
|
+
vec3 b = levelBar(lq - vec2(lw, 0.0), vec2(S.x - lw, rh), ch);
|
|
129
|
+
return vec3(max(lab * 0.9, b.x), b.y, 0.0);
|
|
130
|
+
}
|
|
131
|
+
float cw = S.x / 4.0;
|
|
132
|
+
int ch = int(clamp(floor(q.x / cw), 0.0, 3.0));
|
|
133
|
+
float fs = min(cw * 0.7, 15.0 * U);
|
|
134
|
+
float lh = fs * 1.5;
|
|
135
|
+
vec2 lq = vec2(q.x - float(ch) * cw, q.y);
|
|
136
|
+
vec2 gp = lq - vec2((cw - 3.0 * MONO_ADV * fs) * 0.5, S.y - lh);
|
|
137
|
+
float lab = ch == 0 ? aTxt(gp, fs, 66, 83, 83, 0) : (ch == 1 ? aTxt(gp, fs, 77, 73, 68, 0) : (ch == 2 ? aTxt(gp, fs, 84, 82, 66, 0) : aTxt(gp, fs, 82, 77, 83, 0)));
|
|
138
|
+
vec3 b = levelBar(lq, vec2(cw, S.y - lh), ch);
|
|
139
|
+
return vec3(max(lab * 0.9, b.x), b.y, 0.0);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// live number, left aligned and sized to the cell width: 1 rms, 2 cut count (flashes hot for 4 frames), 3 frame, 4 timecode, 5 bpm
|
|
143
|
+
vec3 pReadEd(vec2 q, vec2 S, int v, vec4 clk) {
|
|
144
|
+
int nch = v == 4 ? 8 : (v == 3 ? 4 : 3);
|
|
145
|
+
float fs = min(S.x / (float(nch) * MONO_ADV), S.y / 0.86);
|
|
146
|
+
vec2 p = q - vec2(0.0, S.y * 0.5 - fs * 0.455);
|
|
147
|
+
float ink = 0.0;
|
|
148
|
+
if (v == 1) { ink = aNum(p, fs, floor(stLevel().a * 999.0), 3); }
|
|
149
|
+
if (v == 2) { ink = aNum(p, fs, mod(clk.x, 1000.0), 3); }
|
|
150
|
+
if (v == 3) { ink = aNum(p, fs, mod(float(FRAMEINDEX), 10000.0), 4); }
|
|
151
|
+
if (v == 5) { ink = aNum(p, fs, floor(AUDIO_BPM), 3); }
|
|
152
|
+
if (v == 4) {
|
|
153
|
+
float adv = MONO_ADV * fs;
|
|
154
|
+
ink = aNum(p, fs, mod(floor(TIME / 60.0), 100.0), 2) + aGlyph(p - vec2(2.0 * adv, 0.0), 58, fs)
|
|
155
|
+
+ aNum(p - vec2(3.0 * adv, 0.0), fs, mod(floor(TIME), 60.0), 2) + aGlyph(p - vec2(5.0 * adv, 0.0), 58, fs)
|
|
156
|
+
+ aNum(p - vec2(6.0 * adv, 0.0), fs, mod(float(FRAMEINDEX), 30.0), 2);
|
|
157
|
+
}
|
|
158
|
+
ink = min(ink, 1.0);
|
|
159
|
+
float pulse = v == 2 && clk.x > 0.5 && float(FRAMEINDEX) - clk.y < 3.5 ? 1.0 : 0.0;
|
|
160
|
+
return vec3(ink, ink * pulse, 0.0);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// registration mark: ring, inner ring and a cross reaching past the ring; an accent dot follows the spectral
|
|
164
|
+
// balance (x) and loudness (y) and an onset throws a second ring for three frames
|
|
165
|
+
vec3 pRegMark(vec2 q, vec2 S, vec4 clk) {
|
|
166
|
+
vec4 lv = stLevel();
|
|
167
|
+
vec2 c = S * 0.5;
|
|
168
|
+
float R = min(S.x, S.y) * 0.5;
|
|
169
|
+
vec2 d = q - c;
|
|
170
|
+
float r = length(d);
|
|
171
|
+
float r0 = R * 0.6;
|
|
172
|
+
float ink = max(hl(r - r0), hl(r - r0 * 0.28)) * 0.9;
|
|
173
|
+
ink = max(ink, max(hl(d.y) * step(abs(d.x), R * 0.96), hl(d.x) * step(abs(d.y), R * 0.96)) * 0.9);
|
|
174
|
+
vec2 tp = c + vec2(0.5 * r0 * (lv.b - lv.r), -0.6 * r0 * (lv.a * 1.8 - 0.7));
|
|
175
|
+
float hitF = float(FRAMEINDEX) - clk.w;
|
|
176
|
+
float ringB = hitF < 3.0 && clk.z > 0.5 ? hl(r - r0 * (1.0 + 0.22 * (hitF + 1.0))) : 0.0;
|
|
177
|
+
float hot = max(inBox(q - tp, vec2(-3.5 * U), vec2(3.5 * U)), ringB);
|
|
178
|
+
return vec3(ink, hot, 0.0);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// a type cell: window of the text sheet; 1..4 level fill (bass, mid, treble, rms) with a level hairline; 5 hot sweep per onset
|
|
182
|
+
vec3 pType(vec2 q, vec2 S, int v, int rot, vec3 src, int ch, vec4 clk) {
|
|
183
|
+
vec2 tq = rot == 1 ? vec2(S.y - q.y, q.x) : (rot == 2 ? vec2(q.y, S.x - q.x) : q);
|
|
184
|
+
float m = sheetC(src.xy * (RENDERSIZE / vec2(32.0, 18.0)) + tq / src.z, ch);
|
|
185
|
+
float hot = 0.0;
|
|
186
|
+
float line = 0.0;
|
|
187
|
+
if (v >= 1 && v <= 4) {
|
|
188
|
+
float lv = stLevel()[v - 1];
|
|
189
|
+
float yl = S.y * (1.0 - lv);
|
|
190
|
+
hot = m * step(yl, q.y);
|
|
191
|
+
line = hl(q.y - yl) * 0.55 * step(0.03, lv);
|
|
192
|
+
}
|
|
193
|
+
if (v == 5) {
|
|
194
|
+
float age = float(FRAMEINDEX) - clk.w;
|
|
195
|
+
float x0 = S.x * (age / 7.0 - 0.18);
|
|
196
|
+
hot = m * step(0.0, age) * step(age, 7.5) * step(x0, q.x) * step(q.x, x0 + S.x * 0.18) * step(0.5, clk.z);
|
|
197
|
+
}
|
|
198
|
+
return vec3(m, max(hot, line), 0.0);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// rules. 1: horizontal hairline; 2: vertical hairline; 3: baseline with a tick scale; 4..7: level bar (bass, mid, treble, rms);
|
|
202
|
+
// 8: ruled rows, one hairline per grid unit
|
|
203
|
+
vec3 pRule(vec2 q, vec2 S, int v) {
|
|
204
|
+
float inx = step(-0.5, q.x) * step(q.x, S.x + 0.5);
|
|
205
|
+
float iny = step(-0.5, q.y) * step(q.y, S.y + 0.5);
|
|
206
|
+
if (v == 1) { return vec3(hl(q.y - S.y * 0.5) * inx, 0.0, 0.0); }
|
|
207
|
+
if (v == 2) { return vec3(hl(q.x - S.x * 0.5) * iny, 0.0, 0.0); }
|
|
208
|
+
if (v == 3) {
|
|
209
|
+
float k = floor(q.x / (8.0 * U) + 0.5);
|
|
210
|
+
float len = (mod(k, 5.0) < 0.5 ? 12.0 : 5.0) * U;
|
|
211
|
+
float tk = step(abs(q.x - k * 8.0 * U), HW * 0.5 + 0.25) * step(S.y - len, q.y) * step(q.y, S.y);
|
|
212
|
+
return vec3(max(hl(q.y - (S.y - HW * 0.5)) * inx, tk) * 0.85, 0.0, 0.0);
|
|
213
|
+
}
|
|
214
|
+
if (v >= 4 && v <= 7) { return levelBar(q, S, v - 4); }
|
|
215
|
+
if (v == 8) {
|
|
216
|
+
float rows = max(floor(S.y / UN.y + 0.5), 1.0);
|
|
217
|
+
float k = floor(q.y / (S.y / rows) + 0.5);
|
|
218
|
+
return vec3(hl(q.y - k * S.y / rows) * inx * 0.7, 0.0, 0.0);
|
|
219
|
+
}
|
|
220
|
+
return vec3(0.0);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
float frameCov(int frame, vec2 q, vec2 S) {
|
|
224
|
+
if (frame == 2) { return boxLnW(q, vec2(0.5 * HW), S - vec2(0.5 * HW), HW); }
|
|
225
|
+
if (frame == 3) {
|
|
226
|
+
vec2 a = min(q, S - q);
|
|
227
|
+
float arm = 16.0 * U;
|
|
228
|
+
float inb = step(-0.5, q.x) * step(q.x, S.x + 0.5) * step(-0.5, q.y) * step(q.y, S.y + 0.5);
|
|
229
|
+
return max(hl(a.y - 0.5 * HW) * step(a.x, arm), hl(a.x - 0.5 * HW) * step(a.y, arm)) * inb;
|
|
230
|
+
}
|
|
231
|
+
return 0.0;
|
|
232
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// Role 13, typefx: type that the shader warps every frame. The text sheet is a static mask, so every effect below samples
|
|
2
|
+
// it through a changed coordinate (slices, stretch, history shear, smear taps, echo copies, band-cut fills). The cell holds
|
|
3
|
+
// its place; the letters inside it move on the music. Variants: 1 micro-type field, 2 glyph window, 3 slit-scan word,
|
|
4
|
+
// 4 echo stack, 5 echo ripple, 6 type equalizer. A cell reads one text-sheet channel (0 R, 1 G, 2 B) through its src window.
|
|
5
|
+
// Hits (stHit): x is an onset pulse, y a beat pulse; both jump on the event frame and fall in `release` seconds.
|
|
6
|
+
// The input typeWarp scales every audio-driven warp below (0 holds the type still, 1 default, 1.5 harder).
|
|
7
|
+
vec2 gP;
|
|
8
|
+
|
|
9
|
+
float winM(vec2 tq, vec3 src, int ch) { return sheetC(src.xy * (RENDERSIZE / vec2(32.0, 18.0)) + tq / src.z, ch); }
|
|
10
|
+
// re-sharpen a magnified glyph edge back to about one pixel
|
|
11
|
+
float crisp(float m, float s) {
|
|
12
|
+
float k = 0.5 / max(s, 1.0);
|
|
13
|
+
return smoothstep(0.5 - k, 0.5 + k, m);
|
|
14
|
+
}
|
|
15
|
+
float edgeOf(float raw) { return clamp(4.0 * raw * (1.0 - raw), 0.0, 1.0); }
|
|
16
|
+
// history (x beat pulse signed per hit, y mid, z treble, w rms), delay in frames, linear between frames
|
|
17
|
+
vec4 stHist(float delay) {
|
|
18
|
+
float d = clamp(delay, 0.0, 62.0);
|
|
19
|
+
float i0 = floor(d);
|
|
20
|
+
return mix(texelFetch(state, ivec2(63 - int(i0), 7), 0), texelFetch(state, ivec2(62 - int(i0), 7), 0), d - i0);
|
|
21
|
+
}
|
|
22
|
+
vec3 fxFootage(vec2 p) {
|
|
23
|
+
if (!HAS_INPUT) { return inkColor.rgb * 0.4; }
|
|
24
|
+
return footageBody(p, RENDERSIZE, 0.0, 0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// micro-type lines live in the bottom band of the G sheet (5 lines from 84 percent of the height) and the B sheet (8 lines
|
|
28
|
+
// from 78 percent), one line per 2.5 percent of the height, as the text items microK and microM
|
|
29
|
+
vec3 microBand(int ch) { return ch == 1 ? vec3(0.84, 5.0, 0.025) : vec3(0.78, 8.0, 0.025); }
|
|
30
|
+
|
|
31
|
+
// rows of real text (system fonts through the sheet); each row is one spectrum band (bass at the bottom), lit up to its level,
|
|
32
|
+
// the front glyphs hot. Active rows pick another line and start on every onset. Returns (ink coverage, hot coverage).
|
|
33
|
+
vec2 microCov(vec2 q, vec2 S, vec4 clk, vec3 src, int ch) {
|
|
34
|
+
if (ch == 0) { return vec2(0.0); }
|
|
35
|
+
vec3 band = microBand(ch);
|
|
36
|
+
float rowH = band.z * RENDERSIZE.y * src.z;
|
|
37
|
+
float row = floor(q.y / rowH);
|
|
38
|
+
float lvl = bandAt(clamp(1.0 - (row + 0.5) * rowH / S.y, 0.0, 1.0));
|
|
39
|
+
float seed = row * 1.7 + step(0.3, lvl) * clk.z * 3.1;
|
|
40
|
+
float line = floor(hash12(vec2(seed, 2.0)) * band.y);
|
|
41
|
+
float xo = hash12(vec2(seed, 5.0)) * RENDERSIZE.x;
|
|
42
|
+
vec2 sp = vec2(mod(q.x / src.z + xo, RENDERSIZE.x), band.x * RENDERSIZE.y + line * band.z * RENDERSIZE.y + (q.y - row * rowH) / src.z);
|
|
43
|
+
float g = crisp(sheetC(sp, ch), src.z);
|
|
44
|
+
float lit = step(q.x, lvl * S.x);
|
|
45
|
+
float front = lit * step(lvl * S.x - q.x, 28.0 * U + 12.0) * step(0.25, lvl);
|
|
46
|
+
return vec2(g * mix(0.2, 0.85, lit), g * front);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 2: giant glyph window. Footage (or, with tone accent, a solid fill) shows through the letter with the micro-type running on
|
|
50
|
+
// over it; a hard extrusion (darker the deeper it goes) runs down-left behind it and grows on each onset; the letter stretches
|
|
51
|
+
// taller on the onset and tears into horizontal slices that jump sideways on every beat.
|
|
52
|
+
void fxGlyph(vec2 q, vec2 S, vec3 src, int ch, int tone, vec4 clk, vec3 cInk, vec3 cHot, inout vec3 col) {
|
|
53
|
+
vec4 hit = stHit() * typeWarp;
|
|
54
|
+
float band = floor(q.y / (S.y / 9.0));
|
|
55
|
+
float h = hash12(vec2(band, clk.z * 1.37 + 5.0));
|
|
56
|
+
float dx = (fract(h * 7.0) * 2.0 - 1.0) * step(0.4, h) * max(hit.y, hit.x * 0.45) * S.x * 0.13;
|
|
57
|
+
vec2 qq = vec2(q.x - dx, S.y * 0.5 + (q.y - S.y * 0.5) / (1.0 + 0.2 * hit.x));
|
|
58
|
+
float raw = winM(qq, src, ch);
|
|
59
|
+
float m = crisp(raw, src.z);
|
|
60
|
+
float reach = (30.0 + 90.0 * hit.x) * U;
|
|
61
|
+
for (int i = 10; i >= 1; i--) {
|
|
62
|
+
float t = float(i) / 10.0;
|
|
63
|
+
float me = crisp(winM(qq - vec2(-0.8, 0.6) * reach * t, src, ch), src.z);
|
|
64
|
+
col = mix(col, cHot * (1.0 - 0.6 * t), me);
|
|
65
|
+
}
|
|
66
|
+
bool solid = tone == 2;
|
|
67
|
+
vec2 mc = microCov(gP, RENDERSIZE, clk, vec3(0.0, 0.0, 1.0), 2);
|
|
68
|
+
vec3 f = solid ? cInk : mix(fxFootage(gP), groundColor.rgb, mc.x * 0.6);
|
|
69
|
+
col = mix(col, f, m);
|
|
70
|
+
col = mix(col, solid ? groundColor.rgb : cInk, edgeOf(raw) * 0.9);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// 3: slit-scan word. Every row reads the hit history (beat pulse, onsets at 0.4) at its own delay, so each hit enters at the
|
|
74
|
+
// bottom row and travels up the letters as a sideways shear (direction chosen per hit); rows inside a shear jitter; the word
|
|
75
|
+
// smears into a streak on the beat (onsets smear at 0.3). The footage stays still behind the moving letter window.
|
|
76
|
+
void fxSlit(vec2 q, vec2 S, vec3 src, int ch, vec4 clk, vec3 cInk, vec3 cHot, inout vec3 col) {
|
|
77
|
+
vec4 hits = stHit() * typeWarp;
|
|
78
|
+
float hp = max(hits.y, 0.3 * hits.x);
|
|
79
|
+
float delay = (1.0 - clamp(q.y / S.y, 0.0, 1.0)) * 22.0;
|
|
80
|
+
float sh = 0.0;
|
|
81
|
+
for (int i = -2; i <= 2; i++) { sh += stHist(delay + float(i)).x * (i == 0 ? 0.32 : (abs(i) == 1 ? 0.22 : 0.12)); }
|
|
82
|
+
sh *= typeWarp;
|
|
83
|
+
float jit = (hash12(vec2(floor(q.y / max(U * 6.0, 2.0)), clk.z)) - 0.5) * abs(sh);
|
|
84
|
+
float dx = sh * S.x * 0.075 + jit * S.x * 0.04;
|
|
85
|
+
float dir = hash12(vec2(clk.z, 4.0)) < 0.5 ? 1.0 : -1.0;
|
|
86
|
+
float len = S.x * 0.2 * hp;
|
|
87
|
+
float streak = 0.0;
|
|
88
|
+
for (int i = 1; i < 13; i++) {
|
|
89
|
+
float t = float(i) / 12.0;
|
|
90
|
+
streak = max(streak, crisp(winM(vec2(q.x - dx - dir * t * len, q.y), src, ch), src.z) * (1.0 - t));
|
|
91
|
+
}
|
|
92
|
+
float raw = winM(vec2(q.x - dx, q.y), src, ch);
|
|
93
|
+
float m = crisp(raw, src.z);
|
|
94
|
+
col = mix(col, cHot, streak * (1.0 - m));
|
|
95
|
+
col = mix(col, fxFootage(gP), m);
|
|
96
|
+
col = mix(col, cInk, edgeOf(raw) * 0.9);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 4: echo stack. The word repeats 2..10 times (the count follows the rms and jumps by up to 4 on the beat frame, by 1.6 on
|
|
100
|
+
// an onset), each copy stepped up-right and a little larger, painted back to front: odd copies solid hot, even copies knocked
|
|
101
|
+
// out to the ground, every edge in ink, and the footage in the front copy.
|
|
102
|
+
void fxEcho(vec2 q, vec2 S, vec3 src, int ch, vec3 cInk, vec3 cHot, vec3 cGnd, inout vec3 col) {
|
|
103
|
+
vec4 hits = stHit();
|
|
104
|
+
int n = min(2 + int(floor(typeWarp * (4.0 * stLevel().a + 4.0 * max(hits.y, 0.4 * hits.x)) + 0.5)), 11);
|
|
105
|
+
vec2 c = S * 0.5;
|
|
106
|
+
vec2 stp = vec2(S.x * 0.017, -S.y * 0.034);
|
|
107
|
+
for (int j = 0; j < 11; j++) {
|
|
108
|
+
int k = n - 1 - j;
|
|
109
|
+
if (k < 0) { break; }
|
|
110
|
+
float sk = 1.0 + 0.05 * float(k);
|
|
111
|
+
float raw = winM((q - c - stp * float(k)) / sk + c, src, ch);
|
|
112
|
+
float m = crisp(raw, src.z * sk);
|
|
113
|
+
bool odd = mod(float(k), 2.0) > 0.5;
|
|
114
|
+
col = mix(col, odd ? cHot : cGnd, m);
|
|
115
|
+
col = mix(col, cInk, edgeOf(raw) * (odd ? 0.95 : 0.8));
|
|
116
|
+
if (k == 0) { col = mix(col, fxFootage(gP), m); }
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 5: echo ripple. The word is ringed by 2..12 hairline outlines growing out of it from the centre of the cell (alternate rings
|
|
121
|
+
// hot, ink), the count following the rms and the beat as in the stack; the footage fills the word itself.
|
|
122
|
+
void fxRipple(vec2 q, vec2 S, vec3 src, int ch, vec3 cInk, vec3 cHot, inout vec3 col) {
|
|
123
|
+
vec4 hits = stHit();
|
|
124
|
+
int n = min(2 + int(floor(typeWarp * (5.0 * stLevel().a + 5.0 * max(hits.y, 0.4 * hits.x)) + 0.5)), 12);
|
|
125
|
+
vec2 c = S * 0.5;
|
|
126
|
+
for (int j = 0; j < 12; j++) {
|
|
127
|
+
int k = n - 1 - j;
|
|
128
|
+
if (k < 0) { break; }
|
|
129
|
+
float raw = winM((q - c) / (1.0 + 0.11 * float(k)) + c, src, ch);
|
|
130
|
+
if (k > 0) { col = mix(col, mod(float(k), 2.0) > 0.5 ? cHot : cInk, edgeOf(raw) * 0.9); continue; }
|
|
131
|
+
col = mix(col, fxFootage(gP), crisp(raw, src.z));
|
|
132
|
+
col = mix(col, cInk, edgeOf(raw) * 0.9);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// 6: type equalizer. The word is the analyzer: every column of the letters is filled solid up to the level of the spectrum band
|
|
137
|
+
// under it (bass at the left); above the level the letters are only an outline over a dim footage ghost.
|
|
138
|
+
void fxEq(vec2 q, vec2 S, vec3 src, int ch, vec3 cInk, vec3 cHot, inout vec3 col) {
|
|
139
|
+
float raw = winM(q, src, ch);
|
|
140
|
+
float m = crisp(raw, src.z);
|
|
141
|
+
float lv = clamp(bandAt(clamp(q.x / S.x, 0.0, 1.0)) + 0.3 * stHit().y * typeWarp, 0.0, 1.0);
|
|
142
|
+
float on = step(S.y * (1.0 - lv), q.y);
|
|
143
|
+
col = mix(col, fxFootage(gP), m * (1.0 - on) * 0.45);
|
|
144
|
+
col = mix(col, cHot, m * on);
|
|
145
|
+
col = mix(col, cInk, edgeOf(raw) * mix(0.9, 0.35, on));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
void drawTypeFx(int v, vec4 aux, int ch, int tone, vec2 q, vec2 S, vec4 clk, vec3 cInk, vec3 cHot, inout vec3 col) {
|
|
149
|
+
int rot = int(aux.x + 0.5);
|
|
150
|
+
vec3 src = vec3(aux.yz, aux.w);
|
|
151
|
+
vec2 tq = rot == 1 ? vec2(S.y - q.y, q.x) : (rot == 2 ? vec2(q.y, S.x - q.x) : q);
|
|
152
|
+
vec2 TS = rot == 0 ? S : S.yx;
|
|
153
|
+
if (v == 1) {
|
|
154
|
+
vec2 mc = microCov(tq, TS, clk, src, ch);
|
|
155
|
+
col = mix(col, cInk, mc.x);
|
|
156
|
+
col = mix(col, cHot, mc.y);
|
|
157
|
+
}
|
|
158
|
+
if (v == 2) { fxGlyph(tq, TS, src, ch, tone, clk, cInk, cHot, col); }
|
|
159
|
+
if (v == 3) { fxSlit(tq, TS, src, ch, clk, cInk, cHot, col); }
|
|
160
|
+
if (v == 4) { fxEcho(tq, TS, src, ch, cInk, cHot, groundColor.rgb, col); }
|
|
161
|
+
if (v == 5) { fxRipple(tq, TS, src, ch, cInk, cHot, col); }
|
|
162
|
+
if (v == 6) { fxEq(tq, TS, src, ch, cInk, cHot, col); }
|
|
163
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Role 14, scene: a whole mixed-material collage in one cell (flat fields, an image treatment of the plate, geometric
|
|
2
|
+
// primitives, pixel matter, leader lines, instruments and several type roles). Compositions are written in unit space
|
|
3
|
+
// (height 1, width = cell aspect) so a scene scales with its cell. The scene reads the text sheet of its own set
|
|
4
|
+
// (input textSet) through its own positions, and the tint colours for what the three palette colours cannot hold.
|
|
5
|
+
// Hits: stHit().x onset pulse, .y beat pulse; the cut count (clk.x) moves on the beat.
|
|
6
|
+
vec2 scS;
|
|
7
|
+
float scU;
|
|
8
|
+
|
|
9
|
+
float scAA(float d) { return clamp(0.5 - d * scU, 0.0, 1.0); }
|
|
10
|
+
float scLine(float d, float w) { return clamp(0.5 * w - abs(d * scU) + 0.5, 0.0, 1.0); }
|
|
11
|
+
float scPx() { return max(2.0, floor(6.0 * U + 0.5)); }
|
|
12
|
+
float scCell() { return max(2.0, floor(3.0 * U + 0.5)); }
|
|
13
|
+
float scPlus(vec2 c, vec2 p, float arm) {
|
|
14
|
+
vec2 d = abs(c - p);
|
|
15
|
+
return max(scLine(c.y - p.y, 1.0) * step(d.x, arm), scLine(c.x - p.x, 1.0) * step(d.y, arm));
|
|
16
|
+
}
|
|
17
|
+
float scBox(vec2 c, vec2 lo, vec2 hi) { return step(lo.x, c.x) * step(c.x, hi.x) * step(lo.y, c.y) * step(c.y, hi.y); }
|
|
18
|
+
float sdBox(vec2 p, vec2 lo, vec2 hi) {
|
|
19
|
+
vec2 d = abs(p - 0.5 * (lo + hi)) - 0.5 * (hi - lo);
|
|
20
|
+
return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
|
|
21
|
+
}
|
|
22
|
+
float sdArch(vec2 p, vec2 lo, vec2 hi) {
|
|
23
|
+
float r = 0.5 * (hi.x - lo.x);
|
|
24
|
+
vec2 ctr = vec2(0.5 * (lo.x + hi.x), lo.y + r);
|
|
25
|
+
return p.y < ctr.y ? length(p - ctr) - r : sdBox(p, vec2(lo.x, ctr.y), hi);
|
|
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
|
+
// rectangle with its four corners cut at 45 degrees by ch (the octagon media window)
|
|
33
|
+
float sdChamfer(vec2 p, vec2 lo, vec2 hi, float ch) {
|
|
34
|
+
vec2 q = abs(p - 0.5 * (lo + hi)) - 0.5 * (hi - lo);
|
|
35
|
+
return max(max(q.x, q.y), (q.x + q.y + ch) * 0.7071);
|
|
36
|
+
}
|
|
37
|
+
// starburst glyph: n thin rays from radius inner out to R (each ray as long as the spectrum band it is hashed to), turned by rot
|
|
38
|
+
float scBurst(vec2 p, float R, float inner, float rot, float n) {
|
|
39
|
+
float a = atan(p.y, p.x) + rot;
|
|
40
|
+
float id = floor(a * n / 6.28318);
|
|
41
|
+
float da = (fract(a * n / 6.28318) - 0.5) * 6.28318 / n;
|
|
42
|
+
float len = R * (0.45 + 0.55 * bandAt(fract(id * 0.37)));
|
|
43
|
+
float r = length(p);
|
|
44
|
+
return scLine(da * r, 1.0) * step(inner, r) * step(r, len);
|
|
45
|
+
}
|
|
46
|
+
float scBayer(vec2 pix) {
|
|
47
|
+
ivec2 p = ivec2(mod(pix, 8.0));
|
|
48
|
+
int v = 0;
|
|
49
|
+
for (int i = 0; i < 3; i++) { v = (v << 2) | ((((p.x ^ p.y) >> i) & 1) << 1) | ((p.y >> i) & 1); }
|
|
50
|
+
return (float(v) + 0.5) / 64.0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// the plate cover-fitted into the window lo..hi (cell px)
|
|
54
|
+
vec3 scPlate(vec2 q, vec2 lo, vec2 hi) { return HAS_INPUT ? footageBody(q - lo, hi - lo, 0.0, 0) : vec3(0.3); }
|
|
55
|
+
float scTone(vec2 q, vec2 lo, vec2 hi, float gain, float lift) { return clamp((luma(scPlate(q, lo, hi)) - lift) * gain, 0.0, 1.0); }
|
|
56
|
+
|
|
57
|
+
// plate edge strength (central differences of the luma at step d px): the wireframe look
|
|
58
|
+
float scEdge(vec2 q, vec2 lo, vec2 hi, float d) {
|
|
59
|
+
float gx = luma(scPlate(q + vec2(d, 0.0), lo, hi)) - luma(scPlate(q - vec2(d, 0.0), lo, hi));
|
|
60
|
+
float gy = luma(scPlate(q + vec2(0.0, d), lo, hi)) - luma(scPlate(q - vec2(0.0, d), lo, hi));
|
|
61
|
+
return length(vec2(gx, gy));
|
|
62
|
+
}
|
|
63
|
+
// the text sheet at the same place on screen (1 : 1 for a full-frame cell)
|
|
64
|
+
float scSheet(vec2 q, int ch) { return sheetC(q * (RENDERSIZE / scS), ch); }
|
|
65
|
+
// a sheet word drawn with its own scale k (screen px per sheet px) so it can be squeezed or stretched: sheet point sheetLo lands at screen px o
|
|
66
|
+
float scWord(vec2 q, vec2 o, vec2 sheetLo, vec2 k, int ch) {
|
|
67
|
+
float m = sheetC(sheetLo + (q - o) / (k * scS.y / RENDERSIZE.y), ch);
|
|
68
|
+
return crisp(m, max(max(k.x, k.y), 1.0));
|
|
69
|
+
}
|
|
70
|
+
// the same with the horizontal strokes thinned (vertical erosion of d sheet px), for faux-tall type whose crossbars stretch
|
|
71
|
+
float scWordThin(vec2 q, vec2 o, vec2 sheetLo, vec2 k, int ch, float d) {
|
|
72
|
+
vec2 sp = sheetLo + (q - o) / (k * scS.y / RENDERSIZE.y);
|
|
73
|
+
float m = min(sheetC(sp, ch), min(sheetC(sp - vec2(0.0, d), ch), sheetC(sp + vec2(0.0, d), ch)));
|
|
74
|
+
return crisp(m, max(max(k.x, k.y), 1.0));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// dot halftone on a 30 degree grid: dot radius follows the plate under the dot centre; 1 where the dot is
|
|
78
|
+
float scDots(vec2 q, vec2 lo, vec2 hi, float pitch, float gain, float lift, float inv) {
|
|
79
|
+
mat2 R = mat2(0.866, 0.5, -0.5, 0.866);
|
|
80
|
+
vec2 g = R * q / pitch;
|
|
81
|
+
vec2 id = floor(g) + 0.5;
|
|
82
|
+
vec2 cq = transpose(R) * (id * pitch);
|
|
83
|
+
float l = scTone(cq, lo, hi, gain, lift);
|
|
84
|
+
l = mix(l, 1.0 - l, inv);
|
|
85
|
+
float r = 0.62 * sqrt(l);
|
|
86
|
+
return clamp((r - length(g - id)) * pitch + 0.5, 0.0, 1.0);
|
|
87
|
+
}
|
|
88
|
+
// QR-like stamp of 21 x 21 modules: 1 dark, 0 light, -1 outside; three finder squares, the rest re-seeded by seed
|
|
89
|
+
float scFinder(vec2 m, vec2 o) {
|
|
90
|
+
vec2 d = m - o;
|
|
91
|
+
if (d.x < 0.0 || d.y < 0.0 || d.x > 6.0 || d.y > 6.0) { return -1.0; }
|
|
92
|
+
bool ring = d.x < 0.5 || d.x > 5.5 || d.y < 0.5 || d.y > 5.5;
|
|
93
|
+
bool core = d.x > 1.5 && d.x < 4.5 && d.y > 1.5 && d.y < 4.5;
|
|
94
|
+
return ring || core ? 1.0 : 0.0;
|
|
95
|
+
}
|
|
96
|
+
float scQR(vec2 p, vec2 lo, float size, float seed) {
|
|
97
|
+
vec2 u = (p - lo) / size;
|
|
98
|
+
if (u.x < 0.0 || u.y < 0.0 || u.x >= 1.0 || u.y >= 1.0) { return -1.0; }
|
|
99
|
+
vec2 m = floor(u * 21.0);
|
|
100
|
+
float f = max(max(scFinder(m, vec2(0.0)), scFinder(m, vec2(14.0, 0.0))), scFinder(m, vec2(0.0, 14.0)));
|
|
101
|
+
if (f >= 0.0) { return f; }
|
|
102
|
+
if ((m.x < 8.0 && m.y < 8.0) || (m.x > 12.0 && m.y < 8.0) || (m.x < 8.0 && m.y > 12.0)) { return 0.0; }
|
|
103
|
+
return step(0.5, hash12(m + seed * 17.3));
|
|
104
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Scene 1, specimen: a deep ultramarine field; the plate as a single-tone lavender dither inside a tall arch; one ultra-tall
|
|
2
|
+
// thin word as a column; pink and cyan micro bars on the arch edges that are spectrum band levels; a solid black square with a
|
|
3
|
+
// semicircle that snaps to a new place of a fixed set on every cut; mono captions with live numbers. Palette: ground (field),
|
|
4
|
+
// ink (lavender), accent (pink), tintA (cyan), tintB (black). Text set 1.
|
|
5
|
+
vec2 spPair(float i) {
|
|
6
|
+
if (i < 0.5) { return vec2(1.44, 0.10); }
|
|
7
|
+
if (i < 1.5) { return vec2(0.50, 0.70); }
|
|
8
|
+
if (i < 2.5) { return vec2(1.44, 0.62); }
|
|
9
|
+
if (i < 3.5) { return vec2(1.14, 0.78); }
|
|
10
|
+
if (i < 4.5) { return vec2(0.50, 0.08); }
|
|
11
|
+
return vec2(1.22, 0.34);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
void sceneSpecimen(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
|
|
15
|
+
vec2 c = q / scU;
|
|
16
|
+
float A = S.x / S.y;
|
|
17
|
+
vec4 hit = stHit();
|
|
18
|
+
vec3 lav = inkColor.rgb;
|
|
19
|
+
vec3 pink = accentColor.rgb;
|
|
20
|
+
vec3 cyan = tintA.rgb;
|
|
21
|
+
vec3 blk = tintB.rgb;
|
|
22
|
+
col = groundColor.rgb;
|
|
23
|
+
col = mix(col, mix(groundColor.rgb, blk, 0.45), scAA(sdBox(c, vec2(0.03, 0.035), vec2(0.70, 0.965))));
|
|
24
|
+
vec2 lo = vec2(0.76, 0.07);
|
|
25
|
+
vec2 hi = vec2(1.36, 0.93);
|
|
26
|
+
// dithered plate in the arch
|
|
27
|
+
float px = scPx();
|
|
28
|
+
vec2 pix = floor(q / px);
|
|
29
|
+
float inside = scAA(sdArch(c, lo, hi));
|
|
30
|
+
float l = pow(scTone((pix + 0.5) * px, lo * scU, hi * scU, 1.6, 0.15), 0.65) * 0.92 + 0.08 * hit.y;
|
|
31
|
+
col = mix(col, mix(mix(groundColor.rgb, blk, 0.6), lav, step(scBayer(pix), l)), inside);
|
|
32
|
+
col = mix(col, lav, scLine(sdArch(c, lo - 0.016, hi + 0.016), 1.0));
|
|
33
|
+
// band-level micro bars on the straight sides of the arch: pink on the left, cyan on the right
|
|
34
|
+
float y0 = (lo.y + 0.5 * (hi.x - lo.x)) * scU;
|
|
35
|
+
float y1 = (hi.y - 0.02) * scU;
|
|
36
|
+
float row = floor((q.y - y0) / 4.0);
|
|
37
|
+
float t = clamp((row * 4.0 + 2.0) / (y1 - y0), 0.0, 1.0);
|
|
38
|
+
float inRow = step(0.0, q.y - y0) * step(q.y, y1) * step(mod(q.y - y0, 4.0), 2.0);
|
|
39
|
+
float lenL = floor((0.012 + 0.095 * bandAt(t)) * scU / 2.0) * 2.0;
|
|
40
|
+
float lenR = floor((0.012 + 0.095 * bandAt(1.0 - t * 0.8)) * scU / 2.0) * 2.0;
|
|
41
|
+
float xl = (lo.x - 0.016) * scU;
|
|
42
|
+
float xr = (hi.x + 0.016) * scU;
|
|
43
|
+
col = mix(col, pink, inRow * step(xl - lenL, q.x) * step(q.x, xl - 1.0));
|
|
44
|
+
col = mix(col, cyan, inRow * step(xr + 1.0, q.x) * step(q.x, xr + lenR));
|
|
45
|
+
// rules, ticks and a dot grid
|
|
46
|
+
float rule = max(scLine(c.y - 0.035, 1.0), scLine(c.y - 0.965, 1.0)) * step(0.05, c.x) * step(c.x, A - 0.05);
|
|
47
|
+
float tick = step(mod(q.x, 0.04 * scU), 1.0) * step(abs(c.y - 0.965), 0.014) * step(0.05, c.x) * step(c.x, A - 0.05);
|
|
48
|
+
col = mix(col, lav, max(rule * 0.8, tick * 0.8));
|
|
49
|
+
col = mix(col, lav, max(max(scPlus(c, vec2(0.03, 0.035), 0.016), scPlus(c, vec2(0.70, 0.035), 0.016)), max(scPlus(c, vec2(0.03, 0.965), 0.016), scPlus(c, vec2(0.70, 0.965), 0.016))));
|
|
50
|
+
vec2 dg = (c - vec2(1.44, 0.83)) / 0.026;
|
|
51
|
+
float dots = scAA((length(fract(dg) - 0.5) * 0.026 - 0.004)) * step(0.0, dg.x) * step(dg.x, 9.0) * step(0.0, dg.y) * step(dg.y, 4.0);
|
|
52
|
+
col = mix(col, lav, dots * 0.7);
|
|
53
|
+
// the tall word: Pretendard Thin stretched up and squeezed in
|
|
54
|
+
float w = scWordThin(q, vec2(0.05, -0.05) * scU, vec2(0.0, 0.0), vec2(0.35, 1.43), 0, 3.5);
|
|
55
|
+
col = mix(col, lav, w);
|
|
56
|
+
// the black square and semicircle: a new place of the fixed set on every cut
|
|
57
|
+
float i = mod(floor(clk.x) * 5.0 + floor(hash12(vec2(floor(clk.x / 6.0), 7.0)) * 6.0), 6.0);
|
|
58
|
+
vec2 P = spPair(i);
|
|
59
|
+
float s = 0.13;
|
|
60
|
+
float sq = scAA(sdBox(c, P, P + s));
|
|
61
|
+
vec2 sc = P + vec2(s, 0.5 * s);
|
|
62
|
+
sc.x += 0.03;
|
|
63
|
+
float semi = scAA(max(length(c - sc) - 0.5 * s, -(c.x - sc.x)));
|
|
64
|
+
col = mix(col, blk, max(sq, semi));
|
|
65
|
+
// captions and live numbers (MesloLGS NF)
|
|
66
|
+
col = mix(col, lav, scSheet(q, 1));
|
|
67
|
+
vec2 np = q - vec2(1.44, 0.50) * scU;
|
|
68
|
+
float fs = 0.03 * scU;
|
|
69
|
+
float num = aNum(np, fs, floor(stLevel().r * 99.0), 2) + aNum(np - vec2(3.0 * MONO_ADV * fs, 0.0), fs, floor(stLevel().g * 99.0), 2) + aNum(np - vec2(6.0 * MONO_ADV * fs, 0.0), fs, floor(stLevel().b * 99.0), 2);
|
|
70
|
+
col = mix(col, pink, min(num, 1.0));
|
|
71
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Scene 2, wiring: a black ground, the plate as a cyan / yellow duotone with scanline bands that re-seed on every cut, five yellow
|
|
2
|
+
// cables from fixed points on the CRT wall to boxed annotations (small Monument Extended caps and live readouts in a pixel font),
|
|
3
|
+
// quarter pixel arcs and a dot grid in the bottom-left corner, and a small crimson pixel glyph that blinks on every onset.
|
|
4
|
+
// Each onset sends a packet down the next cable and flashes its box. Palette: ground (black), ink (label white), accent (yellow),
|
|
5
|
+
// tintA (cyan), tintB (crimson). Text set 2.
|
|
6
|
+
const vec2 W_A[5] = vec2[5](vec2(0.663, 0.4355), vec2(0.573, 0.5775), vec2(0.663, 0.7195), vec2(1.115, 0.4355), vec2(1.025, 0.7195));
|
|
7
|
+
const vec2 W_B[5] = vec2[5](vec2(0.05, 0.14), vec2(0.05, 0.40), vec2(0.05, 0.62), vec2(1.43, 0.10), vec2(1.43, 0.62));
|
|
8
|
+
const vec2 W_SZ = vec2(0.30, 0.105);
|
|
9
|
+
const int W_GLYPH[7] = int[7](20, 62, 107, 127, 62, 34, 65);
|
|
10
|
+
|
|
11
|
+
vec2 wTail(int i) { return W_B[i] + (i < 3 ? vec2(W_SZ.x, 0.5 * W_SZ.y) : vec2(0.0, 0.5 * W_SZ.y)); }
|
|
12
|
+
vec2 wElbow(vec2 A, vec2 T) { return vec2(T.x + sign(A.x - T.x) * abs(A.y - T.y), T.y); }
|
|
13
|
+
float wCable(vec2 c, vec2 A, vec2 T, float w) {
|
|
14
|
+
vec2 E = wElbow(A, T);
|
|
15
|
+
return max(scLine(sdSeg(c, A, E), w), scLine(sdSeg(c, E, T), w));
|
|
16
|
+
}
|
|
17
|
+
vec2 wAlong(vec2 A, vec2 T, float t) {
|
|
18
|
+
vec2 E = wElbow(A, T);
|
|
19
|
+
float l1 = length(E - A);
|
|
20
|
+
float d = t * (l1 + length(T - E));
|
|
21
|
+
return d < l1 ? mix(A, E, d / max(l1, 1e-4)) : mix(E, T, (d - l1) / max(length(T - E), 1e-4));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
void sceneWiring(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
|
|
25
|
+
vec2 c = q / scU;
|
|
26
|
+
float A = S.x / S.y;
|
|
27
|
+
vec4 hit = stHit();
|
|
28
|
+
vec3 white = inkColor.rgb;
|
|
29
|
+
vec3 yel = accentColor.rgb;
|
|
30
|
+
vec3 cyan = tintA.rgb;
|
|
31
|
+
vec3 red = tintB.rgb;
|
|
32
|
+
float cut = floor(clk.x);
|
|
33
|
+
// plate: cyan / yellow duotone, scanline bands re-seeded on the cut, one slice thrown sideways on the beat
|
|
34
|
+
float sliceY = hash12(vec2(cut, 3.0));
|
|
35
|
+
float shift = step(abs(c.y - sliceY), 0.025) * hit.y * 0.05 * scU;
|
|
36
|
+
float l = clamp((luma(scPlate(q + vec2(shift, 0.0), vec2(0.0), S)) - 0.1) * 1.5, 0.0, 1.0);
|
|
37
|
+
vec3 d = mix(groundColor.rgb, cyan * 0.45, smoothstep(0.0, 0.4, l));
|
|
38
|
+
d = mix(d, cyan, smoothstep(0.35, 0.7, l));
|
|
39
|
+
d = mix(d, yel, smoothstep(0.66, 0.95, l));
|
|
40
|
+
float band = step(0.62, hash12(vec2(floor(c.y / 0.03), cut)));
|
|
41
|
+
d *= (1.0 - 0.22 * step(0.5, fract(c.y / 0.012))) * (1.0 - 0.5 * band);
|
|
42
|
+
d *= mix(0.45, 1.0, smoothstep(1.05, 0.3, length((c - vec2(0.5 * A, 0.5)) * vec2(0.8, 1.2))));
|
|
43
|
+
col = d;
|
|
44
|
+
// cables and anchors
|
|
45
|
+
int act = int(mod(clk.z, 5.0));
|
|
46
|
+
float age = float(FRAMEINDEX) - clk.w;
|
|
47
|
+
for (int i = 0; i < 5; i++) {
|
|
48
|
+
vec2 T = wTail(i);
|
|
49
|
+
bool on = i == act && clk.z > 0.5;
|
|
50
|
+
float flash = on ? step(0.3, hit.x) : 0.0;
|
|
51
|
+
col = mix(col, vec3(0.0), wCable(c, W_A[i], T, 4.0) * 0.85);
|
|
52
|
+
col = mix(col, mix(yel, white, flash), wCable(c, W_A[i], T, on ? 2.0 : 1.2));
|
|
53
|
+
float ring = scLine(length(c - W_A[i]) - 0.014, 1.2);
|
|
54
|
+
col = mix(col, vec3(0.0), scAA(length(c - W_A[i]) - 0.018) * 0.5);
|
|
55
|
+
col = mix(col, yel, max(ring, scAA(sdBox(c, W_A[i] - 0.004, W_A[i] + 0.004))));
|
|
56
|
+
if (on && age < 9.0) {
|
|
57
|
+
vec2 pp = wAlong(W_A[i], T, (age + 1.0) / 9.0);
|
|
58
|
+
col = mix(col, white, scAA(sdBox(c, pp - 0.007, pp + 0.007)));
|
|
59
|
+
}
|
|
60
|
+
// box: black plate, yellow outline, a live readout in the pixel font and a segmented level bar
|
|
61
|
+
float bf = scAA(sdBox(c, W_B[i], W_B[i] + W_SZ));
|
|
62
|
+
col = mix(col, mix(vec3(0.0), yel, flash), bf * 0.9);
|
|
63
|
+
col = mix(col, yel, scLine(sdBox(c, W_B[i], W_B[i] + W_SZ), 1.0));
|
|
64
|
+
float lev = bandAt(0.06 + 0.2 * float(i));
|
|
65
|
+
float cell = cellPx(0.0062 * scU);
|
|
66
|
+
vec2 np = q - (W_B[i] + vec2(0.014, 0.058)) * scU;
|
|
67
|
+
float num = numTxt(np, vec2(0.0), cell, floor(lev * 999.0), 3);
|
|
68
|
+
vec2 bp = (c - (W_B[i] + vec2(0.115, 0.064))) / vec2(0.17, 0.02);
|
|
69
|
+
float seg = step(0.0, bp.x) * step(bp.x, 1.0) * step(0.0, bp.y) * step(bp.y, 1.0) * step(mod(bp.x * 14.0, 1.0), 0.62);
|
|
70
|
+
float litSeg = step(bp.x, lev);
|
|
71
|
+
col = mix(col, mix(flash > 0.5 ? vec3(0.0) : yel, cyan, 1.0 - litSeg), seg * mix(0.35, 1.0, litSeg));
|
|
72
|
+
col = mix(col, flash > 0.5 ? vec3(0.0) : yel, min(num, 1.0));
|
|
73
|
+
}
|
|
74
|
+
// pixel arcs and a dot grid, bottom-left
|
|
75
|
+
float px = scPx();
|
|
76
|
+
vec2 pc = (floor(q / px) + 0.5) * px - vec2(0.0, S.y);
|
|
77
|
+
float r = length(pc) / scU;
|
|
78
|
+
float ring = floor((r - 0.05) / 0.036);
|
|
79
|
+
float ang = atan(-pc.y, pc.x) / 1.5708;
|
|
80
|
+
float seg = floor(ang * (5.0 + ring));
|
|
81
|
+
float arc = step(0.0, ring) * step(ring, 5.0) * step(fract((r - 0.05) / 0.036), 0.55) * step(0.0, ang) * step(ang, 1.0) * step(mod(seg + cut * (ring + 1.0), 3.0), 1.5);
|
|
82
|
+
col = mix(col, yel, arc);
|
|
83
|
+
vec2 dg = (c - vec2(0.27, 0.935)) / 0.026;
|
|
84
|
+
float dots = scAA(length(fract(dg) - 0.5) * 0.026 - 0.004) * step(0.0, dg.x) * step(dg.x, 12.0) * step(0.0, dg.y) * step(dg.y, 2.0);
|
|
85
|
+
col = mix(col, cyan, dots);
|
|
86
|
+
// the crimson pixel glyph: dim, full for 5 frames after every onset
|
|
87
|
+
vec2 gp = floor((c - vec2(0.405, 0.052)) / 0.0118);
|
|
88
|
+
float gl = 0.0;
|
|
89
|
+
if (gp.x >= 0.0 && gp.x < 7.0 && gp.y >= 0.0 && gp.y < 7.0) { gl = float((W_GLYPH[int(gp.y)] >> (6 - int(gp.x))) & 1); }
|
|
90
|
+
col = mix(col, red * (age < 5.0 && clk.z > 0.5 ? 1.0 : 0.3), gl);
|
|
91
|
+
// letterbox, corner brackets, label caps (Monument Extended)
|
|
92
|
+
col = mix(col, vec3(0.0), scAA(sdBox(c, vec2(-1.0), vec2(A + 1.0, 0.045))) + scAA(sdBox(c, vec2(-1.0, 0.955), vec2(A + 1.0, 2.0))));
|
|
93
|
+
vec2 a = min(c - 0.012, vec2(A, 1.0) - c - 0.012);
|
|
94
|
+
col = mix(col, white, max(scLine(a.y, 1.0) * step(a.x, 0.03), scLine(a.x, 1.0) * step(a.y, 0.03)) * step(0.0, min(a.x, a.y) + 0.001));
|
|
95
|
+
col = mix(col, white, scSheet(q, 0) * 0.9);
|
|
96
|
+
}
|