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,629 @@
1
+ import { a as transformColor, l as transformPosition, 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, float, floor, instanceIndex, int, mix, screenUV, storageTexture, texture, textureStore, uint, uniform, uvec2, vec2, vec4 } from "three/tsl";
6
+ var GRID_GPU = 256;
7
+ var GRID_CPU = 56;
8
+ var JACOBI_ITERS = 20;
9
+ var PRESSURE_DISSIPATION = .8;
10
+ var VELOCITY_DISSIPATION = .2;
11
+ const componentDefinition = {
12
+ name: "Smoke",
13
+ category: "Interactive",
14
+ description: "Realistic fluid smoke simulation with vorticity dynamics",
15
+ props: {
16
+ colorA: {
17
+ default: "#fc83f9",
18
+ transform: transformColor,
19
+ description: "Color of fresh smoke",
20
+ ui: {
21
+ type: "color",
22
+ label: "Start Color",
23
+ group: "Colors"
24
+ }
25
+ },
26
+ colorB: {
27
+ default: "#c21c79",
28
+ transform: transformColor,
29
+ description: "Color smoke transitions to as it ages",
30
+ ui: {
31
+ type: "color",
32
+ label: "End Color",
33
+ group: "Colors"
34
+ }
35
+ },
36
+ emitFrom: {
37
+ default: {
38
+ x: .5,
39
+ y: 1
40
+ },
41
+ transform: transformPosition,
42
+ description: "The emission source point",
43
+ ui: {
44
+ type: "position",
45
+ label: "Emit From",
46
+ group: "Emission"
47
+ }
48
+ },
49
+ direction: {
50
+ default: 0,
51
+ description: "Emission direction (0 = up, 90 = right, 180 = down, 270 = left)",
52
+ ui: {
53
+ type: "range",
54
+ min: 0,
55
+ max: 360,
56
+ step: 1,
57
+ label: "Direction",
58
+ group: "Emission"
59
+ }
60
+ },
61
+ speed: {
62
+ default: 20,
63
+ description: "Emission velocity strength",
64
+ ui: {
65
+ type: "range",
66
+ min: .1,
67
+ max: 50,
68
+ step: .1,
69
+ label: "Speed",
70
+ group: "Emission"
71
+ }
72
+ },
73
+ spread: {
74
+ default: 60,
75
+ description: "Emission cone angle in degrees",
76
+ ui: {
77
+ type: "range",
78
+ min: 0,
79
+ max: 180,
80
+ step: 1,
81
+ label: "Spread",
82
+ group: "Emission"
83
+ }
84
+ },
85
+ emitRadius: {
86
+ default: .08,
87
+ description: "Size of the emission area",
88
+ ui: {
89
+ type: "range",
90
+ min: .01,
91
+ max: .3,
92
+ step: .01,
93
+ label: "Emit Size",
94
+ group: "Emission"
95
+ }
96
+ },
97
+ intensity: {
98
+ default: 1,
99
+ description: "Smoke emission density",
100
+ ui: {
101
+ type: "range",
102
+ min: .1,
103
+ max: 1,
104
+ step: .05,
105
+ label: "Intensity",
106
+ group: "Effect"
107
+ }
108
+ },
109
+ dissipation: {
110
+ default: .2,
111
+ description: "How fast smoke fades over time",
112
+ ui: {
113
+ type: "range",
114
+ min: .1,
115
+ max: 3,
116
+ step: .1,
117
+ label: "Dissipation",
118
+ group: "Effect"
119
+ }
120
+ },
121
+ detail: {
122
+ default: 25,
123
+ description: "Fine-scale swirling detail",
124
+ ui: {
125
+ type: "range",
126
+ min: 0,
127
+ max: 50,
128
+ step: 1,
129
+ label: "Detail",
130
+ group: "Effect"
131
+ }
132
+ },
133
+ gravity: {
134
+ default: .5,
135
+ description: "Downward gravitational pull on smoke",
136
+ ui: {
137
+ type: "range",
138
+ min: -2,
139
+ max: 2,
140
+ step: .1,
141
+ label: "Gravity",
142
+ group: "Effect"
143
+ }
144
+ },
145
+ colorDecay: {
146
+ default: .4,
147
+ description: "How quickly smoke shifts from Color A to Color B",
148
+ ui: {
149
+ type: "range",
150
+ min: 0,
151
+ max: 3,
152
+ step: .1,
153
+ label: "Color Decay",
154
+ group: "Colors"
155
+ }
156
+ },
157
+ mouseInfluence: {
158
+ default: .1,
159
+ description: "Strength of cursor influence",
160
+ ui: {
161
+ type: "range",
162
+ min: 0,
163
+ max: 2,
164
+ step: .05,
165
+ label: "Cursor Influence",
166
+ group: "Interaction"
167
+ }
168
+ },
169
+ mouseRadius: {
170
+ default: .1,
171
+ description: "Radius of cursor influence area",
172
+ ui: {
173
+ type: "range",
174
+ min: .02,
175
+ max: .5,
176
+ step: .01,
177
+ label: "Cursor Radius",
178
+ group: "Interaction"
179
+ }
180
+ },
181
+ colorSpace: {
182
+ default: "linear",
183
+ transform: transformColorSpace,
184
+ compileTime: true,
185
+ description: "Color space for color interpolation",
186
+ ui: {
187
+ type: "select",
188
+ options: colorSpaceOptions,
189
+ label: "Color Space",
190
+ group: "Colors"
191
+ }
192
+ }
193
+ },
194
+ computeNode: ({ uniforms, onCleanup, renderer }) => {
195
+ const N = GRID_GPU;
196
+ const gs = uint(N);
197
+ const Ni = int(N);
198
+ const Nm1 = int(N - 1);
199
+ const count = N * N;
200
+ const nidx = (ii, ji, di, dj) => ii.add(int(di)).clamp(int(0), Nm1).mul(Ni).add(ji.add(int(dj)).clamp(int(0), Nm1));
201
+ const velA = attributeArray(count, "vec4");
202
+ const velB = attributeArray(count, "vec4");
203
+ const densA = attributeArray(count, "vec4");
204
+ const densB = attributeArray(count, "vec4");
205
+ const pressDivBuf = attributeArray(count, "vec4");
206
+ const outTex = new StorageTexture(N, N);
207
+ outTex.type = FloatType;
208
+ const outTexNode = storageTexture(outTex);
209
+ onCleanup(() => {
210
+ outTex.dispose();
211
+ });
212
+ const dtU = uniform(.016);
213
+ const emitXU = uniform(128);
214
+ const emitYU = uniform(256);
215
+ const emitVelXU = uniform(0);
216
+ const emitVelYU = uniform(-50);
217
+ const perpDirXU = uniform(1);
218
+ const perpDirYU = uniform(0);
219
+ const spreadFactorU = uniform(.5);
220
+ const emitRadU = uniform(15);
221
+ const emitIntensityU = uniform(.7);
222
+ const densDissipU = uniform(1);
223
+ const curlStrengthU = uniform(30);
224
+ const gravityU = uniform(.5);
225
+ const cursorXU = uniform(128);
226
+ const cursorYU = uniform(128);
227
+ const cursorVelXU = uniform(0);
228
+ const cursorVelYU = uniform(0);
229
+ const mouseActiveU = uniform(0);
230
+ const mouseRadSqU = uniform(900);
231
+ const colorDecayU = uniform(1);
232
+ const splatPass = Fn(() => {
233
+ const idx = instanceIndex;
234
+ const j = idx.mod(gs);
235
+ const i = idx.div(gs);
236
+ const cellX = j.toFloat().add(float(.5));
237
+ const cellY = i.toFloat().add(float(.5));
238
+ const dx = cellX.sub(emitXU);
239
+ const dy = cellY.sub(emitYU);
240
+ const distSq = dx.mul(dx).add(dy.mul(dy));
241
+ const radSq = emitRadU.mul(emitRadU).max(float(1));
242
+ const influence = distSq.negate().div(radSq).exp();
243
+ const cell = densA.element(idx);
244
+ const oldDens = cell.x;
245
+ const addDens = emitIntensityU.mul(influence).mul(dtU).mul(float(8));
246
+ const newDens = oldDens.add(addDens).min(float(1));
247
+ const rejuvenate = addDens.div(newDens.max(float(.001)));
248
+ densA.element(idx).assign(vec4(newDens, cell.y.mul(float(1).sub(rejuvenate.min(float(1)))), float(0), float(0)));
249
+ const vel = velA.element(idx);
250
+ const perpOff = dx.mul(perpDirXU).add(dy.mul(perpDirYU)).div(emitRadU.max(float(1)));
251
+ const vmSq = emitVelXU.mul(emitVelXU).add(emitVelYU.mul(emitVelYU)).max(float(1));
252
+ const tvx = emitVelXU.add(perpDirXU.mul(perpOff).mul(spreadFactorU).mul(vmSq.sqrt()));
253
+ const tvy = emitVelYU.add(perpDirYU.mul(perpOff).mul(spreadFactorU).mul(vmSq.sqrt()));
254
+ const br = influence.mul(dtU).mul(float(3)).min(float(1));
255
+ const gravForce = gravityU.mul(oldDens).mul(dtU).mul(float(N * .08));
256
+ const cursorDX = cellX.sub(cursorXU);
257
+ const cursorDY = cellY.sub(cursorYU);
258
+ const cursorInf = cursorDX.mul(cursorDX).add(cursorDY.mul(cursorDY)).negate().div(mouseRadSqU.max(float(1))).exp().mul(mouseActiveU);
259
+ velA.element(idx).assign(vec4(mix(vel.x, tvx, br).add(cursorVelXU.mul(cursorInf)), mix(vel.y, tvy, br).add(gravForce).add(cursorVelYU.mul(cursorInf)), vel.z, float(0)));
260
+ })().compute(count, [256]);
261
+ const curlPass = Fn(() => {
262
+ const idx = instanceIndex;
263
+ const ji = idx.mod(gs).toInt();
264
+ const ii = idx.div(gs).toInt();
265
+ const vL = velA.element(nidx(ii, ji, 0, -1));
266
+ const vR = velA.element(nidx(ii, ji, 0, 1));
267
+ const vU = velA.element(nidx(ii, ji, -1, 0));
268
+ const vD = velA.element(nidx(ii, ji, 1, 0));
269
+ const curl = vR.y.sub(vL.y).sub(vD.x.sub(vU.x)).mul(float(.5));
270
+ const vel = velA.element(idx);
271
+ velA.element(idx).assign(vec4(vel.x, vel.y, curl, float(0)));
272
+ })().compute(count, [256]);
273
+ const vorticityPass = Fn(() => {
274
+ const idx = instanceIndex;
275
+ const ji = idx.mod(gs).toInt();
276
+ const ii = idx.div(gs).toInt();
277
+ const cL = velA.element(nidx(ii, ji, 0, -1)).z.abs();
278
+ const cR = velA.element(nidx(ii, ji, 0, 1)).z.abs();
279
+ const cU = velA.element(nidx(ii, ji, -1, 0)).z.abs();
280
+ const cD = velA.element(nidx(ii, ji, 1, 0)).z.abs();
281
+ const cc = velA.element(idx).z;
282
+ const gx = cR.sub(cL).mul(float(.5));
283
+ const gy = cD.sub(cU).mul(float(.5));
284
+ const gl = gx.mul(gx).add(gy.mul(gy)).sqrt().max(float(1e-5));
285
+ const fx = gy.div(gl).mul(cc).mul(curlStrengthU).mul(dtU);
286
+ const fy = gx.div(gl).negate().mul(cc).mul(curlStrengthU).mul(dtU);
287
+ const vel = velA.element(idx);
288
+ velA.element(idx).assign(vec4(vel.x.add(fx), vel.y.add(fy), vel.z, float(0)));
289
+ })().compute(count, [256]);
290
+ const divergencePass = Fn(() => {
291
+ const idx = instanceIndex;
292
+ const ji = idx.mod(gs).toInt();
293
+ const ii = idx.div(gs).toInt();
294
+ const jf = ji.toFloat();
295
+ const iF = ii.toFloat();
296
+ const selfVel = velA.element(idx);
297
+ const normalL = velA.element(nidx(ii, ji, 0, -1)).x;
298
+ const normalR = velA.element(nidx(ii, ji, 0, 1)).x;
299
+ const normalU = velA.element(nidx(ii, ji, -1, 0)).y;
300
+ const normalD = velA.element(nidx(ii, ji, 1, 0)).y;
301
+ const L = jf.lessThan(float(.5)).select(selfVel.x.negate(), normalL);
302
+ const R = jf.greaterThan(float(N - 1.5)).select(selfVel.x.negate(), normalR);
303
+ const T = iF.lessThan(float(.5)).select(selfVel.y.negate(), normalU);
304
+ const B = iF.greaterThan(float(N - 1.5)).select(selfVel.y.negate(), normalD);
305
+ const div$1 = R.sub(L).add(B.sub(T)).mul(float(.5));
306
+ const oldP = pressDivBuf.element(idx).x.mul(float(PRESSURE_DISSIPATION));
307
+ pressDivBuf.element(idx).assign(vec4(oldP, div$1, float(0), float(0)));
308
+ })().compute(count, [256]);
309
+ const jacobiPass = Fn(() => {
310
+ const idx = instanceIndex;
311
+ const ji = idx.mod(gs).toInt();
312
+ const ii = idx.div(gs).toInt();
313
+ const pL = pressDivBuf.element(nidx(ii, ji, 0, -1)).x;
314
+ const pR = pressDivBuf.element(nidx(ii, ji, 0, 1)).x;
315
+ const pU = pressDivBuf.element(nidx(ii, ji, -1, 0)).x;
316
+ const pD = pressDivBuf.element(nidx(ii, ji, 1, 0)).x;
317
+ const div$1 = pressDivBuf.element(idx).y;
318
+ pressDivBuf.element(idx).assign(vec4(pL.add(pR).add(pU).add(pD).sub(div$1).mul(float(.25)), div$1, float(0), float(0)));
319
+ })().compute(count, [256]);
320
+ const gradSubtractPass = Fn(() => {
321
+ const idx = instanceIndex;
322
+ const ji = idx.mod(gs).toInt();
323
+ const ii = idx.div(gs).toInt();
324
+ const pL = pressDivBuf.element(nidx(ii, ji, 0, -1)).x;
325
+ const pR = pressDivBuf.element(nidx(ii, ji, 0, 1)).x;
326
+ const pU = pressDivBuf.element(nidx(ii, ji, -1, 0)).x;
327
+ const pD = pressDivBuf.element(nidx(ii, ji, 1, 0)).x;
328
+ const vel = velA.element(idx);
329
+ velA.element(idx).assign(vec4(vel.x.sub(pR.sub(pL).mul(float(.5))), vel.y.sub(pD.sub(pU).mul(float(.5))), vel.z, float(0)));
330
+ })().compute(count, [256]);
331
+ const advectVelPass = Fn(() => {
332
+ const idx = instanceIndex;
333
+ const j = idx.mod(gs);
334
+ const i = idx.div(gs);
335
+ const vel = velA.element(idx);
336
+ const srcX = j.toFloat().sub(vel.x.mul(dtU)).clamp(float(0), float(N - 1));
337
+ const srcY = i.toFloat().sub(vel.y.mul(dtU)).clamp(float(0), float(N - 1));
338
+ const x0 = floor(srcX).clamp(float(0), float(N - 2));
339
+ const y0 = floor(srcY).clamp(float(0), float(N - 2));
340
+ const sx = srcX.sub(x0);
341
+ const sy = srcY.sub(y0);
342
+ const ix0 = x0.toInt();
343
+ const iy0 = y0.toInt();
344
+ const v00 = velA.element(iy0.mul(Ni).add(ix0));
345
+ const v10 = velA.element(iy0.mul(Ni).add(ix0.add(int(1))));
346
+ const v01 = velA.element(iy0.add(int(1)).mul(Ni).add(ix0));
347
+ const v11 = velA.element(iy0.add(int(1)).mul(Ni).add(ix0.add(int(1))));
348
+ const decay = float(1).add(float(VELOCITY_DISSIPATION).mul(dtU));
349
+ 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)));
350
+ })().compute(count, [256]);
351
+ const copyVelPass = Fn(() => {
352
+ const v = velB.element(instanceIndex);
353
+ velA.element(instanceIndex).assign(vec4(v.x, v.y, float(0), float(0)));
354
+ })().compute(count, [256]);
355
+ const advectDensPass = Fn(() => {
356
+ const idx = instanceIndex;
357
+ const j = idx.mod(gs);
358
+ const i = idx.div(gs);
359
+ const vel = velA.element(idx);
360
+ const srcX = j.toFloat().sub(vel.x.mul(dtU)).clamp(float(0), float(N - 1));
361
+ const srcY = i.toFloat().sub(vel.y.mul(dtU)).clamp(float(0), float(N - 1));
362
+ const x0 = floor(srcX).clamp(float(0), float(N - 2));
363
+ const y0 = floor(srcY).clamp(float(0), float(N - 2));
364
+ const sx = srcX.sub(x0);
365
+ const sy = srcY.sub(y0);
366
+ const ix0 = x0.toInt();
367
+ const iy0 = y0.toInt();
368
+ const d00 = densA.element(iy0.mul(Ni).add(ix0));
369
+ const d10 = densA.element(iy0.mul(Ni).add(ix0.add(int(1))));
370
+ const d01 = densA.element(iy0.add(int(1)).mul(Ni).add(ix0));
371
+ const d11 = densA.element(iy0.add(int(1)).mul(Ni).add(ix0.add(int(1))));
372
+ const dens = mix(mix(d00.x, d10.x, sx), mix(d01.x, d11.x, sx), sy);
373
+ const age = mix(mix(d00.y, d10.y, sx), mix(d01.y, d11.y, sx), sy);
374
+ const decay = float(1).add(densDissipU.mul(dtU));
375
+ densB.element(idx).assign(vec4(dens.div(decay).max(float(0)), age.add(dtU.mul(float(.4)).mul(colorDecayU)).min(float(1)), float(0), float(0)));
376
+ })().compute(count, [256]);
377
+ const copyDensPass = Fn(() => {
378
+ const d = densB.element(instanceIndex);
379
+ densA.element(instanceIndex).assign(vec4(d.x, d.y, float(0), float(0)));
380
+ })().compute(count, [256]);
381
+ const outputPass = Fn(() => {
382
+ const idx = instanceIndex;
383
+ const j = idx.mod(gs);
384
+ const i = idx.div(gs);
385
+ const d = densA.element(idx);
386
+ textureStore(outTexNode, uvec2(j, i), vec4(d.x, d.y, float(0), float(0))).toWriteOnly();
387
+ })().compute(count, [256]);
388
+ let lastTime = Date.now();
389
+ let prevMx = .5, prevMy = .5;
390
+ return {
391
+ outputs: { smokeTexture: outTex },
392
+ getComputeNodes: (params) => {
393
+ const now = Date.now();
394
+ const dt = Math.min((now - lastTime) / 1e3, .033);
395
+ lastTime = now;
396
+ if (dt < .001) return null;
397
+ const getNum = (key, fallback) => {
398
+ const def = uniforms[key];
399
+ if (!def) return fallback;
400
+ if (typeof def.getCpuValue === "function") {
401
+ const v$1 = def.getCpuValue();
402
+ return typeof v$1 === "number" ? v$1 : fallback;
403
+ }
404
+ const v = def.uniform?.value;
405
+ return typeof v === "number" ? v : fallback;
406
+ };
407
+ const speed = getNum("speed", 3);
408
+ const dirRad = getNum("direction", 0) * Math.PI / 180;
409
+ const spreadHalf = Math.min(89 * Math.PI / 180, getNum("spread", 45) * Math.PI / 360);
410
+ const emitPos = uniforms.emitFrom.uniform.value;
411
+ const epx = typeof emitPos === "object" ? emitPos.x ?? .5 : .5;
412
+ const epy = typeof emitPos === "object" ? emitPos.y ?? 0 : 0;
413
+ dtU.value = dt;
414
+ emitXU.value = epx * N;
415
+ emitYU.value = (1 - epy) * N;
416
+ const velMag = speed * N * .15;
417
+ emitVelXU.value = Math.sin(dirRad) * velMag;
418
+ emitVelYU.value = -Math.cos(dirRad) * velMag;
419
+ perpDirXU.value = Math.cos(dirRad);
420
+ perpDirYU.value = Math.sin(dirRad);
421
+ spreadFactorU.value = Math.tan(spreadHalf);
422
+ emitRadU.value = getNum("emitRadius", .06) * N;
423
+ emitIntensityU.value = getNum("intensity", .7);
424
+ densDissipU.value = getNum("dissipation", 1);
425
+ curlStrengthU.value = getNum("detail", 30);
426
+ gravityU.value = getNum("gravity", .5);
427
+ colorDecayU.value = getNum("colorDecay", 1);
428
+ const mouseInf = getNum("mouseInfluence", .5);
429
+ const mouseRad = getNum("mouseRadius", .12);
430
+ const mx = params?.pointer?.x ?? prevMx;
431
+ const my = params?.pointer?.y ?? prevMy;
432
+ const mdx = mx - prevMx;
433
+ const mdy = my - prevMy;
434
+ prevMx = mx;
435
+ prevMy = my;
436
+ const cursorSpeed = Math.sqrt(mdx * mdx + mdy * mdy);
437
+ const mouseRadGrid = mouseRad * N;
438
+ mouseRadSqU.value = mouseRadGrid * mouseRadGrid;
439
+ if (cursorSpeed > 5e-4 && mouseInf > 0) {
440
+ cursorXU.value = mx * N;
441
+ cursorYU.value = my * N;
442
+ cursorVelXU.value = mdx * N * 15 * mouseInf;
443
+ cursorVelYU.value = mdy * N * 15 * mouseInf;
444
+ mouseActiveU.value = 1;
445
+ } else mouseActiveU.value = 0;
446
+ renderer.compute(splatPass);
447
+ renderer.compute(curlPass);
448
+ renderer.compute(vorticityPass);
449
+ renderer.compute(divergencePass);
450
+ for (let iter = 0; iter < JACOBI_ITERS; iter++) renderer.compute(jacobiPass);
451
+ renderer.compute(gradSubtractPass);
452
+ renderer.compute(advectVelPass);
453
+ renderer.compute(copyVelPass);
454
+ renderer.compute(advectDensPass);
455
+ renderer.compute(copyDensPass);
456
+ return [outputPass];
457
+ }
458
+ };
459
+ },
460
+ fragmentNode: ({ uniforms, onBeforeRender, onCleanup, computeOutputs }) => {
461
+ let smokeField;
462
+ if (computeOutputs?.smokeTexture) smokeField = texture(computeOutputs.smokeTexture);
463
+ else {
464
+ const cpuN = GRID_CPU;
465
+ const cells = cpuN * cpuN;
466
+ const vx = new Float32Array(cells);
467
+ const vy = new Float32Array(cells);
468
+ const vtx = new Float32Array(cells);
469
+ const vty = new Float32Array(cells);
470
+ const den = new Float32Array(cells);
471
+ const ag = new Float32Array(cells);
472
+ const dtmp = new Float32Array(cells);
473
+ const atmp = new Float32Array(cells);
474
+ const pres = new Float32Array(cells);
475
+ const divg = new Float32Array(cells);
476
+ const crl = new Float32Array(cells);
477
+ const texData = new Float32Array(cells * 4);
478
+ const smokeTex = new DataTexture(texData, cpuN, cpuN, RGBAFormat, FloatType);
479
+ smokeTex.magFilter = LinearFilter$1;
480
+ smokeTex.minFilter = LinearFilter$1;
481
+ smokeTex.needsUpdate = true;
482
+ smokeField = texture(smokeTex);
483
+ const cpuGetNum = (key, fallback) => {
484
+ const def = uniforms[key];
485
+ if (!def) return fallback;
486
+ if (typeof def.getCpuValue === "function") {
487
+ const v$1 = def.getCpuValue();
488
+ return typeof v$1 === "number" ? v$1 : fallback;
489
+ }
490
+ const v = def.uniform?.value;
491
+ return typeof v === "number" ? v : fallback;
492
+ };
493
+ let lt = Date.now();
494
+ let cpuPrevMx = .5, cpuPrevMy = .5;
495
+ const bl = (f, fx, fy) => {
496
+ const sx = Math.max(0, Math.min(cpuN - 1, fx));
497
+ const sy = Math.max(0, Math.min(cpuN - 1, fy));
498
+ const x0 = Math.max(0, Math.min(cpuN - 2, Math.floor(sx)));
499
+ const y0 = Math.max(0, Math.min(cpuN - 2, Math.floor(sy)));
500
+ const tx = sx - x0, ty = sy - y0;
501
+ const i00 = y0 * cpuN + x0;
502
+ return (1 - tx) * (1 - ty) * f[i00] + tx * (1 - ty) * f[i00 + 1] + (1 - tx) * ty * f[i00 + cpuN] + tx * ty * f[i00 + cpuN + 1];
503
+ };
504
+ const ni = (i, j, di, dj) => Math.max(0, Math.min(cpuN - 1, i + di)) * cpuN + Math.max(0, Math.min(cpuN - 1, j + dj));
505
+ onBeforeRender(({ pointer }) => {
506
+ const now = Date.now();
507
+ const dt = Math.min((now - lt) / 1e3, .033);
508
+ lt = now;
509
+ if (dt < .001) return;
510
+ const sp = cpuGetNum("speed", 3);
511
+ const dr = uniforms.direction.uniform.value * Math.PI / 180;
512
+ const sh = Math.min(89 * Math.PI / 180, uniforms.spread.uniform.value * Math.PI / 360);
513
+ const ep = uniforms.emitFrom.uniform.value;
514
+ const ex = (typeof ep === "object" ? ep.x ?? .5 : .5) * cpuN;
515
+ const ey = (1 - (typeof ep === "object" ? ep.y ?? 0 : 0)) * cpuN;
516
+ const vm = sp * cpuN * .15;
517
+ const evx = Math.sin(dr) * vm, evy = -Math.cos(dr) * vm;
518
+ const px = Math.cos(dr), py = Math.sin(dr), sf = Math.tan(sh);
519
+ const er = uniforms.emitRadius.uniform.value * cpuN;
520
+ const ei = uniforms.intensity.uniform.value;
521
+ const cv = cpuGetNum("detail", 30);
522
+ const bv = cpuGetNum("gravity", .5);
523
+ const cd = cpuGetNum("colorDecay", 1);
524
+ const dd = cpuGetNum("dissipation", .2);
525
+ const mi = uniforms.mouseInfluence.uniform.value;
526
+ const mr = uniforms.mouseRadius.uniform.value * cpuN;
527
+ const mx = pointer?.x ?? cpuPrevMx;
528
+ const my = pointer?.y ?? cpuPrevMy;
529
+ const mdx = mx - cpuPrevMx, mdy = my - cpuPrevMy;
530
+ cpuPrevMx = mx;
531
+ cpuPrevMy = my;
532
+ const cActive = Math.sqrt(mdx * mdx + mdy * mdy) > 5e-4 && mi > 0;
533
+ const cvx = cActive ? mdx * cpuN * 15 * mi : 0;
534
+ const cvy = cActive ? mdy * cpuN * 15 * mi : 0;
535
+ const cxGrid = mx * cpuN, cyGrid = my * cpuN;
536
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
537
+ const idx = i * cpuN + j;
538
+ const dx = j + .5 - ex, dy = i + .5 - ey;
539
+ const inf = Math.exp(-(dx * dx + dy * dy) / Math.max(1, er * er));
540
+ const od = den[idx], ad = ei * inf * dt * 8;
541
+ const nd = Math.min(1, od + ad);
542
+ ag[idx] *= 1 - Math.min(1, ad / Math.max(.001, nd));
543
+ den[idx] = nd;
544
+ const po = (dx * px + dy * py) / Math.max(1, er);
545
+ const vms = Math.sqrt(evx * evx + evy * evy);
546
+ const tvx2 = evx + px * po * sf * vms, tvy2 = evy + py * po * sf * vms;
547
+ const br = Math.min(1, inf * dt * 3);
548
+ const cdx = j + .5 - cxGrid, cdy = i + .5 - cyGrid;
549
+ const cinf = cActive ? Math.exp(-(cdx * cdx + cdy * cdy) / Math.max(1, mr * mr)) : 0;
550
+ vx[idx] = vx[idx] * (1 - br) + tvx2 * br + cvx * cinf;
551
+ vy[idx] = vy[idx] * (1 - br) + tvy2 * br + bv * od * dt * cpuN * .08 + cvy * cinf;
552
+ }
553
+ if (cv > 0) {
554
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) crl[i * cpuN + j] = .5 * (vy[ni(i, j, 0, 1)] - vy[ni(i, j, 0, -1)] - (vx[ni(i, j, 1, 0)] - vx[ni(i, j, -1, 0)]));
555
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
556
+ const idx = i * cpuN + j;
557
+ const gx = .5 * (Math.abs(crl[ni(i, j, 0, 1)]) - Math.abs(crl[ni(i, j, 0, -1)]));
558
+ const gy = .5 * (Math.abs(crl[ni(i, j, 1, 0)]) - Math.abs(crl[ni(i, j, -1, 0)]));
559
+ const gl = Math.max(1e-5, Math.sqrt(gx * gx + gy * gy));
560
+ vx[idx] += gy / gl * crl[idx] * cv * dt;
561
+ vy[idx] += -(gx / gl) * crl[idx] * cv * dt;
562
+ }
563
+ }
564
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
565
+ const idx = i * cpuN + j;
566
+ const L = j === 0 ? -vx[idx] : vx[ni(i, j, 0, -1)];
567
+ const R = j === cpuN - 1 ? -vx[idx] : vx[ni(i, j, 0, 1)];
568
+ const T = i === 0 ? -vy[idx] : vy[ni(i, j, -1, 0)];
569
+ const B = i === cpuN - 1 ? -vy[idx] : vy[ni(i, j, 1, 0)];
570
+ divg[idx] = .5 * (R - L + B - T);
571
+ pres[idx] *= PRESSURE_DISSIPATION;
572
+ }
573
+ for (let it = 0; it < 6; it++) for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
574
+ const idx = i * cpuN + j;
575
+ pres[idx] = .25 * (pres[ni(i, j, 0, -1)] + pres[ni(i, j, 0, 1)] + pres[ni(i, j, -1, 0)] + pres[ni(i, j, 1, 0)] - divg[idx]);
576
+ }
577
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
578
+ const idx = i * cpuN + j;
579
+ vx[idx] -= .5 * (pres[ni(i, j, 0, 1)] - pres[ni(i, j, 0, -1)]);
580
+ vy[idx] -= .5 * (pres[ni(i, j, 1, 0)] - pres[ni(i, j, -1, 0)]);
581
+ }
582
+ const vDecay = 1 + VELOCITY_DISSIPATION * dt;
583
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
584
+ const idx = i * cpuN + j;
585
+ vtx[idx] = bl(vx, j - vx[idx] * dt, i - vy[idx] * dt) / vDecay;
586
+ vty[idx] = bl(vy, j - vx[idx] * dt, i - vy[idx] * dt) / vDecay;
587
+ }
588
+ vx.set(vtx);
589
+ vy.set(vty);
590
+ const dDecay = 1 + dd * dt;
591
+ for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
592
+ const idx = i * cpuN + j;
593
+ const sx = j - vx[idx] * dt, sy = i - vy[idx] * dt;
594
+ dtmp[idx] = Math.max(0, bl(den, sx, sy) / dDecay);
595
+ atmp[idx] = Math.min(1, bl(ag, sx, sy) + dt * .4 * cd);
596
+ }
597
+ den.set(dtmp);
598
+ ag.set(atmp);
599
+ for (let i = 0; i < cells; i++) {
600
+ texData[i * 4] = den[i];
601
+ texData[i * 4 + 1] = ag[i];
602
+ }
603
+ smokeTex.needsUpdate = true;
604
+ });
605
+ onCleanup(() => {
606
+ smokeTex.dispose();
607
+ });
608
+ }
609
+ let smokeDensity, smokeAge;
610
+ if (computeOutputs?.smokeTexture) {
611
+ const px = float(1 / GRID_GPU);
612
+ const s0 = smokeField.sample(screenUV);
613
+ const s1 = smokeField.sample(screenUV.add(vec2(px, float(0))));
614
+ const s2 = smokeField.sample(screenUV.add(vec2(float(0), px)));
615
+ const s3 = smokeField.sample(screenUV.add(vec2(px.negate(), float(0))));
616
+ const s4 = smokeField.sample(screenUV.add(vec2(float(0), px.negate())));
617
+ smokeDensity = 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)));
618
+ smokeAge = 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)));
619
+ } else {
620
+ const s = smokeField.sample(screenUV);
621
+ smokeDensity = s.x;
622
+ smokeAge = s.y;
623
+ }
624
+ const smokeColor = mixColors(uniforms.colorA.uniform, uniforms.colorB.uniform, smokeAge, uniforms.colorSpace.uniform.value);
625
+ return vec4(smokeColor.x, smokeColor.y, smokeColor.z, smokeColor.w.mul(smokeDensity));
626
+ }
627
+ };
628
+ var Smoke_default = componentDefinition;
629
+ export { componentDefinition as n, Smoke_default as t };