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,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"DESCRIPTION": "Black HUD ground: hairline brackets, crosshair and a dashed rule, with optional hot points for streaks and bloom",
|
|
3
|
+
"CREDIT": "agentvfx",
|
|
4
|
+
"ISFVSN": "2",
|
|
5
|
+
"CATEGORIES": ["light"],
|
|
6
|
+
"INPUTS": [
|
|
7
|
+
{ "NAME": "hotPoints", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 0 },
|
|
8
|
+
{ "NAME": "pointScale", "TYPE": "float", "MIN": 0.5, "MAX": 6, "DEFAULT": 1 },
|
|
9
|
+
{ "NAME": "rule", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 1 }
|
|
10
|
+
],
|
|
11
|
+
"PASSES": [ {} ],
|
|
12
|
+
"X_AGENTVFX": {
|
|
13
|
+
"id": "light-stage",
|
|
14
|
+
"family": "light",
|
|
15
|
+
"input": "generative",
|
|
16
|
+
"spdx": "LicenseRef-agentvfx",
|
|
17
|
+
"flash": "none",
|
|
18
|
+
"fps": 30,
|
|
19
|
+
"palette": false,
|
|
20
|
+
"presets": {
|
|
21
|
+
"deck": { "hotPoints": 0, "rule": 1 },
|
|
22
|
+
"emitters": { "hotPoints": 1, "rule": 1 },
|
|
23
|
+
"cross": { "hotPoints": 0, "rule": 0 }
|
|
24
|
+
},
|
|
25
|
+
"credits": [
|
|
26
|
+
"Segment SDF for the hairlines, Inigo Quilez distance functions, https://iquilezles.org/articles/distfunctions2d/"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Near-black ground. Hairlines stay under the highlight knee. Hot points are the only emitters.
|
|
2
|
+
|
|
3
|
+
float seg(vec2 p, vec2 a, vec2 b) {
|
|
4
|
+
vec2 pa = p - a;
|
|
5
|
+
vec2 ba = b - a;
|
|
6
|
+
float h = clamp(dot(pa, ba) / max(dot(ba, ba), 1e-5), 0.0, 1.0);
|
|
7
|
+
return length(pa - ba * h);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
float stroke(float d) {
|
|
11
|
+
float w = 1.25 / max(RENDERSIZE.y, 1.0);
|
|
12
|
+
return 1.0 - smoothstep(w * 0.45, w * 1.35, d);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
float bracket(vec2 p, vec2 c, vec2 arm) {
|
|
16
|
+
return min(seg(p, c, c + vec2(arm.x, 0.0)), seg(p, c, c + vec2(0.0, arm.y)));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
void main() {
|
|
20
|
+
vec2 aspect = vec2(RENDERSIZE.x / max(RENDERSIZE.y, 1.0), 1.0);
|
|
21
|
+
vec2 p = (vUv - 0.5) * aspect + 0.5;
|
|
22
|
+
vec3 col = HAS_INPUT ? texture(inputImage, vUv).rgb : vec3(0.003);
|
|
23
|
+
float ink = 0.0;
|
|
24
|
+
float arm = 0.055;
|
|
25
|
+
ink = max(ink, stroke(bracket(p, vec2(0.06, 0.08), vec2(arm, arm))));
|
|
26
|
+
ink = max(ink, stroke(bracket(p, vec2(0.94, 0.08), vec2(-arm, arm))));
|
|
27
|
+
ink = max(ink, stroke(bracket(p, vec2(0.06, 0.92), vec2(arm, -arm))));
|
|
28
|
+
ink = max(ink, stroke(bracket(p, vec2(0.94, 0.92), vec2(-arm, -arm))));
|
|
29
|
+
ink = max(ink, stroke(seg(p, vec2(0.5, 0.22), vec2(0.5, 0.44))));
|
|
30
|
+
ink = max(ink, stroke(seg(p, vec2(0.5, 0.56), vec2(0.5, 0.78))));
|
|
31
|
+
ink = max(ink, stroke(seg(p, vec2(0.38, 0.5), vec2(0.46, 0.5))));
|
|
32
|
+
ink = max(ink, stroke(seg(p, vec2(0.54, 0.5), vec2(0.62, 0.5))));
|
|
33
|
+
ink = max(ink, stroke(seg(p, vec2(0.08, 0.2), vec2(0.08, 0.8))));
|
|
34
|
+
ink = max(ink, stroke(seg(p, vec2(0.92, 0.2), vec2(0.92, 0.8))));
|
|
35
|
+
ink = max(ink, stroke(seg(p, vec2(0.08, 0.2), vec2(0.22, 0.2))));
|
|
36
|
+
ink = max(ink, stroke(seg(p, vec2(0.08, 0.8), vec2(0.22, 0.8))));
|
|
37
|
+
ink = max(ink, stroke(seg(p, vec2(0.78, 0.2), vec2(0.92, 0.2))));
|
|
38
|
+
ink = max(ink, stroke(seg(p, vec2(0.78, 0.8), vec2(0.92, 0.8))));
|
|
39
|
+
if (rule > 0.5) {
|
|
40
|
+
for (int i = 0; i < 18; i++) {
|
|
41
|
+
float x0 = 0.18 + float(i) * 0.036;
|
|
42
|
+
ink = max(ink, stroke(seg(p, vec2(x0, 0.9), vec2(x0 + 0.016, 0.9))));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
col = max(col, vec3(0.16) * ink);
|
|
46
|
+
if (hotPoints > 0.5) {
|
|
47
|
+
float d0 = length((vUv - vec2(0.32, 0.62)) * aspect);
|
|
48
|
+
float d1 = length((vUv - vec2(0.5, 0.42)) * aspect);
|
|
49
|
+
float d2 = length((vUv - vec2(0.7, 0.66)) * aspect);
|
|
50
|
+
float r0 = 0.005 * pointScale;
|
|
51
|
+
float r1 = 0.012 * pointScale;
|
|
52
|
+
float disk = max(1.0 - smoothstep(r0, r1, d0), max(1.0 - smoothstep(r0, r1, d1), 1.0 - smoothstep(r0, r1, d2)));
|
|
53
|
+
col = max(col, vec3(disk));
|
|
54
|
+
}
|
|
55
|
+
fragColor = vec4(col, 1.0);
|
|
56
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"template": "light-sweep",
|
|
4
|
+
"preset": "hard-bar",
|
|
5
|
+
"stack": [{ "template": "light-stage", "preset": "deck" }],
|
|
6
|
+
"input": { "audio": "test-media/beat-132.mp3" },
|
|
7
|
+
"bindings": [{ "param": "audioKick", "feature": "onset", "gain": 1.4, "offset": 0, "attackMs": 8, "releaseMs": 160 }],
|
|
8
|
+
"palette": ["#0b0b0c", "#e9e9e4"],
|
|
9
|
+
"durationSec": 4,
|
|
10
|
+
"seed": 21,
|
|
11
|
+
"out": "light-sweep-hard-bar"
|
|
12
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"template": "light-sweep",
|
|
4
|
+
"preset": "logo-sweep",
|
|
5
|
+
"input": { "video": "test-media/clip-02.mp4", "audio": "test-media/beat-132.mp3" },
|
|
6
|
+
"bindings": [{ "param": "audioKick", "feature": "onset", "gain": 1.2, "offset": 0, "attackMs": 10, "releaseMs": 180 }],
|
|
7
|
+
"palette": "brutal-acid",
|
|
8
|
+
"durationSec": 4,
|
|
9
|
+
"seed": 21,
|
|
10
|
+
"out": "light-sweep-onset"
|
|
11
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"DESCRIPTION": "A rotated HDR gleam band that crosses the frame, bloomed before the display fit",
|
|
3
|
+
"CREDIT": "agentvfx",
|
|
4
|
+
"ISFVSN": "2",
|
|
5
|
+
"CATEGORIES": ["light"],
|
|
6
|
+
"INPUTS": [
|
|
7
|
+
{ "NAME": "sweepAngle", "TYPE": "float", "MIN": -1.5708, "MAX": 1.5708, "DEFAULT": 0.4 },
|
|
8
|
+
{ "NAME": "sweepSpeed", "TYPE": "float", "MIN": 0.04, "MAX": 1.2, "DEFAULT": 0.3 },
|
|
9
|
+
{ "NAME": "bandFrac", "TYPE": "float", "MIN": 0.003, "MAX": 0.08, "DEFAULT": 0.008 },
|
|
10
|
+
{ "NAME": "gleamGain", "TYPE": "float", "MIN": 1, "MAX": 24, "DEFAULT": 14 },
|
|
11
|
+
{ "NAME": "bloomFrac", "TYPE": "float", "MIN": 0.004, "MAX": 0.22, "DEFAULT": 0.018 },
|
|
12
|
+
{ "NAME": "audioKick", "TYPE": "float", "MIN": 0, "MAX": 2, "DEFAULT": 0 },
|
|
13
|
+
{ "NAME": "sweepMix", "TYPE": "float", "MIN": 0.2, "MAX": 2, "DEFAULT": 1.15 },
|
|
14
|
+
{ "NAME": "paletteMix", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 0.75 },
|
|
15
|
+
{ "NAME": "tint", "TYPE": "color", "DEFAULT": [1, 1, 1, 1] },
|
|
16
|
+
{ "NAME": "toneMap", "TYPE": "long", "MIN": 0, "MAX": 1, "VALUES": [0, 1], "LABELS": ["AgX", "ACES"], "DEFAULT": 1 }
|
|
17
|
+
],
|
|
18
|
+
"PASSES": [
|
|
19
|
+
{ "TARGET": "gleam", "FLOAT": true },
|
|
20
|
+
{ "TARGET": "glow", "FLOAT": true },
|
|
21
|
+
{}
|
|
22
|
+
],
|
|
23
|
+
"X_AGENTVFX": {
|
|
24
|
+
"id": "light-sweep",
|
|
25
|
+
"family": "light",
|
|
26
|
+
"input": "either",
|
|
27
|
+
"spdx": "LicenseRef-agentvfx",
|
|
28
|
+
"flash": "possible",
|
|
29
|
+
"fps": 30,
|
|
30
|
+
"palette": true,
|
|
31
|
+
"safeSubstitute": { "params": { "gleamGain": 2, "sweepSpeed": 0.08, "audioKick": 0 } },
|
|
32
|
+
"audioBind": { "audioKick": "onset" },
|
|
33
|
+
"presets": {
|
|
34
|
+
"logo-sweep": { "sweepAngle": 0.55, "sweepSpeed": 0.32, "bandFrac": 0.007, "gleamGain": 16, "bloomFrac": 0.016, "paletteMix": 0.9, "sweepMix": 1.15, "toneMap": 1 },
|
|
35
|
+
"diagonal-hit": { "sweepAngle": 0.95, "sweepSpeed": 0.5, "bandFrac": 0.01, "gleamGain": 18, "bloomFrac": 0.02, "paletteMix": 0.95, "sweepMix": 1.25, "toneMap": 1 },
|
|
36
|
+
"slow-sheen": { "sweepAngle": 0.15, "sweepSpeed": 0.12, "bandFrac": 0.012, "gleamGain": 8, "bloomFrac": 0.02, "paletteMix": 0.45, "sweepMix": 0.9, "toneMap": 1 },
|
|
37
|
+
"hard-bar": { "sweepAngle": 0, "sweepSpeed": 0.42, "bandFrac": 0.0035, "gleamGain": 20, "bloomFrac": 0.008, "paletteMix": 0, "sweepMix": 1.35, "tint": [1, 1, 1, 1], "toneMap": 1 }
|
|
38
|
+
},
|
|
39
|
+
"credits": [
|
|
40
|
+
"Soft analytic band (Gaussian across a rotated axis) with HDR gain, blurred before the display transform",
|
|
41
|
+
"ACES fitted tone map, Krzysztof Narkowicz, https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/",
|
|
42
|
+
"AgX display fit, Troy Sobotka, https://github.com/sobotka/AgX"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Sharp HDR band plus its bloom, over the picture, then AgX or ACES.
|
|
2
|
+
|
|
3
|
+
vec3 acesFit(vec3 x) {
|
|
4
|
+
x = max(x, 0.0);
|
|
5
|
+
return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
vec3 agxFit(vec3 x) {
|
|
9
|
+
vec3 y = log2(max(x, 0.0) + 0.001);
|
|
10
|
+
vec3 u = clamp((y + 7.5) / 11.0, 0.0, 1.0);
|
|
11
|
+
vec3 s = u * u * (3.0 - 2.0 * u);
|
|
12
|
+
return clamp(s * 1.2 - 0.05, 0.0, 1.0);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
vec3 addLight(vec3 scene, vec3 light) {
|
|
16
|
+
vec3 base = max(scene, 0.0);
|
|
17
|
+
vec3 hdr = base + max(light, 0.0);
|
|
18
|
+
vec3 curved = toneMap == 1 ? acesFit(hdr) : agxFit(hdr);
|
|
19
|
+
vec3 curvedBase = toneMap == 1 ? acesFit(base) : agxFit(base);
|
|
20
|
+
return base + max(curved - curvedBase, 0.0);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
void main() {
|
|
24
|
+
vec3 scene = HAS_INPUT ? texture(inputImage, vUv).rgb : vec3(0.0);
|
|
25
|
+
vec3 gleamCol = texture(gleam, vUv).rgb;
|
|
26
|
+
vec3 glowCol = texture(glow, vUv).rgb;
|
|
27
|
+
vec3 light = gleamCol + max(glowCol - gleamCol, 0.0) * 0.45;
|
|
28
|
+
fragColor = vec4(addLight(scene, light * sweepMix), 1.0);
|
|
29
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// HDR gleam only. The picture is composited in the last pass, after this is bloomed.
|
|
2
|
+
|
|
3
|
+
void main() {
|
|
4
|
+
vec2 aspect = vec2(RENDERSIZE.x / max(RENDERSIZE.y, 1.0), 1.0);
|
|
5
|
+
vec2 p = rot(-sweepAngle) * ((vUv - 0.5) * aspect);
|
|
6
|
+
float travel = fract(TIME * sweepSpeed + SEED * 0.17);
|
|
7
|
+
float pos = travel * 2.6 - 1.3;
|
|
8
|
+
float sigma = max(bandFrac * RENDERSIZE.y, 0.75);
|
|
9
|
+
float d = (p.x - pos) * RENDERSIZE.y;
|
|
10
|
+
float band = exp(-0.5 * (d * d) / (sigma * sigma));
|
|
11
|
+
band *= 1.0 - smoothstep(1.7 * sigma, 2.5 * sigma, abs(d));
|
|
12
|
+
float kick = 1.0 + clamp(audioKick, 0.0, 2.0);
|
|
13
|
+
vec3 accent = mix(tint.rgb, paletteRamp(0.92), paletteMix);
|
|
14
|
+
float core = smoothstep(0.45, 0.95, band);
|
|
15
|
+
float halo = band * (1.0 - core);
|
|
16
|
+
fragColor = vec4((vec3(core) + accent * halo) * gleamGain * kick, 1.0);
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// 3x3 tent of the gleam. Radius is a fraction of frame height.
|
|
2
|
+
|
|
3
|
+
void main() {
|
|
4
|
+
vec2 t = vec2(max(bloomFrac * RENDERSIZE.y, 1.0)) / RENDERSIZE;
|
|
5
|
+
vec3 c = texture(gleam, vUv).rgb * 4.0;
|
|
6
|
+
c += texture(gleam, vUv + t * vec2(-1.0, 0.0)).rgb * 2.0;
|
|
7
|
+
c += texture(gleam, vUv + t * vec2( 1.0, 0.0)).rgb * 2.0;
|
|
8
|
+
c += texture(gleam, vUv + t * vec2( 0.0, -1.0)).rgb * 2.0;
|
|
9
|
+
c += texture(gleam, vUv + t * vec2( 0.0, 1.0)).rgb * 2.0;
|
|
10
|
+
c += texture(gleam, vUv + t * vec2(-1.0, -1.0)).rgb;
|
|
11
|
+
c += texture(gleam, vUv + t * vec2( 1.0, -1.0)).rgb;
|
|
12
|
+
c += texture(gleam, vUv + t * vec2(-1.0, 1.0)).rgb;
|
|
13
|
+
c += texture(gleam, vUv + t * vec2( 1.0, 1.0)).rgb;
|
|
14
|
+
fragColor = vec4(c / 16.0, 1.0);
|
|
15
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"DESCRIPTION": "Neon saber: SDF core, Gaussian inner glow, Lorentzian outer glow, flicker, then a bloom pass",
|
|
3
|
+
"CREDIT": "agentvfx",
|
|
4
|
+
"ISFVSN": "2",
|
|
5
|
+
"CATEGORIES": ["light"],
|
|
6
|
+
"INPUTS": [
|
|
7
|
+
{ "NAME": "saberA", "TYPE": "point2D", "DEFAULT": [0.12, 0.2] },
|
|
8
|
+
{ "NAME": "saberB", "TYPE": "point2D", "DEFAULT": [0.88, 0.8] },
|
|
9
|
+
{ "NAME": "coreFrac", "TYPE": "float", "MIN": 0.001, "MAX": 0.04, "DEFAULT": 0.006 },
|
|
10
|
+
{ "NAME": "haloFrac", "TYPE": "float", "MIN": 0.008, "MAX": 0.14, "DEFAULT": 0.02 },
|
|
11
|
+
{ "NAME": "flicker", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 0.62 },
|
|
12
|
+
{ "NAME": "flickerHz", "TYPE": "float", "MIN": 0, "MAX": 18, "DEFAULT": 8 },
|
|
13
|
+
{ "NAME": "flickerFloor", "TYPE": "float", "MIN": 0.15, "MAX": 1, "DEFAULT": 0.32 },
|
|
14
|
+
{ "NAME": "twin", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 0 },
|
|
15
|
+
{ "NAME": "trace", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 0 },
|
|
16
|
+
{ "NAME": "saberGain", "TYPE": "float", "MIN": 1, "MAX": 20, "DEFAULT": 9 },
|
|
17
|
+
{ "NAME": "paletteMix", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 0.85 },
|
|
18
|
+
{ "NAME": "tint", "TYPE": "color", "DEFAULT": [0.7, 0.92, 1, 1] },
|
|
19
|
+
{ "NAME": "toneMap", "TYPE": "long", "MIN": 0, "MAX": 1, "VALUES": [0, 1], "LABELS": ["AgX", "ACES"], "DEFAULT": 1 }
|
|
20
|
+
],
|
|
21
|
+
"PASSES": [
|
|
22
|
+
{ "TARGET": "beam", "FLOAT": true },
|
|
23
|
+
{ "TARGET": "glow", "FLOAT": true },
|
|
24
|
+
{}
|
|
25
|
+
],
|
|
26
|
+
"X_AGENTVFX": {
|
|
27
|
+
"id": "neon-saber",
|
|
28
|
+
"family": "light",
|
|
29
|
+
"input": "either",
|
|
30
|
+
"spdx": "LicenseRef-agentvfx",
|
|
31
|
+
"flash": "possible",
|
|
32
|
+
"fps": 30,
|
|
33
|
+
"palette": true,
|
|
34
|
+
"safeSubstitute": { "params": { "flicker": 0 } },
|
|
35
|
+
"presets": {
|
|
36
|
+
"saber-laser": { "coreFrac": 0.0032, "haloFrac": 0.018, "flicker": 0.55, "flickerHz": 9, "saberGain": 14, "tint": [0.55, 0.95, 1, 1], "paletteMix": 0.95, "saberA": [0.08, 0.22], "saberB": [0.9, 0.78], "toneMap": 1 },
|
|
37
|
+
"neon-tube": { "coreFrac": 0.006, "haloFrac": 0.028, "flicker": 0.18, "flickerHz": 4, "saberGain": 9, "tint": [1, 0.08, 0.55, 1], "paletteMix": 0.35, "saberA": [0.1, 0.5], "saberB": [0.9, 0.5], "toneMap": 1 },
|
|
38
|
+
"twin-blade": { "twin": 1, "coreFrac": 0.003, "haloFrac": 0.016, "flicker": 0.4, "flickerHz": 6, "saberGain": 12, "paletteMix": 0.9, "toneMap": 1 },
|
|
39
|
+
"hairline": { "trace": 1, "coreFrac": 0.0014, "haloFrac": 0.008, "flicker": 0.12, "flickerHz": 3, "saberGain": 16, "paletteMix": 1, "toneMap": 1 }
|
|
40
|
+
},
|
|
41
|
+
"credits": [
|
|
42
|
+
"Segment SDF, Inigo Quilez distance functions, https://iquilezles.org/articles/distfunctions2d/",
|
|
43
|
+
"Gaussian core plus Lorentzian wings, the usual beam profile (narrow exp, wide 1/(1+x^2))",
|
|
44
|
+
"ACES fitted tone map, Krzysztof Narkowicz, https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/",
|
|
45
|
+
"AgX display fit, Troy Sobotka, https://github.com/sobotka/AgX"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Beam core on top of its bloom, over footage, then the display fit.
|
|
2
|
+
|
|
3
|
+
vec3 acesFit(vec3 x) {
|
|
4
|
+
x = max(x, 0.0);
|
|
5
|
+
return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
vec3 agxFit(vec3 x) {
|
|
9
|
+
vec3 y = log2(max(x, 0.0) + 0.001);
|
|
10
|
+
vec3 u = clamp((y + 7.5) / 11.0, 0.0, 1.0);
|
|
11
|
+
vec3 s = u * u * (3.0 - 2.0 * u);
|
|
12
|
+
return clamp(s * 1.2 - 0.05, 0.0, 1.0);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
vec3 addLight(vec3 scene, vec3 light) {
|
|
16
|
+
vec3 base = max(scene, 0.0);
|
|
17
|
+
vec3 hdr = base + max(light, 0.0);
|
|
18
|
+
vec3 curved = toneMap == 1 ? acesFit(hdr) : agxFit(hdr);
|
|
19
|
+
vec3 curvedBase = toneMap == 1 ? acesFit(base) : agxFit(base);
|
|
20
|
+
return base + max(curved - curvedBase, 0.0);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
void main() {
|
|
24
|
+
vec3 scene = HAS_INPUT ? texture(inputImage, vUv).rgb : vec3(0.0);
|
|
25
|
+
vec3 light = texture(beam, vUv).rgb + texture(glow, vUv).rgb * 0.22;
|
|
26
|
+
fragColor = vec4(addLight(scene, light), 1.0);
|
|
27
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// HDR beam. Flicker is one value for the whole blade, seeded by time, not per-pixel noise.
|
|
2
|
+
|
|
3
|
+
float sdSegment(vec2 p, vec2 a, vec2 b) {
|
|
4
|
+
vec2 pa = p - a;
|
|
5
|
+
vec2 ba = b - a;
|
|
6
|
+
float h = clamp(dot(pa, ba) / max(dot(ba, ba), 1e-6), 0.0, 1.0);
|
|
7
|
+
return length(pa - ba * h);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
float bracket(vec2 p, vec2 c, vec2 arm) {
|
|
11
|
+
return min(sdSegment(p, c, c + vec2(arm.x, 0.0)), sdSegment(p, c, c + vec2(0.0, arm.y)));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
void main() {
|
|
15
|
+
vec2 aspect = vec2(RENDERSIZE.x / max(RENDERSIZE.y, 1.0), 1.0);
|
|
16
|
+
vec2 p = vUv * aspect;
|
|
17
|
+
float d;
|
|
18
|
+
if (trace > 0.5) {
|
|
19
|
+
float a = 0.07;
|
|
20
|
+
d = bracket(p, vec2(0.07, 0.1) * aspect, vec2(a, a) * aspect);
|
|
21
|
+
d = min(d, bracket(p, vec2(0.93, 0.1) * aspect, vec2(-a, a) * aspect));
|
|
22
|
+
d = min(d, bracket(p, vec2(0.07, 0.9) * aspect, vec2(a, -a) * aspect));
|
|
23
|
+
d = min(d, bracket(p, vec2(0.93, 0.9) * aspect, vec2(-a, -a) * aspect));
|
|
24
|
+
d = min(d, sdSegment(p, vec2(0.2, 0.5) * aspect, vec2(0.44, 0.5) * aspect));
|
|
25
|
+
d = min(d, sdSegment(p, vec2(0.56, 0.5) * aspect, vec2(0.8, 0.5) * aspect));
|
|
26
|
+
d = min(d, sdSegment(p, vec2(0.5, 0.24) * aspect, vec2(0.5, 0.44) * aspect));
|
|
27
|
+
d = min(d, sdSegment(p, vec2(0.5, 0.56) * aspect, vec2(0.5, 0.76) * aspect));
|
|
28
|
+
} else {
|
|
29
|
+
d = sdSegment(p, saberA * aspect, saberB * aspect);
|
|
30
|
+
float dTwin = sdSegment(p, (saberA + vec2(0.0, 0.07)) * aspect, (saberB + vec2(0.0, 0.07)) * aspect);
|
|
31
|
+
d = min(d, mix(10.0, dTwin, twin));
|
|
32
|
+
}
|
|
33
|
+
d *= RENDERSIZE.y;
|
|
34
|
+
float coreW = max(coreFrac * RENDERSIZE.y, 0.75);
|
|
35
|
+
float haloW = max(haloFrac * RENDERSIZE.y, coreW * 2.0);
|
|
36
|
+
float core = exp(-0.5 * (d * d) / (coreW * coreW));
|
|
37
|
+
float wing = 1.0 / (1.0 + (d / haloW) * (d / haloW));
|
|
38
|
+
wing *= 1.0 - smoothstep(haloW * 1.8, haloW * 3.0, d);
|
|
39
|
+
float bucket = floor(TIME * flickerHz + SEED * 19.0);
|
|
40
|
+
float n = hash12(vec2(bucket, 2.3));
|
|
41
|
+
float fl = mix(1.0, mix(flickerFloor, 1.0, n), clamp(flicker, 0.0, 1.0));
|
|
42
|
+
vec3 accent = mix(tint.rgb, paletteRamp(0.92), paletteMix);
|
|
43
|
+
vec3 hdr = vec3(core) * saberGain * fl * 2.4;
|
|
44
|
+
hdr += accent * wing * saberGain * fl * 0.45;
|
|
45
|
+
fragColor = vec4(hdr, 1.0);
|
|
46
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Cheap bloom of the beam so the Lorentzian wing blooms again instead of stopping hard.
|
|
2
|
+
|
|
3
|
+
void main() {
|
|
4
|
+
vec2 t = vec2(max(RENDERSIZE.y * 0.006, 1.0)) / RENDERSIZE;
|
|
5
|
+
vec3 a = texture(beam, vUv).rgb * 4.0;
|
|
6
|
+
a += texture(beam, vUv + t * vec2(-1.0, 0.0)).rgb * 2.0;
|
|
7
|
+
a += texture(beam, vUv + t * vec2( 1.0, 0.0)).rgb * 2.0;
|
|
8
|
+
a += texture(beam, vUv + t * vec2( 0.0, -1.0)).rgb * 2.0;
|
|
9
|
+
a += texture(beam, vUv + t * vec2( 0.0, 1.0)).rgb * 2.0;
|
|
10
|
+
a += texture(beam, vUv + t * vec2(-1.0, -1.0)).rgb;
|
|
11
|
+
a += texture(beam, vUv + t * vec2( 1.0, -1.0)).rgb;
|
|
12
|
+
a += texture(beam, vUv + t * vec2(-1.0, 1.0)).rgb;
|
|
13
|
+
a += texture(beam, vUv + t * vec2( 1.0, 1.0)).rgb;
|
|
14
|
+
fragColor = vec4(a / 16.0, 1.0);
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":1,"template":"echo-flow","preset":"echo-trail","input":{"video":"test-media/clip-01.mp4"},"durationSec":4,"seed":11,"out":"echo-trail"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"DESCRIPTION": "Echo flow: Horn-Schunck optical flow advecting a max-blend trail buffer with flow-scaled chroma split",
|
|
3
|
+
"CREDIT": "agentvfx",
|
|
4
|
+
"ISFVSN": "2",
|
|
5
|
+
"CATEGORIES": ["psychedelic"],
|
|
6
|
+
"INPUTS": [
|
|
7
|
+
{ "NAME": "flowScale", "TYPE": "float", "MIN": 0, "MAX": 8, "DEFAULT": 2.5 },
|
|
8
|
+
{ "NAME": "flowSmooth", "TYPE": "float", "MIN": 0.001, "MAX": 0.5, "DEFAULT": 0.05 },
|
|
9
|
+
{ "NAME": "decay", "TYPE": "float", "MIN": 0.5, "MAX": 0.999, "DEFAULT": 0.94 },
|
|
10
|
+
{ "NAME": "chromaSplit", "TYPE": "float", "MIN": 0, "MAX": 20, "DEFAULT": 6 },
|
|
11
|
+
{ "NAME": "saturation", "TYPE": "float", "MIN": 0, "MAX": 3, "DEFAULT": 1.7 },
|
|
12
|
+
{ "NAME": "blend", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 1 }
|
|
13
|
+
],
|
|
14
|
+
"PASSES": [
|
|
15
|
+
{ "TARGET": "f1", "FLOAT": true },
|
|
16
|
+
{ "TARGET": "f2", "FLOAT": true },
|
|
17
|
+
{ "TARGET": "trail", "PERSISTENT": true, "FLOAT": true },
|
|
18
|
+
{ "TARGET": "prev", "PERSISTENT": true, "FLOAT": true },
|
|
19
|
+
{}
|
|
20
|
+
],
|
|
21
|
+
"X_AGENTVFX": {
|
|
22
|
+
"id": "echo-flow",
|
|
23
|
+
"family": "psychedelic",
|
|
24
|
+
"input": "footage",
|
|
25
|
+
"spdx": "LicenseRef-agentvfx",
|
|
26
|
+
"flash": "none",
|
|
27
|
+
"fps": 30,
|
|
28
|
+
"palette": true,
|
|
29
|
+
"presets": {
|
|
30
|
+
"echo-trail": { "decay": 0.96, "flowScale": 2.5, "chromaSplit": 6, "flowSmooth": 0.05 },
|
|
31
|
+
"echo-chroma": { "decay": 0.9, "flowScale": 3.5, "chromaSplit": 14, "flowSmooth": 0.03, "saturation": 1.9 },
|
|
32
|
+
"echo-tight": { "decay": 0.86, "flowScale": 1.5, "chromaSplit": 4, "flowSmooth": 0.12 }
|
|
33
|
+
},
|
|
34
|
+
"credits": [
|
|
35
|
+
"Horn-Schunck optical flow (Jacobi iteration), https://en.wikipedia.org/wiki/Horn%E2%80%93Schunck_method"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// echo-flow main: chroma split along the flow direction over the trail
|
|
2
|
+
// buffer, then saturate and blend. (No builtin mix() calls.)
|
|
3
|
+
void main() {
|
|
4
|
+
vec2 texel = vec2(1.0) / vec2(textureSize(trail, 0));
|
|
5
|
+
vec2 f = texture(f2, vUv).rg;
|
|
6
|
+
float mag = length(f);
|
|
7
|
+
vec2 dir = f / (mag + 1e-4);
|
|
8
|
+
float m = clamp(mag * chromaSplit * 0.15, 0.0, 12.0);
|
|
9
|
+
vec2 o = dir * m * texel;
|
|
10
|
+
vec3 col = vec3(
|
|
11
|
+
texture(trail, vUv + o).r,
|
|
12
|
+
texture(trail, vUv).g,
|
|
13
|
+
texture(trail, vUv - o).b);
|
|
14
|
+
float cl = luma(col);
|
|
15
|
+
col = vec3(cl) + (col - vec3(cl)) * clamp(saturation, 0.0, 3.0);
|
|
16
|
+
vec3 src = texture(inputImage, vUv).rgb;
|
|
17
|
+
float b = clamp(blend, 0.0, 1.0);
|
|
18
|
+
fragColor = vec4(src + (col - src) * b, 1.0);
|
|
19
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// echo-flow f1: Horn-Schunck Jacobi iteration 1 from a zero start.
|
|
2
|
+
// Ix, Iy from Sobel on current luma; It against the previous frame.
|
|
3
|
+
void main() {
|
|
4
|
+
vec2 texel = vec2(1.0) / vec2(textureSize(inputImage, 0));
|
|
5
|
+
float lC = luma(texture(inputImage, vUv).rgb);
|
|
6
|
+
float lx1 = luma(texture(inputImage, vUv - vec2(texel.x, 0.0)).rgb);
|
|
7
|
+
float lx2 = luma(texture(inputImage, vUv + vec2(texel.x, 0.0)).rgb);
|
|
8
|
+
float ly1 = luma(texture(inputImage, vUv - vec2(0.0, texel.y)).rgb);
|
|
9
|
+
float ly2 = luma(texture(inputImage, vUv + vec2(0.0, texel.y)).rgb);
|
|
10
|
+
float ix = lx2 - lx1;
|
|
11
|
+
float iy = ly2 - ly1;
|
|
12
|
+
float it = lC - texture(prev, vUv).r;
|
|
13
|
+
float denom = ix * ix + iy * iy + flowSmooth * flowSmooth;
|
|
14
|
+
float corr = it / max(denom, 1e-6);
|
|
15
|
+
fragColor = vec4(-ix * corr, -iy * corr, ix, iy);
|
|
16
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// echo-flow f2: Horn-Schunck Jacobi iteration 2, warm-started from f1.
|
|
2
|
+
// Neighbourhood-averaged flow plus fresh local Sobel gradients.
|
|
3
|
+
void main() {
|
|
4
|
+
vec2 texel = vec2(1.0) / vec2(textureSize(f1, 0));
|
|
5
|
+
vec2 ub = vec2(0.0);
|
|
6
|
+
for (int i = -1; i <= 1; i++) {
|
|
7
|
+
for (int j = -1; j <= 1; j++) {
|
|
8
|
+
ub = ub + texture(f1, vUv + vec2(float(i), float(j)) * texel).rg;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
ub = ub / 9.0;
|
|
12
|
+
vec2 px = vec2(1.0) / vec2(textureSize(inputImage, 0));
|
|
13
|
+
float lC = luma(texture(inputImage, vUv).rgb);
|
|
14
|
+
float ix = luma(texture(inputImage, vUv + vec2(px.x, 0.0)).rgb) - luma(texture(inputImage, vUv - vec2(px.x, 0.0)).rgb);
|
|
15
|
+
float iy = luma(texture(inputImage, vUv + vec2(0.0, px.y)).rgb) - luma(texture(inputImage, vUv - vec2(0.0, px.y)).rgb);
|
|
16
|
+
float it = lC - texture(prev, vUv).r;
|
|
17
|
+
float denom = ix * ix + iy * iy + flowSmooth * flowSmooth;
|
|
18
|
+
float corr = (ix * ub.x + iy * ub.y + it) / max(denom, 1e-6);
|
|
19
|
+
fragColor = vec4(ub - vec2(ix, iy) * corr, 0.0, 1.0);
|
|
20
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// echo-flow trail: advect the previous output along the flow field and
|
|
2
|
+
// max-blend with the lightly punched current frame (persistent trails).
|
|
3
|
+
void main() {
|
|
4
|
+
vec2 texel = vec2(1.0) / vec2(textureSize(trail, 0));
|
|
5
|
+
vec2 f = texture(f2, vUv).rg * flowScale;
|
|
6
|
+
vec3 old = texture(trail, vUv - f * texel).rgb;
|
|
7
|
+
vec3 cur = texture(inputImage, vUv).rgb;
|
|
8
|
+
float cl = luma(cur);
|
|
9
|
+
cur = vec3(cl) + (cur - vec3(cl)) * 1.3;
|
|
10
|
+
fragColor = vec4(max(old * decay, cur), 1.0);
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":1,"template":"hologram-scan","preset":"holo-cyan","input":{"video":"test-media/clip-01.mp4"},"durationSec":4,"seed":11,"out":"hologram-cyan"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"DESCRIPTION": "Hologram scan: Sobel edge neon over dimmed footage with scanlines, sweep bar, wobble, fringe, flicker and grain",
|
|
3
|
+
"CREDIT": "agentvfx",
|
|
4
|
+
"ISFVSN": "2",
|
|
5
|
+
"CATEGORIES": ["psychedelic"],
|
|
6
|
+
"INPUTS": [
|
|
7
|
+
{ "NAME": "neon", "TYPE": "color", "DEFAULT": [0.1, 0.9, 1, 1] },
|
|
8
|
+
{ "NAME": "edgeGain", "TYPE": "float", "MIN": 0, "MAX": 8, "DEFAULT": 3.5 },
|
|
9
|
+
{ "NAME": "fillLevel", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 0.45 },
|
|
10
|
+
{ "NAME": "scanScale", "TYPE": "float", "MIN": 10, "MAX": 400, "DEFAULT": 130 },
|
|
11
|
+
{ "NAME": "sweepSpeed", "TYPE": "float", "MIN": 0, "MAX": 3, "DEFAULT": 0.8 },
|
|
12
|
+
{ "NAME": "wobble", "TYPE": "float", "MIN": 0, "MAX": 0.05, "DEFAULT": 0.012 },
|
|
13
|
+
{ "NAME": "fringe", "TYPE": "float", "MIN": 0, "MAX": 12, "DEFAULT": 2.5 },
|
|
14
|
+
{ "NAME": "flicker", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 0.5 },
|
|
15
|
+
{ "NAME": "grain", "TYPE": "float", "MIN": 0, "MAX": 0.5, "DEFAULT": 0.12 },
|
|
16
|
+
{ "NAME": "blend", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 1 }
|
|
17
|
+
],
|
|
18
|
+
"X_AGENTVFX": {
|
|
19
|
+
"id": "hologram-scan",
|
|
20
|
+
"family": "psychedelic",
|
|
21
|
+
"input": "footage",
|
|
22
|
+
"spdx": "LicenseRef-agentvfx",
|
|
23
|
+
"flash": "possible",
|
|
24
|
+
"fps": 30,
|
|
25
|
+
"palette": true,
|
|
26
|
+
"presets": {
|
|
27
|
+
"holo-cyan": { "neon": [0.1, 0.9, 1, 1], "edgeGain": 3.5, "flicker": 0.5, "fringe": 2.5 },
|
|
28
|
+
"holo-magenta": { "neon": [1, 0.15, 0.85, 1], "edgeGain": 4, "fillLevel": 0.4, "flicker": 0.6, "sweepSpeed": 1.1 },
|
|
29
|
+
"holo-storm": { "neon": [0.6, 1, 0.3, 1], "edgeGain": 5, "fillLevel": 0.5, "flicker": 0.85, "wobble": 0.025, "grain": 0.2 }
|
|
30
|
+
},
|
|
31
|
+
"safeSubstitute": { "params": { "flicker": 0, "grain": 0.05 } },
|
|
32
|
+
"credits": [
|
|
33
|
+
"Sobel operator, https://en.wikipedia.org/wiki/Sobel_operator"
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// hologram-scan: edge neon over a dimmed fill, scanlines, a travelling
|
|
2
|
+
// sweep bar, wobble, RGB fringe, per-frame flicker and grain.
|
|
3
|
+
// (No builtin mix() calls: `blend` is an input name.)
|
|
4
|
+
void main() {
|
|
5
|
+
vec2 texel = vec2(1.0) / vec2(textureSize(inputImage, 0));
|
|
6
|
+
vec2 wuv = vUv + vec2(sin(vUv.y * 40.0 + TIME * 3.0) * wobble, 0.0);
|
|
7
|
+
vec2 cuv = clamp(wuv, 0.0, 1.0);
|
|
8
|
+
float lx1 = luma(texture(inputImage, cuv - vec2(texel.x, 0.0)).rgb);
|
|
9
|
+
float lx2 = luma(texture(inputImage, cuv + vec2(texel.x, 0.0)).rgb);
|
|
10
|
+
float ly1 = luma(texture(inputImage, cuv - vec2(0.0, texel.y)).rgb);
|
|
11
|
+
float ly2 = luma(texture(inputImage, cuv + vec2(0.0, texel.y)).rgb);
|
|
12
|
+
float edge = clamp(length(vec2(lx2 - lx1, ly2 - ly1)) * edgeGain, 0.0, 1.5);
|
|
13
|
+
vec2 fuv = cuv + vec2(fringe * texel.x, 0.0);
|
|
14
|
+
vec2 buv = cuv - vec2(fringe * texel.x, 0.0);
|
|
15
|
+
vec3 src = vec3(
|
|
16
|
+
texture(inputImage, clamp(fuv, 0.0, 1.0)).r,
|
|
17
|
+
texture(inputImage, cuv).g,
|
|
18
|
+
texture(inputImage, clamp(buv, 0.0, 1.0)).b);
|
|
19
|
+
vec3 fill = src * fillLevel;
|
|
20
|
+
float scan = 0.72 + 0.28 * sin(vUv.y * RENDERSIZE.y * scanScale * 0.02418);
|
|
21
|
+
float sweepY = fract(TIME * sweepSpeed * 0.25);
|
|
22
|
+
float bar = exp(-pow((vUv.y - sweepY) * 9.0, 2.0));
|
|
23
|
+
float fl = 1.0 - flicker * hash12(vec2(float(FRAMEINDEX), 7.0));
|
|
24
|
+
vec3 col = fill * scan + neon.rgb * edge * (0.9 + 1.3 * bar);
|
|
25
|
+
col = col * (0.55 + 0.45 * bar + 0.6 * edge) * fl + neon.rgb * bar * 0.25 * fl;
|
|
26
|
+
col = col + vec3(hash12(vUv * RENDERSIZE + fract(TIME) * 13.0) - 0.5) * grain;
|
|
27
|
+
float m = clamp(blend, 0.0, 1.0);
|
|
28
|
+
vec3 base = texture(inputImage, vUv).rgb;
|
|
29
|
+
fragColor = vec4(base + (max(col, 0.0) - base) * m, 1.0);
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":1,"template":"kaleido-fold","preset":"kaleido-six","input":{"video":"test-media/clip-01.mp4"},"durationSec":4,"seed":11,"out":"kaleido-six"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"DESCRIPTION": "Kaleido fold: mirror-folded footage through a spinning segment kaleidoscope with zooming feedback trails",
|
|
3
|
+
"CREDIT": "agentvfx",
|
|
4
|
+
"ISFVSN": "2",
|
|
5
|
+
"CATEGORIES": ["psychedelic"],
|
|
6
|
+
"INPUTS": [
|
|
7
|
+
{ "NAME": "segments", "TYPE": "long", "MIN": 2, "MAX": 16, "DEFAULT": 8 },
|
|
8
|
+
{ "NAME": "zoom", "TYPE": "float", "MIN": 1, "MAX": 1.1, "DEFAULT": 1.01 },
|
|
9
|
+
{ "NAME": "spin", "TYPE": "float", "MIN": -2, "MAX": 2, "DEFAULT": 0.3 },
|
|
10
|
+
{ "NAME": "hueSpin", "TYPE": "float", "MIN": 0, "MAX": 10, "DEFAULT": 2 },
|
|
11
|
+
{ "NAME": "feedback", "TYPE": "float", "MIN": 0, "MAX": 0.99, "DEFAULT": 0.9 },
|
|
12
|
+
{ "NAME": "saturation", "TYPE": "float", "MIN": 0, "MAX": 3, "DEFAULT": 1.7 },
|
|
13
|
+
{ "NAME": "blend", "TYPE": "float", "MIN": 0, "MAX": 1, "DEFAULT": 1 }
|
|
14
|
+
],
|
|
15
|
+
"PASSES": [
|
|
16
|
+
{ "TARGET": "fold", "PERSISTENT": true, "FLOAT": true },
|
|
17
|
+
{}
|
|
18
|
+
],
|
|
19
|
+
"X_AGENTVFX": {
|
|
20
|
+
"id": "kaleido-fold",
|
|
21
|
+
"family": "psychedelic",
|
|
22
|
+
"input": "either",
|
|
23
|
+
"spdx": "LicenseRef-agentvfx",
|
|
24
|
+
"flash": "none",
|
|
25
|
+
"fps": 30,
|
|
26
|
+
"palette": true,
|
|
27
|
+
"presets": {
|
|
28
|
+
"kaleido-six": { "segments": 6, "zoom": 1.012, "spin": 0.35, "hueSpin": 2, "feedback": 0.78, "saturation": 1.9 },
|
|
29
|
+
"kaleido-twelve": { "segments": 12, "zoom": 1.02, "spin": 0.6, "hueSpin": 3.5, "feedback": 0.93, "saturation": 1.9 },
|
|
30
|
+
"kaleido-mirror": { "segments": 8, "zoom": 1.005, "spin": 0.15, "hueSpin": 1, "feedback": 0.86, "saturation": 1.6 }
|
|
31
|
+
},
|
|
32
|
+
"credits": [
|
|
33
|
+
"iq cosine palette, https://iquilezles.org/articles/palettes/",
|
|
34
|
+
"fbm, The Book of Shaders ch.13, https://thebookofshaders.com/13/"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
}
|