shaders 2.5.102 → 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.
- package/dist/core/Fog-DhFHErOx.js +674 -0
- package/dist/core/Halftone-BUCDTTAU.js +287 -0
- package/dist/core/Smoke-LIDjCv7f.js +629 -0
- package/dist/core/SmokeFill-ChSIfTxW.js +641 -0
- package/dist/core/{VideoTexture-DnHIs4pp.js → VideoTexture-SWLe5c3m.js} +1 -1
- package/dist/core/{WebcamTexture-XBDo2kgN.js → WebcamTexture-cXPyEumA.js} +1 -1
- package/dist/core/index.js +73 -70
- package/dist/core/registry.js +72 -69
- package/dist/core/renderer.d.ts.map +1 -1
- package/dist/core/shaderRegistry-CVhdTDhR.js +252 -0
- package/dist/core/shaderRegistry.d.ts.map +1 -1
- package/dist/core/shaders/Fog/index.d.ts +78 -0
- package/dist/core/shaders/Fog/index.d.ts.map +1 -0
- package/dist/core/shaders/Fog/index.js +4 -0
- package/dist/core/shaders/Form3D/index.js +1 -1
- package/dist/core/shaders/Glass/index.js +1 -1
- package/dist/core/shaders/GlassTiles/index.js +1 -1
- package/dist/core/shaders/Glitch/index.js +1 -1
- package/dist/core/shaders/Glow/index.js +1 -1
- package/dist/core/shaders/Godrays/index.js +1 -1
- package/dist/core/shaders/Grayscale/index.js +1 -1
- package/dist/core/shaders/Grid/index.js +1 -1
- package/dist/core/shaders/GridDistortion/index.js +1 -1
- package/dist/core/shaders/Group/index.js +1 -1
- package/dist/core/shaders/Halftone/index.d.ts +76 -4
- package/dist/core/shaders/Halftone/index.d.ts.map +1 -1
- package/dist/core/shaders/Halftone/index.js +2 -1
- package/dist/core/shaders/HexGrid/index.js +1 -1
- package/dist/core/shaders/HueShift/index.js +1 -1
- package/dist/core/shaders/ImageTexture/index.js +1 -1
- package/dist/core/shaders/Invert/index.js +1 -1
- package/dist/core/shaders/Kaleidoscope/index.js +1 -1
- package/dist/core/shaders/LensFlare/index.js +1 -1
- package/dist/core/shaders/LinearBlur/index.js +1 -1
- package/dist/core/shaders/LinearGradient/index.js +1 -1
- package/dist/core/shaders/Liquify/index.js +1 -1
- package/dist/core/shaders/Mirror/index.js +1 -1
- package/dist/core/shaders/MultiPointGradient/index.js +1 -1
- package/dist/core/shaders/Neon/index.js +1 -1
- package/dist/core/shaders/Paper/index.js +1 -1
- package/dist/core/shaders/Perspective/index.js +1 -1
- package/dist/core/shaders/Pixelate/index.js +1 -1
- package/dist/core/shaders/Plasma/index.js +1 -1
- package/dist/core/shaders/PolarCoordinates/index.js +1 -1
- package/dist/core/shaders/Polygon/index.js +1 -1
- package/dist/core/shaders/Posterize/index.js +1 -1
- package/dist/core/shaders/ProgressiveBlur/index.js +1 -1
- package/dist/core/shaders/RadialGradient/index.js +1 -1
- package/dist/core/shaders/RectangularCoordinates/index.js +1 -1
- package/dist/core/shaders/Ring/index.js +1 -1
- package/dist/core/shaders/Ripples/index.js +1 -1
- package/dist/core/shaders/RoundedRect/index.js +1 -1
- package/dist/core/shaders/Saturation/index.js +1 -1
- package/dist/core/shaders/Sharpness/index.js +1 -1
- package/dist/core/shaders/Shatter/index.js +1 -1
- package/dist/core/shaders/SimplexNoise/index.js +1 -1
- package/dist/core/shaders/SineWave/index.js +1 -1
- package/dist/core/shaders/Smoke/index.d.ts +113 -0
- package/dist/core/shaders/Smoke/index.d.ts.map +1 -0
- package/dist/core/shaders/Smoke/index.js +4 -0
- package/dist/core/shaders/SmokeFill/index.d.ts +145 -0
- package/dist/core/shaders/SmokeFill/index.d.ts.map +1 -0
- package/dist/core/shaders/SmokeFill/index.js +5 -0
- package/dist/core/shaders/Solarize/index.js +1 -1
- package/dist/core/shaders/SolidColor/index.js +1 -1
- package/dist/core/shaders/Spherize/index.js +1 -1
- package/dist/core/shaders/Spiral/index.js +1 -1
- package/dist/core/shaders/Star/index.js +1 -1
- package/dist/core/shaders/Strands/index.js +1 -1
- package/dist/core/shaders/Stretch/index.js +1 -1
- package/dist/core/shaders/Stripes/index.js +1 -1
- package/dist/core/shaders/StudioBackground/index.js +1 -1
- package/dist/core/shaders/Swirl/index.js +1 -1
- package/dist/core/shaders/TiltShift/index.js +1 -1
- package/dist/core/shaders/Tint/index.js +1 -1
- package/dist/core/shaders/Trapezoid/index.js +1 -1
- package/dist/core/shaders/Tritone/index.js +1 -1
- package/dist/core/shaders/Truchet/index.js +1 -1
- package/dist/core/shaders/Twirl/index.js +1 -1
- package/dist/core/shaders/VHS/index.js +1 -1
- package/dist/core/shaders/Vesica/index.js +1 -1
- package/dist/core/shaders/Vibrance/index.js +1 -1
- package/dist/core/shaders/VideoTexture/index.js +2 -2
- package/dist/core/shaders/Vignette/index.js +1 -1
- package/dist/core/shaders/Voronoi/index.js +1 -1
- package/dist/core/shaders/WaveDistortion/index.js +1 -1
- package/dist/core/shaders/Weave/index.js +1 -1
- package/dist/core/shaders/WebcamTexture/index.js +2 -2
- package/dist/core/shaders/ZoomBlur/index.js +1 -1
- package/dist/js/createShader.js +1 -1
- package/dist/js/utils/generatePresetCode.d.ts.map +1 -1
- package/dist/js/utils/generatePresetCode.js +79 -1
- package/dist/react/Fog.js +223 -0
- package/dist/react/Preview.js +3 -0
- package/dist/react/Shader.js +1 -1
- package/dist/react/Smoke.js +223 -0
- package/dist/react/SmokeFill.js +223 -0
- package/dist/react/components/Fog.d.ts +31 -0
- package/dist/react/components/Fog.d.ts.map +1 -0
- package/dist/react/components/Halftone.d.ts +7 -2
- package/dist/react/components/Halftone.d.ts.map +1 -1
- package/dist/react/components/Smoke.d.ts +33 -0
- package/dist/react/components/Smoke.d.ts.map +1 -0
- package/dist/react/components/SmokeFill.d.ts +34 -0
- package/dist/react/components/SmokeFill.d.ts.map +1 -0
- package/dist/react/engine/Preview.d.ts.map +1 -1
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +4 -1
- package/dist/react/utils/generatePresetCode.d.ts.map +1 -1
- package/dist/react/utils/generatePresetCode.js +79 -1
- package/dist/registry.js +1559 -18
- package/dist/solid/components/Fog.d.ts +28 -0
- package/dist/solid/components/Fog.d.ts.map +1 -0
- package/dist/solid/components/Fog.js +228 -0
- package/dist/solid/components/Halftone.d.ts +7 -2
- package/dist/solid/components/Halftone.d.ts.map +1 -1
- package/dist/solid/components/Smoke.d.ts +30 -0
- package/dist/solid/components/Smoke.d.ts.map +1 -0
- package/dist/solid/components/Smoke.js +228 -0
- package/dist/solid/components/SmokeFill.d.ts +31 -0
- package/dist/solid/components/SmokeFill.d.ts.map +1 -0
- package/dist/solid/components/SmokeFill.js +228 -0
- package/dist/solid/engine/Preview.d.ts.map +1 -1
- package/dist/solid/engine/Preview.js +162 -156
- package/dist/solid/engine/Shader.js +1 -1
- package/dist/solid/index.d.ts +3 -0
- package/dist/solid/index.d.ts.map +1 -1
- package/dist/solid/index.js +144 -138
- package/dist/solid/utils/generatePresetCode.d.ts.map +1 -1
- package/dist/solid/utils/generatePresetCode.js +79 -1
- package/dist/svelte/components/Fog.svelte.d.ts +19 -0
- package/dist/svelte/components/Halftone.svelte.d.ts +6 -1
- package/dist/svelte/components/Smoke.svelte.d.ts +20 -0
- package/dist/svelte/components/SmokeFill.svelte.d.ts +21 -0
- package/dist/svelte/{generatePresetCode-BygAdFRo.js → generatePresetCode-DR_OAIL7.js} +79 -1
- package/dist/svelte/index.d.ts +3 -0
- package/dist/svelte/index.js +1151 -551
- package/dist/svelte/source/components/Fog.svelte +325 -0
- package/dist/svelte/source/components/Halftone.svelte +6 -1
- package/dist/svelte/source/components/Smoke.svelte +326 -0
- package/dist/svelte/source/components/SmokeFill.svelte +327 -0
- package/dist/svelte/source/engine/Preview.svelte +6 -0
- package/dist/svelte/source/index.js +3 -0
- package/dist/svelte/utils/generatePresetCode.js +1 -1
- package/dist/vue/Fog.js +3 -0
- package/dist/vue/Fog.vue_vue_type_script_setup_true_lang.js +222 -0
- package/dist/vue/Halftone.vue_vue_type_script_setup_true_lang.js +13 -2
- package/dist/vue/Preview.vue_vue_type_script_setup_true_lang.js +6 -0
- package/dist/vue/Shader.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/vue/Smoke.js +3 -0
- package/dist/vue/Smoke.vue_vue_type_script_setup_true_lang.js +227 -0
- package/dist/vue/SmokeFill.js +3 -0
- package/dist/vue/SmokeFill.vue_vue_type_script_setup_true_lang.js +232 -0
- package/dist/vue/components/Fog.vue.d.ts +54 -0
- package/dist/vue/components/Fog.vue.d.ts.map +1 -0
- package/dist/vue/components/Halftone.vue.d.ts +6 -1
- package/dist/vue/components/Halftone.vue.d.ts.map +1 -1
- package/dist/vue/components/Smoke.vue.d.ts +55 -0
- package/dist/vue/components/Smoke.vue.d.ts.map +1 -0
- package/dist/vue/components/SmokeFill.vue.d.ts +56 -0
- package/dist/vue/components/SmokeFill.vue.d.ts.map +1 -0
- package/dist/vue/index.d.ts +3 -0
- package/dist/vue/index.d.ts.map +1 -1
- package/dist/vue/index.js +4 -1
- package/dist/vue/utils/generatePresetCode.d.ts.map +1 -1
- package/dist/vue/utils/generatePresetCode.js +79 -1
- package/package.json +25 -1
- package/dist/core/Halftone-BVL2oy37.js +0 -67
- package/dist/core/shaderRegistry-B6D8HKv7.js +0 -246
- /package/dist/core/{Form3D-rKpxb9t3.js → Form3D-DaPbLGUi.js} +0 -0
- /package/dist/core/{Glass-C04tCmBL.js → Glass-CpcmrDfm.js} +0 -0
- /package/dist/core/{GlassTiles-k1C4a4u8.js → GlassTiles-Dgh6nOaE.js} +0 -0
- /package/dist/core/{Glitch-DzPMkBu4.js → Glitch-BsbzLahF.js} +0 -0
- /package/dist/core/{Glow-BwaPYDRZ.js → Glow-Ft2x2QHL.js} +0 -0
- /package/dist/core/{Godrays-DAYmq-BP.js → Godrays-D1LINbut.js} +0 -0
- /package/dist/core/{Grayscale-lYKBBkGY.js → Grayscale-Ri-695Uh.js} +0 -0
- /package/dist/core/{Grid-BJ-nxN3i.js → Grid-BYSsAIEv.js} +0 -0
- /package/dist/core/{GridDistortion-DtaRNrTZ.js → GridDistortion-DWFGD8ya.js} +0 -0
- /package/dist/core/{Group-DpozigtX.js → Group-CkhjTW59.js} +0 -0
- /package/dist/core/{HexGrid-D-EmQ4kI.js → HexGrid-BUiDrehv.js} +0 -0
- /package/dist/core/{HueShift-D9K0ynaS.js → HueShift-BtGVMu7q.js} +0 -0
- /package/dist/core/{ImageTexture-CArkZMfh.js → ImageTexture-CrX_9-f0.js} +0 -0
- /package/dist/core/{Invert-DCnwo_Xq.js → Invert-azYrcDMi.js} +0 -0
- /package/dist/core/{Kaleidoscope-BytHro3k.js → Kaleidoscope-CFWtKisp.js} +0 -0
- /package/dist/core/{LensFlare-B0vv4x97.js → LensFlare-ttrXgfea.js} +0 -0
- /package/dist/core/{LinearBlur-BFewxPjV.js → LinearBlur-By2aD8OO.js} +0 -0
- /package/dist/core/{LinearGradient-BKUf_u7r.js → LinearGradient-CM02z32l.js} +0 -0
- /package/dist/core/{Liquify-cE5dxrfh.js → Liquify-CyXo6vAH.js} +0 -0
- /package/dist/core/{Mirror-DIle92J8.js → Mirror-B7XmfGdw.js} +0 -0
- /package/dist/core/{MultiPointGradient-DDwac_mm.js → MultiPointGradient-8zGSIM4U.js} +0 -0
- /package/dist/core/{Neon-Dg8UfC7P.js → Neon-C1JlexhM.js} +0 -0
- /package/dist/core/{Paper-bMSMCeYK.js → Paper-B08rxNys.js} +0 -0
- /package/dist/core/{Perspective-BmfvQV6W.js → Perspective-BN_OpTZq.js} +0 -0
- /package/dist/core/{Pixelate-Dl26r6IT.js → Pixelate-dxPAFCRu.js} +0 -0
- /package/dist/core/{Plasma-CJWS1TvX.js → Plasma-DGCw0cd7.js} +0 -0
- /package/dist/core/{PolarCoordinates-lq6K4WBm.js → PolarCoordinates-CMYCFT4S.js} +0 -0
- /package/dist/core/{Polygon-DRCs3CYs.js → Polygon-CsCOt5YE.js} +0 -0
- /package/dist/core/{Posterize-BjH7Zscm.js → Posterize-Blv9pzPT.js} +0 -0
- /package/dist/core/{ProgressiveBlur-B8xwWyTM.js → ProgressiveBlur-Cx6eR7o9.js} +0 -0
- /package/dist/core/{RadialGradient-DiGFPgrn.js → RadialGradient-De0gtdh3.js} +0 -0
- /package/dist/core/{RectangularCoordinates-COkNDxi0.js → RectangularCoordinates-8Sa2GaDy.js} +0 -0
- /package/dist/core/{Ring-QApyKPzE.js → Ring-kHH-DIDQ.js} +0 -0
- /package/dist/core/{Ripples-C8Q17Hvz.js → Ripples-Bf6Zwg6X.js} +0 -0
- /package/dist/core/{RoundedRect-Ca9af9xe.js → RoundedRect-B0sWh2BN.js} +0 -0
- /package/dist/core/{Saturation-CgDaiq6n.js → Saturation-CB19kOXg.js} +0 -0
- /package/dist/core/{Sharpness-CRXT0D30.js → Sharpness-CQOboeqy.js} +0 -0
- /package/dist/core/{Shatter-BssZTRYJ.js → Shatter-BhK75BiG.js} +0 -0
- /package/dist/core/{SimplexNoise-KfTCAfpL.js → SimplexNoise-BcSgytjc.js} +0 -0
- /package/dist/core/{SineWave-Ckeap_YM.js → SineWave-VTNDSK_g.js} +0 -0
- /package/dist/core/{Solarize-DhtQYYpW.js → Solarize-CWDgSBiv.js} +0 -0
- /package/dist/core/{SolidColor-6yUkGybH.js → SolidColor-DhMdM3bE.js} +0 -0
- /package/dist/core/{Spherize-8LXrGGG_.js → Spherize-BZxwopX8.js} +0 -0
- /package/dist/core/{Spiral-Bs7uZrBr.js → Spiral-gpkw37l1.js} +0 -0
- /package/dist/core/{Star-DiXwnPGP.js → Star-WJAOZ5P5.js} +0 -0
- /package/dist/core/{Strands-DsAAVemq.js → Strands-DOthZNHt.js} +0 -0
- /package/dist/core/{Stretch-D7P2R5lV.js → Stretch--GV6hbru.js} +0 -0
- /package/dist/core/{Stripes-DF8agIiJ.js → Stripes-CFCXw1_N.js} +0 -0
- /package/dist/core/{StudioBackground-BFeNfwEu.js → StudioBackground-DJr-cxOL.js} +0 -0
- /package/dist/core/{Swirl-BwezrSAA.js → Swirl-By5FadQK.js} +0 -0
- /package/dist/core/{TiltShift-CI3FlfYk.js → TiltShift-Dh8wc9GG.js} +0 -0
- /package/dist/core/{Tint-BdXlqlzz.js → Tint-DaTx2HII.js} +0 -0
- /package/dist/core/{Trapezoid-BX_hmeZJ.js → Trapezoid-Co0sIA73.js} +0 -0
- /package/dist/core/{Tritone-BlJ7cchN.js → Tritone-C9Yx69Tw.js} +0 -0
- /package/dist/core/{Truchet-Bnn0fwbF.js → Truchet-CkFSkniR.js} +0 -0
- /package/dist/core/{Twirl-C5ijhqz1.js → Twirl-v8pLqUTN.js} +0 -0
- /package/dist/core/{VHS-CQJ1hV_D.js → VHS-mKd1QBBj.js} +0 -0
- /package/dist/core/{Vesica-DU0f85NG.js → Vesica-CxP7UD0a.js} +0 -0
- /package/dist/core/{Vibrance-CGvYDeds.js → Vibrance-WR5yQv_9.js} +0 -0
- /package/dist/core/{Vignette-BJaonUVL.js → Vignette-hAIKTi35.js} +0 -0
- /package/dist/core/{Voronoi-DZemzWA4.js → Voronoi-DOGmwUSK.js} +0 -0
- /package/dist/core/{WaveDistortion--Y-m667K.js → WaveDistortion-BGdgj3Iz.js} +0 -0
- /package/dist/core/{Weave-CtyohvHz.js → Weave-CIP_EUPa.js} +0 -0
- /package/dist/core/{ZoomBlur-BwkhsFRE.js → ZoomBlur-BuIVpHGG.js} +0 -0
- /package/dist/core/{browser-DTNngPey.js → browser-D8zonASQ.js} +0 -0
|
@@ -0,0 +1,641 @@
|
|
|
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 { n as createAnalyticSdfSampler, r as createSvgSdfSampler } from "./sdf-DyC2H_qS.js";
|
|
4
|
+
import { StorageTexture } from "three/webgpu";
|
|
5
|
+
import { DataTexture, FloatType, LinearFilter as LinearFilter$1, RGBAFormat } from "three";
|
|
6
|
+
import { Fn, attributeArray, float, floor, instanceIndex, int, mix, screenUV, storageTexture, texture, textureStore, uint, uniform, uvec2, vec2, vec4, viewportSize } from "three/tsl";
|
|
7
|
+
var DEFAULT_SHAPE_CONFIG = JSON.stringify({
|
|
8
|
+
type: "circleSDF",
|
|
9
|
+
radius: .35
|
|
10
|
+
});
|
|
11
|
+
var GRID_GPU = 256;
|
|
12
|
+
var GRID_CPU = 56;
|
|
13
|
+
var JACOBI_ITERS = 20;
|
|
14
|
+
var PRESSURE_DISSIPATION = .8;
|
|
15
|
+
var VELOCITY_DISSIPATION = .2;
|
|
16
|
+
const componentDefinition = {
|
|
17
|
+
name: "SmokeFill",
|
|
18
|
+
category: "Shape Effects",
|
|
19
|
+
description: "Fill a shape with swirling fluid smoke that interacts with the shape boundary",
|
|
20
|
+
requiresRTT: false,
|
|
21
|
+
requiresChild: false,
|
|
22
|
+
props: {
|
|
23
|
+
colorA: {
|
|
24
|
+
default: "#8cf3ff",
|
|
25
|
+
transform: transformColor,
|
|
26
|
+
description: "Color of fresh smoke",
|
|
27
|
+
ui: {
|
|
28
|
+
type: "color",
|
|
29
|
+
label: "Start Color",
|
|
30
|
+
group: "Colors"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
colorB: {
|
|
34
|
+
default: "#04a0d6",
|
|
35
|
+
transform: transformColor,
|
|
36
|
+
description: "Color smoke transitions to as it ages",
|
|
37
|
+
ui: {
|
|
38
|
+
type: "color",
|
|
39
|
+
label: "End Color",
|
|
40
|
+
group: "Colors"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
center: {
|
|
44
|
+
default: {
|
|
45
|
+
x: .5,
|
|
46
|
+
y: .5
|
|
47
|
+
},
|
|
48
|
+
transform: transformPosition,
|
|
49
|
+
description: "Center position of the shape",
|
|
50
|
+
ui: {
|
|
51
|
+
type: "position",
|
|
52
|
+
label: "Center",
|
|
53
|
+
group: "Position"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
scale: {
|
|
57
|
+
default: 1,
|
|
58
|
+
description: "Scale of the shape (1 = default size)",
|
|
59
|
+
ui: {
|
|
60
|
+
type: "range",
|
|
61
|
+
min: .1,
|
|
62
|
+
max: 3,
|
|
63
|
+
step: .05,
|
|
64
|
+
label: "Scale",
|
|
65
|
+
group: "Position"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
emitFrom: {
|
|
69
|
+
default: {
|
|
70
|
+
x: .5,
|
|
71
|
+
y: .5
|
|
72
|
+
},
|
|
73
|
+
transform: transformPosition,
|
|
74
|
+
description: "Emission source point within the shape",
|
|
75
|
+
ui: {
|
|
76
|
+
type: "position",
|
|
77
|
+
label: "Emit From",
|
|
78
|
+
group: "Emission"
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
direction: {
|
|
82
|
+
default: 0,
|
|
83
|
+
description: "Emission direction (0 = up, 90 = right, 180 = down, 270 = left)",
|
|
84
|
+
ui: {
|
|
85
|
+
type: "range",
|
|
86
|
+
min: 0,
|
|
87
|
+
max: 360,
|
|
88
|
+
step: 1,
|
|
89
|
+
label: "Direction",
|
|
90
|
+
group: "Emission"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
speed: {
|
|
94
|
+
default: 10,
|
|
95
|
+
description: "Emission velocity strength",
|
|
96
|
+
ui: {
|
|
97
|
+
type: "range",
|
|
98
|
+
min: .1,
|
|
99
|
+
max: 30,
|
|
100
|
+
step: .1,
|
|
101
|
+
label: "Speed",
|
|
102
|
+
group: "Emission"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
spread: {
|
|
106
|
+
default: 60,
|
|
107
|
+
description: "Emission cone angle in degrees",
|
|
108
|
+
ui: {
|
|
109
|
+
type: "range",
|
|
110
|
+
min: 0,
|
|
111
|
+
max: 180,
|
|
112
|
+
step: 1,
|
|
113
|
+
label: "Spread",
|
|
114
|
+
group: "Emission"
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
emitRadius: {
|
|
118
|
+
default: .03,
|
|
119
|
+
description: "Size of the emission area",
|
|
120
|
+
ui: {
|
|
121
|
+
type: "range",
|
|
122
|
+
min: .01,
|
|
123
|
+
max: .3,
|
|
124
|
+
step: .01,
|
|
125
|
+
label: "Emit Size",
|
|
126
|
+
group: "Emission"
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
intensity: {
|
|
130
|
+
default: 1,
|
|
131
|
+
description: "Smoke emission density",
|
|
132
|
+
ui: {
|
|
133
|
+
type: "range",
|
|
134
|
+
min: .1,
|
|
135
|
+
max: 1,
|
|
136
|
+
step: .05,
|
|
137
|
+
label: "Intensity",
|
|
138
|
+
group: "Effect"
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
dissipation: {
|
|
142
|
+
default: .3,
|
|
143
|
+
description: "How fast smoke fades over time",
|
|
144
|
+
ui: {
|
|
145
|
+
type: "range",
|
|
146
|
+
min: .1,
|
|
147
|
+
max: 5,
|
|
148
|
+
step: .1,
|
|
149
|
+
label: "Dissipation",
|
|
150
|
+
group: "Effect"
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
detail: {
|
|
154
|
+
default: 25,
|
|
155
|
+
description: "Fine-scale swirling detail",
|
|
156
|
+
ui: {
|
|
157
|
+
type: "range",
|
|
158
|
+
min: 0,
|
|
159
|
+
max: 50,
|
|
160
|
+
step: 1,
|
|
161
|
+
label: "Detail",
|
|
162
|
+
group: "Effect"
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
gravity: {
|
|
166
|
+
default: .5,
|
|
167
|
+
description: "Downward gravitational pull on smoke — 0 = weightless, negative values = smoke rises",
|
|
168
|
+
ui: {
|
|
169
|
+
type: "range",
|
|
170
|
+
min: -2,
|
|
171
|
+
max: 2,
|
|
172
|
+
step: .1,
|
|
173
|
+
label: "Gravity",
|
|
174
|
+
group: "Effect"
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
colorDecay: {
|
|
178
|
+
default: .4,
|
|
179
|
+
description: "How quickly smoke shifts from Color A to Color B",
|
|
180
|
+
ui: {
|
|
181
|
+
type: "range",
|
|
182
|
+
min: 0,
|
|
183
|
+
max: 3,
|
|
184
|
+
step: .1,
|
|
185
|
+
label: "Color Decay",
|
|
186
|
+
group: "Colors"
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
mouseInfluence: {
|
|
190
|
+
default: .1,
|
|
191
|
+
description: "Strength of cursor influence",
|
|
192
|
+
ui: {
|
|
193
|
+
type: "range",
|
|
194
|
+
min: 0,
|
|
195
|
+
max: 2,
|
|
196
|
+
step: .05,
|
|
197
|
+
label: "Cursor Influence",
|
|
198
|
+
group: "Interaction"
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
mouseRadius: {
|
|
202
|
+
default: .1,
|
|
203
|
+
description: "Radius of cursor influence area",
|
|
204
|
+
ui: {
|
|
205
|
+
type: "range",
|
|
206
|
+
min: .02,
|
|
207
|
+
max: .5,
|
|
208
|
+
step: .01,
|
|
209
|
+
label: "Cursor Radius",
|
|
210
|
+
group: "Interaction"
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
colorSpace: {
|
|
214
|
+
default: "linear",
|
|
215
|
+
transform: transformColorSpace,
|
|
216
|
+
compileTime: true,
|
|
217
|
+
description: "Color space for color interpolation",
|
|
218
|
+
ui: {
|
|
219
|
+
type: "select",
|
|
220
|
+
options: colorSpaceOptions,
|
|
221
|
+
label: "Color Space",
|
|
222
|
+
group: "Colors"
|
|
223
|
+
}
|
|
224
|
+
},
|
|
225
|
+
shape: {
|
|
226
|
+
default: DEFAULT_SHAPE_CONFIG,
|
|
227
|
+
description: "Serialized shape configuration (JSON)",
|
|
228
|
+
ui: {
|
|
229
|
+
type: "shape",
|
|
230
|
+
label: "Shape",
|
|
231
|
+
group: "Shape"
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
shapeSdfUrl: {
|
|
235
|
+
default: "",
|
|
236
|
+
compileTime: true,
|
|
237
|
+
description: "URL to a pre-generated SDF .bin file"
|
|
238
|
+
},
|
|
239
|
+
shapeType: {
|
|
240
|
+
default: "",
|
|
241
|
+
compileTime: true,
|
|
242
|
+
description: "Active SDF shape type"
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
computeNode: ({ uniforms, onCleanup, onBeforeRender, renderer }) => {
|
|
246
|
+
const N = GRID_GPU;
|
|
247
|
+
const gs = uint(N);
|
|
248
|
+
const Ni = int(N);
|
|
249
|
+
const Nm1 = int(N - 1);
|
|
250
|
+
const count = N * N;
|
|
251
|
+
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));
|
|
252
|
+
const shapeSdfUrl = uniforms.shapeSdfUrl.uniform.value;
|
|
253
|
+
const initialConfig = (() => {
|
|
254
|
+
const val = uniforms.shape.uniform.value;
|
|
255
|
+
try {
|
|
256
|
+
return JSON.parse(val);
|
|
257
|
+
} catch {
|
|
258
|
+
return {
|
|
259
|
+
type: "circleSDF",
|
|
260
|
+
radius: .35
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
})();
|
|
264
|
+
let sdfSampler;
|
|
265
|
+
if (shapeSdfUrl) sdfSampler = createSvgSdfSampler(shapeSdfUrl, onBeforeRender, onCleanup);
|
|
266
|
+
else sdfSampler = createAnalyticSdfSampler(uniforms.shapeType.uniform.value || initialConfig.type || "circleSDF", initialConfig, uniforms.shape, onBeforeRender);
|
|
267
|
+
const velA = attributeArray(count, "vec4");
|
|
268
|
+
const velB = attributeArray(count, "vec4");
|
|
269
|
+
const densA = attributeArray(count, "vec4");
|
|
270
|
+
const densB = attributeArray(count, "vec4");
|
|
271
|
+
const pressDivBuf = attributeArray(count, "vec4");
|
|
272
|
+
const maskBuf = attributeArray(count, "vec4");
|
|
273
|
+
const outTex = new StorageTexture(N, N);
|
|
274
|
+
outTex.type = FloatType;
|
|
275
|
+
const outTexNode = storageTexture(outTex);
|
|
276
|
+
onCleanup(() => {
|
|
277
|
+
outTex.dispose();
|
|
278
|
+
});
|
|
279
|
+
const dtU = uniform(.016);
|
|
280
|
+
const emitXU = uniform(.5);
|
|
281
|
+
const emitYU = uniform(.5);
|
|
282
|
+
const emitVelXU = uniform(0);
|
|
283
|
+
const emitVelYU = uniform(-50);
|
|
284
|
+
const perpDirXU = uniform(1);
|
|
285
|
+
const perpDirYU = uniform(0);
|
|
286
|
+
const spreadFactorU = uniform(.5);
|
|
287
|
+
const emitRadU = uniform(10);
|
|
288
|
+
const emitIntensityU = uniform(.8);
|
|
289
|
+
const densDissipU = uniform(.5);
|
|
290
|
+
const curlStrengthU = uniform(30);
|
|
291
|
+
const gravityU = uniform(.5);
|
|
292
|
+
const colorDecayU = uniform(1);
|
|
293
|
+
const centerXU = uniform(.5);
|
|
294
|
+
const centerYU = uniform(.5);
|
|
295
|
+
const scaleU = uniform(1);
|
|
296
|
+
const aspectU = uniform(1);
|
|
297
|
+
const cursorXU = uniform(128);
|
|
298
|
+
const cursorYU = uniform(128);
|
|
299
|
+
const cursorVelXU = uniform(0);
|
|
300
|
+
const cursorVelYU = uniform(0);
|
|
301
|
+
const mouseActiveU = uniform(0);
|
|
302
|
+
const mouseRadSqU = uniform(900);
|
|
303
|
+
const maskPass = Fn(() => {
|
|
304
|
+
const idx = instanceIndex;
|
|
305
|
+
const j = idx.mod(gs);
|
|
306
|
+
const i = idx.div(gs);
|
|
307
|
+
const u = j.toFloat().add(float(.5)).div(float(N));
|
|
308
|
+
const v = i.toFloat().add(float(.5)).div(float(N));
|
|
309
|
+
const sdfUV = vec2(u.sub(centerXU).mul(aspectU).div(scaleU).add(float(.5)), v.sub(centerYU).div(scaleU).add(float(.5)));
|
|
310
|
+
const dist = sdfSampler(sdfUV).x;
|
|
311
|
+
const inside = dist.lessThan(float(0)).select(float(1), float(0));
|
|
312
|
+
maskBuf.element(idx).assign(vec4(inside, dist, float(0), float(0)));
|
|
313
|
+
})().compute(count, [256]);
|
|
314
|
+
const splatPass = Fn(() => {
|
|
315
|
+
const idx = instanceIndex;
|
|
316
|
+
const j = idx.mod(gs);
|
|
317
|
+
const i = idx.div(gs);
|
|
318
|
+
const mask = maskBuf.element(idx).x;
|
|
319
|
+
const cellX = j.toFloat().add(float(.5));
|
|
320
|
+
const cellY = i.toFloat().add(float(.5));
|
|
321
|
+
const dx = cellX.sub(emitXU);
|
|
322
|
+
const dy = cellY.sub(emitYU);
|
|
323
|
+
const distSq = dx.mul(dx).add(dy.mul(dy));
|
|
324
|
+
const radSq = emitRadU.mul(emitRadU).max(float(1));
|
|
325
|
+
const influence = distSq.negate().div(radSq).exp().mul(mask);
|
|
326
|
+
const cell = densA.element(idx);
|
|
327
|
+
const oldDens = cell.x;
|
|
328
|
+
const addDens = emitIntensityU.mul(influence).mul(dtU).mul(float(8));
|
|
329
|
+
const newDens = oldDens.add(addDens).min(float(1));
|
|
330
|
+
const rejuvenate = addDens.div(newDens.max(float(.001)));
|
|
331
|
+
densA.element(idx).assign(vec4(newDens, cell.y.mul(float(1).sub(rejuvenate.min(float(1)))), float(0), float(0)));
|
|
332
|
+
const vel = velA.element(idx);
|
|
333
|
+
const perpOff = dx.mul(perpDirXU).add(dy.mul(perpDirYU)).div(emitRadU.max(float(1)));
|
|
334
|
+
const vmSq = emitVelXU.mul(emitVelXU).add(emitVelYU.mul(emitVelYU)).max(float(1));
|
|
335
|
+
const tvx = emitVelXU.add(perpDirXU.mul(perpOff).mul(spreadFactorU).mul(vmSq.sqrt()));
|
|
336
|
+
const tvy = emitVelYU.add(perpDirYU.mul(perpOff).mul(spreadFactorU).mul(vmSq.sqrt()));
|
|
337
|
+
const br = influence.mul(dtU).mul(float(3)).min(float(1));
|
|
338
|
+
const gravForce = gravityU.mul(oldDens).mul(dtU).mul(float(N * .08)).mul(mask);
|
|
339
|
+
const cursorDX = cellX.sub(cursorXU);
|
|
340
|
+
const cursorDY = cellY.sub(cursorYU);
|
|
341
|
+
const cursorInf = cursorDX.mul(cursorDX).add(cursorDY.mul(cursorDY)).negate().div(mouseRadSqU.max(float(1))).exp().mul(mouseActiveU).mul(mask);
|
|
342
|
+
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)));
|
|
343
|
+
})().compute(count, [256]);
|
|
344
|
+
const curlPass = Fn(() => {
|
|
345
|
+
const idx = instanceIndex;
|
|
346
|
+
const ji = idx.mod(gs).toInt();
|
|
347
|
+
const ii = idx.div(gs).toInt();
|
|
348
|
+
const vL = velA.element(nidx(ii, ji, 0, -1));
|
|
349
|
+
const vR = velA.element(nidx(ii, ji, 0, 1));
|
|
350
|
+
const vU = velA.element(nidx(ii, ji, -1, 0));
|
|
351
|
+
const vD = velA.element(nidx(ii, ji, 1, 0));
|
|
352
|
+
const curl = vR.y.sub(vL.y).sub(vD.x.sub(vU.x)).mul(float(.5));
|
|
353
|
+
const vel = velA.element(idx);
|
|
354
|
+
velA.element(idx).assign(vec4(vel.x, vel.y, curl, float(0)));
|
|
355
|
+
})().compute(count, [256]);
|
|
356
|
+
const vorticityPass = Fn(() => {
|
|
357
|
+
const idx = instanceIndex;
|
|
358
|
+
const ji = idx.mod(gs).toInt();
|
|
359
|
+
const ii = idx.div(gs).toInt();
|
|
360
|
+
const cL = velA.element(nidx(ii, ji, 0, -1)).z.abs();
|
|
361
|
+
const cR = velA.element(nidx(ii, ji, 0, 1)).z.abs();
|
|
362
|
+
const cU = velA.element(nidx(ii, ji, -1, 0)).z.abs();
|
|
363
|
+
const cD = velA.element(nidx(ii, ji, 1, 0)).z.abs();
|
|
364
|
+
const cc = velA.element(idx).z;
|
|
365
|
+
const gx = cR.sub(cL).mul(float(.5));
|
|
366
|
+
const gy = cD.sub(cU).mul(float(.5));
|
|
367
|
+
const gl = gx.mul(gx).add(gy.mul(gy)).sqrt().max(float(1e-5));
|
|
368
|
+
const vel = velA.element(idx);
|
|
369
|
+
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)));
|
|
370
|
+
})().compute(count, [256]);
|
|
371
|
+
const divergencePass = Fn(() => {
|
|
372
|
+
const idx = instanceIndex;
|
|
373
|
+
const ji = idx.mod(gs).toInt();
|
|
374
|
+
const ii = idx.div(gs).toInt();
|
|
375
|
+
const jf = ji.toFloat();
|
|
376
|
+
const iF = ii.toFloat();
|
|
377
|
+
const selfMask = maskBuf.element(idx).x;
|
|
378
|
+
const selfVel = velA.element(idx);
|
|
379
|
+
const isWallL = jf.lessThan(float(.5)).or(maskBuf.element(nidx(ii, ji, 0, -1)).x.lessThan(float(.5)));
|
|
380
|
+
const isWallR = jf.greaterThan(float(N - 1.5)).or(maskBuf.element(nidx(ii, ji, 0, 1)).x.lessThan(float(.5)));
|
|
381
|
+
const isWallT = iF.lessThan(float(.5)).or(maskBuf.element(nidx(ii, ji, -1, 0)).x.lessThan(float(.5)));
|
|
382
|
+
const isWallB = iF.greaterThan(float(N - 1.5)).or(maskBuf.element(nidx(ii, ji, 1, 0)).x.lessThan(float(.5)));
|
|
383
|
+
const L = isWallL.select(selfVel.x.negate(), velA.element(nidx(ii, ji, 0, -1)).x);
|
|
384
|
+
const R = isWallR.select(selfVel.x.negate(), velA.element(nidx(ii, ji, 0, 1)).x);
|
|
385
|
+
const T = isWallT.select(selfVel.y.negate(), velA.element(nidx(ii, ji, -1, 0)).y);
|
|
386
|
+
const B = isWallB.select(selfVel.y.negate(), velA.element(nidx(ii, ji, 1, 0)).y);
|
|
387
|
+
const div$1 = R.sub(L).add(B.sub(T)).mul(float(.5)).mul(selfMask);
|
|
388
|
+
const oldP = pressDivBuf.element(idx).x.mul(float(PRESSURE_DISSIPATION)).mul(selfMask);
|
|
389
|
+
pressDivBuf.element(idx).assign(vec4(oldP, div$1, float(0), float(0)));
|
|
390
|
+
})().compute(count, [256]);
|
|
391
|
+
const jacobiPass = Fn(() => {
|
|
392
|
+
const idx = instanceIndex;
|
|
393
|
+
const ji = idx.mod(gs).toInt();
|
|
394
|
+
const ii = idx.div(gs).toInt();
|
|
395
|
+
const pL = pressDivBuf.element(nidx(ii, ji, 0, -1)).x;
|
|
396
|
+
const pR = pressDivBuf.element(nidx(ii, ji, 0, 1)).x;
|
|
397
|
+
const pU = pressDivBuf.element(nidx(ii, ji, -1, 0)).x;
|
|
398
|
+
const pD = pressDivBuf.element(nidx(ii, ji, 1, 0)).x;
|
|
399
|
+
const div$1 = pressDivBuf.element(idx).y;
|
|
400
|
+
pressDivBuf.element(idx).assign(vec4(pL.add(pR).add(pU).add(pD).sub(div$1).mul(float(.25)), div$1, float(0), float(0)));
|
|
401
|
+
})().compute(count, [256]);
|
|
402
|
+
const gradSubtractPass = Fn(() => {
|
|
403
|
+
const idx = instanceIndex;
|
|
404
|
+
const ji = idx.mod(gs).toInt();
|
|
405
|
+
const ii = idx.div(gs).toInt();
|
|
406
|
+
const pL = pressDivBuf.element(nidx(ii, ji, 0, -1)).x;
|
|
407
|
+
const pR = pressDivBuf.element(nidx(ii, ji, 0, 1)).x;
|
|
408
|
+
const pU = pressDivBuf.element(nidx(ii, ji, -1, 0)).x;
|
|
409
|
+
const pD = pressDivBuf.element(nidx(ii, ji, 1, 0)).x;
|
|
410
|
+
const vel = velA.element(idx);
|
|
411
|
+
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)));
|
|
412
|
+
})().compute(count, [256]);
|
|
413
|
+
const advectVelPass = Fn(() => {
|
|
414
|
+
const idx = instanceIndex;
|
|
415
|
+
const j = idx.mod(gs);
|
|
416
|
+
const i = idx.div(gs);
|
|
417
|
+
const vel = velA.element(idx);
|
|
418
|
+
const srcX = j.toFloat().sub(vel.x.mul(dtU)).clamp(float(0), float(N - 1));
|
|
419
|
+
const srcY = i.toFloat().sub(vel.y.mul(dtU)).clamp(float(0), float(N - 1));
|
|
420
|
+
const x0 = floor(srcX).clamp(float(0), float(N - 2));
|
|
421
|
+
const y0 = floor(srcY).clamp(float(0), float(N - 2));
|
|
422
|
+
const sx = srcX.sub(x0);
|
|
423
|
+
const sy = srcY.sub(y0);
|
|
424
|
+
const ix0 = x0.toInt();
|
|
425
|
+
const iy0 = y0.toInt();
|
|
426
|
+
const v00 = velA.element(iy0.mul(Ni).add(ix0));
|
|
427
|
+
const v10 = velA.element(iy0.mul(Ni).add(ix0.add(int(1))));
|
|
428
|
+
const v01 = velA.element(iy0.add(int(1)).mul(Ni).add(ix0));
|
|
429
|
+
const v11 = velA.element(iy0.add(int(1)).mul(Ni).add(ix0.add(int(1))));
|
|
430
|
+
const decay = float(1).add(float(VELOCITY_DISSIPATION).mul(dtU));
|
|
431
|
+
const mask = maskBuf.element(idx).x;
|
|
432
|
+
velB.element(idx).assign(vec4(mix(mix(v00.x, v10.x, sx), mix(v01.x, v11.x, sx), sy).div(decay).mul(mask), mix(mix(v00.y, v10.y, sx), mix(v01.y, v11.y, sx), sy).div(decay).mul(mask), float(0), float(0)));
|
|
433
|
+
})().compute(count, [256]);
|
|
434
|
+
const copyVelPass = Fn(() => {
|
|
435
|
+
const v = velB.element(instanceIndex);
|
|
436
|
+
velA.element(instanceIndex).assign(vec4(v.x, v.y, float(0), float(0)));
|
|
437
|
+
})().compute(count, [256]);
|
|
438
|
+
const advectDensPass = Fn(() => {
|
|
439
|
+
const idx = instanceIndex;
|
|
440
|
+
const j = idx.mod(gs);
|
|
441
|
+
const i = idx.div(gs);
|
|
442
|
+
const vel = velA.element(idx);
|
|
443
|
+
const srcX = j.toFloat().sub(vel.x.mul(dtU)).clamp(float(0), float(N - 1));
|
|
444
|
+
const srcY = i.toFloat().sub(vel.y.mul(dtU)).clamp(float(0), float(N - 1));
|
|
445
|
+
const x0 = floor(srcX).clamp(float(0), float(N - 2));
|
|
446
|
+
const y0 = floor(srcY).clamp(float(0), float(N - 2));
|
|
447
|
+
const sx = srcX.sub(x0);
|
|
448
|
+
const sy = srcY.sub(y0);
|
|
449
|
+
const ix0 = x0.toInt();
|
|
450
|
+
const iy0 = y0.toInt();
|
|
451
|
+
const d00 = densA.element(iy0.mul(Ni).add(ix0));
|
|
452
|
+
const d10 = densA.element(iy0.mul(Ni).add(ix0.add(int(1))));
|
|
453
|
+
const d01 = densA.element(iy0.add(int(1)).mul(Ni).add(ix0));
|
|
454
|
+
const d11 = densA.element(iy0.add(int(1)).mul(Ni).add(ix0.add(int(1))));
|
|
455
|
+
const dens = mix(mix(d00.x, d10.x, sx), mix(d01.x, d11.x, sx), sy);
|
|
456
|
+
const age = mix(mix(d00.y, d10.y, sx), mix(d01.y, d11.y, sx), sy);
|
|
457
|
+
const decay = float(1).add(densDissipU.mul(dtU));
|
|
458
|
+
const mask = maskBuf.element(idx).x;
|
|
459
|
+
densB.element(idx).assign(vec4(dens.div(decay).max(float(0)).mul(mask), age.add(dtU.mul(float(.4)).mul(colorDecayU)).min(float(1)), float(0), float(0)));
|
|
460
|
+
})().compute(count, [256]);
|
|
461
|
+
const copyDensPass = Fn(() => {
|
|
462
|
+
const d = densB.element(instanceIndex);
|
|
463
|
+
densA.element(instanceIndex).assign(vec4(d.x, d.y, float(0), float(0)));
|
|
464
|
+
})().compute(count, [256]);
|
|
465
|
+
const outputPass = Fn(() => {
|
|
466
|
+
const idx = instanceIndex;
|
|
467
|
+
const j = idx.mod(gs);
|
|
468
|
+
const i = idx.div(gs);
|
|
469
|
+
const d = densA.element(idx);
|
|
470
|
+
textureStore(outTexNode, uvec2(j, i), vec4(d.x, d.y, float(0), float(0))).toWriteOnly();
|
|
471
|
+
})().compute(count, [256]);
|
|
472
|
+
let lastTime = Date.now();
|
|
473
|
+
let prevMx = .5, prevMy = .5;
|
|
474
|
+
return {
|
|
475
|
+
outputs: { smokeTexture: outTex },
|
|
476
|
+
getComputeNodes: (params) => {
|
|
477
|
+
const now = Date.now();
|
|
478
|
+
const dt = Math.min((now - lastTime) / 1e3, .033);
|
|
479
|
+
lastTime = now;
|
|
480
|
+
if (dt < .001) return null;
|
|
481
|
+
const getNum = (key, fallback) => {
|
|
482
|
+
const def = uniforms[key];
|
|
483
|
+
if (!def) return fallback;
|
|
484
|
+
if (typeof def.getCpuValue === "function") {
|
|
485
|
+
const v$1 = def.getCpuValue();
|
|
486
|
+
return typeof v$1 === "number" ? v$1 : fallback;
|
|
487
|
+
}
|
|
488
|
+
const v = def.uniform?.value;
|
|
489
|
+
return typeof v === "number" ? v : fallback;
|
|
490
|
+
};
|
|
491
|
+
const speed = getNum("speed", 2);
|
|
492
|
+
const dirRad = getNum("direction", 0) * Math.PI / 180;
|
|
493
|
+
const spreadHalf = Math.min(89 * Math.PI / 180, getNum("spread", 60) * Math.PI / 360);
|
|
494
|
+
const centerPos = uniforms.center.uniform.value;
|
|
495
|
+
const cpx = typeof centerPos === "object" ? centerPos.x ?? .5 : .5;
|
|
496
|
+
const cpy = typeof centerPos === "object" ? centerPos.y ?? .5 : .5;
|
|
497
|
+
const aspect = typeof window !== "undefined" && renderer?.domElement ? renderer.domElement.width / Math.max(1, renderer.domElement.height) : 1;
|
|
498
|
+
dtU.value = dt;
|
|
499
|
+
centerXU.value = cpx;
|
|
500
|
+
centerYU.value = 1 - cpy;
|
|
501
|
+
scaleU.value = getNum("scale", 1);
|
|
502
|
+
aspectU.value = aspect;
|
|
503
|
+
const emitPos = uniforms.emitFrom?.uniform?.value;
|
|
504
|
+
const epx = typeof emitPos === "object" ? emitPos.x ?? .5 : .5;
|
|
505
|
+
const epy = typeof emitPos === "object" ? emitPos.y ?? .5 : .5;
|
|
506
|
+
emitXU.value = epx * N;
|
|
507
|
+
emitYU.value = (1 - epy) * N;
|
|
508
|
+
const velMag = speed * N * .15;
|
|
509
|
+
emitVelXU.value = Math.sin(dirRad) * velMag;
|
|
510
|
+
emitVelYU.value = -Math.cos(dirRad) * velMag;
|
|
511
|
+
perpDirXU.value = Math.cos(dirRad);
|
|
512
|
+
perpDirYU.value = Math.sin(dirRad);
|
|
513
|
+
spreadFactorU.value = Math.tan(spreadHalf);
|
|
514
|
+
emitRadU.value = getNum("emitRadius", .03) * N;
|
|
515
|
+
emitIntensityU.value = getNum("intensity", .8);
|
|
516
|
+
densDissipU.value = getNum("dissipation", .5);
|
|
517
|
+
curlStrengthU.value = getNum("detail", 30);
|
|
518
|
+
gravityU.value = getNum("gravity", .5);
|
|
519
|
+
colorDecayU.value = getNum("colorDecay", 1);
|
|
520
|
+
const mouseInf = getNum("mouseInfluence", .5);
|
|
521
|
+
const mouseRad = getNum("mouseRadius", .12);
|
|
522
|
+
const mx = params?.pointer?.x ?? prevMx;
|
|
523
|
+
const my = params?.pointer?.y ?? prevMy;
|
|
524
|
+
const mdx = mx - prevMx, mdy = my - prevMy;
|
|
525
|
+
prevMx = mx;
|
|
526
|
+
prevMy = my;
|
|
527
|
+
const cursorSpeed = Math.sqrt(mdx * mdx + mdy * mdy);
|
|
528
|
+
const mouseRadGrid = mouseRad * N;
|
|
529
|
+
mouseRadSqU.value = mouseRadGrid * mouseRadGrid;
|
|
530
|
+
if (cursorSpeed > 5e-4 && mouseInf > 0) {
|
|
531
|
+
cursorXU.value = mx * N;
|
|
532
|
+
cursorYU.value = my * N;
|
|
533
|
+
cursorVelXU.value = mdx * N * 15 * mouseInf;
|
|
534
|
+
cursorVelYU.value = mdy * N * 15 * mouseInf;
|
|
535
|
+
mouseActiveU.value = 1;
|
|
536
|
+
} else mouseActiveU.value = 0;
|
|
537
|
+
renderer.compute(maskPass);
|
|
538
|
+
renderer.compute(splatPass);
|
|
539
|
+
renderer.compute(curlPass);
|
|
540
|
+
renderer.compute(vorticityPass);
|
|
541
|
+
renderer.compute(divergencePass);
|
|
542
|
+
for (let iter = 0; iter < JACOBI_ITERS; iter++) renderer.compute(jacobiPass);
|
|
543
|
+
renderer.compute(gradSubtractPass);
|
|
544
|
+
renderer.compute(advectVelPass);
|
|
545
|
+
renderer.compute(copyVelPass);
|
|
546
|
+
renderer.compute(advectDensPass);
|
|
547
|
+
renderer.compute(copyDensPass);
|
|
548
|
+
return [outputPass];
|
|
549
|
+
}
|
|
550
|
+
};
|
|
551
|
+
},
|
|
552
|
+
fragmentNode: ({ uniforms, onBeforeRender, onCleanup, computeOutputs }) => {
|
|
553
|
+
const shapeSdfUrl = uniforms.shapeSdfUrl.uniform.value;
|
|
554
|
+
const initialConfig = (() => {
|
|
555
|
+
const val = uniforms.shape.uniform.value;
|
|
556
|
+
try {
|
|
557
|
+
return JSON.parse(val);
|
|
558
|
+
} catch {
|
|
559
|
+
return {
|
|
560
|
+
type: "circleSDF",
|
|
561
|
+
radius: .35
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
})();
|
|
565
|
+
let sdfSampler;
|
|
566
|
+
if (shapeSdfUrl) sdfSampler = createSvgSdfSampler(shapeSdfUrl, onBeforeRender, onCleanup);
|
|
567
|
+
else sdfSampler = createAnalyticSdfSampler(uniforms.shapeType.uniform.value || initialConfig.type || "circleSDF", initialConfig, uniforms.shape, onBeforeRender);
|
|
568
|
+
let smokeField;
|
|
569
|
+
const N = computeOutputs?.smokeTexture ? GRID_GPU : GRID_CPU;
|
|
570
|
+
if (computeOutputs?.smokeTexture) smokeField = texture(computeOutputs.smokeTexture);
|
|
571
|
+
else {
|
|
572
|
+
const cpuN = GRID_CPU;
|
|
573
|
+
const cells = cpuN * cpuN;
|
|
574
|
+
const texData = new Float32Array(cells * 4);
|
|
575
|
+
const smokeTex = new DataTexture(texData, cpuN, cpuN, RGBAFormat, FloatType);
|
|
576
|
+
smokeTex.magFilter = LinearFilter$1;
|
|
577
|
+
smokeTex.minFilter = LinearFilter$1;
|
|
578
|
+
smokeTex.needsUpdate = true;
|
|
579
|
+
smokeField = texture(smokeTex);
|
|
580
|
+
const cpuGetNum = (key, fallback) => {
|
|
581
|
+
const def = uniforms[key];
|
|
582
|
+
if (!def) return fallback;
|
|
583
|
+
if (typeof def.getCpuValue === "function") {
|
|
584
|
+
const v$1 = def.getCpuValue();
|
|
585
|
+
return typeof v$1 === "number" ? v$1 : fallback;
|
|
586
|
+
}
|
|
587
|
+
const v = def.uniform?.value;
|
|
588
|
+
return typeof v === "number" ? v : fallback;
|
|
589
|
+
};
|
|
590
|
+
let lt = Date.now();
|
|
591
|
+
onBeforeRender(() => {
|
|
592
|
+
const now = Date.now();
|
|
593
|
+
const dt = Math.min((now - lt) / 1e3, .033);
|
|
594
|
+
lt = now;
|
|
595
|
+
if (dt < .001) return;
|
|
596
|
+
const ei = cpuGetNum("intensity", .8);
|
|
597
|
+
const dd = cpuGetNum("dissipation", .5);
|
|
598
|
+
const ep = uniforms.emitFrom?.uniform?.value;
|
|
599
|
+
const ex = (typeof ep === "object" ? ep.x ?? .5 : .5) * cpuN;
|
|
600
|
+
const ey = (1 - (typeof ep === "object" ? ep.y ?? .5 : .5)) * cpuN;
|
|
601
|
+
const er = cpuGetNum("emitRadius", .03) * cpuN;
|
|
602
|
+
for (let i = 0; i < cpuN; i++) for (let j = 0; j < cpuN; j++) {
|
|
603
|
+
const idx = i * cpuN + j;
|
|
604
|
+
const dx = j + .5 - ex, dy = i + .5 - ey;
|
|
605
|
+
const inf = Math.exp(-(dx * dx + dy * dy) / Math.max(1, er * er));
|
|
606
|
+
texData[idx * 4] = Math.max(0, (texData[idx * 4] + ei * inf * dt * 8) / (1 + dd * dt));
|
|
607
|
+
texData[idx * 4 + 1] = Math.min(1, texData[idx * 4 + 1] + dt * .4 * cpuGetNum("colorDecay", 1));
|
|
608
|
+
}
|
|
609
|
+
smokeTex.needsUpdate = true;
|
|
610
|
+
});
|
|
611
|
+
onCleanup(() => {
|
|
612
|
+
smokeTex.dispose();
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
const uv$1 = screenUV;
|
|
616
|
+
const aspect = viewportSize.x.div(viewportSize.y);
|
|
617
|
+
const centerPos = vec2(uniforms.center.uniform.x, uniforms.center.uniform.y.oneMinus());
|
|
618
|
+
const scale = uniforms.scale.uniform;
|
|
619
|
+
const sdfUV = vec2(uv$1.x.sub(centerPos.x).mul(aspect).div(scale).add(float(.5)), uv$1.y.sub(centerPos.y).div(scale).add(float(.5)));
|
|
620
|
+
const shapeMask = sdfSampler(sdfUV).x.negate().mul(float(N * 4)).clamp(float(0), float(1));
|
|
621
|
+
let smokeDensity, smokeAge;
|
|
622
|
+
if (computeOutputs?.smokeTexture) {
|
|
623
|
+
const px = float(1 / GRID_GPU);
|
|
624
|
+
const s0 = smokeField.sample(screenUV);
|
|
625
|
+
const s1 = smokeField.sample(screenUV.add(vec2(px, float(0))));
|
|
626
|
+
const s2 = smokeField.sample(screenUV.add(vec2(float(0), px)));
|
|
627
|
+
const s3 = smokeField.sample(screenUV.add(vec2(px.negate(), float(0))));
|
|
628
|
+
const s4 = smokeField.sample(screenUV.add(vec2(float(0), px.negate())));
|
|
629
|
+
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)));
|
|
630
|
+
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)));
|
|
631
|
+
} else {
|
|
632
|
+
const s = smokeField.sample(screenUV);
|
|
633
|
+
smokeDensity = s.x;
|
|
634
|
+
smokeAge = s.y;
|
|
635
|
+
}
|
|
636
|
+
const smokeColor = mixColors(uniforms.colorA.uniform, uniforms.colorB.uniform, smokeAge, uniforms.colorSpace.uniform.value);
|
|
637
|
+
return vec4(smokeColor.x, smokeColor.y, smokeColor.z, smokeColor.w.mul(smokeDensity).mul(shapeMask));
|
|
638
|
+
}
|
|
639
|
+
};
|
|
640
|
+
var SmokeFill_default = componentDefinition;
|
|
641
|
+
export { componentDefinition as n, SmokeFill_default as t };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as needsVideoCanvasWorkaround } from "./browser-
|
|
1
|
+
import { t as needsVideoCanvasWorkaround } from "./browser-D8zonASQ.js";
|
|
2
2
|
import { CanvasTexture, SRGBColorSpace, VideoTexture } from "three/webgpu";
|
|
3
3
|
import { float, max, min, or, screenUV, select, step, texture, uniform, vec2, vec4, viewportSize } from "three/tsl";
|
|
4
4
|
const componentDefinition = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as needsVideoCanvasWorkaround } from "./browser-
|
|
1
|
+
import { t as needsVideoCanvasWorkaround } from "./browser-D8zonASQ.js";
|
|
2
2
|
import { CanvasTexture, SRGBColorSpace, VideoTexture } from "three/webgpu";
|
|
3
3
|
import { float, max, min, or, screenUV, select, step, texture, uniform, vec2, vec4, viewportSize } from "three/tsl";
|
|
4
4
|
const componentDefinition = {
|