agentvfx 0.0.0-stage → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/AGENTS.md +8 -0
  2. package/GEMINI.md +1 -0
  3. package/LICENSE +202 -0
  4. package/README.md +228 -2
  5. package/package.json +35 -4
  6. package/skills/agentvfx/LICENSE +202 -0
  7. package/skills/agentvfx/NOTICE +50 -0
  8. package/skills/agentvfx/SKILL.md +90 -0
  9. package/skills/agentvfx/engine/core/constants.mjs +84 -0
  10. package/skills/agentvfx/engine/core/flash-constants.mjs +23 -0
  11. package/skills/agentvfx/engine/core/flash.mjs +240 -0
  12. package/skills/agentvfx/engine/core/mark.mjs +25 -0
  13. package/skills/agentvfx/engine/core/palettes.mjs +36 -0
  14. package/skills/agentvfx/engine/core/schedule.mjs +85 -0
  15. package/skills/agentvfx/engine/core/templates.mjs +43 -0
  16. package/skills/agentvfx/engine/core/util.mjs +167 -0
  17. package/skills/agentvfx/engine/core/validate.mjs +334 -0
  18. package/skills/agentvfx/engine/node/analysis.mjs +172 -0
  19. package/skills/agentvfx/engine/node/audio.mjs +621 -0
  20. package/skills/agentvfx/engine/node/board.mjs +24 -0
  21. package/skills/agentvfx/engine/node/chrome.mjs +349 -0
  22. package/skills/agentvfx/engine/node/encode.mjs +110 -0
  23. package/skills/agentvfx/engine/node/eye.mjs +77 -0
  24. package/skills/agentvfx/engine/node/footage.mjs +129 -0
  25. package/skills/agentvfx/engine/node/frame-worker.mjs +39 -0
  26. package/skills/agentvfx/engine/node/host.mjs +31 -0
  27. package/skills/agentvfx/engine/node/job.mjs +181 -0
  28. package/skills/agentvfx/engine/node/png.mjs +112 -0
  29. package/skills/agentvfx/engine/node/render.mjs +161 -0
  30. package/skills/agentvfx/engine/node/stage-capture.mjs +187 -0
  31. package/skills/agentvfx/engine/node/stage-serve.mjs +72 -0
  32. package/skills/agentvfx/engine/node/stills.mjs +100 -0
  33. package/skills/agentvfx/engine/node/ws-server.mjs +132 -0
  34. package/skills/agentvfx/engine/web/gl.mjs +319 -0
  35. package/skills/agentvfx/engine/web/glsl-common.mjs +78 -0
  36. package/skills/agentvfx/engine/web/init.js +23 -0
  37. package/skills/agentvfx/engine/web/prelude.mjs +150 -0
  38. package/skills/agentvfx/engine/web/render.html +11 -0
  39. package/skills/agentvfx/engine/web/render.mjs +388 -0
  40. package/skills/agentvfx/engine/web/scale.mjs +15 -0
  41. package/skills/agentvfx/engine/web/text.mjs +158 -0
  42. package/skills/agentvfx/plates/terminalcore/README.md +61 -0
  43. package/skills/agentvfx/plates/terminalcore/__pycache__/crt.cpython-313.pyc +0 -0
  44. package/skills/agentvfx/plates/terminalcore/__pycache__/font.cpython-313.pyc +0 -0
  45. package/skills/agentvfx/plates/terminalcore/__pycache__/gallery.cpython-313.pyc +0 -0
  46. package/skills/agentvfx/plates/terminalcore/__pycache__/gallery_mats.cpython-313.pyc +0 -0
  47. package/skills/agentvfx/plates/terminalcore/__pycache__/gallery_room.cpython-313.pyc +0 -0
  48. package/skills/agentvfx/plates/terminalcore/__pycache__/materials.cpython-313.pyc +0 -0
  49. package/skills/agentvfx/plates/terminalcore/__pycache__/nodekit.cpython-313.pyc +0 -0
  50. package/skills/agentvfx/plates/terminalcore/__pycache__/room.cpython-313.pyc +0 -0
  51. package/skills/agentvfx/plates/terminalcore/__pycache__/shots.cpython-313.pyc +0 -0
  52. package/skills/agentvfx/plates/terminalcore/__pycache__/textures.cpython-313.pyc +0 -0
  53. package/skills/agentvfx/plates/terminalcore/__pycache__/wall.cpython-313.pyc +0 -0
  54. package/skills/agentvfx/plates/terminalcore/crt.py +143 -0
  55. package/skills/agentvfx/plates/terminalcore/font.py +80 -0
  56. package/skills/agentvfx/plates/terminalcore/gallery.py +61 -0
  57. package/skills/agentvfx/plates/terminalcore/gallery_mats.py +144 -0
  58. package/skills/agentvfx/plates/terminalcore/gallery_room.py +126 -0
  59. package/skills/agentvfx/plates/terminalcore/materials.py +170 -0
  60. package/skills/agentvfx/plates/terminalcore/nodekit.py +87 -0
  61. package/skills/agentvfx/plates/terminalcore/room.py +82 -0
  62. package/skills/agentvfx/plates/terminalcore/scene.py +219 -0
  63. package/skills/agentvfx/plates/terminalcore/shots.py +48 -0
  64. package/skills/agentvfx/plates/terminalcore/textures.py +79 -0
  65. package/skills/agentvfx/plates/terminalcore/wall.py +103 -0
  66. package/skills/agentvfx/references/plates.md +22 -0
  67. package/skills/agentvfx/references/template-format.md +149 -0
  68. package/skills/agentvfx/references/web.md +63 -0
  69. package/skills/agentvfx/runtime/agentvfx.js +708 -0
  70. package/skills/agentvfx/schemas/fx-score.schema.json +98 -0
  71. package/skills/agentvfx/scripts/export-web.mjs +157 -0
  72. package/skills/agentvfx/scripts/loop.mjs +129 -0
  73. package/skills/agentvfx/scripts/make-beat.mjs +133 -0
  74. package/skills/agentvfx/scripts/plate.mjs +82 -0
  75. package/skills/agentvfx/scripts/vfx.mjs +173 -0
  76. package/skills/agentvfx/templates/_test/feedback-counter/fx.json +11 -0
  77. package/skills/agentvfx/templates/_test/feedback-counter/main.frag +4 -0
  78. package/skills/agentvfx/templates/_test/feedback-counter/pass0.frag +4 -0
  79. package/skills/agentvfx/templates/_test/gradient/fx.json +23 -0
  80. package/skills/agentvfx/templates/_test/gradient/main.frag +5 -0
  81. package/skills/agentvfx/templates/_test/identity/fx.json +10 -0
  82. package/skills/agentvfx/templates/_test/identity/main.frag +4 -0
  83. package/skills/agentvfx/templates/_test/strobe/fx.json +14 -0
  84. package/skills/agentvfx/templates/_test/strobe/main.frag +6 -0
  85. package/skills/agentvfx/templates/_test/text-probe/fx.json +15 -0
  86. package/skills/agentvfx/templates/_test/text-probe/main.frag +6 -0
  87. package/skills/agentvfx/templates/brutal/NOTES.md +14 -0
  88. package/skills/agentvfx/templates/brutal/_src/boot-log/def.mjs +57 -0
  89. package/skills/agentvfx/templates/brutal/_src/boot-log/main.src.frag +129 -0
  90. package/skills/agentvfx/templates/brutal/_src/build.mjs +33 -0
  91. package/skills/agentvfx/templates/brutal/_src/halftone-field/def.mjs +72 -0
  92. package/skills/agentvfx/templates/brutal/_src/halftone-field/main.src.frag +94 -0
  93. package/skills/agentvfx/templates/brutal/_src/hud-deck/deck-left.src.glsl +100 -0
  94. package/skills/agentvfx/templates/brutal/_src/hud-deck/deck-right.src.glsl +61 -0
  95. package/skills/agentvfx/templates/brutal/_src/hud-deck/deck-tiles.src.glsl +153 -0
  96. package/skills/agentvfx/templates/brutal/_src/hud-deck/def.mjs +82 -0
  97. package/skills/agentvfx/templates/brutal/_src/hud-deck/main.src.frag +110 -0
  98. package/skills/agentvfx/templates/brutal/_src/hud-deck/pass0.src.frag +38 -0
  99. package/skills/agentvfx/templates/brutal/_src/shared/defs.mjs +28 -0
  100. package/skills/agentvfx/templates/brutal/_src/shared/icons.glsl +72 -0
  101. package/skills/agentvfx/templates/brutal/_src/shared/lib.glsl +115 -0
  102. package/skills/agentvfx/templates/brutal/_src/shared/screen.glsl +43 -0
  103. package/skills/agentvfx/templates/brutal/boot-log/demo-acid.json +1 -0
  104. package/skills/agentvfx/templates/brutal/boot-log/demo-phosphor.json +1 -0
  105. package/skills/agentvfx/templates/brutal/boot-log/demo-ultramarine.json +1 -0
  106. package/skills/agentvfx/templates/brutal/boot-log/fx.json +257 -0
  107. package/skills/agentvfx/templates/brutal/boot-log/main.frag +242 -0
  108. package/skills/agentvfx/templates/brutal/collage/_src/00-lib.glsl +73 -0
  109. package/skills/agentvfx/templates/brutal/collage/_src/10-spectrum-scope.glsl +73 -0
  110. package/skills/agentvfx/templates/brutal/collage/_src/20-meter-readout-cross.glsl +87 -0
  111. package/skills/agentvfx/templates/brutal/collage/_src/30-footage-fillers.glsl +92 -0
  112. package/skills/agentvfx/templates/brutal/collage/_src/40-editorial.glsl +232 -0
  113. package/skills/agentvfx/templates/brutal/collage/_src/50-typefx.glsl +163 -0
  114. package/skills/agentvfx/templates/brutal/collage/_src/60-scene-lib.glsl +104 -0
  115. package/skills/agentvfx/templates/brutal/collage/_src/61-scene-specimen.glsl +71 -0
  116. package/skills/agentvfx/templates/brutal/collage/_src/62-scene-wiring.glsl +96 -0
  117. package/skills/agentvfx/templates/brutal/collage/_src/63-scene-fieldcut.glsl +119 -0
  118. package/skills/agentvfx/templates/brutal/collage/_src/64-scene-pattern.glsl +64 -0
  119. package/skills/agentvfx/templates/brutal/collage/_src/641-scene-anatomy.glsl +49 -0
  120. package/skills/agentvfx/templates/brutal/collage/_src/642-scene-deck.glsl +78 -0
  121. package/skills/agentvfx/templates/brutal/collage/_src/643-scene-bootlog.glsl +60 -0
  122. package/skills/agentvfx/templates/brutal/collage/_src/644-scene-tunnel.glsl +48 -0
  123. package/skills/agentvfx/templates/brutal/collage/_src/645-scene-runner.glsl +42 -0
  124. package/skills/agentvfx/templates/brutal/collage/_src/646-scene-ascii.glsl +66 -0
  125. package/skills/agentvfx/templates/brutal/collage/_src/647-scene-cubewall.glsl +80 -0
  126. package/skills/agentvfx/templates/brutal/collage/_src/648-scene-vortex.glsl +46 -0
  127. package/skills/agentvfx/templates/brutal/collage/_src/649-scene-sticker.glsl +72 -0
  128. package/skills/agentvfx/templates/brutal/collage/_src/65-scene-main.glsl +1 -0
  129. package/skills/agentvfx/templates/brutal/collage/_src/650-scene-ribbon.glsl +55 -0
  130. package/skills/agentvfx/templates/brutal/collage/_src/651-scene-slab.glsl +38 -0
  131. package/skills/agentvfx/templates/brutal/collage/_src/652-scene-framedial.glsl +79 -0
  132. package/skills/agentvfx/templates/brutal/collage/_src/653-scene-tilt.glsl +40 -0
  133. package/skills/agentvfx/templates/brutal/collage/_src/654-scene-marquee.glsl +45 -0
  134. package/skills/agentvfx/templates/brutal/collage/_src/655-scene-lens.glsl +57 -0
  135. package/skills/agentvfx/templates/brutal/collage/_src/656-scene-liquid.glsl +35 -0
  136. package/skills/agentvfx/templates/brutal/collage/_src/657-scene-panelgrid.glsl +75 -0
  137. package/skills/agentvfx/templates/brutal/collage/_src/658-scene-mirror.glsl +49 -0
  138. package/skills/agentvfx/templates/brutal/collage/_src/66-scene-main.glsl +27 -0
  139. package/skills/agentvfx/templates/brutal/collage/_src/90-main.glsl +120 -0
  140. package/skills/agentvfx/templates/brutal/collage/_src/build.mjs +24 -0
  141. package/skills/agentvfx/templates/brutal/collage/_src/sync-presets.mjs +16 -0
  142. package/skills/agentvfx/templates/brutal/collage/demo-bone-lime.json +1 -0
  143. package/skills/agentvfx/templates/brutal/collage/demo-lime-sparse.json +1 -0
  144. package/skills/agentvfx/templates/brutal/collage/demo-orange-dense.json +1 -0
  145. package/skills/agentvfx/templates/brutal/collage/demo-ultra-slow.json +1 -0
  146. package/skills/agentvfx/templates/brutal/collage/fx.json +4882 -0
  147. package/skills/agentvfx/templates/brutal/collage/layout.mjs +97 -0
  148. package/skills/agentvfx/templates/brutal/collage/layouts.json +366 -0
  149. package/skills/agentvfx/templates/brutal/collage/main.frag +2367 -0
  150. package/skills/agentvfx/templates/brutal/collage/pass0.frag +265 -0
  151. package/skills/agentvfx/templates/brutal/halftone-field/demo-acid.json +1 -0
  152. package/skills/agentvfx/templates/brutal/halftone-field/demo-ascii.json +1 -0
  153. package/skills/agentvfx/templates/brutal/halftone-field/demo-dither.json +1 -0
  154. package/skills/agentvfx/templates/brutal/halftone-field/demo-orange.json +1 -0
  155. package/skills/agentvfx/templates/brutal/halftone-field/demo-phosphor.json +1 -0
  156. package/skills/agentvfx/templates/brutal/halftone-field/demo-ultramarine.json +1 -0
  157. package/skills/agentvfx/templates/brutal/halftone-field/fx.json +474 -0
  158. package/skills/agentvfx/templates/brutal/halftone-field/main.frag +248 -0
  159. package/skills/agentvfx/templates/brutal/hud-deck/demo-acid.json +1 -0
  160. package/skills/agentvfx/templates/brutal/hud-deck/demo-night.json +1 -0
  161. package/skills/agentvfx/templates/brutal/hud-deck/demo-octagon.json +1 -0
  162. package/skills/agentvfx/templates/brutal/hud-deck/demo-ultramarine.json +1 -0
  163. package/skills/agentvfx/templates/brutal/hud-deck/fx.json +601 -0
  164. package/skills/agentvfx/templates/brutal/hud-deck/main.frag +645 -0
  165. package/skills/agentvfx/templates/brutal/hud-deck/pass0.frag +38 -0
  166. package/skills/agentvfx/templates/brutal/lattice/demo-cobalt-fine.json +1 -0
  167. package/skills/agentvfx/templates/brutal/lattice/demo-ink-yellow.json +1 -0
  168. package/skills/agentvfx/templates/brutal/lattice/demo-vermilion.json +1 -0
  169. package/skills/agentvfx/templates/brutal/lattice/demo-violet-slow.json +1 -0
  170. package/skills/agentvfx/templates/brutal/lattice/fx.json +130 -0
  171. package/skills/agentvfx/templates/brutal/lattice/main.frag +175 -0
  172. package/skills/agentvfx/templates/brutal/lattice/pass0.frag +29 -0
  173. package/skills/agentvfx/templates/glitch/block-glitch/demo-mosaic.json +1 -0
  174. package/skills/agentvfx/templates/glitch/block-glitch/demo-onset.json +1 -0
  175. package/skills/agentvfx/templates/glitch/block-glitch/demo-static.json +1 -0
  176. package/skills/agentvfx/templates/glitch/block-glitch/demo-tear.json +1 -0
  177. package/skills/agentvfx/templates/glitch/block-glitch/fx.json +54 -0
  178. package/skills/agentvfx/templates/glitch/block-glitch/main.frag +132 -0
  179. package/skills/agentvfx/templates/glitch/block-glitch/pass0.frag +12 -0
  180. package/skills/agentvfx/templates/glitch/pixel-sort/NOTES.md +13 -0
  181. package/skills/agentvfx/templates/glitch/pixel-sort/build-passes.mjs +162 -0
  182. package/skills/agentvfx/templates/glitch/pixel-sort/demo-chunk.json +1 -0
  183. package/skills/agentvfx/templates/glitch/pixel-sort/demo-hue.json +1 -0
  184. package/skills/agentvfx/templates/glitch/pixel-sort/demo-kick.json +1 -0
  185. package/skills/agentvfx/templates/glitch/pixel-sort/demo-streak.json +1 -0
  186. package/skills/agentvfx/templates/glitch/pixel-sort/demo-vertical.json +1 -0
  187. package/skills/agentvfx/templates/glitch/pixel-sort/fx.json +60 -0
  188. package/skills/agentvfx/templates/glitch/pixel-sort/main.frag +83 -0
  189. package/skills/agentvfx/templates/glitch/pixel-sort/pass0.frag +64 -0
  190. package/skills/agentvfx/templates/glitch/pixel-sort/pass1.frag +66 -0
  191. package/skills/agentvfx/templates/glitch/pixel-sort/pass2.frag +66 -0
  192. package/skills/agentvfx/templates/glitch/pixel-sort/pass3.frag +66 -0
  193. package/skills/agentvfx/templates/glitch/pixel-sort/pass4.frag +66 -0
  194. package/skills/agentvfx/templates/glitch/pixel-sort/pass5.frag +66 -0
  195. package/skills/agentvfx/templates/glitch/pixel-sort/pass6.frag +66 -0
  196. package/skills/agentvfx/templates/glitch/pixel-sort/pass7.frag +66 -0
  197. package/skills/agentvfx/templates/glitch/pixel-sort/pass8.frag +66 -0
  198. package/skills/agentvfx/templates/glitch/rgb-split/demo-diagonal-stutter.json +1 -0
  199. package/skills/agentvfx/templates/glitch/rgb-split/demo-hard.json +1 -0
  200. package/skills/agentvfx/templates/glitch/rgb-split/demo-kick.json +1 -0
  201. package/skills/agentvfx/templates/glitch/rgb-split/demo-radial.json +1 -0
  202. package/skills/agentvfx/templates/glitch/rgb-split/fx.json +46 -0
  203. package/skills/agentvfx/templates/glitch/rgb-split/main.frag +76 -0
  204. package/skills/agentvfx/templates/glitch/vhs/demo-clean.json +1 -0
  205. package/skills/agentvfx/templates/glitch/vhs/demo-crash.json +1 -0
  206. package/skills/agentvfx/templates/glitch/vhs/demo-tape.json +1 -0
  207. package/skills/agentvfx/templates/glitch/vhs/demo-worn.json +1 -0
  208. package/skills/agentvfx/templates/glitch/vhs/fx.json +46 -0
  209. package/skills/agentvfx/templates/glitch/vhs/main.frag +96 -0
  210. package/skills/agentvfx/templates/impact/impact-1bit/demo-onebit-bayer.json +1 -0
  211. package/skills/agentvfx/templates/impact/impact-1bit/fx.json +45 -0
  212. package/skills/agentvfx/templates/impact/impact-1bit/main.frag +64 -0
  213. package/skills/agentvfx/templates/impact/impact-invert/demo-invert-snap.json +1 -0
  214. package/skills/agentvfx/templates/impact/impact-invert/fx.json +37 -0
  215. package/skills/agentvfx/templates/impact/impact-invert/main.frag +44 -0
  216. package/skills/agentvfx/templates/impact/punch-shake/demo-punch-hard.json +1 -0
  217. package/skills/agentvfx/templates/impact/punch-shake/fx.json +36 -0
  218. package/skills/agentvfx/templates/impact/punch-shake/main.frag +62 -0
  219. package/skills/agentvfx/templates/impact/rgb-hit/demo-rgb-slam.json +1 -0
  220. package/skills/agentvfx/templates/impact/rgb-hit/fx.json +39 -0
  221. package/skills/agentvfx/templates/impact/rgb-hit/main.frag +62 -0
  222. package/skills/agentvfx/templates/impact/signal-cut/demo-lime-hold.json +1 -0
  223. package/skills/agentvfx/templates/impact/signal-cut/demo-lime.json +1 -0
  224. package/skills/agentvfx/templates/impact/signal-cut/demo-orange.json +1 -0
  225. package/skills/agentvfx/templates/impact/signal-cut/demo-ultramarine.json +1 -0
  226. package/skills/agentvfx/templates/impact/signal-cut/fx.json +83 -0
  227. package/skills/agentvfx/templates/impact/signal-cut/main.frag +101 -0
  228. package/skills/agentvfx/templates/impact/signal-cut/pass0.frag +68 -0
  229. package/skills/agentvfx/templates/impact/speedline-burst/demo-speed-white.json +1 -0
  230. package/skills/agentvfx/templates/impact/speedline-burst/fx.json +44 -0
  231. package/skills/agentvfx/templates/impact/speedline-burst/main.frag +68 -0
  232. package/skills/agentvfx/templates/impact/strobe-burst/demo-strobe-white-16.json +1 -0
  233. package/skills/agentvfx/templates/impact/strobe-burst/fx.json +42 -0
  234. package/skills/agentvfx/templates/impact/strobe-burst/main.frag +43 -0
  235. package/skills/agentvfx/templates/light/anamorphic-streak/demo-anamorphic-cinema.json +10 -0
  236. package/skills/agentvfx/templates/light/anamorphic-streak/demo-data.json +10 -0
  237. package/skills/agentvfx/templates/light/anamorphic-streak/fx.json +47 -0
  238. package/skills/agentvfx/templates/light/anamorphic-streak/main.frag +45 -0
  239. package/skills/agentvfx/templates/light/anamorphic-streak/pass0.frag +22 -0
  240. package/skills/agentvfx/templates/light/anamorphic-streak/pass1.frag +16 -0
  241. package/skills/agentvfx/templates/light/anamorphic-streak/pass2.frag +16 -0
  242. package/skills/agentvfx/templates/light/anamorphic-streak/pass3.frag +16 -0
  243. package/skills/agentvfx/templates/light/bloom-glow/demo-clip01-low.json +11 -0
  244. package/skills/agentvfx/templates/light/bloom-glow/demo-neon-night.json +10 -0
  245. package/skills/agentvfx/templates/light/bloom-glow/demo-phosphor.json +11 -0
  246. package/skills/agentvfx/templates/light/bloom-glow/fx.json +53 -0
  247. package/skills/agentvfx/templates/light/bloom-glow/main.frag +85 -0
  248. package/skills/agentvfx/templates/light/bloom-glow/pass0.frag +21 -0
  249. package/skills/agentvfx/templates/light/bloom-glow/pass1.frag +50 -0
  250. package/skills/agentvfx/templates/light/bloom-glow/pass2.frag +44 -0
  251. package/skills/agentvfx/templates/light/bloom-glow/pass3.frag +32 -0
  252. package/skills/agentvfx/templates/light/bloom-glow/pass4.frag +48 -0
  253. package/skills/agentvfx/templates/light/bloom-glow/pass5.frag +46 -0
  254. package/skills/agentvfx/templates/light/god-rays/demo-golden-hour.json +10 -0
  255. package/skills/agentvfx/templates/light/god-rays/demo-point-lamp.json +10 -0
  256. package/skills/agentvfx/templates/light/god-rays/fx.json +39 -0
  257. package/skills/agentvfx/templates/light/god-rays/main.frag +54 -0
  258. package/skills/agentvfx/templates/light/lens-flare/demo-clip01-bar.json +11 -0
  259. package/skills/agentvfx/templates/light/lens-flare/demo-eye-bar.json +10 -0
  260. package/skills/agentvfx/templates/light/lens-flare/demo-sun-ghosts.json +10 -0
  261. package/skills/agentvfx/templates/light/lens-flare/fx.json +49 -0
  262. package/skills/agentvfx/templates/light/lens-flare/main.frag +86 -0
  263. package/skills/agentvfx/templates/light/lens-flare/pass0.frag +24 -0
  264. package/skills/agentvfx/templates/light/light-leak/demo-slit.json +10 -0
  265. package/skills/agentvfx/templates/light/light-leak/demo-vintage-burn.json +10 -0
  266. package/skills/agentvfx/templates/light/light-leak/fx.json +40 -0
  267. package/skills/agentvfx/templates/light/light-leak/main.frag +46 -0
  268. package/skills/agentvfx/templates/light/light-stage/fx.json +29 -0
  269. package/skills/agentvfx/templates/light/light-stage/main.frag +56 -0
  270. package/skills/agentvfx/templates/light/light-sweep/demo-hard-bar.json +12 -0
  271. package/skills/agentvfx/templates/light/light-sweep/demo-logo-sweep.json +10 -0
  272. package/skills/agentvfx/templates/light/light-sweep/demo-onset.json +11 -0
  273. package/skills/agentvfx/templates/light/light-sweep/fx.json +45 -0
  274. package/skills/agentvfx/templates/light/light-sweep/main.frag +29 -0
  275. package/skills/agentvfx/templates/light/light-sweep/pass0.frag +17 -0
  276. package/skills/agentvfx/templates/light/light-sweep/pass1.frag +15 -0
  277. package/skills/agentvfx/templates/light/neon-saber/demo-hairline.json +10 -0
  278. package/skills/agentvfx/templates/light/neon-saber/demo-saber-laser.json +10 -0
  279. package/skills/agentvfx/templates/light/neon-saber/fx.json +48 -0
  280. package/skills/agentvfx/templates/light/neon-saber/main.frag +27 -0
  281. package/skills/agentvfx/templates/light/neon-saber/pass0.frag +46 -0
  282. package/skills/agentvfx/templates/light/neon-saber/pass1.frag +15 -0
  283. package/skills/agentvfx/templates/psychedelic/echo-flow/demo-trail.json +1 -0
  284. package/skills/agentvfx/templates/psychedelic/echo-flow/fx.json +38 -0
  285. package/skills/agentvfx/templates/psychedelic/echo-flow/main.frag +19 -0
  286. package/skills/agentvfx/templates/psychedelic/echo-flow/pass0.frag +16 -0
  287. package/skills/agentvfx/templates/psychedelic/echo-flow/pass1.frag +20 -0
  288. package/skills/agentvfx/templates/psychedelic/echo-flow/pass2.frag +11 -0
  289. package/skills/agentvfx/templates/psychedelic/echo-flow/pass3.frag +4 -0
  290. package/skills/agentvfx/templates/psychedelic/hologram-scan/demo-cyan.json +1 -0
  291. package/skills/agentvfx/templates/psychedelic/hologram-scan/fx.json +36 -0
  292. package/skills/agentvfx/templates/psychedelic/hologram-scan/main.frag +30 -0
  293. package/skills/agentvfx/templates/psychedelic/kaleido-fold/demo-six.json +1 -0
  294. package/skills/agentvfx/templates/psychedelic/kaleido-fold/fx.json +37 -0
  295. package/skills/agentvfx/templates/psychedelic/kaleido-fold/main.frag +10 -0
  296. package/skills/agentvfx/templates/psychedelic/kaleido-fold/pass0.frag +34 -0
  297. package/skills/agentvfx/templates/psychedelic/mosh-melt/demo-classic.json +1 -0
  298. package/skills/agentvfx/templates/psychedelic/mosh-melt/fx.json +38 -0
  299. package/skills/agentvfx/templates/psychedelic/mosh-melt/main.frag +20 -0
  300. package/skills/agentvfx/templates/psychedelic/mosh-melt/pass0.frag +22 -0
  301. package/skills/agentvfx/templates/psychedelic/sacred/NOTES.md +13 -0
  302. package/skills/agentvfx/templates/psychedelic/sacred/demo-classic.json +1 -0
  303. package/skills/agentvfx/templates/psychedelic/sacred/demo-halo.json +1 -0
  304. package/skills/agentvfx/templates/psychedelic/sacred/demo-slow-tide.json +1 -0
  305. package/skills/agentvfx/templates/psychedelic/sacred/demo-thermal.json +1 -0
  306. package/skills/agentvfx/templates/psychedelic/sacred/fx.json +263 -0
  307. package/skills/agentvfx/templates/psychedelic/sacred/main.frag +109 -0
  308. package/skills/agentvfx/templates/psychedelic/sacred/pass0.frag +25 -0
  309. package/skills/agentvfx/templates/psychedelic/sacred/pass1.frag +23 -0
  310. package/skills/agentvfx/templates/psychedelic/tidal-bands/demo-classic.json +1 -0
  311. package/skills/agentvfx/templates/psychedelic/tidal-bands/fx.json +37 -0
  312. package/skills/agentvfx/templates/psychedelic/tidal-bands/main.frag +54 -0
  313. package/skills/agentvfx/templates/scope/_chrome.glsl +242 -0
  314. package/skills/agentvfx/templates/scope/goniometer/demo-boot-green.json +1 -0
  315. package/skills/agentvfx/templates/scope/goniometer/demo-field-lime.json +1 -0
  316. package/skills/agentvfx/templates/scope/goniometer/demo-field-ultramarine.json +1 -0
  317. package/skills/agentvfx/templates/scope/goniometer/demo-glow-phosphor.json +1 -0
  318. package/skills/agentvfx/templates/scope/goniometer/demo-hud-black.json +1 -0
  319. package/skills/agentvfx/templates/scope/goniometer/fx.json +635 -0
  320. package/skills/agentvfx/templates/scope/goniometer/main.frag +33 -0
  321. package/skills/agentvfx/templates/scope/goniometer/pass0.frag +58 -0
  322. package/skills/agentvfx/templates/scope/goniometer/pass1.frag +43 -0
  323. package/skills/agentvfx/templates/scope/goniometer/pass2.frag +12 -0
  324. package/skills/agentvfx/templates/scope/goniometer/pass3.frag +12 -0
  325. package/skills/agentvfx/templates/scope/goniometer/pass4.frag +12 -0
  326. package/skills/agentvfx/templates/scope/goniometer/pass5.frag +12 -0
  327. package/skills/agentvfx/templates/scope/goniometer/pass6.frag +251 -0
  328. package/skills/agentvfx/templates/scope/scope-polar/demo-boot-green.json +1 -0
  329. package/skills/agentvfx/templates/scope/scope-polar/demo-field-lime.json +1 -0
  330. package/skills/agentvfx/templates/scope/scope-polar/demo-field-ultramarine.json +1 -0
  331. package/skills/agentvfx/templates/scope/scope-polar/demo-glow-phosphor.json +1 -0
  332. package/skills/agentvfx/templates/scope/scope-polar/demo-hud-black.json +1 -0
  333. package/skills/agentvfx/templates/scope/scope-polar/fx.json +686 -0
  334. package/skills/agentvfx/templates/scope/scope-polar/main.frag +39 -0
  335. package/skills/agentvfx/templates/scope/scope-polar/pass0.frag +84 -0
  336. package/skills/agentvfx/templates/scope/scope-polar/pass1.frag +49 -0
  337. package/skills/agentvfx/templates/scope/scope-polar/pass2.frag +12 -0
  338. package/skills/agentvfx/templates/scope/scope-polar/pass3.frag +12 -0
  339. package/skills/agentvfx/templates/scope/scope-polar/pass4.frag +12 -0
  340. package/skills/agentvfx/templates/scope/scope-polar/pass5.frag +12 -0
  341. package/skills/agentvfx/templates/scope/scope-polar/pass6.frag +251 -0
  342. package/skills/agentvfx/templates/scope/scope-triggered/demo-boot-green.json +1 -0
  343. package/skills/agentvfx/templates/scope/scope-triggered/demo-field-lime.json +1 -0
  344. package/skills/agentvfx/templates/scope/scope-triggered/demo-field-ultramarine.json +1 -0
  345. package/skills/agentvfx/templates/scope/scope-triggered/demo-glow-phosphor.json +1 -0
  346. package/skills/agentvfx/templates/scope/scope-triggered/demo-hud-black.json +1 -0
  347. package/skills/agentvfx/templates/scope/scope-triggered/fx.json +712 -0
  348. package/skills/agentvfx/templates/scope/scope-triggered/main.frag +36 -0
  349. package/skills/agentvfx/templates/scope/scope-triggered/pass0.frag +78 -0
  350. package/skills/agentvfx/templates/scope/scope-triggered/pass1.frag +50 -0
  351. package/skills/agentvfx/templates/scope/scope-triggered/pass2.frag +12 -0
  352. package/skills/agentvfx/templates/scope/scope-triggered/pass3.frag +12 -0
  353. package/skills/agentvfx/templates/scope/scope-triggered/pass4.frag +12 -0
  354. package/skills/agentvfx/templates/scope/scope-triggered/pass5.frag +12 -0
  355. package/skills/agentvfx/templates/scope/scope-triggered/pass6.frag +251 -0
  356. package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-boot-green.json +1 -0
  357. package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-field-lime.json +1 -0
  358. package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-field-ultramarine.json +1 -0
  359. package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-glow-phosphor.json +1 -0
  360. package/skills/agentvfx/templates/scope/spectrogram-scroll/demo-hud-black.json +1 -0
  361. package/skills/agentvfx/templates/scope/spectrogram-scroll/fx.json +595 -0
  362. package/skills/agentvfx/templates/scope/spectrogram-scroll/main.frag +83 -0
  363. package/skills/agentvfx/templates/scope/spectrogram-scroll/pass0.frag +52 -0
  364. package/skills/agentvfx/templates/scope/spectrogram-scroll/pass1.frag +251 -0
  365. package/skills/agentvfx/templates/scope/xy-phosphor/demo-boot-green.json +1 -0
  366. package/skills/agentvfx/templates/scope/xy-phosphor/demo-field-lime.json +1 -0
  367. package/skills/agentvfx/templates/scope/xy-phosphor/demo-field-ultramarine.json +1 -0
  368. package/skills/agentvfx/templates/scope/xy-phosphor/demo-glow-phosphor.json +1 -0
  369. package/skills/agentvfx/templates/scope/xy-phosphor/demo-hud-black.json +1 -0
  370. package/skills/agentvfx/templates/scope/xy-phosphor/fx.json +642 -0
  371. package/skills/agentvfx/templates/scope/xy-phosphor/main.frag +33 -0
  372. package/skills/agentvfx/templates/scope/xy-phosphor/pass0.frag +56 -0
  373. package/skills/agentvfx/templates/scope/xy-phosphor/pass1.frag +44 -0
  374. package/skills/agentvfx/templates/scope/xy-phosphor/pass2.frag +12 -0
  375. package/skills/agentvfx/templates/scope/xy-phosphor/pass3.frag +12 -0
  376. package/skills/agentvfx/templates/scope/xy-phosphor/pass4.frag +12 -0
  377. package/skills/agentvfx/templates/scope/xy-phosphor/pass5.frag +12 -0
  378. package/skills/agentvfx/templates/scope/xy-phosphor/pass6.frag +251 -0
  379. package/skills/agentvfx/templates/spectrum/_src/bars-linear/fx.src.json +61 -0
  380. package/skills/agentvfx/templates/spectrum/_src/bars-linear/main.src.frag +112 -0
  381. package/skills/agentvfx/templates/spectrum/_src/bars-linear/pass0.src.frag +2 -0
  382. package/skills/agentvfx/templates/spectrum/_src/bars-mirror/fx.src.json +51 -0
  383. package/skills/agentvfx/templates/spectrum/_src/bars-mirror/main.src.frag +72 -0
  384. package/skills/agentvfx/templates/spectrum/_src/bars-mirror/pass0.src.frag +2 -0
  385. package/skills/agentvfx/templates/spectrum/_src/bass-circle/fx.src.json +56 -0
  386. package/skills/agentvfx/templates/spectrum/_src/bass-circle/main.src.frag +136 -0
  387. package/skills/agentvfx/templates/spectrum/_src/bass-circle/pass0.src.frag +2 -0
  388. package/skills/agentvfx/templates/spectrum/_src/build.mjs +68 -0
  389. package/skills/agentvfx/templates/spectrum/_src/label-bars/fx.src.json +54 -0
  390. package/skills/agentvfx/templates/spectrum/_src/label-bars/main.src.frag +102 -0
  391. package/skills/agentvfx/templates/spectrum/_src/label-bars/pass0.src.frag +2 -0
  392. package/skills/agentvfx/templates/spectrum/_src/shared/bars-fn.glsl +64 -0
  393. package/skills/agentvfx/templates/spectrum/_src/shared/bars-pass.glsl +22 -0
  394. package/skills/agentvfx/templates/spectrum/_src/shared/clock.glsl +7 -0
  395. package/skills/agentvfx/templates/spectrum/_src/shared/hud.glsl +50 -0
  396. package/skills/agentvfx/templates/spectrum/_src/shared/stage.glsl +74 -0
  397. package/skills/agentvfx/templates/spectrum/_src/spectrum-particles/fx.src.json +58 -0
  398. package/skills/agentvfx/templates/spectrum/_src/spectrum-particles/main.src.frag +119 -0
  399. package/skills/agentvfx/templates/spectrum/_src/spectrum-particles/pass0.src.frag +33 -0
  400. package/skills/agentvfx/templates/spectrum/_src/spectrum-radial/fx.src.json +56 -0
  401. package/skills/agentvfx/templates/spectrum/_src/spectrum-radial/main.src.frag +95 -0
  402. package/skills/agentvfx/templates/spectrum/_src/spectrum-radial/pass0.src.frag +2 -0
  403. package/skills/agentvfx/templates/spectrum/_src/waveform-line/fx.src.json +60 -0
  404. package/skills/agentvfx/templates/spectrum/_src/waveform-line/main.src.frag +98 -0
  405. package/skills/agentvfx/templates/spectrum/_src/waveform-line/pass0.src.frag +43 -0
  406. package/skills/agentvfx/templates/spectrum/bars-linear/demo-graph-acid.json +1 -0
  407. package/skills/agentvfx/templates/spectrum/bars-linear/demo-graph-black.json +1 -0
  408. package/skills/agentvfx/templates/spectrum/bars-linear/fx.json +632 -0
  409. package/skills/agentvfx/templates/spectrum/bars-linear/main.frag +233 -0
  410. package/skills/agentvfx/templates/spectrum/bars-linear/pass0.frag +91 -0
  411. package/skills/agentvfx/templates/spectrum/bars-mirror/demo-field-acid.json +1 -0
  412. package/skills/agentvfx/templates/spectrum/bars-mirror/demo-field-ultramarine.json +1 -0
  413. package/skills/agentvfx/templates/spectrum/bars-mirror/fx.json +539 -0
  414. package/skills/agentvfx/templates/spectrum/bars-mirror/main.frag +193 -0
  415. package/skills/agentvfx/templates/spectrum/bars-mirror/pass0.frag +91 -0
  416. package/skills/agentvfx/templates/spectrum/bass-circle/demo-bracket-black.json +1 -0
  417. package/skills/agentvfx/templates/spectrum/bass-circle/demo-bracket-ultramarine.json +1 -0
  418. package/skills/agentvfx/templates/spectrum/bass-circle/fx.json +552 -0
  419. package/skills/agentvfx/templates/spectrum/bass-circle/main.frag +258 -0
  420. package/skills/agentvfx/templates/spectrum/bass-circle/pass0.frag +91 -0
  421. package/skills/agentvfx/templates/spectrum/label-bars/demo-deck-black.json +1 -0
  422. package/skills/agentvfx/templates/spectrum/label-bars/demo-deck-ultramarine.json +1 -0
  423. package/skills/agentvfx/templates/spectrum/label-bars/fx.json +552 -0
  424. package/skills/agentvfx/templates/spectrum/label-bars/main.frag +223 -0
  425. package/skills/agentvfx/templates/spectrum/label-bars/pass0.frag +91 -0
  426. package/skills/agentvfx/templates/spectrum/spectrum-particles/demo-cloud-black.json +1 -0
  427. package/skills/agentvfx/templates/spectrum/spectrum-particles/demo-cloud-ultramarine.json +1 -0
  428. package/skills/agentvfx/templates/spectrum/spectrum-particles/fx.json +584 -0
  429. package/skills/agentvfx/templates/spectrum/spectrum-particles/main.frag +240 -0
  430. package/skills/agentvfx/templates/spectrum/spectrum-particles/pass0.frag +101 -0
  431. package/skills/agentvfx/templates/spectrum/spectrum-radial/demo-starburst-black.json +1 -0
  432. package/skills/agentvfx/templates/spectrum/spectrum-radial/demo-starburst-ultramarine.json +1 -0
  433. package/skills/agentvfx/templates/spectrum/spectrum-radial/fx.json +566 -0
  434. package/skills/agentvfx/templates/spectrum/spectrum-radial/main.frag +217 -0
  435. package/skills/agentvfx/templates/spectrum/spectrum-radial/pass0.frag +91 -0
  436. package/skills/agentvfx/templates/spectrum/waveform-line/demo-strip-acid.json +1 -0
  437. package/skills/agentvfx/templates/spectrum/waveform-line/demo-strip-black.json +1 -0
  438. package/skills/agentvfx/templates/spectrum/waveform-line/fx.json +481 -0
  439. package/skills/agentvfx/templates/spectrum/waveform-line/main.frag +219 -0
  440. package/skills/agentvfx/templates/spectrum/waveform-line/pass0.frag +48 -0
  441. package/skills/agentvfx/templates/spectrum/waveform-line/pass1.frag +86 -0
  442. package/skills/agentvfx/test/_render_light.mjs +38 -0
  443. package/skills/agentvfx/test/audio-stereo.test.mjs +45 -0
  444. package/skills/agentvfx/test/audio.test.mjs +257 -0
  445. package/skills/agentvfx/test/brutal.test.mjs +190 -0
  446. package/skills/agentvfx/test/concept-collage-layout.test.mjs +236 -0
  447. package/skills/agentvfx/test/concept-collage-scenes.test.mjs +305 -0
  448. package/skills/agentvfx/test/concept-collage-typefx.test.mjs +153 -0
  449. package/skills/agentvfx/test/concept-collage.test.mjs +84 -0
  450. package/skills/agentvfx/test/concept-lattice.test.mjs +133 -0
  451. package/skills/agentvfx/test/concept-signal-cut.test.mjs +172 -0
  452. package/skills/agentvfx/test/credit-overlay.test.mjs +58 -0
  453. package/skills/agentvfx/test/credit.test.mjs +54 -0
  454. package/skills/agentvfx/test/doctor.test.mjs +31 -0
  455. package/skills/agentvfx/test/encode.test.mjs +22 -0
  456. package/skills/agentvfx/test/fixtures/r7-collage-LAYOUTS.json +5780 -0
  457. package/skills/agentvfx/test/fixtures/score-bad-duration.json +7 -0
  458. package/skills/agentvfx/test/fixtures/score-bad-safety.json +8 -0
  459. package/skills/agentvfx/test/fixtures/score-identity-footage.json +8 -0
  460. package/skills/agentvfx/test/fixtures/score-missing-template.json +7 -0
  461. package/skills/agentvfx/test/fixtures/score-ok.json +8 -0
  462. package/skills/agentvfx/test/fixtures/score-strobe-12hz.json +8 -0
  463. package/skills/agentvfx/test/fixtures/score-text-probe.json +1 -0
  464. package/skills/agentvfx/test/flash-audit.test.mjs +150 -0
  465. package/skills/agentvfx/test/flash.test.mjs +83 -0
  466. package/skills/agentvfx/test/footage.test.mjs +88 -0
  467. package/skills/agentvfx/test/glitch.test.mjs +272 -0
  468. package/skills/agentvfx/test/impact.test.mjs +231 -0
  469. package/skills/agentvfx/test/imports.test.mjs +39 -0
  470. package/skills/agentvfx/test/light.test.mjs +200 -0
  471. package/skills/agentvfx/test/loop.test.mjs +80 -0
  472. package/skills/agentvfx/test/psychedelic.test.mjs +99 -0
  473. package/skills/agentvfx/test/render.test.mjs +73 -0
  474. package/skills/agentvfx/test/sacred.test.mjs +175 -0
  475. package/skills/agentvfx/test/schema.test.mjs +103 -0
  476. package/skills/agentvfx/test/scope.test.mjs +306 -0
  477. package/skills/agentvfx/test/spectrum.test.mjs +165 -0
  478. package/skills/agentvfx/test/text.test.mjs +142 -0
  479. package/skills/agentvfx/test/web.test.mjs +400 -0
  480. package/skills/agentvfx/test-media/SOURCES.md +39 -0
  481. package/skills/agentvfx/test-media/beat-132.mp3 +0 -0
  482. package/skills/agentvfx/test-media/clip-01.mp4 +0 -0
  483. package/skills/agentvfx/test-media/clip-02.mp4 +0 -0
@@ -0,0 +1,119 @@
1
+ // Scene 3, field-cut: a collage over time. Every beat hard-cuts to the next of four full fields, each with its own fixed
2
+ // composition: acid lime with a halftone of the plate, a black dot-matrix tower whose height is the bass and rule marks;
3
+ // signal orange with rows of a condensed blue word that shear on every onset and a blue dither window of the plate; ultramarine
4
+ // with the plate in a ringed circle, a Hangul word and checker blocks; a white field with the plate torn into RGB pixel slabs and
5
+ // a lime brush chunk. Palette: ground (black), ink (white), accent (lime), tintA (orange), tintB (ultramarine).
6
+ // Text set 3: r the condensed word, g the Hangul word, b the labels.
7
+ void fcLime(vec2 q, vec2 c, vec4 hit, inout vec3 col) {
8
+ vec3 blk = groundColor.rgb;
9
+ col = accentColor.rgb;
10
+ vec2 lo = vec2(0.07, 0.10);
11
+ vec2 hi = vec2(0.95, 0.68);
12
+ float pitch = max(3.0, 14.0 * U);
13
+ col = mix(col, blk, scDots(q, lo * scU, hi * scU, pitch, 1.5, 0.15, 1.0) * scBox(c, lo, hi));
14
+ col = mix(col, blk, max(max(scPlus(c, lo - 0.03, 0.02), scPlus(c, vec2(hi.x + 0.03, lo.y - 0.03), 0.02)), max(scPlus(c, vec2(lo.x - 0.03, hi.y + 0.03), 0.02), scPlus(c, hi + 0.03, 0.02))));
15
+ // the bass tower: 6 x 28 dots, lit from the bottom up to the bass level
16
+ float lv = stLevel().r;
17
+ vec2 tg = (c - vec2(1.07, 0.93)) / vec2(0.026, -0.026);
18
+ vec2 id = floor(tg);
19
+ if (id.x >= 0.0 && id.x < 6.0 && id.y >= 0.0 && id.y < 28.0) {
20
+ float h = (lv * 26.0 + 2.0 + 3.0 * hit.y) * (1.0 - 0.2 * hash12(vec2(id.x, 3.0)));
21
+ float lit = step(id.y + 0.5, h);
22
+ col = mix(col, blk, scAA(length(fract(tg) - 0.5) * 0.026 - mix(0.0035, 0.0115, lit)) * mix(0.4, 1.0, lit));
23
+ }
24
+ // label bar, live number, rule with ticks, readout rows
25
+ col = mix(col, blk, scAA(sdBox(c, vec2(1.36, 0.14), vec2(1.72, 0.27))));
26
+ col = mix(col, accentColor.rgb, scSheet(q, 2) * scBox(c, vec2(1.36, 0.14), vec2(1.72, 0.27)));
27
+ float cell = cellPx(0.0125 * scU);
28
+ col = mix(col, blk, min(numTxt(q, vec2(1.36, 0.31) * scU, cell, floor(lv * 999.0), 3), 1.0));
29
+ col = mix(col, blk, max(scLine(c.y - 0.76, 1.0), step(mod(q.x, 0.04 * scU), 1.0) * step(abs(c.y - 0.77), 0.012)) * step(0.07, c.x) * step(c.x, 1.72));
30
+ float rc = scCell();
31
+ float rows = 0.0;
32
+ for (int i = 0; i < 3; i++) {
33
+ vec2 o = vec2(1.36, 0.47 + 0.075 * float(i)) * scU;
34
+ float v = floor(stLevel()[i] * 999.0);
35
+ rows = max(rows, i == 0 ? txt4(q, o, rc, 66, 83, 83, 0) : (i == 1 ? txt4(q, o, rc, 77, 73, 68, 0) : txt4(q, o, rc, 84, 82, 66, 0)));
36
+ rows = max(rows, numTxt(q, o + vec2(16.0 * rc, 0.0), rc, v, 3));
37
+ rows = max(rows, scBox(c, vec2(1.36, 0.47 + 0.075 * float(i) + 0.05), vec2(1.36 + 0.36 * stLevel()[i], 0.47 + 0.075 * float(i) + 0.056)));
38
+ }
39
+ col = mix(col, blk, rows);
40
+ col = mix(col, blk, scBox(c, vec2(0.07, 0.82), vec2(0.07 + 0.88 * hit.y, 0.84)));
41
+ col = mix(col, blk, numTxt(q, vec2(0.07, 0.88) * scU, rc, mod(float(FRAMEINDEX), 1000.0), 3));
42
+ }
43
+
44
+ void fcOrange(vec2 q, vec2 c, vec4 clk, vec4 hit, inout vec3 col) {
45
+ vec3 blue = tintB.rgb;
46
+ vec3 blk = groundColor.rgb;
47
+ col = tintA.rgb;
48
+ float row = floor((c.y - 0.035) / 0.134);
49
+ float ry = q.y - (0.035 + row * 0.134) * scU;
50
+ float h = hash12(vec2(row, clk.z));
51
+ float shear = (fract(h * 7.0) < 0.5 ? -1.0 : 1.0) * (0.06 + 0.1 * fract(h * 11.0)) * step(0.45, hit.x) * step(h, 0.3) * scU;
52
+ float pitch = 0.43 * scU;
53
+ float lx = mod(q.x - (mod(row, 2.0) * 0.215 + 0.02) * scU - shear, pitch);
54
+ float k = scS.y / RENDERSIZE.y;
55
+ float m = crisp(sheetC(vec2(lx / (0.4 * k), 0.0333 * RENDERSIZE.y + (ry - 0.006 * scU) / (0.5 * k)), 0), 1.0) * step(0.0, row) * step(row, 6.0) * step(0.0, ry);
56
+ col = mix(col, blue, m);
57
+ vec2 lo = vec2(0.62, 0.38);
58
+ vec2 hi = vec2(1.20, 0.66);
59
+ float px = scPx();
60
+ vec2 pix = floor(q / px);
61
+ float win = scBox(c, lo, hi);
62
+ float l = scTone((pix + 0.5) * px, lo * scU, hi * scU, 1.7, 0.2);
63
+ col = mix(col, mix(tintA.rgb, blue, step(scBayer(pix), l)), win);
64
+ col = mix(col, blk, max(scLine(sdBox(c, lo, hi), 1.5), max(max(scPlus(c, vec2(0.26, 0.20), 0.025), scPlus(c, vec2(1.45, 0.86), 0.025)), scPlus(c, vec2(1.62, 0.18), 0.025))));
65
+ float cell = scCell();
66
+ col = mix(col, blk, max(txt4(q, vec2(0.62, 0.68) * scU, cell, 82, 79, 87, 0), numTxt(q, vec2(0.62 + 0.06, 0.68) * scU, cell, mod(row + clk.z, 100.0), 2)));
67
+ }
68
+
69
+ void fcBlue(vec2 q, vec2 c, vec4 clk, inout vec3 col) {
70
+ vec3 white = inkColor.rgb;
71
+ col = tintB.rgb;
72
+ vec2 ctr = vec2(1.22, 0.50);
73
+ float R = 0.34;
74
+ float d = length(c - ctr);
75
+ vec3 f = clamp((scPlate(q, (ctr - R) * scU, (ctr + R) * scU) - 0.12) * 1.5, 0.0, 1.0);
76
+ col = mix(col, f, scAA((d - R) * 1.0));
77
+ float a = atan(c.y - ctr.y, c.x - ctr.x) / 6.28318;
78
+ float tk = fract(a * 48.0 + floor(clk.x) * 0.5);
79
+ float tickR = step(R + 0.07, d) * step(d, R + 0.07 + 0.03 * (mod(floor(a * 48.0 + floor(clk.x) * 0.5), 4.0) < 0.5 ? 1.8 : 1.0)) * step(tk, 0.16);
80
+ col = mix(col, white, max(max(scLine(d - R - 0.025, 1.0), scLine(d - R - 0.05, 1.0) * step(fract(a * 24.0), 0.6)), tickR));
81
+ col = mix(col, white, scSheet(q, 1));
82
+ col = mix(col, groundColor.rgb, scAA(sdBox(c, vec2(0.07, 0.66), vec2(0.74, 0.76))));
83
+ col = mix(col, accentColor.rgb, scSheet(q, 2) * scBox(c, vec2(0.07, 0.66), vec2(0.74, 0.76)));
84
+ vec2 ck = floor((c - vec2(0.07, 0.83)) / 0.02);
85
+ float chk = step(0.0, ck.x) * step(ck.x, 15.0) * step(0.0, ck.y) * step(ck.y, 4.0) * step(1.0, mod(ck.x + ck.y, 2.0));
86
+ col = mix(col, groundColor.rgb, chk);
87
+ col = mix(col, white, max(scPlus(c, vec2(0.05, 0.05), 0.02), scPlus(c, vec2(0.76, 0.05), 0.02)));
88
+ }
89
+
90
+ void fcWhite(vec2 q, vec2 c, float A, vec4 clk, vec4 hit, inout vec3 col) {
91
+ vec3 blk = groundColor.rgb;
92
+ col = inkColor.rgb;
93
+ vec2 lo = vec2(0.06, 0.06);
94
+ vec2 hi = vec2(A - 0.06, 0.94);
95
+ float amt = 0.3 + 0.7 * step(0.7, hit.y);
96
+ vec2 sl = floor(c / vec2(0.2, 0.045));
97
+ float hs = hash12(vec2(sl.y, floor(clk.x) + 0.37 * sl.x));
98
+ float off = step(0.55, hs) * (fract(hs * 13.0) - 0.5) * 0.18 * amt * scU;
99
+ vec2 qq = q + vec2(off, 0.0);
100
+ if (hs > 0.88) { qq = (floor(qq / 14.0) + 0.5) * 14.0; }
101
+ float sp = 0.014 * amt * scU * step(0.5, hs);
102
+ vec3 f = vec3(scPlate(qq + vec2(sp, 0.0), lo * scU, hi * scU).r, scPlate(qq, lo * scU, hi * scU).g, scPlate(qq - vec2(sp, 0.0), lo * scU, hi * scU).b);
103
+ col = mix(col, clamp((f - 0.1) * 1.3, 0.0, 1.0), scBox(c, lo, hi));
104
+ float ragged = 0.72 - 0.08 * hash12(vec2(floor(c.y / 0.012), 1.0)) - 0.1 * hit.y;
105
+ col = mix(col, accentColor.rgb, scBox(c, vec2(0.30, 0.46), vec2(ragged, 0.54)));
106
+ float cell = scCell();
107
+ col = mix(col, blk, max(txt4(q, vec2(0.07, 0.955) * scU, cell, 70, 82, 77, 0), numTxt(q, vec2(0.07 + 0.045, 0.955) * scU, cell, mod(float(FRAMEINDEX), 1000.0), 3)));
108
+ col = mix(col, blk, max(scPlus(c, vec2(0.03, 0.03), 0.018), scPlus(c, vec2(A - 0.03, 0.03), 0.018)));
109
+ }
110
+
111
+ void sceneFieldCut(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
112
+ vec2 c = q / scU;
113
+ vec4 hit = stHit();
114
+ int f = int(mod(floor(clk.x * 0.5), 4.0));
115
+ if (f == 0) { fcLime(q, c, hit, col); }
116
+ if (f == 1) { fcOrange(q, c, clk, hit, col); }
117
+ if (f == 2) { fcBlue(q, c, clk, col); }
118
+ if (f == 3) { fcWhite(q, c, S.x / S.y, clk, hit, col); }
119
+ }
@@ -0,0 +1,64 @@
1
+ // Scene 4, pattern-sheet: a bone sheet inside a signal-green frame border. The plate is a black line-screen engraving inside the
2
+ // big circle; a heavy grotesk label between magenta serif quote marks; outline circles whose radius steps on every onset; thin
3
+ // rules, ticks and crosshairs; QR-like pixel stamps that re-seed on every beat; a vertical waveform strip with a 0 to 5 ruler on the
4
+ // left edge. Palette: ground (frame green), ink (black), accent (magenta), tintA (bone). Text set 4: r the label and caption,
5
+ // g the quote marks.
6
+ void scenePattern(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
7
+ vec2 c = q / scU;
8
+ float A = S.x / S.y;
9
+ vec3 ink = inkColor.rgb;
10
+ vec3 mag = accentColor.rgb;
11
+ vec3 bone = tintA.rgb;
12
+ float cut = floor(clk.x);
13
+ col = groundColor.rgb;
14
+ col = mix(col, bone, scAA(sdBox(c, vec2(0.05), vec2(A - 0.05, 0.95))));
15
+ // the big circle with the plate as a horizontal line screen
16
+ vec2 ctr = vec2(1.30, 0.46);
17
+ float R = 0.31;
18
+ float pitch = max(3.0, 8.0 * U);
19
+ float yc = (floor(q.y / pitch) + 0.5) * pitch;
20
+ float l = scTone(vec2(q.x, yc), (ctr - R) * scU, (ctr + R) * scU, 1.5, 0.12);
21
+ float line = clamp(((1.0 - l) * 0.95 * pitch * 0.5) - abs(q.y - yc) + 0.5, 0.0, 1.0);
22
+ float inC = scAA(length(c - ctr) - R);
23
+ col = mix(col, mix(bone, ink, line), inC);
24
+ col = mix(col, ink, scLine(length(c - ctr) - R, 1.6));
25
+ // outline circles; the radii step on every onset
26
+ float st = mod(clk.z, 5.0);
27
+ col = mix(col, ink, scLine(length(c - vec2(0.98, 0.74)) - (0.14 + 0.014 * st), 1.2));
28
+ col = mix(col, ink, scLine(length(c - vec2(0.98, 0.74)) - (0.2 + 0.014 * st), 1.2) * step(0.0, sin(atan(c.y - 0.74, c.x - 0.98) * 18.0 + 1.0)));
29
+ col = mix(col, mag, scLine(length(c - vec2(1.62, 0.80)) - (0.06 + 0.012 * st), 2.0));
30
+ col = mix(col, ink, scLine(length(c - vec2(1.62, 0.80)) - 0.1, 1.0));
31
+ // rules, ticks and crosshairs
32
+ float ex = step(0.2, c.x) * step(c.x, A - 0.05);
33
+ col = mix(col, ink, max(scLine(c.y - 0.87, 1.2) * ex, step(mod(q.x, 0.025 * scU), 1.0) * step(abs(c.y - 0.885), 0.013) * ex));
34
+ col = mix(col, ink, scLine(c.x - 0.92, 1.0) * step(0.05, c.y) * step(c.y, 0.32) * 0.9);
35
+ col = mix(col, ink, scLine((c.x - 0.2) - (0.95 - c.y), 1.0) * step(0.2, c.x) * step(c.x, 0.5) * step(0.75, c.y) * 0.8);
36
+ col = mix(col, ink, scAA(length(c - vec2(0.92, 0.87)) - 0.016));
37
+ col = mix(col, mag, scAA(length(c - vec2(1.62, 0.80)) - 0.016));
38
+ for (int i = 0; i < 4; i++) {
39
+ vec2 p = vec2(0.26 + 0.52 * float(i), 0.46);
40
+ col = mix(col, ink, max(scLine(c.y - p.y, 1.0) * step(abs(c.x - p.x), 0.018), scLine(c.x - p.x, 1.0) * step(abs(c.y - p.y), 0.018)) * step(float(i), 1.5));
41
+ }
42
+ // QR stamps, re-seeded on the beat
43
+ float q1 = scQR(c, vec2(0.25, 0.09), 0.17, cut);
44
+ float q2 = scQR(c, vec2(0.62, 0.09), 0.11, cut + 41.0);
45
+ col = mix(col, ink, step(0.5, q1));
46
+ col = mix(col, ink, step(-0.5, q2));
47
+ col = mix(col, bone, step(0.5, q2));
48
+ // the vertical waveform strip and its 0..5 ruler
49
+ float t = clamp((c.y - 0.09) / 0.82, 0.0, 1.0);
50
+ float amp = clamp(waveI(floor(t * 255.0) * 2.0) * scopeGain * 0.08, -0.028, 0.028);
51
+ float rowOn = step(mod(q.y, 2.0), 1.0);
52
+ float wv = step(0.075, c.x) * step(c.x, 0.135) * step(0.09, c.y) * step(c.y, 0.91) * rowOn * step(abs(c.x - 0.105), abs(amp) + 0.0015);
53
+ col = mix(col, ink, wv);
54
+ col = mix(col, ink, scLine(sdBox(c, vec2(0.075, 0.09), vec2(0.135, 0.91)), 1.0));
55
+ float rk = (c.y - 0.09) / 0.82 * 25.0;
56
+ float major = step(abs(rk - floor(rk / 5.0 + 0.5) * 5.0), 0.12) * step(0.0, rk) * step(rk, 25.2);
57
+ float minor = step(abs(rk - floor(rk + 0.5)), 0.12) * step(0.0, rk) * step(rk, 25.2);
58
+ col = mix(col, ink, max(major * step(0.14, c.x) * step(c.x, 0.165), minor * step(0.14, c.x) * step(c.x, 0.152)));
59
+ float dc = scCell();
60
+ for (int i = 0; i < 6; i++) { col = mix(col, ink, numTxt(q, vec2(0.172, 0.09 + 0.164 * float(i) - 0.012) * scU, dc, float(i), 1)); }
61
+ // the label and the quote marks
62
+ col = mix(col, ink, scSheet(q, 0));
63
+ col = mix(col, mag, scSheet(q, 1));
64
+ }
@@ -0,0 +1,49 @@
1
+ // Scene 5, anatomy: a sepia paper field, a huge cropped serif numeral, a dark panel holding the plate as a cream hairline wireframe
2
+ // (edge detection), a thin ring around it, three callout cables to labels, a checkerboard tower of the mid level and tiny code
3
+ // columns. The wireframe grows denser on every beat and a rust scan band jumps to a new height on every cut, turning the lines it
4
+ // crosses rust. Palette: ground (tan paper), ink (umber), accent (rust), tintA (dark umber), tintB (cream). Text set 5: Times and
5
+ // Pretendard Light.
6
+ void sceneAnatomy(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
7
+ vec2 c = q / scU;
8
+ float A = S.x / S.y;
9
+ vec4 hit = stHit();
10
+ vec3 ink = inkColor.rgb;
11
+ vec3 rust = accentColor.rgb;
12
+ vec3 dark = tintA.rgb;
13
+ vec3 cream = tintB.rgb;
14
+ col = groundColor.rgb;
15
+ col = mix(col, ink, scSheet(q, 0));
16
+ vec2 lo = vec2(0.52, 0.05);
17
+ vec2 hi = vec2(1.30, 0.95);
18
+ float inP = scBox(c, lo, hi);
19
+ col = mix(col, dark, inP);
20
+ float e = scEdge(q, lo * scU, hi * scU, max(1.5, 4.0 * U));
21
+ float thr = 0.1 - 0.05 * hit.y;
22
+ float wire = smoothstep(thr, thr + 0.07, e) * inP;
23
+ float bandY = 0.08 + 0.84 * fract(floor(clk.x) * 0.137);
24
+ float inBand = step(abs(c.y - bandY), 0.03);
25
+ col = mix(col, cream, 0.14 * inBand * inP);
26
+ col = mix(col, mix(cream, rust, inBand), wire);
27
+ col = mix(col, ink, scLine(sdBox(c, lo, hi), 1.0));
28
+ // ring and ticks around the panel
29
+ vec2 ctr = vec2(0.91, 0.5);
30
+ float d = length(c - ctr);
31
+ float a = atan(c.y - ctr.y, c.x - ctr.x) / 6.28318;
32
+ col = mix(col, ink, max(scLine(d - 0.47, 1.0), scLine(d - 0.5, 1.0) * step(fract(a * 90.0), 0.35)));
33
+ // callout cables and labels
34
+ for (int i = 0; i < 3; i++) {
35
+ vec2 A0 = i == 0 ? vec2(1.05, 0.42) : (i == 1 ? vec2(0.98, 0.58) : vec2(0.9, 0.7));
36
+ vec2 T = vec2(1.38, 0.2 + 0.3 * float(i));
37
+ col = mix(col, ink, wCable(c, A0, T, 1.0));
38
+ col = mix(col, rust, scAA(sdBox(c, A0 - 0.006, A0 + 0.006)));
39
+ }
40
+ // checkerboard tower of the mid level, tiny code columns
41
+ vec2 tg = floor((c - vec2(0.45, 0.95)) / vec2(0.02, -0.02));
42
+ float h = stLevel().g * 20.0 + 2.0;
43
+ col = mix(col, ink, step(0.0, tg.x) * step(tg.x, 2.0) * step(0.0, tg.y) * step(tg.y + 0.5, h) * step(mod(tg.x + tg.y, 2.0), 0.5));
44
+ float cell = scCell();
45
+ float code = 0.0;
46
+ for (int i = 0; i < 9; i++) { code = max(code, numTxt(q, vec2(1.40, 0.82 + 0.014 * float(i)) * scU, max(1.0, cell - 1.0), floor(hash12(vec2(float(i), clk.x)) * 9999.0), 4)); }
47
+ col = mix(col, rust, code);
48
+ col = mix(col, ink, scSheet(q, 1));
49
+ }
@@ -0,0 +1,78 @@
1
+ // Scene 6, deck: a hot pink field and a HUD deck of thin black lines. The plate sits in a chamfered octagon window; outlined
2
+ // tab-box labels (DIN Condensed, Pretendard) down the left, a particle cloud box that scatters on the onset, a starburst glyph
3
+ // whose rays are band levels and which steps round on every beat, a text ring that turns a notch per onset, a contour-map box whose
4
+ // terrain shifts on the beat, and a 0..5 ruler strip. Palette: ground (pink), ink (black), accent (white), tintA (lilac).
5
+ // Text set 6: r the tab labels, g captions, b the ring line.
6
+ float dkRing(vec2 q, vec2 ctr, float Rm, float band, float rot) {
7
+ vec2 d = q - ctr;
8
+ float r = length(d);
9
+ float a = atan(d.y, d.x) / 6.28318 + 0.5 + rot;
10
+ float k = scS.y / RENDERSIZE.y;
11
+ vec2 sp = vec2(fract(a) * 6.28318 * Rm / k, 0.9 * RENDERSIZE.y + (Rm + 0.5 * band - r) / k);
12
+ return sheetC(sp, 2) * step(abs(r - Rm), 0.5 * band);
13
+ }
14
+
15
+ void sceneDeck(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
16
+ vec2 c = q / scU;
17
+ float A = S.x / S.y;
18
+ vec4 hit = stHit();
19
+ vec3 ink = inkColor.rgb;
20
+ vec3 white = accentColor.rgb;
21
+ vec3 lil = tintA.rgb;
22
+ col = groundColor.rgb;
23
+ float cut = floor(clk.x);
24
+ // octagon window with the plate
25
+ vec2 lo = vec2(0.40, 0.08);
26
+ vec2 hi = vec2(1.38, 0.74);
27
+ float dO = sdChamfer(c, lo, hi, 0.2);
28
+ vec3 f = scPlate(q, lo * scU, hi * scU);
29
+ col = mix(col, clamp((f - 0.1) * 1.3, 0.0, 1.0), scAA(dO));
30
+ col = mix(col, ink, scLine(dO, 2.0));
31
+ col = mix(col, ink, scLine(sdChamfer(c, lo - 0.014, hi + 0.014, 0.23), 1.0));
32
+ // particle cloud box (left), scatters on the onset
33
+ vec2 pl = vec2(0.03, 0.46);
34
+ vec2 ph = vec2(0.33, 0.9);
35
+ float inBox = scBox(c, pl, ph);
36
+ col = mix(col, lil, inBox);
37
+ col = mix(col, ink, scLine(sdBox(c, pl, ph), 1.0));
38
+ if (inBox > 0.5) {
39
+ float dots = 0.0;
40
+ for (int i = 0; i < 70; i++) {
41
+ vec2 h = hash22(vec2(float(i), 3.7));
42
+ float t = (h.x - 0.5) * 1.6;
43
+ vec2 p = vec2(0.18, 0.68) + vec2(t * 0.1, -t * 0.12) + (hash22(vec2(float(i), 9.1)) - 0.5) * 0.07;
44
+ p += (hash22(vec2(float(i), clk.z)) - 0.5) * 0.12 * step(0.45, hit.x);
45
+ dots = max(dots, scAA(length(c - p) - 0.0035));
46
+ }
47
+ col = mix(col, ink, dots);
48
+ }
49
+ // starburst glyph, top right, one notch per beat
50
+ vec2 sb = vec2(1.58, 0.2);
51
+ col = mix(col, ink, scBurst(c - sb, 0.12, 0.012, cut * 0.2618, 36.0));
52
+ col = mix(col, white, scAA(sdBox(c, sb - 0.008, sb + 0.008)));
53
+ // text ring, bottom right, a notch per onset
54
+ vec2 rc = vec2(1.58, 0.52);
55
+ col = mix(col, ink, dkRing(q, rc * scU, 0.11 * scU, 0.03 * scU, clk.z * 0.04));
56
+ col = mix(col, ink, scLine(length(c - rc) - 0.075, 1.0));
57
+ // contour map box, bottom right, terrain shifts on the beat
58
+ vec2 ml = vec2(0.98, 0.78);
59
+ vec2 mh = vec2(1.72, 0.96);
60
+ float inM = scBox(c, ml, mh);
61
+ col = mix(col, lil, inM);
62
+ float v = fbm(c * vec2(5.0, 7.0) + cut * 0.9, 4) * 9.0;
63
+ float iso = clamp(1.0 - abs(fract(v) - 0.5) * 2.0 / max(fwidth(v) * 1.5, 1e-3), 0.0, 1.0);
64
+ col = mix(col, ink, iso * inM * 0.9);
65
+ col = mix(col, ink, scLine(sdBox(c, ml, mh), 1.0));
66
+ float cell = scCell();
67
+ col = mix(col, ink, numTxt(q, vec2(0.98, 0.745) * scU, cell, mod(cut * 37.0 + 1275.0, 10000.0), 4));
68
+ // ruler strip, bottom left
69
+ float rk = (c.x - 0.03) / 0.3 * 25.0;
70
+ float major = step(abs(rk - floor(rk / 5.0 + 0.5) * 5.0), 0.2) * step(0.0, rk) * step(rk, 25.2);
71
+ float minor = step(abs(rk - floor(rk + 0.5)), 0.2) * step(0.0, rk) * step(rk, 25.2);
72
+ col = mix(col, ink, max(major * step(0.93, c.y) * step(c.y, 0.975), minor * step(0.93, c.y) * step(c.y, 0.953)));
73
+ float amp = waveI(floor(clamp(rk, 0.0, 25.0) / 25.0 * 255.0) * 2.0) * scopeGain * 0.03;
74
+ col = mix(col, ink, scLine(c.y - 0.915 - amp, 1.2) * step(0.0, rk) * step(rk, 25.0));
75
+ // labels in tab boxes, captions
76
+ col = mix(col, ink, scSheet(q, 0));
77
+ col = mix(col, ink, scSheet(q, 1));
78
+ }
@@ -0,0 +1,60 @@
1
+ // Scene 7, bootlog: phosphor green on near-black. A typed boot log (the engine types it over the clip), a dot-matrix terminal icon,
2
+ // a boot progress bar that fills a step on every beat, a big Hangul word, the plate as a single-tone phosphor CRT with raster
3
+ // lines and a ghost, a roll bar, and data streaks along the bottom whose length is the spectrum. Every beat inverts one log row.
4
+ // Palette: ground (near-black), ink (phosphor), accent (white-green), tintA (dim green). Text set 7: r the log, g Hangul.
5
+ const int BL_ICON[8] = int[8](2047, 1025, 1281, 1153, 1281, 1081, 1025, 2047);
6
+
7
+ void sceneBootlog(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
8
+ vec2 c = q / scU;
9
+ float A = S.x / S.y;
10
+ vec4 hit = stHit();
11
+ vec3 ph = inkColor.rgb;
12
+ vec3 hot = accentColor.rgb;
13
+ vec3 dim = tintA.rgb;
14
+ float cut = floor(clk.x);
15
+ col = groundColor.rgb;
16
+ // CRT window: single-tone phosphor plate, raster lines, a ghost one pixel line to the right, roll bar
17
+ vec2 lo = vec2(0.98, 0.14);
18
+ vec2 hi = vec2(1.72, 0.80);
19
+ float inW = scAA(sdBox(c, lo, hi) - 0.02 + 0.02);
20
+ float l = luma(scPlate(q, lo * scU, hi * scU));
21
+ float lg = luma(scPlate(q - vec2(3.0, 0.0), lo * scU, hi * scU));
22
+ float ras = 0.72 + 0.28 * step(0.5, fract(q.y / 3.0));
23
+ float roll = smoothstep(0.06, 0.0, abs(fract(c.y * 1.3 - cut * 0.11) - 0.5) - 0.44);
24
+ float tone = clamp((max(l, lg * 0.6) - 0.05) * 1.7, 0.0, 1.0) * ras;
25
+ col = mix(col, mix(dim * 0.4, ph, tone) + hot * 0.25 * roll * tone, scBox(c, lo, hi));
26
+ col = mix(col, ph, scLine(sdBox(c, lo - 0.012, hi + 0.012), 1.0));
27
+ for (int i = 0; i < 4; i++) {
28
+ vec2 k = vec2(i < 2 ? lo.x - 0.012 : hi.x + 0.012, (i & 1) == 0 ? lo.y - 0.012 : hi.y + 0.012);
29
+ col = mix(col, ph, scPlus(c, k, 0.02));
30
+ }
31
+ // dot-matrix terminal icon and the boot progress bar
32
+ vec2 ig = floor((c - vec2(0.05, 0.84)) / 0.0125);
33
+ float icon = 0.0;
34
+ if (ig.x >= 0.0 && ig.x < 11.0 && ig.y >= 0.0 && ig.y < 8.0) { icon = float((BL_ICON[int(ig.y)] >> (10 - int(ig.x))) & 1); }
35
+ float blink = step(0.5, fract(TIME * 2.0));
36
+ col = mix(col, ph, icon);
37
+ col = mix(col, ph, scBox(c, vec2(0.0 + 0.05 + 0.032, 0.845 + 0.0125 * 5.0), vec2(0.05 + 0.032 + 0.0125 * 3.0, 0.845 + 0.0125 * 6.0)) * blink * (1.0 - icon));
38
+ vec2 pg = (c - vec2(0.24, 0.865)) / vec2(0.016, 0.05);
39
+ float seg = step(0.0, pg.x) * step(pg.x, 40.0) * step(0.0, pg.y) * step(pg.y, 1.0) * step(mod(pg.x, 1.0), 0.7);
40
+ float filled = step(pg.x, min(cut * 3.0 + 2.0, 40.0));
41
+ col = mix(col, mix(dim, ph, filled), seg);
42
+ col = mix(col, ph, scLine(sdBox(c, vec2(0.235, 0.855), vec2(0.24 + 40.0 * 0.016 + 0.005, 0.925)), 1.0));
43
+ float cell = scCell();
44
+ col = mix(col, ph, numTxt(q, vec2(0.24, 0.945) * scU, cell, min(cut * 3.0 + 2.0, 40.0) * 2.5, 3));
45
+ // data streaks along the bottom: length is the spectrum, jump on the onset
46
+ for (int i = 0; i < 6; i++) {
47
+ float y = 0.955 + 0.007 * float(i);
48
+ float len = 0.1 + 0.9 * bandAt(0.08 + 0.15 * float(i));
49
+ float x0 = (0.3 + 1.2 * hash12(vec2(float(i), clk.z))) ;
50
+ float s = scLine(c.y - y, 1.0) * step(x0 - len * 0.5, c.x) * step(c.x, x0 + len * 0.5);
51
+ col = mix(col, ph, s * (0.35 + 0.65 * smoothstep(x0 - len * 0.5, x0 + len * 0.5, c.x)));
52
+ }
53
+ // typed log, Hangul word; the row picked by the beat is inverted
54
+ float logRow = floor((c.y - 0.31) / 0.0364);
55
+ float pick = step(0.0, logRow) * step(abs(logRow - mod(cut * 3.0, 12.0)), 0.5) * step(c.x, 0.93);
56
+ col = mix(col, ph, pick * 0.9);
57
+ float lg2 = scSheet(q, 0);
58
+ col = mix(col, mix(ph, groundColor.rgb, pick), lg2);
59
+ col = mix(col, hot, scSheet(q, 1));
60
+ }
@@ -0,0 +1,48 @@
1
+ // Scene 8, tunnel: a pixel checker tunnel in electric blue on black that jumps one ring deeper and turns half a step on
2
+ // every beat; the plate sits in a curved letterbox window at its vanishing point; a white-hot horizontal eye bar flares on the
3
+ // onset; a black block with a giant Monument Extended word and live depth numbers. Palette: ground (black), ink (white-hot),
4
+ // accent (electric blue), tintA (deep blue). Text set 8: r the word, g captions.
5
+ void sceneTunnel(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
6
+ vec2 c = q / scU;
7
+ float A = S.x / S.y;
8
+ vec4 hit = stHit();
9
+ vec3 hotc = inkColor.rgb;
10
+ vec3 blue = accentColor.rgb;
11
+ vec3 deep = tintA.rgb;
12
+ float cut = floor(clk.x);
13
+ vec2 ctr = vec2(0.5 * A, 0.5);
14
+ float px = scPx();
15
+ vec2 d = ((floor(q / px) + 0.5) * px) / scU - ctr;
16
+ float r = length(d);
17
+ float a = atan(d.y, d.x) / 6.28318;
18
+ float z = 0.16 / max(r, 0.02);
19
+ float ring = floor(z * 2.2 + cut);
20
+ float seg = floor(a * 20.0 + cut * 0.5);
21
+ float chk = mod(ring + seg, 2.0);
22
+ float shade = smoothstep(0.05, 0.4, r);
23
+ col = groundColor.rgb;
24
+ col = mix(col, mix(deep, blue, 0.5 + 0.5 * step(1.5, mod(ring, 4.0))), chk * shade);
25
+ col = mix(col, hotc, chk * step(0.5, mod(ring * 7.0 + seg, 29.0) - 27.5) * shade * step(1.2, z));
26
+ // plate in the curved letterbox: the half height grows toward the sides
27
+ float halfH = 0.17 + 0.2 * pow(abs(d.x) / (0.5 * A), 2.0);
28
+ float inWin = scAA(abs(d.y) - halfH) * step(abs(d.x), 0.5 * A * 0.8);
29
+ vec3 f = scPlate(q, vec2(0.1 * A, 0.2) * scU, vec2(0.9 * A, 0.8) * scU);
30
+ vec3 tint = mix(vec3(luma(f)), f, 0.6) * vec3(0.7, 0.85, 1.25);
31
+ col = mix(col, clamp(tint * 1.1, 0.0, 1.0), inWin);
32
+ float edge = max(scLine(abs(d.y) - halfH, 1.5), 0.0) * step(abs(d.x), 0.5 * A * 0.8);
33
+ col = mix(col, hotc, edge);
34
+ // eye bar
35
+ float bar = 0.003 + 0.028 * hit.x;
36
+ float glow = smoothstep(0.1, 0.0, abs(d.y)) * 0.18 * (0.4 + hit.x);
37
+ col = mix(col, blue, glow);
38
+ col = mix(col, hotc, scAA(abs(d.y) - bar) * (0.55 + 0.45 * step(0.2, hit.x)));
39
+ // block with the word, crosshairs, live depth
40
+ col = mix(col, vec3(0.0), scAA(sdBox(c, vec2(-0.1, 0.78), vec2(0.98, 1.1))));
41
+ col = mix(col, vec3(0.0), scAA(sdBox(c, vec2(1.1, 0.84), vec2(A + 0.1, 1.1))));
42
+ col = mix(col, hotc, scSheet(q, 0));
43
+ col = mix(col, hotc, scPlus(c, vec2(0.05, 0.05), 0.02));
44
+ col = mix(col, hotc, scPlus(c, vec2(A - 0.05, 0.05), 0.02));
45
+ float cell = scCell();
46
+ col = mix(col, hotc, numTxt(q, vec2(A - 0.2, 0.9) * scU, cell * 2.0, mod(cut * 7.0, 1000.0), 3));
47
+ col = mix(col, blue, scSheet(q, 1));
48
+ }
@@ -0,0 +1,42 @@
1
+ // Scene 9, runner: the plate as a grey monotone under scanline bands (a few bands slide sideways on every onset), glowing
2
+ // white-hot data streaks whose length is the spectrum and which jump on the onset, and a vermilion bar carrying a heavy Arial Black
3
+ // word that swaps to the next of three words and slams to a new left edge on every beat. Black pixel crosses, MesloLGS NF captions.
4
+ // Palette: ground (black), ink (white-hot), accent (vermilion), tintA (black), tintB (light grey). Text set 9: r, g, b are
5
+ // the three words (same place), the captions are on r above the bar.
6
+ void sceneRunner(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
7
+ vec2 c = q / scU;
8
+ float A = S.x / S.y;
9
+ vec4 hit = stHit();
10
+ vec3 hotc = inkColor.rgb;
11
+ vec3 verm = accentColor.rgb;
12
+ vec3 blk = tintA.rgb;
13
+ vec3 sky = tintB.rgb;
14
+ float cut = floor(clk.x);
15
+ float band = floor(q.y / (4.0 * max(U * 3.0, 1.0)));
16
+ float slide = step(0.9, hash12(vec2(band, clk.z))) * (hash12(vec2(band, clk.z + 7.0)) - 0.5) * 0.12 * scU;
17
+ float l = clamp((luma(scPlate(q + vec2(slide, 0.0), vec2(0.0), S)) - 0.06) * 1.6, 0.0, 1.0);
18
+ float stripe = 0.78 + 0.22 * step(0.5, fract(band * 0.5));
19
+ col = mix(groundColor.rgb, sky, smoothstep(0.0, 1.0, l)) * stripe;
20
+ // streaks
21
+ for (int i = 0; i < 16; i++) {
22
+ float fi = float(i);
23
+ float y = 0.04 + 0.92 * hash12(vec2(fi, 1.3));
24
+ float len = 0.12 + 0.55 * bandAt(hash12(vec2(fi, 2.9)));
25
+ float x0 = A * hash12(vec2(fi, clk.z));
26
+ float u = clamp((c.x - (x0 - len)) / len, 0.0, 1.0);
27
+ float s = scLine(c.y - y, 1.3) * step(x0 - len, c.x) * step(c.x, x0);
28
+ col = mix(col, hotc, s * u * u * 0.9);
29
+ }
30
+ // the bar: its left edge slams to one of three places on the beat, the word swaps
31
+ float pos = mod(cut, 3.0);
32
+ float x0 = pos < 0.5 ? 0.0 : (pos < 1.5 ? 0.22 : 0.08);
33
+ col = mix(col, verm, scAA(sdBox(c, vec2(x0, 0.6), vec2(A + 0.1, 0.79))));
34
+ float w = pos < 0.5 ? scSheet(q, 0) : (pos < 1.5 ? scSheet(q, 1) : scSheet(q, 2));
35
+ col = mix(col, blk, w * step(x0, c.x) * step(0.58, c.y) * step(c.y, 0.8));
36
+ col = mix(col, blk, max(scPlus(c, vec2(x0 + 0.04, 0.6), 0.015), scPlus(c, vec2(A - 0.05, 0.79), 0.015)));
37
+ float cell = scCell();
38
+ col = mix(col, hotc, numTxt(q, vec2(0.06, 0.1) * scU, cell * 2.0, mod(cut * 11.0, 1000.0), 3));
39
+ col = mix(col, hotc, scSheet(q, 0) * step(c.y, 0.5) * step(0.2, c.y));
40
+ vec2 ck = floor((c - vec2(A - 0.34, 0.86)) / 0.025);
41
+ col = mix(col, blk, step(0.0, ck.x) * step(ck.x, 9.0) * step(0.0, ck.y) * step(ck.y, 2.0) * step(1.0, mod(ck.x + ck.y, 2.0)));
42
+ }
@@ -0,0 +1,66 @@
1
+ // Scene 0, ascii: the plate drawn as ASCII, one character per cell from the pixel font by tone (mint, the lightest cells lilac);
2
+ // after every onset a hot column sweeps across it and lifts the characters it passes; a contour-map box with its terrain shifting
3
+ // on the beat, a particle cloud box that scatters on the onset, live readouts and a big Hangul word. Palette: ground (dark teal),
4
+ // ink (mint), accent (white mint), tintA (lilac). Text set 10 (Pretendard).
5
+ float asciiChar(vec2 q, vec2 lo, vec2 hi, vec4 clk, vec4 hit, out float lit) {
6
+ float cell = scCell();
7
+ vec2 adv = vec2(4.0, 6.0) * cell;
8
+ vec2 id = floor((q - lo) / adv);
9
+ vec2 org = lo + id * adv;
10
+ vec2 mid = org + vec2(2.0, 3.0) * cell;
11
+ float l = pow(scTone(mid, lo, hi, 1.5, 0.04), 0.7);
12
+ float age = float(FRAMEINDEX) - clk.w;
13
+ float sweepX = lo.x + (hi.x - lo.x) * (age / 9.0);
14
+ float sw = step(abs(mid.x - sweepX), 18.0 * U + 8.0) * step(0.0, age) * step(age, 9.5) * step(0.5, clk.z);
15
+ l = clamp(l + 0.35 * sw, 0.0, 1.0);
16
+ int k = int(floor(l * 7.99));
17
+ int ch = k == 0 ? 0 : (k == 1 ? 46 : (k == 2 ? 58 : (k == 3 ? 45 : (k == 4 ? 43 : (k == 5 ? 47 : (k == 6 ? 37 : 56))))));
18
+ lit = step(0.8, l) + sw;
19
+ return glyphAt(q - org, ch, cell) * step(lo.x, q.x) * step(q.x, hi.x) * step(lo.y, q.y) * step(q.y, hi.y);
20
+ }
21
+
22
+ void sceneAscii(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
23
+ vec2 c = q / scU;
24
+ float A = S.x / S.y;
25
+ vec4 hit = stHit();
26
+ vec3 mint = inkColor.rgb;
27
+ vec3 whit = accentColor.rgb;
28
+ vec3 lil = tintA.rgb;
29
+ float cut = floor(clk.x);
30
+ col = groundColor.rgb;
31
+ float lit;
32
+ float g = asciiChar(q, vec2(0.05, 0.07) * scU, vec2(1.12, 0.77) * scU, clk, hit, lit);
33
+ col = mix(col, mix(mint, lil, step(0.8, lit)), g);
34
+ col = mix(col, whit, g * step(1.5, lit));
35
+ col = mix(col, mint, scLine(sdBox(c, vec2(0.04, 0.06), vec2(1.13, 0.78)), 1.0) * 0.6);
36
+ // contour map box
37
+ vec2 ml = vec2(1.22, 0.07);
38
+ vec2 mh = vec2(1.72, 0.37);
39
+ float v = fbm(c * vec2(6.0, 8.0) + cut * 0.7, 4) * 10.0;
40
+ float iso = clamp(1.0 - abs(fract(v) - 0.5) * 2.0 / max(fwidth(v) * 1.5, 1e-3), 0.0, 1.0);
41
+ float major = clamp(1.0 - abs(fract(v * 0.2) - 0.5) * 2.0 / max(fwidth(v * 0.2) * 2.5, 1e-3), 0.0, 1.0);
42
+ float inM = scBox(c, ml, mh);
43
+ col = mix(col, mint, iso * inM * 0.7);
44
+ col = mix(col, lil, major * inM);
45
+ col = mix(col, mint, scLine(sdBox(c, ml, mh), 1.0));
46
+ // particle cloud box
47
+ vec2 pl = vec2(1.22, 0.42);
48
+ vec2 ph = vec2(1.72, 0.72);
49
+ col = mix(col, mint, scLine(sdBox(c, pl, ph), 1.0));
50
+ if (scBox(c, pl, ph) > 0.5) {
51
+ float dots = 0.0;
52
+ for (int i = 0; i < 80; i++) {
53
+ vec2 h = hash22(vec2(float(i), 5.3));
54
+ vec2 p = vec2(1.47, 0.57) + (h - 0.5) * vec2(0.4, 0.22) * (0.4 + 0.6 * h.y);
55
+ p += (hash22(vec2(float(i), clk.z + 3.0)) - 0.5) * 0.14 * step(0.45, hit.x);
56
+ dots = max(dots, scAA(length(c - p) - 0.0035));
57
+ }
58
+ col = mix(col, lil, dots);
59
+ }
60
+ // readouts and the Hangul word
61
+ float cell = scCell();
62
+ col = mix(col, mint, max(txt4(q, vec2(1.22, 0.76) * scU, cell, 88, 0, 0, 0), numTxt(q, vec2(1.28, 0.76) * scU, cell, mod(cut * 37.0 + 714.0, 10000.0), 4)));
63
+ col = mix(col, mint, max(txt4(q, vec2(1.22, 0.8) * scU, cell, 89, 0, 0, 0), numTxt(q, vec2(1.28, 0.8) * scU, cell, floor(stLevel().a * 999.0), 4)));
64
+ col = mix(col, lil, scSheet(q, 0));
65
+ col = mix(col, mint, scSheet(q, 1));
66
+ }
@@ -0,0 +1,80 @@
1
+ // Scene 10 (variant 0, rot 1), cube-wall: a salmon field and a 4 x 3 wall of cubes. On every beat every cube turns to its next face in
2
+ // three frames (even columns slide round sideways, odd columns upward); a face is a cobalt rounded tile with a cream letter, a cream
3
+ // tile with a cobalt letter, a cobalt Bayer dither of the plate, or a dot grid whose dot radius is the bass. Each onset swaps the letter
4
+ // of one cube. Palette: ground (salmon), ink (cream), accent (cobalt), tintA (dark salmon). Text set 11: r the four face letters
5
+ // (Big Shoulders Display Black, C U B E at 0, 0.2, 0.4, 0.6 of the sheet width), g the caption (MesloLGS NF).
6
+ float cwRound(vec2 p, float s, float r) { return length(max(abs(p) - (s - r), 0.0)) - r; }
7
+
8
+ vec4 cwFace(vec2 q, vec2 ctr, vec2 p, float s, int kind, int letter, float bass) {
9
+ vec3 cobalt = accentColor.rgb;
10
+ vec3 cream = inkColor.rgb;
11
+ float cov = scAA(cwRound(p, s, 0.05));
12
+ vec3 f = kind == 0 ? cobalt : (kind == 3 ? tintA.rgb : cream);
13
+ float cx = (float(letter) * 0.2) * RENDERSIZE.x + 0.1167 * RENDERSIZE.y;
14
+ vec2 sp = vec2(cx, 0.2361 * RENDERSIZE.y) + p / s * 0.1833 * RENDERSIZE.y;
15
+ float m = crisp(sheetC(sp, 0), 1.0);
16
+ if (kind == 0) { f = mix(f, cream, m); }
17
+ if (kind == 1) { f = mix(f, cobalt, m); }
18
+ if (kind == 2) {
19
+ float px = scPx();
20
+ vec2 pix = floor(q / px);
21
+ float l = scTone((pix + 0.5) * px, (ctr - s) * scU, (ctr + s) * scU, 1.5, 0.08);
22
+ f = mix(cream, cobalt, step(scBayer(pix), 1.0 - l));
23
+ }
24
+ if (kind == 3) {
25
+ vec2 g = (p / s * 0.5 + 0.5) * 6.0;
26
+ float dt = scAA((length(fract(g) - 0.5) - (0.12 + 0.34 * bass)) * s / 3.0);
27
+ f = mix(f, cream, dt);
28
+ }
29
+ return vec4(f, cov);
30
+ }
31
+
32
+ void sceneCubeWall(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
33
+ vec2 c = q / scU;
34
+ float A = S.x / S.y;
35
+ vec3 cobalt = accentColor.rgb;
36
+ vec3 cream = inkColor.rgb;
37
+ float beat = floor(clk.x);
38
+ float cut = floor(beat * 0.5);
39
+ float age = float(FRAMEINDEX) - clk.y;
40
+ float u = (cut < 0.5 || mod(beat, 2.0) > 0.5) ? 1.0 : clamp((age + 1.0) / 3.0, 0.0, 1.0);
41
+ col = groundColor.rgb;
42
+ vec2 o = vec2(0.5 * A - 0.6, 0.05);
43
+ vec2 g = (c - o) / 0.3;
44
+ vec2 id = floor(g);
45
+ col = mix(col, tintA.rgb, scAA(sdBox(c, o - 0.01, o + vec2(1.2, 0.9) + 0.01)) * 0.5);
46
+ if (id.x >= 0.0 && id.x < 4.0 && id.y >= 0.0 && id.y < 3.0) {
47
+ vec2 ctr = o + (id + 0.5) * 0.3;
48
+ vec2 p = c - ctr;
49
+ float s = 0.135;
50
+ bool horiz = mod(id.x, 2.0) < 0.5;
51
+ float pitch = 2.0 * s + 0.03;
52
+ float off = pitch * u;
53
+ vec2 pPrev = horiz ? p + vec2(off, 0.0) : p + vec2(0.0, off);
54
+ vec2 pNew = horiz ? p - vec2(pitch - off, 0.0) : p - vec2(0.0, pitch - off);
55
+ float idx = id.x + 4.0 * id.y;
56
+ float turns = floor((clk.z + 11.0 - idx) / 12.0);
57
+ int letter = int(mod(idx + turns, 4.0));
58
+ int kNew = int(mod(cut + id.x + 2.0 * id.y, 4.0));
59
+ int kPrev = int(mod(cut + 3.0 + id.x + 2.0 * id.y, 4.0));
60
+ bool inPrev = abs(horiz ? pPrev.x : pPrev.y) < s && abs(horiz ? pPrev.y : pPrev.x) < s;
61
+ bool inNew = abs(horiz ? pNew.x : pNew.y) < s && abs(horiz ? pNew.y : pNew.x) < s;
62
+ float bass = stLevel().r;
63
+ if (u >= 0.99) {
64
+ vec4 f2 = cwFace(q, ctr, p, s, kNew, letter, bass);
65
+ col = mix(col, f2.rgb, f2.a);
66
+ } else if (inNew) {
67
+ vec4 fn = cwFace(q, ctr, pNew, s, kNew, letter, bass);
68
+ col = mix(col, fn.rgb * (0.65 + 0.35 * u), fn.a);
69
+ } else if (inPrev) {
70
+ vec4 fp = cwFace(q, ctr, pPrev, s, kPrev, letter, bass);
71
+ col = mix(col, fp.rgb * (1.0 - 0.35 * u), fp.a);
72
+ }
73
+ }
74
+ // margins: cobalt bar with the caption, rules, crosses
75
+ col = mix(col, cobalt, scAA(sdBox(c, vec2(0.0, 0.88), vec2(o.x - 0.03, 0.95))));
76
+ col = mix(col, cream, scSheet(q, 1) * scBox(c, vec2(0.0, 0.88), vec2(o.x - 0.03, 0.95)));
77
+ col = mix(col, cream, scLine(c.x - (o.x + 1.23), 1.0) * step(0.05, c.y) * step(c.y, 0.95) * 0.9);
78
+ col = mix(col, cobalt, max(scPlus(c, vec2(0.08, 0.08), 0.02), scPlus(c, vec2(A - 0.08, 0.92), 0.02)));
79
+ col = mix(col, cobalt, numTxt(q, vec2(A - 0.25, 0.08) * scU, scCell() * 2.0, mod(cut, 100.0), 2));
80
+ }
@@ -0,0 +1,46 @@
1
+ // Scene 11 (variant 1, rot 1), vortex-count: a blue-grey field whose log-polar rings of text spiral out of the centre (white and navy
2
+ // rings alternate, the spiral steps a little on every beat), a round window at the vanishing point holding the plate as white
3
+ // halftone dots (dot size follows the bass), and a ring of 24 countdown ticks that loses one tick on every beat. Palette: ground
4
+ // (blue-grey), ink (white), accent (navy), tintA (pale blue-grey). Text set 12: r the spiral line (Bebas Neue), g the caption (Futura).
5
+ void sceneVortex(vec2 q, vec2 S, vec4 clk, inout vec3 col) {
6
+ vec2 c = q / scU;
7
+ float A = S.x / S.y;
8
+ vec4 hit = stHit();
9
+ vec3 white = inkColor.rgb;
10
+ vec3 navy = accentColor.rgb;
11
+ float cut = floor(clk.x);
12
+ vec2 ctr = vec2(0.5 * A, 0.5);
13
+ vec2 d = c - ctr;
14
+ float r = length(d);
15
+ float th = atan(d.y, d.x);
16
+ col = groundColor.rgb;
17
+ // spiral text
18
+ float w = log(max(r, 0.001) / 0.2) * 3.0;
19
+ float n = floor(w);
20
+ float tt = fract(th / 6.28318 + n * 0.173 + cut * 0.012);
21
+ float k = RENDERSIZE.y;
22
+ vec2 sp = vec2(tt * 0.97 * RENDERSIZE.x, (0.004 + (1.0 - fract(w)) * 0.076) * k);
23
+ float m = crisp(sheetC(sp, 0), 1.0) * step(0.0, w) * step(r, 1.4);
24
+ col = mix(col, mod(n, 2.0) < 0.5 ? white : navy, m);
25
+ col = mix(col, white, 0.1 * step(0.0, w) * step(fract(w), 0.03));
26
+ // round window with the plate as halftone, and the countdown ring
27
+ float R = 0.19;
28
+ float lv = stLevel().r;
29
+ vec2 lo = (ctr - R) * scU;
30
+ vec2 hi = (ctr + R) * scU;
31
+ float dots = scDots(q, lo, hi, max(3.0, 11.0 * U), 1.0 + 1.6 * lv, 0.05, 0.0);
32
+ col = mix(col, navy, scAA(r - R));
33
+ col = mix(col, white, dots * scAA(r - R + 0.004));
34
+ col = mix(col, white, scLine(r - R, 1.5));
35
+ float left = 24.0 - mod(cut, 25.0);
36
+ float a24 = (th / 6.28318 + 0.5) * 24.0;
37
+ float tick = step(0.2, fract(a24)) * step(fract(a24), 0.8) * step(R + 0.012, r) * step(r, R + 0.045);
38
+ float lit = step(floor(a24) + 0.5, left);
39
+ col = mix(col, mix(tintA.rgb, white, lit), tick);
40
+ // numeral, caption, crosses
41
+ float cell = scCell();
42
+ col = mix(col, white, numTxt(q, vec2(ctr.x + 0.08, ctr.y + 0.11) * scU, cell * 2.0, left, 2));
43
+ col = mix(col, navy, scAA(sdBox(c, vec2(0.0, 0.84), vec2(0.4, 1.0))));
44
+ col = mix(col, white, scSheet(q, 1));
45
+ col = mix(col, white, max(scPlus(c, vec2(0.06, 0.06), 0.02), scPlus(c, vec2(A - 0.06, 0.06), 0.02)));
46
+ }