shaders 2.5.103 → 2.5.104

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 (223) hide show
  1. package/dist/core/Fog-DhFHErOx.js +674 -0
  2. package/dist/core/Smoke-LIDjCv7f.js +629 -0
  3. package/dist/core/SmokeFill-ChSIfTxW.js +641 -0
  4. package/dist/core/{VideoTexture-DnHIs4pp.js → VideoTexture-SWLe5c3m.js} +1 -1
  5. package/dist/core/{WebcamTexture-XBDo2kgN.js → WebcamTexture-cXPyEumA.js} +1 -1
  6. package/dist/core/index.js +73 -70
  7. package/dist/core/registry.js +72 -69
  8. package/dist/core/renderer.d.ts.map +1 -1
  9. package/dist/core/shaderRegistry-CVhdTDhR.js +252 -0
  10. package/dist/core/shaderRegistry.d.ts.map +1 -1
  11. package/dist/core/shaders/Fog/index.d.ts +78 -0
  12. package/dist/core/shaders/Fog/index.d.ts.map +1 -0
  13. package/dist/core/shaders/Fog/index.js +4 -0
  14. package/dist/core/shaders/Form3D/index.js +1 -1
  15. package/dist/core/shaders/Glass/index.js +1 -1
  16. package/dist/core/shaders/GlassTiles/index.js +1 -1
  17. package/dist/core/shaders/Glitch/index.js +1 -1
  18. package/dist/core/shaders/Glow/index.js +1 -1
  19. package/dist/core/shaders/Godrays/index.js +1 -1
  20. package/dist/core/shaders/Grayscale/index.js +1 -1
  21. package/dist/core/shaders/Grid/index.js +1 -1
  22. package/dist/core/shaders/GridDistortion/index.js +1 -1
  23. package/dist/core/shaders/Group/index.js +1 -1
  24. package/dist/core/shaders/Halftone/index.js +1 -1
  25. package/dist/core/shaders/HexGrid/index.js +1 -1
  26. package/dist/core/shaders/HueShift/index.js +1 -1
  27. package/dist/core/shaders/ImageTexture/index.js +1 -1
  28. package/dist/core/shaders/Invert/index.js +1 -1
  29. package/dist/core/shaders/Kaleidoscope/index.js +1 -1
  30. package/dist/core/shaders/LensFlare/index.js +1 -1
  31. package/dist/core/shaders/LinearBlur/index.js +1 -1
  32. package/dist/core/shaders/LinearGradient/index.js +1 -1
  33. package/dist/core/shaders/Liquify/index.js +1 -1
  34. package/dist/core/shaders/Mirror/index.js +1 -1
  35. package/dist/core/shaders/MultiPointGradient/index.js +1 -1
  36. package/dist/core/shaders/Neon/index.js +1 -1
  37. package/dist/core/shaders/Paper/index.js +1 -1
  38. package/dist/core/shaders/Perspective/index.js +1 -1
  39. package/dist/core/shaders/Pixelate/index.js +1 -1
  40. package/dist/core/shaders/Plasma/index.js +1 -1
  41. package/dist/core/shaders/PolarCoordinates/index.js +1 -1
  42. package/dist/core/shaders/Polygon/index.js +1 -1
  43. package/dist/core/shaders/Posterize/index.js +1 -1
  44. package/dist/core/shaders/ProgressiveBlur/index.js +1 -1
  45. package/dist/core/shaders/RadialGradient/index.js +1 -1
  46. package/dist/core/shaders/RectangularCoordinates/index.js +1 -1
  47. package/dist/core/shaders/Ring/index.js +1 -1
  48. package/dist/core/shaders/Ripples/index.js +1 -1
  49. package/dist/core/shaders/RoundedRect/index.js +1 -1
  50. package/dist/core/shaders/Saturation/index.js +1 -1
  51. package/dist/core/shaders/Sharpness/index.js +1 -1
  52. package/dist/core/shaders/Shatter/index.js +1 -1
  53. package/dist/core/shaders/SimplexNoise/index.js +1 -1
  54. package/dist/core/shaders/SineWave/index.js +1 -1
  55. package/dist/core/shaders/Smoke/index.d.ts +113 -0
  56. package/dist/core/shaders/Smoke/index.d.ts.map +1 -0
  57. package/dist/core/shaders/Smoke/index.js +4 -0
  58. package/dist/core/shaders/SmokeFill/index.d.ts +145 -0
  59. package/dist/core/shaders/SmokeFill/index.d.ts.map +1 -0
  60. package/dist/core/shaders/SmokeFill/index.js +5 -0
  61. package/dist/core/shaders/Solarize/index.js +1 -1
  62. package/dist/core/shaders/SolidColor/index.js +1 -1
  63. package/dist/core/shaders/Spherize/index.js +1 -1
  64. package/dist/core/shaders/Spiral/index.js +1 -1
  65. package/dist/core/shaders/Star/index.js +1 -1
  66. package/dist/core/shaders/Strands/index.js +1 -1
  67. package/dist/core/shaders/Stretch/index.js +1 -1
  68. package/dist/core/shaders/Stripes/index.js +1 -1
  69. package/dist/core/shaders/StudioBackground/index.js +1 -1
  70. package/dist/core/shaders/Swirl/index.js +1 -1
  71. package/dist/core/shaders/TiltShift/index.js +1 -1
  72. package/dist/core/shaders/Tint/index.js +1 -1
  73. package/dist/core/shaders/Trapezoid/index.js +1 -1
  74. package/dist/core/shaders/Tritone/index.js +1 -1
  75. package/dist/core/shaders/Truchet/index.js +1 -1
  76. package/dist/core/shaders/Twirl/index.js +1 -1
  77. package/dist/core/shaders/VHS/index.js +1 -1
  78. package/dist/core/shaders/Vesica/index.js +1 -1
  79. package/dist/core/shaders/Vibrance/index.js +1 -1
  80. package/dist/core/shaders/VideoTexture/index.js +2 -2
  81. package/dist/core/shaders/Vignette/index.js +1 -1
  82. package/dist/core/shaders/Voronoi/index.js +1 -1
  83. package/dist/core/shaders/WaveDistortion/index.js +1 -1
  84. package/dist/core/shaders/Weave/index.js +1 -1
  85. package/dist/core/shaders/WebcamTexture/index.js +2 -2
  86. package/dist/core/shaders/ZoomBlur/index.js +1 -1
  87. package/dist/js/createShader.js +1 -1
  88. package/dist/js/utils/generatePresetCode.d.ts.map +1 -1
  89. package/dist/js/utils/generatePresetCode.js +67 -0
  90. package/dist/react/Fog.js +223 -0
  91. package/dist/react/Preview.js +3 -0
  92. package/dist/react/Shader.js +1 -1
  93. package/dist/react/Smoke.js +223 -0
  94. package/dist/react/SmokeFill.js +223 -0
  95. package/dist/react/components/Fog.d.ts +31 -0
  96. package/dist/react/components/Fog.d.ts.map +1 -0
  97. package/dist/react/components/Smoke.d.ts +33 -0
  98. package/dist/react/components/Smoke.d.ts.map +1 -0
  99. package/dist/react/components/SmokeFill.d.ts +34 -0
  100. package/dist/react/components/SmokeFill.d.ts.map +1 -0
  101. package/dist/react/engine/Preview.d.ts.map +1 -1
  102. package/dist/react/index.d.ts +3 -0
  103. package/dist/react/index.d.ts.map +1 -1
  104. package/dist/react/index.js +4 -1
  105. package/dist/react/utils/generatePresetCode.d.ts.map +1 -1
  106. package/dist/react/utils/generatePresetCode.js +67 -0
  107. package/dist/registry.js +1189 -0
  108. package/dist/solid/components/Fog.d.ts +28 -0
  109. package/dist/solid/components/Fog.d.ts.map +1 -0
  110. package/dist/solid/components/Fog.js +228 -0
  111. package/dist/solid/components/Smoke.d.ts +30 -0
  112. package/dist/solid/components/Smoke.d.ts.map +1 -0
  113. package/dist/solid/components/Smoke.js +228 -0
  114. package/dist/solid/components/SmokeFill.d.ts +31 -0
  115. package/dist/solid/components/SmokeFill.d.ts.map +1 -0
  116. package/dist/solid/components/SmokeFill.js +228 -0
  117. package/dist/solid/engine/Preview.d.ts.map +1 -1
  118. package/dist/solid/engine/Preview.js +162 -156
  119. package/dist/solid/engine/Shader.js +1 -1
  120. package/dist/solid/index.d.ts +3 -0
  121. package/dist/solid/index.d.ts.map +1 -1
  122. package/dist/solid/index.js +144 -138
  123. package/dist/solid/utils/generatePresetCode.d.ts.map +1 -1
  124. package/dist/solid/utils/generatePresetCode.js +67 -0
  125. package/dist/svelte/components/Fog.svelte.d.ts +19 -0
  126. package/dist/svelte/components/Smoke.svelte.d.ts +20 -0
  127. package/dist/svelte/components/SmokeFill.svelte.d.ts +21 -0
  128. package/dist/svelte/{generatePresetCode-psTzYsW3.js → generatePresetCode-DR_OAIL7.js} +67 -0
  129. package/dist/svelte/index.d.ts +3 -0
  130. package/dist/svelte/index.js +1151 -551
  131. package/dist/svelte/source/components/Fog.svelte +325 -0
  132. package/dist/svelte/source/components/Smoke.svelte +326 -0
  133. package/dist/svelte/source/components/SmokeFill.svelte +327 -0
  134. package/dist/svelte/source/engine/Preview.svelte +6 -0
  135. package/dist/svelte/source/index.js +3 -0
  136. package/dist/svelte/utils/generatePresetCode.js +1 -1
  137. package/dist/vue/Fog.js +3 -0
  138. package/dist/vue/Fog.vue_vue_type_script_setup_true_lang.js +222 -0
  139. package/dist/vue/Preview.vue_vue_type_script_setup_true_lang.js +6 -0
  140. package/dist/vue/Shader.vue_vue_type_script_setup_true_lang.js +1 -1
  141. package/dist/vue/Smoke.js +3 -0
  142. package/dist/vue/Smoke.vue_vue_type_script_setup_true_lang.js +227 -0
  143. package/dist/vue/SmokeFill.js +3 -0
  144. package/dist/vue/SmokeFill.vue_vue_type_script_setup_true_lang.js +232 -0
  145. package/dist/vue/components/Fog.vue.d.ts +54 -0
  146. package/dist/vue/components/Fog.vue.d.ts.map +1 -0
  147. package/dist/vue/components/Smoke.vue.d.ts +55 -0
  148. package/dist/vue/components/Smoke.vue.d.ts.map +1 -0
  149. package/dist/vue/components/SmokeFill.vue.d.ts +56 -0
  150. package/dist/vue/components/SmokeFill.vue.d.ts.map +1 -0
  151. package/dist/vue/index.d.ts +3 -0
  152. package/dist/vue/index.d.ts.map +1 -1
  153. package/dist/vue/index.js +4 -1
  154. package/dist/vue/utils/generatePresetCode.d.ts.map +1 -1
  155. package/dist/vue/utils/generatePresetCode.js +67 -0
  156. package/package.json +25 -1
  157. package/dist/core/shaderRegistry-BWuH2me2.js +0 -246
  158. /package/dist/core/{Form3D-rKpxb9t3.js → Form3D-DaPbLGUi.js} +0 -0
  159. /package/dist/core/{Glass-C04tCmBL.js → Glass-CpcmrDfm.js} +0 -0
  160. /package/dist/core/{GlassTiles-k1C4a4u8.js → GlassTiles-Dgh6nOaE.js} +0 -0
  161. /package/dist/core/{Glitch-DzPMkBu4.js → Glitch-BsbzLahF.js} +0 -0
  162. /package/dist/core/{Glow-BwaPYDRZ.js → Glow-Ft2x2QHL.js} +0 -0
  163. /package/dist/core/{Godrays-DAYmq-BP.js → Godrays-D1LINbut.js} +0 -0
  164. /package/dist/core/{Grayscale-lYKBBkGY.js → Grayscale-Ri-695Uh.js} +0 -0
  165. /package/dist/core/{Grid-BJ-nxN3i.js → Grid-BYSsAIEv.js} +0 -0
  166. /package/dist/core/{GridDistortion-DtaRNrTZ.js → GridDistortion-DWFGD8ya.js} +0 -0
  167. /package/dist/core/{Group-DpozigtX.js → Group-CkhjTW59.js} +0 -0
  168. /package/dist/core/{Halftone-XFa7by1s.js → Halftone-BUCDTTAU.js} +0 -0
  169. /package/dist/core/{HexGrid-D-EmQ4kI.js → HexGrid-BUiDrehv.js} +0 -0
  170. /package/dist/core/{HueShift-D9K0ynaS.js → HueShift-BtGVMu7q.js} +0 -0
  171. /package/dist/core/{ImageTexture-CArkZMfh.js → ImageTexture-CrX_9-f0.js} +0 -0
  172. /package/dist/core/{Invert-DCnwo_Xq.js → Invert-azYrcDMi.js} +0 -0
  173. /package/dist/core/{Kaleidoscope-BytHro3k.js → Kaleidoscope-CFWtKisp.js} +0 -0
  174. /package/dist/core/{LensFlare-B0vv4x97.js → LensFlare-ttrXgfea.js} +0 -0
  175. /package/dist/core/{LinearBlur-BFewxPjV.js → LinearBlur-By2aD8OO.js} +0 -0
  176. /package/dist/core/{LinearGradient-BKUf_u7r.js → LinearGradient-CM02z32l.js} +0 -0
  177. /package/dist/core/{Liquify-cE5dxrfh.js → Liquify-CyXo6vAH.js} +0 -0
  178. /package/dist/core/{Mirror-DIle92J8.js → Mirror-B7XmfGdw.js} +0 -0
  179. /package/dist/core/{MultiPointGradient-DDwac_mm.js → MultiPointGradient-8zGSIM4U.js} +0 -0
  180. /package/dist/core/{Neon-Dg8UfC7P.js → Neon-C1JlexhM.js} +0 -0
  181. /package/dist/core/{Paper-bMSMCeYK.js → Paper-B08rxNys.js} +0 -0
  182. /package/dist/core/{Perspective-BmfvQV6W.js → Perspective-BN_OpTZq.js} +0 -0
  183. /package/dist/core/{Pixelate-Dl26r6IT.js → Pixelate-dxPAFCRu.js} +0 -0
  184. /package/dist/core/{Plasma-CJWS1TvX.js → Plasma-DGCw0cd7.js} +0 -0
  185. /package/dist/core/{PolarCoordinates-lq6K4WBm.js → PolarCoordinates-CMYCFT4S.js} +0 -0
  186. /package/dist/core/{Polygon-DRCs3CYs.js → Polygon-CsCOt5YE.js} +0 -0
  187. /package/dist/core/{Posterize-BjH7Zscm.js → Posterize-Blv9pzPT.js} +0 -0
  188. /package/dist/core/{ProgressiveBlur-B8xwWyTM.js → ProgressiveBlur-Cx6eR7o9.js} +0 -0
  189. /package/dist/core/{RadialGradient-DiGFPgrn.js → RadialGradient-De0gtdh3.js} +0 -0
  190. /package/dist/core/{RectangularCoordinates-COkNDxi0.js → RectangularCoordinates-8Sa2GaDy.js} +0 -0
  191. /package/dist/core/{Ring-QApyKPzE.js → Ring-kHH-DIDQ.js} +0 -0
  192. /package/dist/core/{Ripples-C8Q17Hvz.js → Ripples-Bf6Zwg6X.js} +0 -0
  193. /package/dist/core/{RoundedRect-Ca9af9xe.js → RoundedRect-B0sWh2BN.js} +0 -0
  194. /package/dist/core/{Saturation-CgDaiq6n.js → Saturation-CB19kOXg.js} +0 -0
  195. /package/dist/core/{Sharpness-CRXT0D30.js → Sharpness-CQOboeqy.js} +0 -0
  196. /package/dist/core/{Shatter-BssZTRYJ.js → Shatter-BhK75BiG.js} +0 -0
  197. /package/dist/core/{SimplexNoise-KfTCAfpL.js → SimplexNoise-BcSgytjc.js} +0 -0
  198. /package/dist/core/{SineWave-Ckeap_YM.js → SineWave-VTNDSK_g.js} +0 -0
  199. /package/dist/core/{Solarize-DhtQYYpW.js → Solarize-CWDgSBiv.js} +0 -0
  200. /package/dist/core/{SolidColor-6yUkGybH.js → SolidColor-DhMdM3bE.js} +0 -0
  201. /package/dist/core/{Spherize-8LXrGGG_.js → Spherize-BZxwopX8.js} +0 -0
  202. /package/dist/core/{Spiral-Bs7uZrBr.js → Spiral-gpkw37l1.js} +0 -0
  203. /package/dist/core/{Star-DiXwnPGP.js → Star-WJAOZ5P5.js} +0 -0
  204. /package/dist/core/{Strands-DsAAVemq.js → Strands-DOthZNHt.js} +0 -0
  205. /package/dist/core/{Stretch-D7P2R5lV.js → Stretch--GV6hbru.js} +0 -0
  206. /package/dist/core/{Stripes-DF8agIiJ.js → Stripes-CFCXw1_N.js} +0 -0
  207. /package/dist/core/{StudioBackground-BFeNfwEu.js → StudioBackground-DJr-cxOL.js} +0 -0
  208. /package/dist/core/{Swirl-BwezrSAA.js → Swirl-By5FadQK.js} +0 -0
  209. /package/dist/core/{TiltShift-CI3FlfYk.js → TiltShift-Dh8wc9GG.js} +0 -0
  210. /package/dist/core/{Tint-BdXlqlzz.js → Tint-DaTx2HII.js} +0 -0
  211. /package/dist/core/{Trapezoid-BX_hmeZJ.js → Trapezoid-Co0sIA73.js} +0 -0
  212. /package/dist/core/{Tritone-BlJ7cchN.js → Tritone-C9Yx69Tw.js} +0 -0
  213. /package/dist/core/{Truchet-Bnn0fwbF.js → Truchet-CkFSkniR.js} +0 -0
  214. /package/dist/core/{Twirl-C5ijhqz1.js → Twirl-v8pLqUTN.js} +0 -0
  215. /package/dist/core/{VHS-CQJ1hV_D.js → VHS-mKd1QBBj.js} +0 -0
  216. /package/dist/core/{Vesica-DU0f85NG.js → Vesica-CxP7UD0a.js} +0 -0
  217. /package/dist/core/{Vibrance-CGvYDeds.js → Vibrance-WR5yQv_9.js} +0 -0
  218. /package/dist/core/{Vignette-BJaonUVL.js → Vignette-hAIKTi35.js} +0 -0
  219. /package/dist/core/{Voronoi-DZemzWA4.js → Voronoi-DOGmwUSK.js} +0 -0
  220. /package/dist/core/{WaveDistortion--Y-m667K.js → WaveDistortion-BGdgj3Iz.js} +0 -0
  221. /package/dist/core/{Weave-CtyohvHz.js → Weave-CIP_EUPa.js} +0 -0
  222. /package/dist/core/{ZoomBlur-BwkhsFRE.js → ZoomBlur-BuIVpHGG.js} +0 -0
  223. /package/dist/core/{browser-DTNngPey.js → browser-D8zonASQ.js} +0 -0
@@ -0,0 +1,674 @@
1
+ import { a as transformColor, o as transformColorSpace, t as colorSpaceOptions } from "./transformations-B5lM6fYX.js";
2
+ import { t as mixColors } from "./colorMixing-BPpDnR5I.js";
3
+ import { StorageTexture } from "three/webgpu";
4
+ import { DataTexture, FloatType, LinearFilter as LinearFilter$1, RGBAFormat } from "three";
5
+ import { Fn, attributeArray, cos, float, floor, fract, instanceIndex, int, mix, mod, screenUV, sin, storageTexture, texture, textureStore, uint, uniform, uvec2, vec2, vec4 } from "three/tsl";
6
+ var GRID_GPU = 256;
7
+ var GRID_CPU = 64;
8
+ var JACOBI_ITERS = 20;
9
+ var PRESSURE_DISSIPATION = .8;
10
+ var VELOCITY_DISSIPATION = .15;
11
+ var INTERNAL_MAX_VEL = GRID_GPU * .6;
12
+ const componentDefinition = {
13
+ name: "Fog",
14
+ category: "Interactive",
15
+ description: "Fog that fills the screen and interacts with the mouse",
16
+ props: {
17
+ colorA: {
18
+ default: "#e0e0e0",
19
+ transform: transformColor,
20
+ description: "Primary fog color",
21
+ ui: {
22
+ type: "color",
23
+ label: "Color A",
24
+ group: "Colors"
25
+ }
26
+ },
27
+ colorB: {
28
+ default: "#888888",
29
+ transform: transformColor,
30
+ description: "Secondary fog color — creates variation across the field",
31
+ ui: {
32
+ type: "color",
33
+ label: "Color B",
34
+ group: "Colors"
35
+ }
36
+ },
37
+ seed: {
38
+ default: 0,
39
+ description: "Deterministic starting pattern — different seeds produce different fog configurations",
40
+ ui: {
41
+ type: "range",
42
+ min: 0,
43
+ max: 999,
44
+ step: 1,
45
+ label: "Seed",
46
+ group: "Field"
47
+ }
48
+ },
49
+ speed: {
50
+ default: 1,
51
+ description: "Simulation speed multiplier",
52
+ ui: {
53
+ type: "range",
54
+ min: .1,
55
+ max: 3,
56
+ step: .1,
57
+ label: "Speed",
58
+ group: "Field"
59
+ }
60
+ },
61
+ turbulence: {
62
+ default: 1,
63
+ description: "Ambient motion strength",
64
+ ui: {
65
+ type: "range",
66
+ min: 0,
67
+ max: 3,
68
+ step: .05,
69
+ label: "Turbulence",
70
+ group: "Field"
71
+ }
72
+ },
73
+ detail: {
74
+ default: 15,
75
+ description: "Fine-scale swirling structure — higher values produce more intricate wisps and vortices",
76
+ ui: {
77
+ type: "range",
78
+ min: 0,
79
+ max: 50,
80
+ step: 1,
81
+ label: "Detail",
82
+ group: "Field"
83
+ }
84
+ },
85
+ blending: {
86
+ default: .3,
87
+ description: "How much the two colors blend together — 0 behaves like oil & water (colors stay distinct with sharp boundaries), 1 behaves like food coloring (colors fully mix)",
88
+ ui: {
89
+ type: "range",
90
+ min: 0,
91
+ max: 1,
92
+ step: .05,
93
+ label: "Blending",
94
+ group: "Field"
95
+ }
96
+ },
97
+ mouseInfluence: {
98
+ default: .1,
99
+ description: "Strength of cursor influence — move the cursor to push fog",
100
+ ui: {
101
+ type: "range",
102
+ min: 0,
103
+ max: 2,
104
+ step: .05,
105
+ label: "Cursor Influence",
106
+ group: "Interaction"
107
+ }
108
+ },
109
+ mouseRadius: {
110
+ default: .1,
111
+ description: "Radius of cursor influence area",
112
+ ui: {
113
+ type: "range",
114
+ min: .02,
115
+ max: .5,
116
+ step: .01,
117
+ label: "Cursor Radius",
118
+ group: "Interaction"
119
+ }
120
+ },
121
+ colorSpace: {
122
+ default: "linear",
123
+ transform: transformColorSpace,
124
+ compileTime: true,
125
+ description: "Color space for color interpolation",
126
+ ui: {
127
+ type: "select",
128
+ options: colorSpaceOptions,
129
+ label: "Color Space",
130
+ group: "Colors"
131
+ }
132
+ }
133
+ },
134
+ computeNode: ({ uniforms, onCleanup, renderer }) => {
135
+ const N = GRID_GPU;
136
+ const gs = uint(N);
137
+ const Ni = int(N);
138
+ const Nf = float(N);
139
+ const TAU = float(Math.PI * 2);
140
+ const count = N * N;
141
+ const nw = (ii, ji, di, dj) => ii.add(int(di)).add(Ni).mod(Ni).mul(Ni).add(ji.add(int(dj)).add(Ni).mod(Ni));
142
+ const velA = attributeArray(count, "vec4");
143
+ const velB = attributeArray(count, "vec4");
144
+ const densA = attributeArray(count, "vec4");
145
+ const densB = attributeArray(count, "vec4");
146
+ const pressDivBuf = attributeArray(count, "vec4");
147
+ const valueNoise2D = Fn(([nx, ny]) => {
148
+ const ix = floor(nx), iy = floor(ny);
149
+ const sx = fract(nx), sy = fract(ny);
150
+ const ux = sx.mul(sx).mul(float(3).sub(sx.mul(float(2))));
151
+ const uy = sy.mul(sy).mul(float(3).sub(sy.mul(float(2))));
152
+ const h = (px, py) => fract(sin(px.mul(float(127.1)).add(py.mul(float(311.7)))).mul(float(43758.5453)));
153
+ return mix(mix(h(ix, iy), h(ix.add(float(1)), iy), ux), mix(h(ix, iy.add(float(1))), h(ix.add(float(1)), iy.add(float(1))), ux), uy);
154
+ });
155
+ const fbm = Fn(([nx, ny]) => valueNoise2D(nx, ny).mul(float(.5)).add(valueNoise2D(nx.mul(float(2)).add(float(5.37)), ny.mul(float(2)).add(float(9.13))).mul(float(.3))).add(valueNoise2D(nx.mul(float(4)).add(float(1.79)), ny.mul(float(4)).add(float(3.51))).mul(float(.2))));
156
+ const outTex = new StorageTexture(N, N);
157
+ outTex.type = FloatType;
158
+ const outTexNode = storageTexture(outTex);
159
+ onCleanup(() => {
160
+ outTex.dispose();
161
+ });
162
+ const dtU = uniform(.016);
163
+ const timeU = uniform(0);
164
+ const seedU = uniform(0);
165
+ const turbulenceU = uniform(.3);
166
+ const curlStrengthU = uniform(25);
167
+ const blendingU = uniform(.3);
168
+ const cursorXU = uniform(128);
169
+ const cursorYU = uniform(128);
170
+ const cursorVelXU = uniform(0);
171
+ const cursorVelYU = uniform(0);
172
+ const mouseActiveU = uniform(0);
173
+ const mouseRadSqU = uniform(1500);
174
+ const initPass = Fn(() => {
175
+ const idx = instanceIndex;
176
+ const jf = idx.mod(gs).toFloat();
177
+ const iF = idx.div(gs).toFloat();
178
+ const sdx = fract(sin(seedU.mul(float(37.31))).mul(float(43758.5453))).mul(float(97));
179
+ const sdy = fract(sin(seedU.mul(float(83.17))).mul(float(43758.5453))).mul(float(97));
180
+ const nx = jf.div(Nf).mul(float(3)).add(sdx);
181
+ const ny = iF.div(Nf).mul(float(3)).add(sdy);
182
+ const fogDens = fbm(nx.add(float(31.7)), ny.add(float(53.3))).mul(float(.75)).add(float(.25)).clamp(float(.15), float(.9));
183
+ const colorVar = fbm(nx, ny).clamp(float(0), float(1));
184
+ densA.element(idx).assign(vec4(fogDens, colorVar, float(0), float(0)));
185
+ densB.element(idx).assign(vec4(fogDens, colorVar, float(0), float(0)));
186
+ velA.element(idx).assign(vec4(float(0), float(0), float(0), float(0)));
187
+ velB.element(idx).assign(vec4(float(0), float(0), float(0), float(0)));
188
+ pressDivBuf.element(idx).assign(vec4(float(0), float(0), float(0), float(0)));
189
+ })().compute(count, [256]);
190
+ const forcePass = Fn(() => {
191
+ const idx = instanceIndex;
192
+ const j = idx.mod(gs);
193
+ const i = idx.div(gs);
194
+ const jf = j.toFloat().add(float(.5));
195
+ const iF = i.toFloat().add(float(.5));
196
+ const x = jf.div(Nf).mul(TAU);
197
+ const y = iF.div(Nf).mul(TAU);
198
+ const vel = velA.element(idx);
199
+ const t = timeU;
200
+ const fx = sin(x.mul(float(2)).add(t.mul(float(.31)))).mul(cos(y.mul(float(1.5)).add(t.mul(float(.23))))).add(sin(x.mul(float(.7)).add(y.mul(float(1.3))).add(t.mul(float(.17)))).mul(float(.4))).mul(turbulenceU).mul(float(N * .04)).mul(dtU);
201
+ const fy = cos(x.mul(float(1.5)).add(t.mul(float(.27)))).mul(sin(y.mul(float(2)).add(t.mul(float(.19))))).add(cos(x.mul(float(1.1)).add(y.mul(float(.9))).add(t.mul(float(.21)))).mul(float(.4))).mul(turbulenceU).mul(float(N * .04)).mul(dtU);
202
+ const cellX = jf;
203
+ const cellY = iF;
204
+ const cdx = cellX.sub(cursorXU);
205
+ const cdy = cellY.sub(cursorYU);
206
+ const cursorInf = cdx.mul(cdx).add(cdy.mul(cdy)).negate().div(mouseRadSqU.max(float(1))).exp().mul(mouseActiveU);
207
+ const newVx = vel.x.add(fx).add(cursorVelXU.mul(cursorInf));
208
+ const newVy = vel.y.add(fy).add(cursorVelYU.mul(cursorInf));
209
+ velA.element(idx).assign(vec4(newVx, newVy, vel.z, float(0)));
210
+ })().compute(count, [256]);
211
+ const curlPass = Fn(() => {
212
+ const idx = instanceIndex;
213
+ const ji = idx.mod(gs).toInt();
214
+ const ii = idx.div(gs).toInt();
215
+ const vL = velA.element(nw(ii, ji, 0, -1));
216
+ const vR = velA.element(nw(ii, ji, 0, 1));
217
+ const vU = velA.element(nw(ii, ji, -1, 0));
218
+ const vD = velA.element(nw(ii, ji, 1, 0));
219
+ const curl = vR.y.sub(vL.y).sub(vD.x.sub(vU.x)).mul(float(.5));
220
+ const vel = velA.element(idx);
221
+ velA.element(idx).assign(vec4(vel.x, vel.y, curl, float(0)));
222
+ })().compute(count, [256]);
223
+ const vorticityPass = Fn(() => {
224
+ const idx = instanceIndex;
225
+ const ji = idx.mod(gs).toInt();
226
+ const ii = idx.div(gs).toInt();
227
+ const cL = velA.element(nw(ii, ji, 0, -1)).z.abs();
228
+ const cR = velA.element(nw(ii, ji, 0, 1)).z.abs();
229
+ const cU = velA.element(nw(ii, ji, -1, 0)).z.abs();
230
+ const cD = velA.element(nw(ii, ji, 1, 0)).z.abs();
231
+ const cc = velA.element(idx).z;
232
+ const gx = cR.sub(cL).mul(float(.5));
233
+ const gy = cD.sub(cU).mul(float(.5));
234
+ const gl = gx.mul(gx).add(gy.mul(gy)).sqrt().max(float(1e-5));
235
+ const vel = velA.element(idx);
236
+ velA.element(idx).assign(vec4(vel.x.add(gy.div(gl).mul(cc).mul(curlStrengthU).mul(dtU)), vel.y.add(gx.div(gl).negate().mul(cc).mul(curlStrengthU).mul(dtU)), vel.z, float(0)));
237
+ })().compute(count, [256]);
238
+ const divergencePass = Fn(() => {
239
+ const idx = instanceIndex;
240
+ const ji = idx.mod(gs).toInt();
241
+ const ii = idx.div(gs).toInt();
242
+ const vL = velA.element(nw(ii, ji, 0, -1)).x;
243
+ const vR = velA.element(nw(ii, ji, 0, 1)).x;
244
+ const vU = velA.element(nw(ii, ji, -1, 0)).y;
245
+ const vD = velA.element(nw(ii, ji, 1, 0)).y;
246
+ const div$1 = vR.sub(vL).add(vD.sub(vU)).mul(float(.5));
247
+ const oldP = pressDivBuf.element(idx).x.mul(float(PRESSURE_DISSIPATION));
248
+ pressDivBuf.element(idx).assign(vec4(oldP, div$1, float(0), float(0)));
249
+ })().compute(count, [256]);
250
+ const jacobiPass = Fn(() => {
251
+ const idx = instanceIndex;
252
+ const ji = idx.mod(gs).toInt();
253
+ const ii = idx.div(gs).toInt();
254
+ const pL = pressDivBuf.element(nw(ii, ji, 0, -1)).x;
255
+ const pR = pressDivBuf.element(nw(ii, ji, 0, 1)).x;
256
+ const pU = pressDivBuf.element(nw(ii, ji, -1, 0)).x;
257
+ const pD = pressDivBuf.element(nw(ii, ji, 1, 0)).x;
258
+ const div$1 = pressDivBuf.element(idx).y;
259
+ pressDivBuf.element(idx).assign(vec4(pL.add(pR).add(pU).add(pD).sub(div$1).mul(float(.25)), div$1, float(0), float(0)));
260
+ })().compute(count, [256]);
261
+ const gradSubtractPass = Fn(() => {
262
+ const idx = instanceIndex;
263
+ const ji = idx.mod(gs).toInt();
264
+ const ii = idx.div(gs).toInt();
265
+ const pL = pressDivBuf.element(nw(ii, ji, 0, -1)).x;
266
+ const pR = pressDivBuf.element(nw(ii, ji, 0, 1)).x;
267
+ const pU = pressDivBuf.element(nw(ii, ji, -1, 0)).x;
268
+ const pD = pressDivBuf.element(nw(ii, ji, 1, 0)).x;
269
+ const vel = velA.element(idx);
270
+ const vx = vel.x.sub(pR.sub(pL).mul(float(.5)));
271
+ const vy = vel.y.sub(pD.sub(pU).mul(float(.5)));
272
+ const maxVel = float(INTERNAL_MAX_VEL);
273
+ const vLen = vx.mul(vx).add(vy.mul(vy)).sqrt().max(float(1e-6));
274
+ const capScale = maxVel.div(vLen.max(maxVel));
275
+ velA.element(idx).assign(vec4(vx.mul(capScale), vy.mul(capScale), vel.z, float(0)));
276
+ })().compute(count, [256]);
277
+ const advectVelPass = Fn(() => {
278
+ const idx = instanceIndex;
279
+ const j = idx.mod(gs);
280
+ const i = idx.div(gs);
281
+ const vel = velA.element(idx);
282
+ const srcX = mod(j.toFloat().sub(vel.x.mul(dtU)).add(Nf), Nf);
283
+ const srcY = mod(i.toFloat().sub(vel.y.mul(dtU)).add(Nf), Nf);
284
+ const x0 = floor(srcX);
285
+ const y0 = floor(srcY);
286
+ const sx = srcX.sub(x0);
287
+ const sy = srcY.sub(y0);
288
+ const ix0 = x0.toInt();
289
+ const iy0 = y0.toInt();
290
+ const ix1 = ix0.add(int(1)).mod(Ni);
291
+ const iy1 = iy0.add(int(1)).mod(Ni);
292
+ const v00 = velA.element(iy0.mul(Ni).add(ix0));
293
+ const v10 = velA.element(iy0.mul(Ni).add(ix1));
294
+ const v01 = velA.element(iy1.mul(Ni).add(ix0));
295
+ const v11 = velA.element(iy1.mul(Ni).add(ix1));
296
+ const decay = float(1).add(float(VELOCITY_DISSIPATION).mul(dtU));
297
+ velB.element(idx).assign(vec4(mix(mix(v00.x, v10.x, sx), mix(v01.x, v11.x, sx), sy).div(decay), mix(mix(v00.y, v10.y, sx), mix(v01.y, v11.y, sx), sy).div(decay), float(0), float(0)));
298
+ })().compute(count, [256]);
299
+ const copyVelPass = Fn(() => {
300
+ const v = velB.element(instanceIndex);
301
+ velA.element(instanceIndex).assign(vec4(v.x, v.y, float(0), float(0)));
302
+ })().compute(count, [256]);
303
+ const advectDensPass = Fn(() => {
304
+ const idx = instanceIndex;
305
+ const j = idx.mod(gs);
306
+ const i = idx.div(gs);
307
+ const vel = velA.element(idx);
308
+ const srcX = mod(j.toFloat().sub(vel.x.mul(dtU)).add(Nf), Nf);
309
+ const srcY = mod(i.toFloat().sub(vel.y.mul(dtU)).add(Nf), Nf);
310
+ const x0 = floor(srcX);
311
+ const y0 = floor(srcY);
312
+ const sx = srcX.sub(x0);
313
+ const sy = srcY.sub(y0);
314
+ const ix0 = x0.toInt();
315
+ const iy0 = y0.toInt();
316
+ const ix1 = ix0.add(int(1)).mod(Ni);
317
+ const iy1 = iy0.add(int(1)).mod(Ni);
318
+ const d00 = densA.element(iy0.mul(Ni).add(ix0));
319
+ const d10 = densA.element(iy0.mul(Ni).add(ix1));
320
+ const d01 = densA.element(iy1.mul(Ni).add(ix0));
321
+ const d11 = densA.element(iy1.mul(Ni).add(ix1));
322
+ densB.element(idx).assign(vec4(mix(mix(d00.x, d10.x, sx), mix(d01.x, d11.x, sx), sy), mix(mix(d00.y, d10.y, sx), mix(d01.y, d11.y, sx), sy), float(0), float(0)));
323
+ })().compute(count, [256]);
324
+ const copyDensPass = Fn(() => {
325
+ const d = densB.element(instanceIndex);
326
+ densA.element(instanceIndex).assign(vec4(d.x, d.y, float(0), float(0)));
327
+ })().compute(count, [256]);
328
+ const colorRestorePass = Fn(() => {
329
+ const idx = instanceIndex;
330
+ const jf = idx.mod(gs).toFloat();
331
+ const iF = idx.div(gs).toFloat();
332
+ const sdx2 = fract(sin(seedU.mul(float(37.31))).mul(float(43758.5453))).mul(float(97));
333
+ const sdy2 = fract(sin(seedU.mul(float(83.17))).mul(float(43758.5453))).mul(float(97));
334
+ const refRaw = fbm(jf.div(Nf).mul(float(3)).add(sdx2), iF.div(Nf).mul(float(3)).add(sdy2));
335
+ const invBlend = float(1).sub(blendingU);
336
+ const contrastBoost = float(1).add(invBlend.mul(float(5)));
337
+ const refBoosted = refRaw.sub(float(.5)).mul(contrastBoost).add(float(.5)).clamp(float(0), float(1));
338
+ const cell = densA.element(idx);
339
+ const rateMult = float(1).add(invBlend.mul(float(2.5)));
340
+ const blendRate = dtU.mul(float(.5)).mul(rateMult).min(float(.3));
341
+ densA.element(idx).assign(vec4(cell.x, mix(cell.y, refBoosted, blendRate), float(0), float(0)));
342
+ })().compute(count, [256]);
343
+ const outputPass = Fn(() => {
344
+ const idx = instanceIndex;
345
+ const j = idx.mod(gs);
346
+ const i = idx.div(gs);
347
+ const d = densA.element(idx);
348
+ textureStore(outTexNode, uvec2(j, i), vec4(d.x, d.y, float(0), float(0))).toWriteOnly();
349
+ })().compute(count, [256]);
350
+ let lastTime = Date.now();
351
+ let elapsed = 0;
352
+ let prevMx = .5, prevMy = .5;
353
+ let lastSeed = -1;
354
+ let initialized = false;
355
+ return {
356
+ outputs: { fogTexture: outTex },
357
+ getComputeNodes: (params) => {
358
+ const now = Date.now();
359
+ const rawDt = Math.min((now - lastTime) / 1e3, .033);
360
+ lastTime = now;
361
+ if (rawDt < .001) return null;
362
+ const getNum = (key, fallback) => {
363
+ const def = uniforms[key];
364
+ if (!def) return fallback;
365
+ if (typeof def.getCpuValue === "function") {
366
+ const v$1 = def.getCpuValue();
367
+ return typeof v$1 === "number" ? v$1 : fallback;
368
+ }
369
+ const v = def.uniform?.value;
370
+ return typeof v === "number" ? v : fallback;
371
+ };
372
+ const dt = rawDt * getNum("speed", 1);
373
+ elapsed += rawDt;
374
+ const seed = Number(uniforms.seed.uniform.value ?? 0);
375
+ if (!initialized || seed !== lastSeed) {
376
+ initialized = true;
377
+ lastSeed = seed;
378
+ seedU.value = seed;
379
+ const warmDt = .05;
380
+ turbulenceU.value = getNum("turbulence", 1);
381
+ curlStrengthU.value = getNum("detail", 15);
382
+ blendingU.value = getNum("blending", .3);
383
+ dtU.value = warmDt;
384
+ renderer.compute(initPass);
385
+ let warmTime = Math.random() * 60;
386
+ for (let w = 0; w < 100; w++) {
387
+ timeU.value = warmTime;
388
+ warmTime += warmDt;
389
+ renderer.compute(forcePass);
390
+ renderer.compute(curlPass);
391
+ renderer.compute(vorticityPass);
392
+ renderer.compute(divergencePass);
393
+ for (let iter = 0; iter < 10; iter++) renderer.compute(jacobiPass);
394
+ renderer.compute(gradSubtractPass);
395
+ renderer.compute(advectVelPass);
396
+ renderer.compute(copyVelPass);
397
+ renderer.compute(advectDensPass);
398
+ renderer.compute(copyDensPass);
399
+ renderer.compute(colorRestorePass);
400
+ }
401
+ elapsed = warmTime;
402
+ }
403
+ dtU.value = dt;
404
+ timeU.value = elapsed;
405
+ turbulenceU.value = getNum("turbulence", 1);
406
+ curlStrengthU.value = getNum("detail", 15);
407
+ blendingU.value = getNum("blending", .3);
408
+ const mouseInf = getNum("mouseInfluence", .1);
409
+ const mouseRad = getNum("mouseRadius", .1) * GRID_GPU;
410
+ const mx = params?.pointer?.x ?? prevMx;
411
+ const my = params?.pointer?.y ?? prevMy;
412
+ const mdx = mx - prevMx, mdy = my - prevMy;
413
+ prevMx = mx;
414
+ prevMy = my;
415
+ const cspeed = Math.sqrt(mdx * mdx + mdy * mdy);
416
+ mouseRadSqU.value = mouseRad * mouseRad;
417
+ if (cspeed > 5e-4 && mouseInf > 0) {
418
+ cursorXU.value = mx * GRID_GPU;
419
+ cursorYU.value = my * GRID_GPU;
420
+ cursorVelXU.value = mdx * GRID_GPU * 15 * mouseInf;
421
+ cursorVelYU.value = mdy * GRID_GPU * 15 * mouseInf;
422
+ mouseActiveU.value = 1;
423
+ } else mouseActiveU.value = 0;
424
+ renderer.compute(forcePass);
425
+ renderer.compute(curlPass);
426
+ renderer.compute(vorticityPass);
427
+ renderer.compute(divergencePass);
428
+ for (let iter = 0; iter < JACOBI_ITERS; iter++) renderer.compute(jacobiPass);
429
+ renderer.compute(gradSubtractPass);
430
+ renderer.compute(advectVelPass);
431
+ renderer.compute(copyVelPass);
432
+ renderer.compute(advectDensPass);
433
+ renderer.compute(copyDensPass);
434
+ renderer.compute(colorRestorePass);
435
+ return [outputPass];
436
+ }
437
+ };
438
+ },
439
+ fragmentNode: ({ uniforms, onBeforeRender, onCleanup, computeOutputs }) => {
440
+ let fogField;
441
+ const N = computeOutputs?.fogTexture ? GRID_GPU : GRID_CPU;
442
+ if (computeOutputs?.fogTexture) fogField = texture(computeOutputs.fogTexture);
443
+ else {
444
+ const cpuN = GRID_CPU;
445
+ const cells = cpuN * cpuN;
446
+ const vx = new Float32Array(cells), vy = new Float32Array(cells);
447
+ const vtx = new Float32Array(cells), vty = new Float32Array(cells);
448
+ const den = new Float32Array(cells), cv = new Float32Array(cells);
449
+ const dtmp = new Float32Array(cells), ctmp = new Float32Array(cells);
450
+ const pres = new Float32Array(cells), divg = new Float32Array(cells);
451
+ const curlArr = new Float32Array(cells);
452
+ const texData = new Float32Array(cells * 4);
453
+ const fogTex = new DataTexture(texData, cpuN, cpuN, RGBAFormat, FloatType);
454
+ fogTex.magFilter = LinearFilter$1;
455
+ fogTex.minFilter = LinearFilter$1;
456
+ fogTex.needsUpdate = true;
457
+ fogField = texture(fogTex);
458
+ const hashF = (px$1, py) => {
459
+ const s = Math.sin(px$1 * 127.1 + py * 311.7) * 43758.5453;
460
+ return s - Math.floor(s);
461
+ };
462
+ const valueNoiseCPU = (nx, ny) => {
463
+ const ix = Math.floor(nx), iy = Math.floor(ny);
464
+ const fx = nx - ix, fy = ny - iy;
465
+ const sx = fx * fx * (3 - 2 * fx), sy = fy * fy * (3 - 2 * fy);
466
+ return (1 - sy) * ((1 - sx) * hashF(ix, iy) + sx * hashF(ix + 1, iy)) + sy * ((1 - sx) * hashF(ix, iy + 1) + sx * hashF(ix + 1, iy + 1));
467
+ };
468
+ const fbmCPU = (nx, ny) => valueNoiseCPU(nx, ny) * .5 + valueNoiseCPU(nx * 2 + 5.37, ny * 2 + 9.13) * .3 + valueNoiseCPU(nx * 4 + 1.79, ny * 4 + 3.51) * .2;
469
+ const cpuSeedOffset = (seed) => {
470
+ const sx2 = (x) => {
471
+ const s = Math.sin(x) * 43758.5453;
472
+ return s - Math.floor(s);
473
+ };
474
+ return {
475
+ sdx: sx2(seed * 37.31) * 97,
476
+ sdy: sx2(seed * 83.17) * 97
477
+ };
478
+ };
479
+ const cpuRefColorVar = (j, i, seed) => {
480
+ const { sdx, sdy } = cpuSeedOffset(seed);
481
+ const nx = (j + .5) / cpuN * 3 + sdx;
482
+ const ny = (i + .5) / cpuN * 3 + sdy;
483
+ return Math.max(0, Math.min(1, fbmCPU(nx, ny)));
484
+ };
485
+ const initCPU = (seed) => {
486
+ vx.fill(0);
487
+ vy.fill(0);
488
+ const { sdx, sdy } = cpuSeedOffset(seed);
489
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
490
+ const idx = i * cpuN + j;
491
+ const nx = (j + .5) / cpuN * 3 + sdx;
492
+ const ny = (i + .5) / cpuN * 3 + sdy;
493
+ den[idx] = Math.max(.15, Math.min(.9, fbmCPU(nx + 31.7, ny + 53.3) * .75 + .25));
494
+ cv[idx] = Math.max(0, Math.min(1, fbmCPU(nx, ny)));
495
+ }
496
+ };
497
+ let lt = Date.now(), elapsed = 0;
498
+ let prevMx = .5, prevMy = .5, lastSeed = -1;
499
+ const safeWrap = (x) => (x % cpuN + cpuN) % cpuN;
500
+ const blWrap = (f, fx, fy) => {
501
+ const sx = (fx % cpuN + cpuN) % cpuN;
502
+ const sy = (fy % cpuN + cpuN) % cpuN;
503
+ const x0 = Math.floor(sx) % cpuN, y0 = Math.floor(sy) % cpuN;
504
+ const x1 = (x0 + 1) % cpuN, y1 = (y0 + 1) % cpuN;
505
+ const tx = sx - x0, ty = sy - y0;
506
+ return (1 - tx) * (1 - ty) * f[y0 * cpuN + x0] + tx * (1 - ty) * f[y0 * cpuN + x1] + (1 - tx) * ty * f[y1 * cpuN + x0] + tx * ty * f[y1 * cpuN + x1];
507
+ };
508
+ const nw2 = (i, j, di, dj) => safeWrap(i + di) * cpuN + safeWrap(j + dj);
509
+ const cpuGetNum = (key, fallback) => {
510
+ const def = uniforms[key];
511
+ if (!def) return fallback;
512
+ if (typeof def.getCpuValue === "function") {
513
+ const v$1 = def.getCpuValue();
514
+ return typeof v$1 === "number" ? v$1 : fallback;
515
+ }
516
+ const v = def.uniform?.value;
517
+ return typeof v === "number" ? v : fallback;
518
+ };
519
+ onBeforeRender(({ pointer }) => {
520
+ const now = Date.now();
521
+ const rawDt = Math.min((now - lt) / 1e3, .033);
522
+ lt = now;
523
+ if (rawDt < .001) return;
524
+ const seed = Number(uniforms.seed.uniform.value ?? 0);
525
+ if (seed !== lastSeed) {
526
+ lastSeed = seed;
527
+ initCPU(seed);
528
+ const wTurb = cpuGetNum("turbulence", 1);
529
+ const wInvBlend = 1 - cpuGetNum("blending", .3);
530
+ const wBoost = 1 + wInvBlend * 5;
531
+ const wRateMult = 1 + wInvBlend * 2.5;
532
+ const wDt = .05;
533
+ let wt = Math.random() * 60;
534
+ const wMaxVel = cpuN * .6;
535
+ for (let w = 0; w < 60; w++) {
536
+ const tau2 = Math.PI * 2;
537
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
538
+ const idx = i * cpuN + j;
539
+ const x = (j + .5) / cpuN * tau2, y = (i + .5) / cpuN * tau2;
540
+ vx[idx] += Math.sin(2 * x + wt * .31) * Math.cos(1.5 * y + wt * .23) * wTurb * cpuN * .04 * wDt;
541
+ vy[idx] += Math.cos(1.5 * x + wt * .27) * Math.sin(2 * y + wt * .19) * wTurb * cpuN * .04 * wDt;
542
+ const vl = Math.sqrt(vx[idx] * vx[idx] + vy[idx] * vy[idx]);
543
+ if (vl > wMaxVel) {
544
+ vx[idx] *= wMaxVel / vl;
545
+ vy[idx] *= wMaxVel / vl;
546
+ }
547
+ }
548
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
549
+ const idx = i * cpuN + j;
550
+ dtmp[idx] = blWrap(den, j - vx[idx] * wDt, i - vy[idx] * wDt);
551
+ ctmp[idx] = blWrap(cv, j - vx[idx] * wDt, i - vy[idx] * wDt);
552
+ }
553
+ den.set(dtmp);
554
+ cv.set(ctmp);
555
+ const br = Math.min(.3, wDt * .5 * wRateMult);
556
+ for (let i2 = 0; i2 < cpuN; i2++) for (let j2 = 0; j2 < cpuN; j2++) {
557
+ const refRaw = cpuRefColorVar(j2, i2, seed);
558
+ const refBoosted = Math.max(0, Math.min(1, (refRaw - .5) * wBoost + .5));
559
+ cv[i2 * cpuN + j2] = cv[i2 * cpuN + j2] * (1 - br) + refBoosted * br;
560
+ }
561
+ wt += wDt;
562
+ }
563
+ elapsed = wt;
564
+ }
565
+ const dt = rawDt * cpuGetNum("speed", 1);
566
+ elapsed += rawDt;
567
+ const t = elapsed;
568
+ const turb = cpuGetNum("turbulence", 1);
569
+ const curl = cpuGetNum("detail", 15);
570
+ const blending = cpuGetNum("blending", .3);
571
+ const mi = cpuGetNum("mouseInfluence", .1);
572
+ const mr = cpuGetNum("mouseRadius", .1) * cpuN;
573
+ const mx = pointer?.x ?? prevMx, my = pointer?.y ?? prevMy;
574
+ const mdx = mx - prevMx, mdy = my - prevMy;
575
+ prevMx = mx;
576
+ prevMy = my;
577
+ const cActive = Math.sqrt(mdx * mdx + mdy * mdy) > 5e-4 && mi > 0;
578
+ const maxVel = cpuN * .6;
579
+ const tau = Math.PI * 2;
580
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
581
+ const idx = i * cpuN + j;
582
+ const x = (j + .5) / cpuN * tau, y = (i + .5) / cpuN * tau;
583
+ const fx = Math.sin(2 * x + t * .31) * Math.cos(1.5 * y + t * .23) * turb * cpuN * .04 * dt;
584
+ const fy = Math.cos(1.5 * x + t * .27) * Math.sin(2 * y + t * .19) * turb * cpuN * .04 * dt;
585
+ let cvxF = 0, cvyF = 0;
586
+ if (cActive) {
587
+ const cdx = j + .5 - mx * cpuN, cdy = i + .5 - my * cpuN;
588
+ const cinf = Math.exp(-(cdx * cdx + cdy * cdy) / Math.max(1, mr * mr));
589
+ cvxF = mdx * cpuN * 15 * mi * cinf;
590
+ cvyF = mdy * cpuN * 15 * mi * cinf;
591
+ }
592
+ vx[idx] += fx + cvxF;
593
+ vy[idx] += fy + cvyF;
594
+ }
595
+ if (curl > 0) {
596
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) curlArr[i * cpuN + j] = .5 * (vy[nw2(i, j, 0, 1)] - vy[nw2(i, j, 0, -1)] - (vx[nw2(i, j, 1, 0)] - vx[nw2(i, j, -1, 0)]));
597
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
598
+ const idx = i * cpuN + j;
599
+ const gx = .5 * (Math.abs(curlArr[nw2(i, j, 0, 1)]) - Math.abs(curlArr[nw2(i, j, 0, -1)]));
600
+ const gy = .5 * (Math.abs(curlArr[nw2(i, j, 1, 0)]) - Math.abs(curlArr[nw2(i, j, -1, 0)]));
601
+ const gl = Math.max(1e-5, Math.sqrt(gx * gx + gy * gy));
602
+ vx[idx] += gy / gl * curlArr[idx] * curl * dt;
603
+ vy[idx] += -(gx / gl) * curlArr[idx] * curl * dt;
604
+ }
605
+ }
606
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
607
+ const idx = i * cpuN + j;
608
+ divg[idx] = .5 * (vx[nw2(i, j, 0, 1)] - vx[nw2(i, j, 0, -1)] + vy[nw2(i, j, 1, 0)] - vy[nw2(i, j, -1, 0)]);
609
+ pres[idx] *= .8;
610
+ }
611
+ for (let it = 0; it < 12; it++) for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
612
+ const idx = i * cpuN + j;
613
+ pres[idx] = .25 * (pres[nw2(i, j, 0, -1)] + pres[nw2(i, j, 0, 1)] + pres[nw2(i, j, -1, 0)] + pres[nw2(i, j, 1, 0)] - divg[idx]);
614
+ }
615
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
616
+ const idx = i * cpuN + j;
617
+ vx[idx] -= .5 * (pres[nw2(i, j, 0, 1)] - pres[nw2(i, j, 0, -1)]);
618
+ vy[idx] -= .5 * (pres[nw2(i, j, 1, 0)] - pres[nw2(i, j, -1, 0)]);
619
+ const vlen = Math.sqrt(vx[idx] * vx[idx] + vy[idx] * vy[idx]);
620
+ if (vlen > maxVel) {
621
+ vx[idx] *= maxVel / vlen;
622
+ vy[idx] *= maxVel / vlen;
623
+ }
624
+ }
625
+ const vDecay = 1 + VELOCITY_DISSIPATION * dt;
626
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
627
+ const idx = i * cpuN + j;
628
+ vtx[idx] = blWrap(vx, j - vx[idx] * dt, i - vy[idx] * dt) / vDecay;
629
+ vty[idx] = blWrap(vy, j - vx[idx] * dt, i - vy[idx] * dt) / vDecay;
630
+ }
631
+ vx.set(vtx);
632
+ vy.set(vty);
633
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
634
+ const idx = i * cpuN + j;
635
+ dtmp[idx] = blWrap(den, j - vx[idx] * dt, i - vy[idx] * dt);
636
+ ctmp[idx] = blWrap(cv, j - vx[idx] * dt, i - vy[idx] * dt);
637
+ }
638
+ den.set(dtmp);
639
+ cv.set(ctmp);
640
+ const invBlend = 1 - blending;
641
+ const contrastBoost = 1 + invBlend * 5;
642
+ const rateMult = 1 + invBlend * 2.5;
643
+ const blendRate = Math.min(.3, dt * .5 * rateMult);
644
+ const seed2 = Number(uniforms.seed.uniform.value ?? 0);
645
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
646
+ const idx = i * cpuN + j;
647
+ const refRaw = cpuRefColorVar(j, i, seed2);
648
+ const refBoosted = Math.max(0, Math.min(1, (refRaw - .5) * contrastBoost + .5));
649
+ cv[idx] = cv[idx] * (1 - blendRate) + refBoosted * blendRate;
650
+ }
651
+ for (let i = 0; i < cells; i++) {
652
+ texData[i * 4] = den[i];
653
+ texData[i * 4 + 1] = cv[i];
654
+ }
655
+ fogTex.needsUpdate = true;
656
+ });
657
+ onCleanup(() => {
658
+ fogTex.dispose();
659
+ });
660
+ }
661
+ const px = float(1 / N);
662
+ const s0 = fogField.sample(screenUV);
663
+ const s1 = fogField.sample(screenUV.add(vec2(px, float(0))));
664
+ const s2 = fogField.sample(screenUV.add(vec2(float(0), px)));
665
+ const s3 = fogField.sample(screenUV.add(vec2(px.negate(), float(0))));
666
+ const s4 = fogField.sample(screenUV.add(vec2(float(0), px.negate())));
667
+ const fogDensity = s0.x.mul(float(.5)).add(s1.x.mul(float(.125))).add(s2.x.mul(float(.125))).add(s3.x.mul(float(.125))).add(s4.x.mul(float(.125)));
668
+ const colorVar = s0.y.mul(float(.5)).add(s1.y.mul(float(.125))).add(s2.y.mul(float(.125))).add(s3.y.mul(float(.125))).add(s4.y.mul(float(.125)));
669
+ const fogColor = mixColors(uniforms.colorA.uniform, uniforms.colorB.uniform, colorVar, uniforms.colorSpace.uniform.value);
670
+ return vec4(fogColor.x, fogColor.y, fogColor.z, fogColor.w.mul(fogDensity));
671
+ }
672
+ };
673
+ var Fog_default = componentDefinition;
674
+ export { componentDefinition as n, Fog_default as t };