@mkbabb/glass-ui 4.1.0 → 4.2.0
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/{CardAction-8whJrLWt.js → CardAction-DlVP2evz.js} +58 -54
- package/dist/{CommandShortcut-D3yxgHNn.js → CommandShortcut-By-VQcLO.js} +3 -3
- package/dist/{ConfiguratorRow-CaP7U3ZA.js → ConfiguratorRow-YMXdINHx.js} +3 -3
- package/dist/{ContextMenuContent-B3ZsheLV.js → ContextMenuContent-CMWn6huB.js} +1 -1
- package/dist/{ContextMenuSubContent-DDRID3qC.js → ContextMenuSubContent-DvwWCUc0.js} +1 -1
- package/dist/{DataTable-Bc9kUtu_.js → DataTable-C4tG3eIJ.js} +4 -4
- package/dist/DialogContent-D8U9ZfWS.js +121 -0
- package/dist/{DialogScrollContent-TTuovQst.js → DialogScrollContent-BMekN7gq.js} +1 -1
- package/dist/{FadingScroll-DLRbH5Xr.js → FadingScroll-P8B30rAD.js} +1 -1
- package/dist/{HoverCardContent-Bel1gdLZ.js → HoverCardContent-DAmGYglo.js} +1 -1
- package/dist/{HoverPopover-BcIxvyqZ.js → HoverPopover-DYpBOzzF.js} +1 -1
- package/dist/{IconChip-DhbdGdFQ.js → IconChip-CQa7XZYc.js} +7 -5
- package/dist/{IconTooltip-B0zimd2H.js → IconTooltip-_df8M3xm.js} +1 -1
- package/dist/{Input-Cg9DF62r.js → Input-CyU4_hIC.js} +2 -2
- package/dist/{MetricBadge-RHdBP72w.js → MetricBadge-DQt_dGah.js} +1 -1
- package/dist/{Notification-CphK7AAm.js → Notification-BlSPJhtZ.js} +1 -1
- package/dist/{NumberFieldContent-D8cXeyO4.js → NumberFieldContent-Z3VxGu_6.js} +3 -3
- package/dist/PagerDots-CYlqVFd4.js +196 -0
- package/dist/PaperBackdrop-DYWgrnh8.js +42 -0
- package/dist/{PopoverContent-DL7E6vJP.js → PopoverContent-BuKyHZSz.js} +2 -2
- package/dist/{Progress-CnqB7gLm.js → Progress-C9SsdwIZ.js} +1 -1
- package/dist/{ScrollingText-CTZbA_cG.js → ScrollingText-DY3W1Jfh.js} +2 -2
- package/dist/{SelectScrollDownButton-DAKCBEdW.js → SelectScrollDownButton-3mFHX_R-.js} +15 -12
- package/dist/{Switch-B8RscmRu.js → Switch-uf-UKPA2.js} +1 -1
- package/dist/{Toaster-D9qIHjBI.js → Toaster-ozrsR4mP.js} +1 -1
- package/dist/{ToggleGroupItem-BLtr3TJq.js → ToggleGroupItem-BpzaVzNm.js} +4 -4
- package/dist/{TooltipProvider-BJ_Y5EGX.js → TooltipProvider-QQVM_80r.js} +1 -1
- package/dist/animated-digit.js +2 -2
- package/dist/api/index.d.ts +1 -0
- package/dist/api/types-extra.d.ts +3 -1
- package/dist/api.js +2 -2
- package/dist/aurora.js +163 -131
- package/dist/badge-Bt14yURi.js +72 -0
- package/dist/badge.js +1 -1
- package/dist/border-progress.js +1 -1
- package/dist/button-D1W9PrzI.js +130 -0
- package/dist/button.js +1 -1
- package/dist/canvas.js +1 -1
- package/dist/card.js +1 -1
- package/dist/carousel.js +227 -98
- package/dist/chipVariants-BJQ0I2kB.js +18 -0
- package/dist/collapsible.js +1 -1
- package/dist/color.js +1 -1
- package/dist/command.js +1 -1
- package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
- package/dist/components/custom/aurora/composables/uniformBridgeWGPU.d.ts +1 -1
- package/dist/components/custom/aurora/constants/presets.d.ts +29 -0
- package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -1
- package/dist/components/custom/aurora/index.d.ts +1 -1
- package/dist/components/custom/concentric/Concentric.vue.d.ts +15 -12
- package/dist/components/custom/concentric/composables/concentricGLSetup.d.ts +8 -3
- package/dist/components/custom/concentric/composables/concentricWGPUSetup.d.ts +8 -4
- package/dist/components/custom/concentric/composables/levelField.d.ts +50 -0
- package/dist/components/custom/concentric/composables/uniformBridgeWGPU.d.ts +7 -4
- package/dist/components/custom/concentric/composables/useConcentric.d.ts +3 -3
- package/dist/components/custom/concentric/constants.d.ts +62 -41
- package/dist/components/custom/concentric/index.d.ts +2 -2
- package/dist/components/custom/concentric/shaders/concentric.glsl.d.ts +2 -2
- package/dist/components/custom/concentric/shaders/concentric.wgsl.d.ts +1 -1
- package/dist/components/custom/configurator/Configurator.vue.d.ts +23 -2
- package/dist/components/custom/configurator/index.d.ts +1 -1
- package/dist/components/custom/dock/DockDropdownTrigger.vue.d.ts +4 -3
- package/dist/components/custom/dock/DockIconButton.vue.d.ts +10 -0
- package/dist/components/custom/dock/DockPopoverTrigger.vue.d.ts +19 -0
- package/dist/components/custom/dock/DockStack.vue.d.ts +35 -22
- package/dist/components/custom/dock/GlassDock.vue.d.ts +19 -3
- package/dist/components/custom/dock/composables/dockMorphContext.d.ts +18 -32
- package/dist/components/custom/dock/composables/dockMorphMeasure.d.ts +76 -145
- package/dist/components/custom/dock/composables/index.d.ts +1 -0
- package/dist/components/custom/dock/composables/railProjection.d.ts +45 -0
- package/dist/components/custom/dock/composables/useDockContextSilhouette.d.ts +192 -0
- package/dist/components/custom/dock/composables/useDockFission.d.ts +158 -0
- package/dist/components/custom/dock/composables/useDockItemDrag.d.ts +18 -0
- package/dist/components/custom/dock/composables/useDockShellProps.d.ts +38 -0
- package/dist/components/custom/dock/constants.d.ts +14 -3
- package/dist/components/custom/dock/index.d.ts +3 -0
- package/dist/components/custom/dot-flow-field/composables/flowField.d.ts +21 -0
- package/dist/components/custom/dot-flow-field/composables/flowGLProgram.d.ts +8 -0
- package/dist/components/custom/dot-flow-field/composables/flowSetupGL.d.ts +9 -0
- package/dist/components/custom/dot-flow-field/composables/flowSetupGLFlow.d.ts +12 -0
- package/dist/components/custom/dot-flow-field/composables/flowSetupWGPU.d.ts +7 -0
- package/dist/components/custom/dot-flow-field/composables/uniformBridgeWGPU.d.ts +28 -2
- package/dist/components/custom/dot-flow-field/composables/useFlowParticles.d.ts +18 -17
- package/dist/components/custom/dot-flow-field/constants.d.ts +51 -0
- package/dist/components/custom/dot-flow-field/index.d.ts +1 -1
- package/dist/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.d.ts +1 -1
- package/dist/components/custom/dot-flow-field/shaders/flow-field.glsl.d.ts +29 -0
- package/dist/components/custom/dot-flow-field/shaders/flow-field.render.wgsl.d.ts +2 -1
- package/dist/components/custom/dot-matrix/composables/uniformBridgeWGPU.d.ts +10 -1
- package/dist/components/custom/dot-matrix/composables/useDotSphere.d.ts +7 -0
- package/dist/components/custom/dot-matrix/constants.d.ts +14 -0
- package/dist/components/custom/dot-matrix/index.d.ts +1 -1
- package/dist/components/custom/dot-matrix/shaders/dot-matrix.glsl.d.ts +2 -2
- package/dist/components/custom/dot-matrix/shaders/dot-matrix.wgsl.d.ts +1 -1
- package/dist/components/custom/fourier-field/FourierField.vue.d.ts +4 -0
- package/dist/components/custom/fourier-field/composables/fourierFieldGLSetup.d.ts +9 -0
- package/dist/components/custom/fourier-field/composables/fourierFieldWGPUSetup.d.ts +11 -0
- package/dist/components/custom/fourier-field/composables/uniformBridgeWGPU.d.ts +16 -1
- package/dist/components/custom/fourier-field/composables/useFourierField.d.ts +22 -1
- package/dist/components/custom/fourier-field/constants.d.ts +53 -0
- package/dist/components/custom/fourier-field/shaders/fourier-field.glsl.d.ts +1 -1
- package/dist/components/custom/fourier-field/shaders/fourier-field.render.wgsl.d.ts +1 -1
- package/dist/components/custom/goo-blob/composables/easing.d.ts +1 -0
- package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +1 -0
- package/dist/components/custom/goo-blob/constants.d.ts +26 -1
- package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +1 -1
- package/dist/components/custom/goo-blob/shaders/metaball.wgsl.d.ts +1 -1
- package/dist/components/custom/goo-blob/types.d.ts +50 -1
- package/dist/components/custom/goo-dot-matrix/composables/gooDotSetup.d.ts +32 -3
- package/dist/components/custom/goo-dot-matrix/composables/uniformBridgeWGPU.d.ts +14 -4
- package/dist/components/custom/goo-dot-matrix/constants.d.ts +55 -16
- package/dist/components/custom/goo-dot-matrix/index.d.ts +1 -1
- package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.frag.d.ts +2 -0
- package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.wgsl.d.ts +1 -0
- package/dist/components/custom/goo-filter/GooFilter.vue.d.ts +22 -0
- package/dist/components/custom/goo-filter/index.d.ts +1 -0
- package/dist/components/custom/handmark/brush.d.ts +17 -17
- package/dist/components/custom/handmark/constants.d.ts +28 -8
- package/dist/components/custom/handmark/geometry.d.ts +34 -1
- package/dist/components/custom/handmark/index.d.ts +1 -1
- package/dist/components/custom/icon-chip/types.d.ts +10 -0
- package/dist/components/custom/paper-backdrop/PaperBackdrop.vue.d.ts +18 -0
- package/dist/components/custom/paper-grid/composables/paperGrid.d.ts +44 -29
- package/dist/components/custom/paper-grid/composables/paperGridGLSetup.d.ts +2 -0
- package/dist/components/custom/paper-grid/composables/paperGridWGPUSetup.d.ts +3 -1
- package/dist/components/custom/paper-grid/composables/uniformBridgeWGPU.d.ts +2 -2
- package/dist/components/custom/paper-grid/constants.d.ts +44 -6
- package/dist/components/custom/paper-grid/index.d.ts +2 -2
- package/dist/components/custom/paper-grid/shaders/paper-grid.glsl.d.ts +1 -1
- package/dist/components/custom/paper-grid/shaders/paper-grid.wgsl.d.ts +1 -1
- package/dist/components/custom/selectable-chip/chipVariants.d.ts +39 -0
- package/dist/components/custom/selectable-chip/selectableChipVariants.d.ts +12 -20
- package/dist/components/custom/tabs/constants.d.ts +16 -8
- package/dist/components/custom/timeline/ScrubberTimeline.vue.d.ts +16 -0
- package/dist/components/custom/timeline/geometry.d.ts +0 -8
- package/dist/components/custom/toggle-chip/index.d.ts +15 -4
- package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +12 -10
- package/dist/components/ui/_shared/useSurfaceAxis.d.ts +17 -3
- package/dist/components/ui/badge/Badge.vue.d.ts +14 -0
- package/dist/components/ui/badge/index.d.ts +1 -0
- package/dist/components/ui/button/Button.vue.d.ts +1 -0
- package/dist/components/ui/card/Card.vue.d.ts +1 -1
- package/dist/components/ui/card/ScrollCard.vue.d.ts +1 -1
- package/dist/components/ui/carousel/CarouselContent.vue.d.ts +2 -4
- package/dist/components/ui/dialog/DialogContent.vue.d.ts +9 -0
- package/dist/components/ui/drawer/Drawer.vue.d.ts +33 -14
- package/dist/components/ui/drawer/constants.d.ts +8 -6
- package/dist/components/ui/drawer/index.d.ts +12 -2
- package/dist/components/ui/select/SelectContent.vue.d.ts +9 -0
- package/dist/components/ui/slider/Slider.vue.d.ts +9 -0
- package/dist/composables/dom/index.d.ts +1 -0
- package/dist/composables/dom/useDragVelocity.d.ts +46 -0
- package/dist/composables/glass/wave/index.d.ts +4 -0
- package/dist/composables/glass/wave/waveField.d.ts +115 -0
- package/dist/composables/glass/wave/waveField.glsl.d.ts +1 -0
- package/dist/composables/glass/wave/waveField.wgsl.d.ts +1 -0
- package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +95 -2
- package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +40 -2
- package/dist/composables/glass/webgpu/index.d.ts +1 -0
- package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +37 -0
- package/dist/composables/glass/webgpu/useWebGPUCanvas.d.ts +49 -2
- package/dist/composables/glass/webgpu/webgpuDevice.d.ts +1 -1
- package/dist/composables/motion/core/index.d.ts +4 -0
- package/dist/composables/motion/core/useHaptic.d.ts +48 -0
- package/dist/composables/motion/core/writeVelocityWeight.d.ts +31 -0
- package/dist/composables/motion/index.d.ts +2 -0
- package/dist/composables/motion/springPresets.d.ts +16 -17
- package/dist/composables/motion/suite.d.ts +2 -2
- package/dist/composables/motion/useBloomUp.d.ts +97 -0
- package/dist/composables/motion/useCelebrationBurst.d.ts +50 -0
- package/dist/composables/motion/useDockCtaReceive.d.ts +10 -28
- package/dist/composables/motion/useGooMorph.d.ts +72 -0
- package/dist/composables/motion/useLiquidFlex.d.ts +18 -0
- package/dist/composables/motion/useLiquidMorph.d.ts +108 -0
- package/dist/composables/motion/useLiquidPress.d.ts +12 -0
- package/dist/composables/motion/useLiquidReveal.d.ts +7 -4
- package/dist/composables/motion/useMorphField.d.ts +157 -0
- package/dist/composables/motion/useScrollPin.d.ts +49 -0
- package/dist/composables/motion/useScrollScene.d.ts +67 -0
- package/dist/concentric.js +532 -563
- package/dist/configurator.js +2 -2
- package/dist/confirm-dialog.js +3 -3
- package/dist/constellation.js +4 -4
- package/dist/context-menu.js +2 -2
- package/dist/controls.js +2 -2
- package/dist/createCanvasLifecycle-CuCrGRfq.js +173 -0
- package/dist/dark.js +1 -1
- package/dist/data-table.js +1 -1
- package/dist/deck.js +1 -1
- package/dist/dialog.js +3 -3
- package/dist/dock.js +1163 -618
- package/dist/dockContext-gFVS2gMg.js +18 -0
- package/dist/dom.js +7 -6
- package/dist/dot-flow-field.js +1114 -523
- package/dist/dot-matrix.js +348 -204
- package/dist/drawer.js +106 -96
- package/dist/{dropdown-menu-aJmV5SqE.js → dropdown-menu-CCfcCQ68.js} +3 -3
- package/dist/dropdown-menu.js +1 -1
- package/dist/easing.js +3 -3
- package/dist/expandable-container.js +2 -2
- package/dist/fading-scroll.js +1 -1
- package/dist/forms.js +6 -6
- package/dist/fourier-field.js +441 -197
- package/dist/fourier-math.js +1 -1
- package/dist/glass-panel.js +2 -2
- package/dist/glass-ui.css +1 -1
- package/dist/glass-ui.js +139 -135
- package/dist/goo-blob.js +11 -9
- package/dist/goo-dot-matrix.js +418 -198
- package/dist/handmark.js +137 -94
- package/dist/header-ribbon.js +1 -1
- package/dist/hover-card.js +1 -1
- package/dist/hover-popover.js +1 -1
- package/dist/icon-chip.js +1 -1
- package/dist/icon-tooltip.js +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/instrument-chassis.js +1 -1
- package/dist/keyboard.js +1 -1
- package/dist/label.js +1 -1
- package/dist/labeled-field.js +7 -7
- package/dist/metric-badge.js +1 -1
- package/dist/metric-cell.js +1 -1
- package/dist/metric-stack.js +1 -1
- package/dist/motion-core.js +42 -39
- package/dist/motion-curves.js +20 -14
- package/dist/motion.js +226 -26
- package/dist/notification.js +1 -1
- package/dist/number-field.js +1 -1
- package/dist/pager-dots.js +1 -1
- package/dist/paper-backdrop.js +1 -1
- package/dist/paper-grid.js +315 -342
- package/dist/paperGrid-CXCSMbZ1.js +191 -0
- package/dist/popover.js +1 -1
- package/dist/{presets-CvOUqtdY.js → presets-QvYgnFIZ.js} +13 -12
- package/dist/progress.js +1 -1
- package/dist/pulse.js +1 -1
- package/dist/reactive.js +2 -2
- package/dist/{resolveCanvasColor-yPyIpJt9.js → resolveCanvasColor-DsSJk06I.js} +5 -5
- package/dist/scrolling-text.js +1 -1
- package/dist/search.js +7 -7
- package/dist/select.js +3 -3
- package/dist/selectable-chip.js +18 -35
- package/dist/separator.js +1 -1
- package/dist/{sheet-B2flBfLH.js → sheet-DUCIoOe0.js} +3 -3
- package/dist/sheet.js +1 -1
- package/dist/sidebar.js +1 -1
- package/dist/slider-CcICPe3u.js +149 -0
- package/dist/slider.js +1 -1
- package/dist/sortable-list.js +3 -3
- package/dist/{spectrum-walk-BVzA7Biz.js → spectrum-walk-cBNSx_zm.js} +1 -1
- package/dist/springPresets-DfoQ6XRY.js +64 -0
- package/dist/stacked-icons.js +54 -39
- package/dist/styles/cards.css +202 -2
- package/dist/styles/components.css +1 -3
- package/dist/styles/configurator.css +172 -7
- package/dist/styles/critical-partition.mjs +35 -2
- package/dist/styles/deferred.css +2 -0
- package/dist/styles/dock/adaptive-legibility.css +119 -0
- package/dist/styles/dock/density.css +18 -10
- package/dist/styles/dock/fission-bridge.css +552 -0
- package/dist/styles/dock/layers.css +88 -124
- package/dist/styles/dock/morph-bridge.css +15 -2
- package/dist/styles/dock/morph.css +45 -114
- package/dist/styles/dock/shape.css +137 -11
- package/dist/styles/dock/shell.css +1 -3
- package/dist/styles/dock/stack-rail.css +95 -7
- package/dist/styles/dock-controls/icon-button.css +34 -2
- package/dist/styles/dock-controls/triggers.css +23 -1
- package/dist/styles/dock-controls.css +18 -0
- package/dist/styles/dock.css +16 -1
- package/dist/styles/drawer.css +166 -0
- package/dist/styles/glass/glass-atom.css +244 -0
- package/dist/styles/glass/glass-capsule.css +143 -0
- package/dist/styles/glass/glass-chip.css +215 -0
- package/dist/styles/glass/liquid-enter.css +252 -0
- package/dist/styles/glass/liquid-morph.css +850 -0
- package/dist/styles/glass/material.css +70 -1
- package/dist/styles/glass/reveal.css +22 -2
- package/dist/styles/glass/rim.css +13 -1
- package/dist/styles/glass/surfaces.css +18 -8
- package/dist/styles/glass.css +11 -0
- package/dist/styles/icon-chip.css +45 -0
- package/dist/styles/index.css +11 -0
- package/dist/styles/jubilance.css +65 -0
- package/dist/styles/motion/morph-field.css +229 -0
- package/dist/styles/paper.css +230 -14
- package/dist/styles/scroll-choreography.css +135 -78
- package/dist/styles/segmented-tabs.css +85 -51
- package/dist/styles/select.css +151 -0
- package/dist/styles/tokens/color-radius.css +1 -1
- package/dist/styles/tokens/dark-arm.css +57 -8
- package/dist/styles/tokens/glass-deep.css +8 -4
- package/dist/styles/tokens/glass-fx.css +80 -2
- package/dist/styles/tokens/glass.css +140 -8
- package/dist/styles/tokens/light-dark.css +2 -2
- package/dist/styles/tokens/property-regs.css +144 -0
- package/dist/styles/tokens/scale-paper.css +20 -8
- package/dist/styles/tokens/scheme-motion.css +92 -157
- package/dist/styles/tokens/scheme-spring.css +239 -0
- package/dist/styles/tokens/scroll-tokens.css +15 -15
- package/dist/styles/tokens/shadow.css +73 -13
- package/dist/styles/tokens.css +9 -2
- package/dist/styles/utilities/btn.css +70 -0
- package/dist/switch.js +1 -1
- package/dist/tabs.js +198 -181
- package/dist/timeline.js +241 -206
- package/dist/toast.js +1 -1
- package/dist/toggle-chip.js +14 -41
- package/dist/toggle-group.js +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/{uniformBridgeWGPU-CtAKl45L.js → uniformBridgeWGPU-BCse1SHU.js} +191 -127
- package/dist/{useAnimatedNumber-CLrxicG9.js → useAnimatedNumber-BntskVdQ.js} +1 -1
- package/dist/{useConfiguratorState-4xblKfwd.js → useConfiguratorState-22BcULzF.js} +37 -35
- package/dist/useDockCtaReceive-DX7RDb6_.js +88 -0
- package/dist/{useDragMorph-BUgAC-zK.js → useDragMorph-DGLSewwB.js} +2 -2
- package/dist/useDragVelocity-CjcfX3dA.js +57 -0
- package/dist/useGooMorph-Cs13NgYL.js +104 -0
- package/dist/useGpuSubstrate-Ceet70xq.js +347 -0
- package/dist/{useViewTransition-CUI1nAgn.js → useHaptic-CPz5BT9I.js} +40 -1
- package/dist/{useLiquidFlex-UmA6LMZu.js → useLiquidFlex-Cc6PjVJD.js} +8 -3
- package/dist/useLiquidPress-CtOQ8Z0_.js +43 -0
- package/dist/useMorphField-ogBM7ubT.js +141 -0
- package/dist/{useScrollChrome-D66AVP7C.js → useScrollChrome-JuImi1DM.js} +2 -2
- package/dist/{useSpringMount-BWDnKIwh.js → useSpringMount-DFxtzmkR.js} +1 -1
- package/dist/{useSpringPress-B1-Czp-V.js → useSpringPress-VM9RgVq3.js} +1 -1
- package/dist/{useSurfaceAxis-g0NloYEF.js → useSurfaceAxis-Ci7Dnaw2.js} +1 -1
- package/dist/{useTouchGate-CBZTD4SD.js → useTouchGate-B1Lf9XqN.js} +1 -1
- package/dist/virtual.js +1 -1
- package/dist/watercolor-dot.js +16 -26
- package/dist/writeVelocityWeight-Bh83xZfs.js +19 -0
- package/package.json +14 -3
- package/src/styles/cards.css +202 -2
- package/src/styles/configurator.css +172 -7
- package/src/styles/critical-partition.mjs +35 -2
- package/src/styles/dock/adaptive-legibility.css +119 -0
- package/src/styles/dock/density.css +18 -10
- package/src/styles/dock/fission-bridge.css +552 -0
- package/src/styles/dock/layers.css +88 -124
- package/src/styles/dock/morph-bridge.css +15 -2
- package/src/styles/dock/morph.css +45 -114
- package/src/styles/dock/shape.css +137 -11
- package/src/styles/dock/shell.css +1 -3
- package/src/styles/dock/stack-rail.css +95 -7
- package/src/styles/dock-controls/icon-button.css +34 -2
- package/src/styles/dock-controls/triggers.css +23 -1
- package/src/styles/dock-controls.css +18 -0
- package/src/styles/dock.css +16 -1
- package/src/styles/drawer.css +164 -0
- package/src/styles/glass/glass-atom.css +244 -0
- package/src/styles/glass/glass-capsule.css +143 -0
- package/src/styles/glass/glass-chip.css +215 -0
- package/src/styles/glass/liquid-enter.css +252 -0
- package/src/styles/glass/liquid-morph.css +850 -0
- package/src/styles/glass/material.css +70 -1
- package/src/styles/glass/reveal.css +22 -2
- package/src/styles/glass/rim.css +13 -1
- package/src/styles/glass/surfaces.css +18 -8
- package/src/styles/glass.css +11 -0
- package/src/styles/icon-chip.css +45 -0
- package/src/styles/index.css +11 -0
- package/src/styles/jubilance.css +65 -0
- package/src/styles/motion/morph-field.css +229 -0
- package/src/styles/paper.css +230 -14
- package/src/styles/scroll-choreography.css +135 -78
- package/src/styles/segmented-tabs.css +85 -47
- package/src/styles/select.css +151 -0
- package/src/styles/tokens/color-radius.css +1 -1
- package/src/styles/tokens/dark-arm.css +57 -8
- package/src/styles/tokens/glass-deep.css +8 -4
- package/src/styles/tokens/glass-fx.css +80 -2
- package/src/styles/tokens/glass.css +140 -8
- package/src/styles/tokens/light-dark.css +2 -2
- package/src/styles/tokens/property-regs.css +144 -0
- package/src/styles/tokens/scale-paper.css +20 -8
- package/src/styles/tokens/scheme-motion.css +92 -157
- package/src/styles/tokens/scheme-spring.css +239 -0
- package/src/styles/tokens/scroll-tokens.css +15 -15
- package/src/styles/tokens/shadow.css +73 -13
- package/src/styles/tokens.css +9 -2
- package/src/styles/utilities/btn.css +70 -0
- package/dist/DialogContent-6JtTB5x2.js +0 -106
- package/dist/PagerDots-Cjx96la-.js +0 -98
- package/dist/PaperBackdrop-CqwjnfLv.js +0 -31
- package/dist/badge-D9XWW4GT.js +0 -53
- package/dist/button-5dY1Dvhd.js +0 -125
- package/dist/components/custom/concentric/composables/ringField.d.ts +0 -85
- package/dist/createCanvasLifecycle-Gh45Ce-p.js +0 -93
- package/dist/dockContext-BNfyPLe9.js +0 -17
- package/dist/slider-2A0rPn79.js +0 -142
- package/dist/springPresets-Ce7OYCm9.js +0 -46
- package/dist/useDockCtaReceive-DfFkmgL1.js +0 -82
- package/dist/useGpuSubstrate-4pTcp6mX.js +0 -294
- package/dist/useLiquidPress-BooG97RY.js +0 -39
- /package/dist/{CollapsibleContent-68dEXIAl.js → CollapsibleContent-D7UNsXQr.js} +0 -0
- /package/dist/{DialogFooter-9phqcRIS.js → DialogFooter-DoLy0ewI.js} +0 -0
- /package/dist/{InstrumentChassis-CxsHSyMj.js → InstrumentChassis-UUJX0-mW.js} +0 -0
- /package/dist/{Label-C2ejNWeC.js → Label-B_HPqi_q.js} +0 -0
- /package/dist/{ModalOverlay-D1VrWyoi.js → ModalOverlay-DfAf7o15.js} +0 -0
- /package/dist/{SelectGroup-BFiod7X2.js → SelectGroup-Dcczq44n.js} +0 -0
- /package/dist/{SelectSeparator-C2UGOkXF.js → SelectSeparator-CNRGG7Ew.js} +0 -0
- /package/dist/{Separator-DQcwC2TR.js → Separator-Cf9-JFgi.js} +0 -0
- /package/dist/{_plugin-vue_export-helper-C1je1s0u.js → _plugin-vue_export-helper-gLzyemvl.js} +0 -0
- /package/dist/{color-Cs0-oxYL.js → color-B9jZdhJX.js} +0 -0
- /package/dist/{compile-nZ1xVYTp.js → compile-INR_tPk_.js} +0 -0
- /package/dist/{constants--C2DkLW8.js → constants-BWj7DkMn.js} +0 -0
- /package/dist/{createContext-CpBNTRMI.js → createContext-Cd23P9j0.js} +0 -0
- /package/dist/{dotMatrixField-D_x9_1qq.js → dotMatrixField-CRO0ZFk4.js} +0 -0
- /package/dist/{flow.glsl-B2P7e0MT.js → flow.glsl-DqEGRpl4.js} +0 -0
- /package/dist/{math-Eb0w3LqU.js → math-5RcIgCB4.js} +0 -0
- /package/dist/{menuItemVariants-D8VNHq22.js → menuItemVariants-DAXquKja.js} +0 -0
- /package/dist/{prng-B-d9eYX8.js → prng-B5tIXTtj.js} +0 -0
- /package/dist/{procedural-color.wgsl-m7Zgv35j.js → procedural-color.wgsl-C1Y5PkM6.js} +0 -0
- /package/dist/{scrollReader-DI1NWxUw.js → scrollReader-rc3Ns_NM.js} +0 -0
- /package/dist/{useControlSize-SH1UmJCi.js → useControlSize-DAZ062x7.js} +0 -0
- /package/dist/{useFuzzySearch-DIhcYtcw.js → useFuzzySearch-0fTYOhS4.js} +0 -0
- /package/dist/{useGlobalDark-CmjB9E32.js → useGlobalDark-B4HO9LXG.js} +0 -0
- /package/dist/{useIntersectionPause-Dbozzjgm.js → useIntersectionPause-DO8Vl4gs.js} +0 -0
- /package/dist/{useInterval-CNdua40W.js → useInterval-BVUI-sez.js} +0 -0
- /package/dist/{useKeyboardShortcuts-BPRp33Im.js → useKeyboardShortcuts-BEut54Tk.js} +0 -0
- /package/dist/{usePointerVelocityField-QLsy3_kv.js → usePointerVelocityField-BrkqZFhj.js} +0 -0
- /package/dist/{useResizeObserver-Bpoi7tRE.js → useResizeObserver-DdEn3v2f.js} +0 -0
- /package/dist/{useResolveTokenColor-vAylyR0x.js → useResolveTokenColor-ChOnCckA.js} +0 -0
- /package/dist/{useScrollProgress-c3yxmH6a.js → useScrollProgress-A0M6qRl7.js} +0 -0
- /package/dist/{useSortable-BVqlJRBR.js → useSortable-DQV_UNDw.js} +0 -0
- /package/dist/{useTextHighlight-NmBM5V_4.js → useTextHighlight-Bma3UlKA.js} +0 -0
- /package/dist/{useTimer-BHJOKr35.js → useTimer-BBLGPXR8.js} +0 -0
- /package/dist/{useUserInvalidAria-y5namzeE.js → useUserInvalidAria-EmmwWPOl.js} +0 -0
- /package/dist/{useViewportReady-anbac3m6.js → useViewportReady-C9pYnn7K.js} +0 -0
- /package/dist/{vReveal-D9k0jADx.js → vReveal-CT1KtwZA.js} +0 -0
package/dist/dot-flow-field.js
CHANGED
|
@@ -1,17 +1,288 @@
|
|
|
1
|
-
import { t as e } from "./_plugin-vue_export-helper-
|
|
2
|
-
import { t } from "./usePointerVelocityField-
|
|
3
|
-
import { n, o as r, r as i, s as a } from "./procedural-color.wgsl-
|
|
4
|
-
import { a as o, t as s } from "./useGpuSubstrate-
|
|
5
|
-
import { c } from "./color-
|
|
1
|
+
import { t as e } from "./_plugin-vue_export-helper-gLzyemvl.js";
|
|
2
|
+
import { t } from "./usePointerVelocityField-BrkqZFhj.js";
|
|
3
|
+
import { n, o as r, r as i, s as a } from "./procedural-color.wgsl-C1Y5PkM6.js";
|
|
4
|
+
import { a as o, t as s } from "./useGpuSubstrate-Ceet70xq.js";
|
|
5
|
+
import { c } from "./color-B9jZdhJX.js";
|
|
6
6
|
import { computed as l, createElementBlock as u, createElementVNode as d, defineComponent as f, normalizeStyle as p, onScopeDispose as m, openBlock as h, useTemplateRef as g, watch as _ } from "vue";
|
|
7
|
+
//#region src/components/custom/dot-flow-field/composables/flowField.ts
|
|
8
|
+
var v = 9.81, y = Math.PI * 2;
|
|
9
|
+
function b(e) {
|
|
10
|
+
let t = e * Math.PI / 180;
|
|
11
|
+
return {
|
|
12
|
+
x: Math.cos(t),
|
|
13
|
+
y: Math.sin(t)
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function x(e, t, n, r) {
|
|
17
|
+
let i = 0, a = 0;
|
|
18
|
+
for (let o of n) {
|
|
19
|
+
let n = y / Math.max(o.wavelength, 1e-4), s = b(o.direction), c = Math.sqrt(v * n) * r, l = n * (s.x * e.x + s.y * e.y) - c * t + o.phase, u = Math.cos(l), d = o.amplitude * n * u;
|
|
20
|
+
i += d * s.x, a += d * s.y;
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
x: a,
|
|
24
|
+
y: -i
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
var S = .012;
|
|
28
|
+
function C(e, t) {
|
|
29
|
+
let n = e * .1031 % 1, r = t * .1031 % 1, i = e * .1031 % 1;
|
|
30
|
+
n < 0 && (n += 1), r < 0 && (r += 1), i < 0 && (i += 1);
|
|
31
|
+
let a = n * (r + 33.33) + r * (i + 33.33) + i * (n + 33.33);
|
|
32
|
+
n += a, r += a, i += a;
|
|
33
|
+
let o = (n + r) * i % 1;
|
|
34
|
+
return o < 0 && (o += 1), o;
|
|
35
|
+
}
|
|
36
|
+
function w(e, t, n) {
|
|
37
|
+
return e + (t - e) * n;
|
|
38
|
+
}
|
|
39
|
+
function T(e, t) {
|
|
40
|
+
let n = Math.floor(e), r = Math.floor(t), i = e - n, a = t - r, o = i * i * i * (i * (i * 6 - 15) + 10), s = a * a * a * (a * (a * 6 - 15) + 10), c = C(n, r), l = C(n + 1, r), u = C(n, r + 1), d = C(n + 1, r + 1);
|
|
41
|
+
return w(w(c, l, o), w(u, d, o), s);
|
|
42
|
+
}
|
|
43
|
+
function E(e, t) {
|
|
44
|
+
let n = 0, r = .5, i = 1, a = e, o = t;
|
|
45
|
+
for (let e = 0; e < 3; e++) {
|
|
46
|
+
n += r * T(a * i, o * i);
|
|
47
|
+
let e = .8 * a - .6 * o, t = .6 * a + .8 * o;
|
|
48
|
+
a = e, o = t, i *= 2, r *= .5;
|
|
49
|
+
}
|
|
50
|
+
return n;
|
|
51
|
+
}
|
|
52
|
+
function D(e) {
|
|
53
|
+
let t = E(e.x + S, e.y) - E(e.x - S, e.y), n = E(e.x, e.y + S) - E(e.x, e.y - S), r = t / (2 * S);
|
|
54
|
+
return {
|
|
55
|
+
x: n / (2 * S),
|
|
56
|
+
y: -r
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function O(e, t, n, r, i) {
|
|
60
|
+
let a = x(e, t, n, r);
|
|
61
|
+
if (i <= 0) return a;
|
|
62
|
+
let o = D({
|
|
63
|
+
x: e.x * .55 + t * .15,
|
|
64
|
+
y: e.y * .55
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
x: a.x + o.x * i,
|
|
68
|
+
y: a.y + o.y * i
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function k(e, t) {
|
|
72
|
+
if (!t.active) return {
|
|
73
|
+
x: 0,
|
|
74
|
+
y: 0
|
|
75
|
+
};
|
|
76
|
+
let n = e.x - t.cursor.x, r = e.y - t.cursor.y, i = Math.hypot(n, r), a = Math.max(t.radius, .001), o = Math.exp(-(i * i) / (a * a)), s = -r, c = n, l = Math.hypot(s, c) || 1e-6, u = s / l, d = c / l, f = n / Math.max(i, 1e-4), p = r / Math.max(i, 1e-4), m = u * t.spin + t.pointerVel.x * t.dragGain + f * t.burst * t.burstShove, h = d * t.spin + t.pointerVel.y * t.dragGain + p * t.burst * t.burstShove;
|
|
77
|
+
return {
|
|
78
|
+
x: m * o,
|
|
79
|
+
y: h * o
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
var A = .85;
|
|
83
|
+
function j(e, t, n) {
|
|
84
|
+
let r = Math.max(t, 1), i = e % r, a = Math.floor(e / r), o = (r - 1) * n / 2;
|
|
85
|
+
return {
|
|
86
|
+
x: i * n - o,
|
|
87
|
+
y: a * n - o
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function M(e, t, n, r) {
|
|
91
|
+
let i = 0, a = 0;
|
|
92
|
+
for (let o of n) {
|
|
93
|
+
let n = y / Math.max(o.wavelength, 1e-4), s = b(o.direction), c = Math.sqrt(v * n) * r, l = n * (s.x * e.x + s.y * e.y) - c * t + o.phase;
|
|
94
|
+
i += o.amplitude * Math.sin(l), a += Math.abs(o.amplitude);
|
|
95
|
+
}
|
|
96
|
+
return i / Math.max(a, 1e-4);
|
|
97
|
+
}
|
|
98
|
+
function N(e, t, n, r, i) {
|
|
99
|
+
let a = O(e, t, n, r, i), o = Math.hypot(a.x, a.y);
|
|
100
|
+
if (o < 1e-5) return {
|
|
101
|
+
x: 0,
|
|
102
|
+
y: 0
|
|
103
|
+
};
|
|
104
|
+
let s = Math.tanh(o) / o;
|
|
105
|
+
return {
|
|
106
|
+
x: a.x * s,
|
|
107
|
+
y: a.y * s
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function P(e, t, n) {
|
|
111
|
+
return 1 - F(0, Math.max(n, .001), Math.abs(e - t));
|
|
112
|
+
}
|
|
113
|
+
function F(e, t, n) {
|
|
114
|
+
let r = Math.min(Math.max((n - e) / Math.max(t - e, 1e-6), 0), 1);
|
|
115
|
+
return r * r * (3 - 2 * r);
|
|
116
|
+
}
|
|
117
|
+
function I(e, t = 3, n = 2.5) {
|
|
118
|
+
let r = 2 * A, i = Math.max(n, .5) * r, a = i / y, o = r / 3, s = Math.max(1, Math.min(Math.round(t), 3)), c = [], l = i, u = 1;
|
|
119
|
+
for (let t = 0; t < s; t++) {
|
|
120
|
+
let n = Math.max(l, o), r = y / n, i = Math.exp(-1 / (r * a) ** 2) / (r * r), s = (t % 2 == 0 ? 1 : -1) * (8 + t * 4);
|
|
121
|
+
c.push({
|
|
122
|
+
amplitude: i * u,
|
|
123
|
+
wavelength: n,
|
|
124
|
+
direction: e + s,
|
|
125
|
+
phase: t * 1.618033 % y
|
|
126
|
+
}), l *= .58, u *= .38;
|
|
127
|
+
}
|
|
128
|
+
return c;
|
|
129
|
+
}
|
|
130
|
+
//#endregion
|
|
131
|
+
//#region src/components/custom/dot-flow-field/constants.ts
|
|
132
|
+
var L = 16384, R = 8, z = 4, B = 1.618033988749895;
|
|
133
|
+
function ee(e, t = 1 / 60) {
|
|
134
|
+
let n = Math.max(e, .001);
|
|
135
|
+
return 2 ** (-t / n);
|
|
136
|
+
}
|
|
137
|
+
var V = [{
|
|
138
|
+
L: .92,
|
|
139
|
+
C: .03,
|
|
140
|
+
h: 78
|
|
141
|
+
}, {
|
|
142
|
+
L: .84,
|
|
143
|
+
C: .07,
|
|
144
|
+
h: 62
|
|
145
|
+
}], H = I(35, 3, 2.5), U = {
|
|
146
|
+
mode: "flow",
|
|
147
|
+
particleCount: 12e3,
|
|
148
|
+
trailHalfLife: .55,
|
|
149
|
+
trailScale: .5,
|
|
150
|
+
turnRate: .14,
|
|
151
|
+
speedScale: .9,
|
|
152
|
+
speedGlow: 1.25,
|
|
153
|
+
lifetimeSec: .55 * B,
|
|
154
|
+
edgeBias: .35,
|
|
155
|
+
contentMask: null,
|
|
156
|
+
vortexRadius: .3,
|
|
157
|
+
vortexSpin: 1.6,
|
|
158
|
+
dragGain: 1,
|
|
159
|
+
burstShove: 1.8,
|
|
160
|
+
shadowOffset: .18,
|
|
161
|
+
stretchAmp: .6,
|
|
162
|
+
waveComponents: H,
|
|
163
|
+
windSpeed: .3,
|
|
164
|
+
curlStrength: .12,
|
|
165
|
+
gridPitch: 26,
|
|
166
|
+
dotSize: 2,
|
|
167
|
+
displaceAmp: .18,
|
|
168
|
+
springK: 6,
|
|
169
|
+
waveBandCenter: 0,
|
|
170
|
+
waveBandWidth: .55,
|
|
171
|
+
contrast: .6,
|
|
172
|
+
coherence: .8,
|
|
173
|
+
globeMask: !1,
|
|
174
|
+
palette: V,
|
|
175
|
+
background: "transparent",
|
|
176
|
+
interactive: !0,
|
|
177
|
+
respectReducedMotion: !0
|
|
178
|
+
}, W = A, te = 16384;
|
|
179
|
+
function G(e, t) {
|
|
180
|
+
let n = Math.min(Math.max(Math.ceil((t || 320) / Math.max(e, 4)) + 2, 4), 128);
|
|
181
|
+
return {
|
|
182
|
+
cols: n,
|
|
183
|
+
count: Math.min(n * n, te),
|
|
184
|
+
pitchDomain: 2 * W / Math.max(n, 1)
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
var ne = 240, K = {
|
|
188
|
+
p0: 0,
|
|
189
|
+
p1: 4,
|
|
190
|
+
ints: 8,
|
|
191
|
+
f0: 12,
|
|
192
|
+
f1: 16,
|
|
193
|
+
ptr: 20,
|
|
194
|
+
ptr2: 24,
|
|
195
|
+
waves: 28
|
|
196
|
+
}, re = {
|
|
197
|
+
cursorX: 0,
|
|
198
|
+
cursorY: 0,
|
|
199
|
+
velX: 0,
|
|
200
|
+
velY: 0,
|
|
201
|
+
burst: 0,
|
|
202
|
+
active: 0
|
|
203
|
+
};
|
|
204
|
+
function ie() {
|
|
205
|
+
let e = new ArrayBuffer(ne);
|
|
206
|
+
return {
|
|
207
|
+
buffer: e,
|
|
208
|
+
f32: new Float32Array(e),
|
|
209
|
+
i32: new Int32Array(e)
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function ae(e, t, n, r, i, a, o = re) {
|
|
213
|
+
let { f32: s, i32: c } = e, l = t.mode === "flow";
|
|
214
|
+
s[K.p0 + 0] = n, s[K.p0 + 1] = r, s[K.p0 + 2] = t.windSpeed, s[K.p0 + 3] = t.curlStrength, s[K.p1 + 0] = i.pitchDomain, s[K.p1 + 1] = t.displaceAmp, s[K.p1 + 2] = t.springK, s[K.p1 + 3] = i.cols;
|
|
215
|
+
let u = Math.min(t.waveComponents.length, 8);
|
|
216
|
+
return c[K.ints + 0] = u, c[K.ints + 1] = a, c[K.ints + 2] = i.cols, c[K.ints + 3] = +!!l, s[K.f0 + 0] = t.turnRate, s[K.f0 + 1] = t.speedScale, s[K.f0 + 2] = t.lifetimeSec, s[K.f0 + 3] = W, s[K.f1 + 0] = t.vortexRadius, s[K.f1 + 1] = t.vortexSpin, s[K.f1 + 2] = t.dragGain, s[K.f1 + 3] = t.burstShove, s[K.ptr + 0] = o.cursorX, s[K.ptr + 1] = o.cursorY, s[K.ptr + 2] = o.velX, s[K.ptr + 3] = o.velY, s[K.ptr2 + 0] = o.burst, s[K.ptr2 + 1] = o.active, s[K.ptr2 + 2] = t.edgeBias, s[K.ptr2 + 3] = 0, pe(s, K.waves, t.waveComponents), e;
|
|
217
|
+
}
|
|
218
|
+
var oe = 160, se = .022, q = {
|
|
219
|
+
r0: 0,
|
|
220
|
+
r1: 4,
|
|
221
|
+
r2: 8,
|
|
222
|
+
ints: 12,
|
|
223
|
+
bg: 16,
|
|
224
|
+
f0: 20,
|
|
225
|
+
palette: 24
|
|
226
|
+
};
|
|
227
|
+
function ce() {
|
|
228
|
+
let e = new ArrayBuffer(oe);
|
|
229
|
+
return {
|
|
230
|
+
buffer: e,
|
|
231
|
+
f32: new Float32Array(e),
|
|
232
|
+
i32: new Int32Array(e)
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
var le = .22, ue = .4;
|
|
236
|
+
function de(e, t) {
|
|
237
|
+
let n = (t || 320) / (2 * W);
|
|
238
|
+
return e / Math.max(n, 1e-4);
|
|
239
|
+
}
|
|
240
|
+
function fe(e, t, n, r, i, a, o) {
|
|
241
|
+
let { f32: s, i32: l } = e;
|
|
242
|
+
s[q.r0 + 0] = n, s[q.r0 + 1] = t.contrast, s[q.r0 + 2] = le, s[q.r0 + 3] = W, s[q.r1 + 0] = de(t.dotSize, i), s[q.r1 + 1] = ue, s[q.r1 + 2] = r, s[q.r1 + 3] = a.pitchDomain, s[q.r2 + 0] = t.waveBandCenter, s[q.r2 + 1] = t.waveBandWidth, s[q.r2 + 2] = +!!t.globeMask, s[q.r2 + 3] = +(t.mode === "flow"), s[q.f0 + 0] = t.speedGlow, s[q.f0 + 1] = se, s[q.f0 + 2] = t.shadowOffset, s[q.f0 + 3] = t.stretchAmp;
|
|
243
|
+
let u = Math.min(o.length, 4);
|
|
244
|
+
if (l[q.ints + 0] = u, l[q.ints + 1] = a.count, l[q.ints + 2] = 0, l[q.ints + 3] = 0, t.background === "transparent") s[q.bg + 0] = 0, s[q.bg + 1] = 0, s[q.bg + 2] = 0, s[q.bg + 3] = 0;
|
|
245
|
+
else {
|
|
246
|
+
let e = c(t.background);
|
|
247
|
+
s[q.bg + 0] = e[0], s[q.bg + 1] = e[1], s[q.bg + 2] = e[2], s[q.bg + 3] = 1;
|
|
248
|
+
}
|
|
249
|
+
for (let e = 0; e < 4; e++) {
|
|
250
|
+
let t = q.palette + e * 4, n = c(o[Math.min(e, u - 1)] ?? o[0]);
|
|
251
|
+
s[t + 0] = n[0], s[t + 1] = n[1], s[t + 2] = n[2], s[t + 3] = 0;
|
|
252
|
+
}
|
|
253
|
+
return e;
|
|
254
|
+
}
|
|
255
|
+
function pe(e, t, n) {
|
|
256
|
+
for (let r = 0; r < 8; r++) {
|
|
257
|
+
let i = t + r * 4, a = n[r];
|
|
258
|
+
a ? (e[i + 0] = a.amplitude, e[i + 1] = a.wavelength, e[i + 2] = a.direction, e[i + 3] = a.phase) : (e[i + 0] = 0, e[i + 1] = 1, e[i + 2] = 0, e[i + 3] = 0);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
function me(e) {
|
|
262
|
+
let { cols: t, count: n, pitchDomain: r } = e, i = new Float32Array(n * 4), a = (t - 1) * r / 2;
|
|
263
|
+
for (let e = 0; e < n; e++) {
|
|
264
|
+
let n = e % t, o = Math.floor(e / t), s = e * 4;
|
|
265
|
+
i[s + 0] = n * r - a, i[s + 1] = o * r - a, i[s + 2] = 0, i[s + 3] = 0;
|
|
266
|
+
}
|
|
267
|
+
return i;
|
|
268
|
+
}
|
|
269
|
+
function he(e, t) {
|
|
270
|
+
let n = new Float32Array(e * 4), r = W, i = 2654435769, a = () => (i = i * 1664525 + 1013904223 >>> 0, i / 4294967295);
|
|
271
|
+
for (let i = 0; i < e; i++) {
|
|
272
|
+
let e = i * 4;
|
|
273
|
+
n[e + 0] = (a() * 2 - 1) * r, n[e + 1] = (a() * 2 - 1) * r, n[e + 2] = 0, n[e + 3] = a() * Math.max(t, .001);
|
|
274
|
+
}
|
|
275
|
+
return n;
|
|
276
|
+
}
|
|
277
|
+
//#endregion
|
|
7
278
|
//#region src/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.ts
|
|
8
|
-
var
|
|
279
|
+
var ge = "\nconst MAX_WAVE_COMPONENTS: i32 = 8;\nconst PI: f32 = 3.141592653589793;\nconst TAU: f32 = 6.283185307179586;\nconst FLOW_GRAVITY: f32 = 9.81;\nconst CURL_EPS: f32 = 0.012;\nconst FBM_ROT: mat2x2<f32> = mat2x2<f32>(0.8, 0.6, -0.6, 0.8);\n\nstruct Particle {\n // field: (pos.x, pos.y, height, |disp|) — the anchored-lattice live state\n // flow: (pos.x, pos.y, speed, life) — the advected-mote live state\n data: vec4<f32>,\n};\n\n// ── Uniforms (the typed-struct source-of-truth — see uniformBridgeWGPU.ts) ──\nstruct FlowUniforms {\n // p0: (uTime, uDt, uWindSpeed, uCurlStrength)\n p0: vec4<f32>,\n // p1: (uGridPitch, uDisplaceAmp, uSpringK, uGridCols) — the lattice geometry (field)\n p1: vec4<f32>,\n // ints: (uWaveCount, uParticleCount, uGridColsI, uMode) — uMode: 0=field, 1=flow\n ints: vec4<i32>,\n // f0: (uTurnRate, uSpeedScale, uLifetimeSec, uDomainHalf) — the flow advection levers\n f0: vec4<f32>,\n // f1: (uVortexRadius, uVortexSpin, uDragGain, uBurstShove) — the cursor vortex\n f1: vec4<f32>,\n // ptr: (cursor.x, cursor.y, vel.x, vel.y) — the pointer in domain space + its velocity\n ptr: vec4<f32>,\n // ptr2: (burst, pointerActive, edgeBias, _pad)\n ptr2: vec4<f32>,\n // each wave row: (amplitude, wavelength, directionDeg, phase)\n waves: array<vec4<f32>, 8>,\n};\n\n@group(0) @binding(0) var<uniform> u: FlowUniforms;\n@group(0) @binding(1) var<storage, read_write> particles: array<Particle>;\n\n// ── The deterministic lattice origin (transcribes flowField.ts gridOrigin) ──\nfn gridOrigin(index: u32, cols: i32, pitch: f32) -> vec2<f32> {\n let c = max(cols, 1);\n let col = i32(index) % c;\n let row = i32(index) / c;\n let half = f32(c - 1) * pitch * 0.5;\n return vec2<f32>(f32(col) * pitch - half, f32(row) * pitch - half);\n}\n\n// ── The Gerstner-sum analytic ∇⊥h velocity (transcribes flowField.ts gerstnerVelocity) ──\nfn gerstnerVelocity(p: vec2<f32>, t: f32) -> vec2<f32> {\n var dhdx = 0.0;\n var dhdy = 0.0;\n let windSpeed = u.p0.z;\n let waveCount = u.ints.x;\n for (var i = 0; i < MAX_WAVE_COMPONENTS; i = i + 1) {\n if (i >= waveCount) { break; }\n let w = u.waves[i];\n let amplitude = w.x;\n let wavelength = max(w.y, 1e-4);\n let dirRad = w.z * PI / 180.0;\n let phase = w.w;\n let k = TAU / wavelength;\n let d = vec2<f32>(cos(dirRad), sin(dirRad));\n let omega = sqrt(FLOW_GRAVITY * k) * windSpeed;\n let theta = k * (d.x * p.x + d.y * p.y) - omega * t + phase;\n let akc = amplitude * k * cos(theta);\n dhdx = dhdx + akc * d.x;\n dhdy = dhdy + akc * d.y;\n }\n // v = ∇⊥h = (∂h/∂y, −∂h/∂x).\n return vec2<f32>(dhdy, -dhdx);\n}\n\n// ── The scalar Gerstner HEIGHT (transcribes flowField.ts sampleHeight — the brightness\n// driver, normalized to ≈[-1,1] by the total amplitude so the band thresholds are\n// wave-table-independent). ──\nfn sampleHeight(o: vec2<f32>, t: f32) -> f32 {\n var h = 0.0;\n var ampSum = 0.0;\n let windSpeed = u.p0.z;\n let waveCount = u.ints.x;\n for (var i = 0; i < MAX_WAVE_COMPONENTS; i = i + 1) {\n if (i >= waveCount) { break; }\n let w = u.waves[i];\n let k = TAU / max(w.y, 1e-4);\n let dirRad = w.z * PI / 180.0;\n let d = vec2<f32>(cos(dirRad), sin(dirRad));\n let omega = sqrt(FLOW_GRAVITY * k) * windSpeed;\n let theta = k * (d.x * o.x + d.y * o.y) - omega * t + w.w;\n h = h + w.x * sin(theta);\n ampSum = ampSum + abs(w.x);\n }\n return h / max(ampSum, 1e-4);\n}\n\n// ── Shared curl-noise basis (the WGSL twin of flow.glsl.ts curlFBM) ──\nfn hash21(p: vec2<f32>) -> f32 {\n var p3 = fract(vec3<f32>(p.x, p.y, p.x) * 0.1031);\n p3 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn valueNoise(p: vec2<f32>) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u2 = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n let a = hash21(i + vec2<f32>(0.0, 0.0));\n let b = hash21(i + vec2<f32>(1.0, 0.0));\n let c = hash21(i + vec2<f32>(0.0, 1.0));\n let d = hash21(i + vec2<f32>(1.0, 1.0));\n return mix(mix(a, b, u2.x), mix(c, d, u2.x), u2.y);\n}\n\nfn potentialFBM(p0: vec2<f32>) -> f32 {\n var v = 0.0;\n var amp = 0.5;\n var freq = 1.0;\n var p = p0;\n for (var i = 0; i < 3; i = i + 1) {\n v = v + amp * valueNoise(p * freq);\n p = FBM_ROT * p;\n freq = freq * 2.0;\n amp = amp * 0.5;\n }\n return v;\n}\n\nfn curlFBM(p: vec2<f32>) -> vec2<f32> {\n let dx = potentialFBM(p + vec2<f32>(CURL_EPS, 0.0)) - potentialFBM(p - vec2<f32>(CURL_EPS, 0.0));\n let dy = potentialFBM(p + vec2<f32>(0.0, CURL_EPS)) - potentialFBM(p - vec2<f32>(0.0, CURL_EPS));\n let g = vec2<f32>(dx, dy) / (2.0 * CURL_EPS);\n return vec2<f32>(g.y, -g.x);\n}\n\n// The composite flow velocity (transcribes flowField.ts sampleVelocity EXACTLY — the\n// coarse ×0.55 curl domain-scale, the §3.2 inversion).\nfn sampleVelocity(p: vec2<f32>, t: f32) -> vec2<f32> {\n let curlStrength = u.p0.w;\n var v = gerstnerVelocity(p, t);\n if (curlStrength > 0.0) {\n let c = curlFBM(vec2<f32>(p.x * 0.55 + t * 0.15, p.y * 0.55));\n v = v + c * curlStrength;\n }\n return v;\n}\n\n// The sub-cell DISPLACEMENT (transcribes flowField.ts sampleDisplacement — ∇⊥h + the\n// coarse curl break, soft-clamped through tanh so the magnitude rides into [0,1)).\nfn sampleDisplacement(o: vec2<f32>, t: f32) -> vec2<f32> {\n let v = sampleVelocity(o, t);\n let mag = length(v);\n if (mag < 1e-5) { return vec2<f32>(0.0, 0.0); }\n let bounded = tanh(mag);\n return v * (bounded / mag);\n}\n\n// ── The cursor VORTEX injected into the velocity field (transcribes flowField.ts\n// pointerVortex). r = p − cursor; a gaussian fall-off; a TRUE tangential ∇⊥ swirl +\n// a drag-along term + a radial burst shove. Inert when the pointer is inactive. ──\nfn pointerVortex(p: vec2<f32>) -> vec2<f32> {\n if (u.ptr2.y < 0.5) { return vec2<f32>(0.0, 0.0); } // pointer inactive → no vortex\n let cursor = u.ptr.xy;\n let vel = u.ptr.zw;\n let burst = u.ptr2.x;\n let radius = max(u.f1.x, 1e-3);\n let r = p - cursor;\n let d = length(r);\n let fall = exp(-(d * d) / (radius * radius));\n let swirl = normalize(vec2<f32>(-r.y, r.x) + vec2<f32>(1e-6, 0.0)); // tangential ∇⊥\n let radial = r / max(d, 1e-4);\n let v = swirl * u.f1.y // the spin\n + vel * u.f1.z // the drag (streamlines follow the gesture)\n + radial * burst * u.f1.w; // the flick shockwave\n return v * fall;\n}\n\n// ── density-weighted respawn: a hash-stratified seed inside the domain, biased toward the\n// edges by edgeBias (a faint vignette — the field never thins to a hole). ──\nfn respawn(idx: u32, t: f32) -> vec2<f32> {\n let half = u.f0.w;\n let s = f32(idx) * 0.013 + t * 0.37;\n let rx = hash21(vec2<f32>(s, 1.7)) * 2.0 - 1.0;\n let ry = hash21(vec2<f32>(3.1, s)) * 2.0 - 1.0;\n // edgeBias>0 pushes the seed toward the perimeter (a power-curve on |coord|).\n let bias = clamp(u.ptr2.z, 0.0, 1.0);\n let bx = sign(rx) * pow(abs(rx), mix(1.0, 0.5, bias));\n let by = sign(ry) * pow(abs(ry), mix(1.0, 0.5, bias));\n return vec2<f32>(bx, by) * half;\n}\n\n// ── cs_field — the ANCHORED-LATTICE evaluator (BYTE-MOVED from cs_main; the field-mode\n// fence-scoped unit; F1 greps the no-advection/no-reseed witness WITHIN this brace-span).\nfn cs_field(idx: u32, t: f32, dt: f32) {\n let pitch = u.p1.x;\n let displaceAmp = u.p1.y;\n let springK = u.p1.z;\n let cols = u.ints.z;\n\n // The PERMANENT anchor — no wrap, no re-seed (the coherence fix).\n let o = gridOrigin(idx, cols, pitch);\n let disp = sampleDisplacement(o, t);\n let anchorTarget = o + disp * (displaceAmp * pitch);\n\n var pr = particles[idx];\n var pos = pr.data.xy;\n // Framerate-independent critically-damped pull-to-anchor:\n // p ← mix(p, anchorTarget, 1 - exp(-springK·dt)) (the GPGPU influence-pull pattern).\n let k = 1.0 - exp(-springK * dt);\n pos = mix(pos, anchorTarget, k);\n\n let h = sampleHeight(o, t);\n particles[idx] = Particle(vec4<f32>(pos, h, length(disp)));\n}\n\n// ── cs_flow — the AURORA CURRENT (the RE-INVENT register). Momentum-integrated advection\n// along the curl current + the live cursor vortex, with lifetime decay + density-weighted\n// respawn. F1b greps the pos+=v*dt + respawn( + pointerVortex( witness in THIS function.\nfn cs_flow(idx: u32, t: f32, dt: f32) {\n let half = u.f0.w;\n let turnRate = u.f0.x;\n let speedScale = u.f0.y;\n let lifetimeSec = max(u.f0.z, 1e-3);\n\n var pr = particles[idx];\n var pos = pr.data.xy;\n var life = pr.data.w;\n\n // First-frame / dead / out-of-domain seed (the density-weighted respawn).\n let outOfDomain = max(abs(pos.x), abs(pos.y)) > half * 1.05;\n if (life <= 0.0 || outOfDomain) {\n pos = respawn(idx, t);\n // stratify the initial life across [0,lifetime] so deaths don't synchronize.\n life = lifetimeSec * hash21(vec2<f32>(f32(idx) * 0.027, t * 0.11));\n }\n\n // The target velocity: the divergence-free curl current + the cursor vortex.\n let vField = sampleVelocity(pos, t) + pointerVortex(pos);\n // Momentum/inertia: the low turnRate scales how hard the mote commits to the field\n // each step — a weighty ease into the current's turns (arcs, not snaps), the\n // overlapping-action/follow-through on a particle (R4-motion).\n let v = vField * turnRate * speedScale;\n // Forward-Euler advection step (the integrator — F1b's witness pos = pos + v*dt).\n pos = pos + v * dt * 60.0;\n\n life = life - dt;\n let speed = length(v);\n particles[idx] = Particle(vec4<f32>(pos, speed, life));\n}\n\n@compute @workgroup_size(64)\nfn cs_main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let idx = gid.x;\n let count = u32(u.ints.y);\n if (idx >= count) { return; } // bounds-guard the dispatch tail\n\n let t = u.p0.x;\n let dt = u.p0.y;\n let mode = u.ints.w;\n\n if (mode == 1) {\n cs_flow(idx, t, dt);\n } else {\n cs_field(idx, t, dt);\n }\n}\n", _e = `
|
|
9
280
|
const PI: f32 = 3.141592653589793;
|
|
10
281
|
const TAU: f32 = 6.283185307179586;
|
|
11
282
|
const MAX_FLOW_STOPS: i32 = 4;
|
|
12
283
|
|
|
13
284
|
struct Particle {
|
|
14
|
-
// (pos.x, pos.y, height, |disp|)
|
|
285
|
+
// field: (pos.x, pos.y, height, |disp|) flow: (pos.x, pos.y, speed, life)
|
|
15
286
|
data: vec4<f32>,
|
|
16
287
|
};
|
|
17
288
|
|
|
@@ -21,12 +292,14 @@ struct RenderUniforms {
|
|
|
21
292
|
r0: vec4<f32>,
|
|
22
293
|
// r1: (uDotSize, uSizePulse, uAspect, uGridPitch)
|
|
23
294
|
r1: vec4<f32>,
|
|
24
|
-
// r2: (uWaveBandCenter, uWaveBandWidth, uGlobeMask,
|
|
295
|
+
// r2: (uWaveBandCenter, uWaveBandWidth, uGlobeMask, uMode) — uMode: 0=field, 1=flow
|
|
25
296
|
r2: vec4<f32>,
|
|
26
297
|
// ints: (uStopCount, uParticleCount, _pad, _pad)
|
|
27
298
|
ints: vec4<i32>,
|
|
28
299
|
// bg: (background.rgb, hasBackground)
|
|
29
300
|
bg: vec4<f32>,
|
|
301
|
+
// f0: (uSpeedGlow, uSpeedNorm, uShadowOffset, uStretchAmp) — the flow velocity-map levers
|
|
302
|
+
f0: vec4<f32>,
|
|
30
303
|
// each palette stop: linear-sRGB rgb + _pad
|
|
31
304
|
palette: array<vec4<f32>, 4>,
|
|
32
305
|
};
|
|
@@ -74,7 +347,9 @@ fn samplePaletteLin(t: f32) -> vec3<f32> {
|
|
|
74
347
|
struct VSOut {
|
|
75
348
|
@builtin(position) pos: vec4<f32>,
|
|
76
349
|
@location(0) local: vec2<f32>, // [-1,1] billboard-local coords for the soft circle
|
|
77
|
-
@location(1) bright: f32, //
|
|
350
|
+
@location(1) bright: f32, // brightness [0, ~1.6]
|
|
351
|
+
@location(2) ramp: f32, // palette-ramp coord (field: tone, flow: speedNorm)
|
|
352
|
+
@location(3) flowFade: f32, // flow life-fade [0,1] (field: 1)
|
|
78
353
|
};
|
|
79
354
|
|
|
80
355
|
@vertex
|
|
@@ -91,24 +366,39 @@ fn vs_main(
|
|
|
91
366
|
|
|
92
367
|
let pr = particles[ii].data;
|
|
93
368
|
let p = pr.xy;
|
|
94
|
-
let h = pr.z;
|
|
95
|
-
let dispMag = pr.w;
|
|
96
369
|
let half = u.r0.w;
|
|
370
|
+
let aspect = u.r1.z;
|
|
371
|
+
let mode = i32(u.r2.w + 0.5);
|
|
97
372
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
var bright = u.r0.z + band * u.r0.y;
|
|
103
|
-
bright = bright * globeMask(p, u.r0.x, u.r2.z);
|
|
373
|
+
var bright: f32;
|
|
374
|
+
var ramp: f32;
|
|
375
|
+
var sizeWorld: f32;
|
|
376
|
+
var flowFade: f32 = 1.0;
|
|
104
377
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
378
|
+
if (mode == 1) {
|
|
379
|
+
// ── flow (AURORA CURRENT): speed→hue, speed·life→brightness, speed→size bloom ──
|
|
380
|
+
let speed = pr.z;
|
|
381
|
+
let life = pr.w;
|
|
382
|
+
let speedNorm = clamp(speed / max(u.f0.y, 1e-4), 0.0, 1.0);
|
|
383
|
+
// life fades the mote over its last third (the trail's tail / overlapping-action).
|
|
384
|
+
flowFade = clamp(life * 3.0, 0.0, 1.0);
|
|
385
|
+
ramp = speedNorm;
|
|
386
|
+
bright = (0.35 + speedNorm * u.f0.x) * flowFade;
|
|
387
|
+
// a speed bloom (the cartoon "more" on WGPU — faster motes read as hot speed-cores) +
|
|
388
|
+
// the √φ stretch lever scales the bloom (the squash-stretch as an isotropic core here).
|
|
389
|
+
sizeWorld = u.r1.x * (1.0 + speedNorm * (u.f0.w + 1.0));
|
|
390
|
+
} else {
|
|
391
|
+
// ── field: the sweeping bright band over the anchored lattice (BC.W-VIZ-DOTFLOW) ──
|
|
392
|
+
let h = pr.z;
|
|
393
|
+
let dispMag = pr.w;
|
|
394
|
+
let band = waveBand(h, u.r2.x, u.r2.y);
|
|
395
|
+
bright = (u.r0.z + band * u.r0.y) * globeMask(p, u.r0.x, u.r2.z);
|
|
396
|
+
ramp = clamp(bright, 0.0, 1.0);
|
|
397
|
+
sizeWorld = u.r1.x * (1.0 + dispMag * u.r1.y);
|
|
398
|
+
}
|
|
108
399
|
|
|
109
400
|
// Position the quad at the dot in clip space. Domain [-half,half] → NDC [-1,1];
|
|
110
401
|
// the quad half-extent rides sizeWorld (in domain units, aspect-corrected x).
|
|
111
|
-
let aspect = u.r1.z;
|
|
112
402
|
let ndc = p / half;
|
|
113
403
|
let off = local * sizeWorld / half;
|
|
114
404
|
let offX = off.x / max(aspect, 1e-4);
|
|
@@ -117,6 +407,8 @@ fn vs_main(
|
|
|
117
407
|
out.pos = vec4<f32>(ndc.x + offX, ndc.y + off.y, 0.0, 1.0);
|
|
118
408
|
out.local = local;
|
|
119
409
|
out.bright = bright;
|
|
410
|
+
out.ramp = ramp;
|
|
411
|
+
out.flowFade = flowFade;
|
|
120
412
|
return out;
|
|
121
413
|
}
|
|
122
414
|
|
|
@@ -128,98 +420,434 @@ fn fs_main(in: VSOut) -> @location(0) vec4<f32> {
|
|
|
128
420
|
let mask = 1.0 - smoothstep(1.0 - feather, 1.0, r);
|
|
129
421
|
if (mask < 0.002) { return vec4<f32>(0.0); }
|
|
130
422
|
|
|
131
|
-
|
|
423
|
+
let mode = i32(u.r2.w + 0.5);
|
|
132
424
|
let bright = clamp(in.bright, 0.0, 1.6);
|
|
133
|
-
let
|
|
134
|
-
let lin = samplePaletteLin(tone) * bright;
|
|
135
|
-
// A floor alpha so even an off-band dot stays a faint lattice point (the calm grid).
|
|
136
|
-
let alpha = mask * clamp(bright * 0.8 + 0.12, 0.0, 1.0);
|
|
425
|
+
let lin = samplePaletteLin(in.ramp) * bright;
|
|
137
426
|
let rgb = clamp(linearToSrgb(lin), vec3<f32>(0.0), vec3<f32>(1.0));
|
|
138
|
-
|
|
427
|
+
|
|
428
|
+
if (mode == 1) {
|
|
429
|
+
// flow: additive premultiplied — a soft glowing core, alpha rides speed·life.
|
|
430
|
+
let coreAlpha = mask * mask; // a tighter hot core (less white wash — H2 cap)
|
|
431
|
+
let a = coreAlpha * clamp(bright, 0.0, 1.0);
|
|
432
|
+
return vec4<f32>(rgb * a, a);
|
|
433
|
+
}
|
|
434
|
+
// field: a floor alpha so even an off-band dot stays a faint lattice point.
|
|
435
|
+
let alpha = mask * clamp(bright * 0.8 + 0.12, 0.0, 1.0);
|
|
139
436
|
return vec4<f32>(rgb * alpha, alpha);
|
|
140
437
|
}
|
|
141
|
-
`,
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
uniform float uTime;
|
|
155
|
-
uniform float uWindSpeed;
|
|
156
|
-
uniform float uCurlStrength;
|
|
157
|
-
uniform float uDomainHalf;
|
|
158
|
-
uniform float uAspect;
|
|
159
|
-
uniform float uGridPitchDomain; // lattice pitch in DOMAIN units
|
|
160
|
-
uniform float uDotRadiusDomain; // dot radius in DOMAIN units
|
|
161
|
-
uniform float uDisplaceAmp; // sub-cell drift in pitch fractions
|
|
162
|
-
uniform float uContrast;
|
|
163
|
-
uniform float uBaseBright;
|
|
164
|
-
uniform float uWaveBandCenter;
|
|
165
|
-
uniform float uWaveBandWidth;
|
|
166
|
-
uniform float uGlobeMask;
|
|
167
|
-
uniform int uWaveCount;
|
|
168
|
-
uniform int uStopCount;
|
|
169
|
-
uniform float uHasBackground;
|
|
170
|
-
uniform vec3 uBg;
|
|
171
|
-
uniform vec4 uWaves[MAX_WAVE_COMPONENTS]; // (amplitude, wavelength, directionDeg, phase)
|
|
172
|
-
uniform vec3 uPalette[MAX_FLOW_STOPS]; // linear-sRGB stops
|
|
438
|
+
`, ve = `
|
|
439
|
+
struct TrailUniforms {
|
|
440
|
+
// (decay, hasGround, time, _pad)
|
|
441
|
+
p: vec4<f32>,
|
|
442
|
+
// floor.rgb (linear-sRGB) + _pad
|
|
443
|
+
floorC: vec4<f32>,
|
|
444
|
+
// bloom.rgb (linear-sRGB) + _pad
|
|
445
|
+
bloomC: vec4<f32>,
|
|
446
|
+
};
|
|
447
|
+
@group(0) @binding(0) var<uniform> u: TrailUniforms;
|
|
448
|
+
@group(0) @binding(1) var samp: sampler;
|
|
449
|
+
@group(0) @binding(2) var tex: texture_2d<f32>;
|
|
173
450
|
|
|
174
|
-
|
|
451
|
+
${n}
|
|
175
452
|
|
|
176
|
-
|
|
177
|
-
${a}
|
|
453
|
+
struct FSQ { @builtin(position) pos: vec4<f32>, @location(0) uv: vec2<f32> };
|
|
178
454
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;
|
|
190
|
-
float theta = k * (d.x * p.x + d.y * p.y) - omega * t + w.w;
|
|
191
|
-
float akc = w.x * k * cos(theta);
|
|
192
|
-
dhdx += akc * d.x;
|
|
193
|
-
dhdy += akc * d.y;
|
|
194
|
-
}
|
|
195
|
-
return vec2(dhdy, -dhdx);
|
|
455
|
+
@vertex
|
|
456
|
+
fn vs_fsq(@builtin(vertex_index) vi: u32) -> FSQ {
|
|
457
|
+
var c = array<vec2<f32>, 3>(
|
|
458
|
+
vec2<f32>(-1.0, -1.0), vec2<f32>(3.0, -1.0), vec2<f32>(-1.0, 3.0),
|
|
459
|
+
);
|
|
460
|
+
let p = c[vi];
|
|
461
|
+
var out: FSQ;
|
|
462
|
+
out.pos = vec4<f32>(p, 0.0, 1.0);
|
|
463
|
+
out.uv = p * 0.5 + 0.5;
|
|
464
|
+
return out;
|
|
196
465
|
}
|
|
197
466
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
for (int i = 0; i < MAX_WAVE_COMPONENTS; i++) {
|
|
203
|
-
if (i >= uWaveCount) break;
|
|
204
|
-
vec4 w = uWaves[i];
|
|
205
|
-
float k = TAU / max(w.y, 1e-4);
|
|
206
|
-
float dirRad = w.z * PI / 180.0;
|
|
207
|
-
vec2 d = vec2(cos(dirRad), sin(dirRad));
|
|
208
|
-
float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;
|
|
209
|
-
float theta = k * (d.x * o.x + d.y * o.y) - omega * t + w.w;
|
|
210
|
-
h += w.x * sin(theta);
|
|
211
|
-
ampSum += abs(w.x);
|
|
212
|
-
}
|
|
213
|
-
return h / max(ampSum, 1e-4);
|
|
467
|
+
@fragment
|
|
468
|
+
fn fs_decay(in: FSQ) -> @location(0) vec4<f32> {
|
|
469
|
+
let prev = textureSample(tex, samp, in.uv);
|
|
470
|
+
return prev * u.p.x; // fade toward black
|
|
214
471
|
}
|
|
215
472
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
473
|
+
@fragment
|
|
474
|
+
fn fs_present(in: FSQ) -> @location(0) vec4<f32> {
|
|
475
|
+
let trail = textureSample(tex, samp, in.uv).rgb;
|
|
476
|
+
let mapped = trail / (trail + vec3<f32>(0.85)); // Reinhard — hot cores, not white wash
|
|
477
|
+
if (u.p.y < 0.5) {
|
|
478
|
+
let rgb = clamp(linearToSrgb(mapped), vec3<f32>(0.0), vec3<f32>(1.0));
|
|
479
|
+
let a = clamp(max(mapped.r, max(mapped.g, mapped.b)), 0.0, 1.0);
|
|
480
|
+
return vec4<f32>(rgb * a, a);
|
|
481
|
+
}
|
|
482
|
+
let bloom = smoothstep(1.3, 0.0, distance(in.uv, vec2<f32>(0.12, 0.88)));
|
|
483
|
+
let floorLin = u.floorC.rgb + u.bloomC.rgb * bloom * 0.5;
|
|
484
|
+
let lin = floorLin + mapped;
|
|
485
|
+
let rgb = clamp(linearToSrgb(lin), vec3<f32>(0.0), vec3<f32>(1.0));
|
|
486
|
+
return vec4<f32>(rgb, 1.0);
|
|
221
487
|
}
|
|
222
|
-
|
|
488
|
+
`, J = 64, ye = 128, Y = 8, be = 16, xe = 4, Se = 1, X = 2, Ce = 4, we = 64;
|
|
489
|
+
function Te(e) {
|
|
490
|
+
let { canvas: t, config: n, getPalette: r, shouldContinue: i, onFrame: a, getPointer: s } = e;
|
|
491
|
+
return function(e, l, u) {
|
|
492
|
+
let d = n.mode === "flow", f = G(n.gridPitch, $(t)), p = d ? He(n) : f.count, m = d ? he(p, n.lifetimeSec) : me(f), h = e.createShaderModule({
|
|
493
|
+
label: "[DotFlowField] flow-field.compute.wgsl",
|
|
494
|
+
code: ge
|
|
495
|
+
}), g = e.createShaderModule({
|
|
496
|
+
label: "[DotFlowField] flow-field.render.wgsl",
|
|
497
|
+
code: _e
|
|
498
|
+
}), _ = e.createBuffer({
|
|
499
|
+
label: "[DotFlowField] particles",
|
|
500
|
+
size: m.length / 4 * 16,
|
|
501
|
+
usage: ye | Y,
|
|
502
|
+
mappedAtCreation: !0
|
|
503
|
+
});
|
|
504
|
+
new Float32Array(_.getMappedRange()).set(m), _.unmap();
|
|
505
|
+
let v = e.createBuffer({
|
|
506
|
+
label: "[DotFlowField] compute-uniforms",
|
|
507
|
+
size: ie().buffer.byteLength,
|
|
508
|
+
usage: J | Y
|
|
509
|
+
}), y = e.createBuffer({
|
|
510
|
+
label: "[DotFlowField] render-uniforms",
|
|
511
|
+
size: ce().buffer.byteLength,
|
|
512
|
+
usage: J | Y
|
|
513
|
+
}), b = e.createBindGroupLayout({
|
|
514
|
+
label: "[DotFlowField] compute-bgl",
|
|
515
|
+
entries: [{
|
|
516
|
+
binding: 0,
|
|
517
|
+
visibility: Ce,
|
|
518
|
+
buffer: { type: "uniform" }
|
|
519
|
+
}, {
|
|
520
|
+
binding: 1,
|
|
521
|
+
visibility: Ce,
|
|
522
|
+
buffer: { type: "storage" }
|
|
523
|
+
}]
|
|
524
|
+
}), x = e.createComputePipeline({
|
|
525
|
+
label: "[DotFlowField] compute-pipeline",
|
|
526
|
+
layout: e.createPipelineLayout({ bindGroupLayouts: [b] }),
|
|
527
|
+
compute: {
|
|
528
|
+
module: h,
|
|
529
|
+
entryPoint: "cs_main"
|
|
530
|
+
}
|
|
531
|
+
}), S = e.createBindGroup({
|
|
532
|
+
label: "[DotFlowField] compute-bg",
|
|
533
|
+
layout: b,
|
|
534
|
+
entries: [{
|
|
535
|
+
binding: 0,
|
|
536
|
+
resource: { buffer: v }
|
|
537
|
+
}, {
|
|
538
|
+
binding: 1,
|
|
539
|
+
resource: { buffer: _ }
|
|
540
|
+
}]
|
|
541
|
+
}), C = e.createBindGroupLayout({
|
|
542
|
+
label: "[DotFlowField] render-bgl",
|
|
543
|
+
entries: [{
|
|
544
|
+
binding: 0,
|
|
545
|
+
visibility: Se | X,
|
|
546
|
+
buffer: { type: "uniform" }
|
|
547
|
+
}, {
|
|
548
|
+
binding: 1,
|
|
549
|
+
visibility: Se,
|
|
550
|
+
buffer: { type: "read-only-storage" }
|
|
551
|
+
}]
|
|
552
|
+
}), w = "rgba16float", T = e.createRenderPipeline({
|
|
553
|
+
label: "[DotFlowField] render-pipeline",
|
|
554
|
+
layout: e.createPipelineLayout({ bindGroupLayouts: [C] }),
|
|
555
|
+
vertex: {
|
|
556
|
+
module: g,
|
|
557
|
+
entryPoint: "vs_main"
|
|
558
|
+
},
|
|
559
|
+
fragment: {
|
|
560
|
+
module: g,
|
|
561
|
+
entryPoint: "fs_main",
|
|
562
|
+
targets: [{
|
|
563
|
+
format: d ? w : u,
|
|
564
|
+
blend: d ? {
|
|
565
|
+
color: {
|
|
566
|
+
srcFactor: "one",
|
|
567
|
+
dstFactor: "one",
|
|
568
|
+
operation: "add"
|
|
569
|
+
},
|
|
570
|
+
alpha: {
|
|
571
|
+
srcFactor: "one",
|
|
572
|
+
dstFactor: "one",
|
|
573
|
+
operation: "add"
|
|
574
|
+
}
|
|
575
|
+
} : {
|
|
576
|
+
color: {
|
|
577
|
+
srcFactor: "one",
|
|
578
|
+
dstFactor: "one-minus-src-alpha",
|
|
579
|
+
operation: "add"
|
|
580
|
+
},
|
|
581
|
+
alpha: {
|
|
582
|
+
srcFactor: "one",
|
|
583
|
+
dstFactor: "one-minus-src-alpha",
|
|
584
|
+
operation: "add"
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}]
|
|
588
|
+
},
|
|
589
|
+
primitive: { topology: "triangle-list" }
|
|
590
|
+
}), E = e.createBindGroup({
|
|
591
|
+
label: "[DotFlowField] render-bg",
|
|
592
|
+
layout: C,
|
|
593
|
+
entries: [{
|
|
594
|
+
binding: 0,
|
|
595
|
+
resource: { buffer: y }
|
|
596
|
+
}, {
|
|
597
|
+
binding: 1,
|
|
598
|
+
resource: { buffer: _ }
|
|
599
|
+
}]
|
|
600
|
+
}), D = d ? e.createShaderModule({
|
|
601
|
+
label: "[DotFlowField] flow-field.trail.wgsl",
|
|
602
|
+
code: ve
|
|
603
|
+
}) : null, O = d ? e.createBuffer({
|
|
604
|
+
label: "[DotFlowField] trail-uniforms",
|
|
605
|
+
size: 48,
|
|
606
|
+
usage: J | Y
|
|
607
|
+
}) : null, k = d ? e.createSampler({
|
|
608
|
+
magFilter: "linear",
|
|
609
|
+
minFilter: "linear"
|
|
610
|
+
}) : null, A = d && D ? e.createBindGroupLayout({
|
|
611
|
+
label: "[DotFlowField] trail-bgl",
|
|
612
|
+
entries: [
|
|
613
|
+
{
|
|
614
|
+
binding: 0,
|
|
615
|
+
visibility: X,
|
|
616
|
+
buffer: { type: "uniform" }
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
binding: 1,
|
|
620
|
+
visibility: X,
|
|
621
|
+
sampler: { type: "filtering" }
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
binding: 2,
|
|
625
|
+
visibility: X,
|
|
626
|
+
texture: { sampleType: "float" }
|
|
627
|
+
}
|
|
628
|
+
]
|
|
629
|
+
}) : null, j = d && D && A ? e.createRenderPipeline({
|
|
630
|
+
label: "[DotFlowField] trail-decay-pipeline",
|
|
631
|
+
layout: e.createPipelineLayout({ bindGroupLayouts: [A] }),
|
|
632
|
+
vertex: {
|
|
633
|
+
module: D,
|
|
634
|
+
entryPoint: "vs_fsq"
|
|
635
|
+
},
|
|
636
|
+
fragment: {
|
|
637
|
+
module: D,
|
|
638
|
+
entryPoint: "fs_decay",
|
|
639
|
+
targets: [{ format: w }]
|
|
640
|
+
},
|
|
641
|
+
primitive: { topology: "triangle-list" }
|
|
642
|
+
}) : null, M = d && D && A ? e.createRenderPipeline({
|
|
643
|
+
label: "[DotFlowField] trail-present-pipeline",
|
|
644
|
+
layout: e.createPipelineLayout({ bindGroupLayouts: [A] }),
|
|
645
|
+
vertex: {
|
|
646
|
+
module: D,
|
|
647
|
+
entryPoint: "vs_fsq"
|
|
648
|
+
},
|
|
649
|
+
fragment: {
|
|
650
|
+
module: D,
|
|
651
|
+
entryPoint: "fs_present",
|
|
652
|
+
targets: [{ format: u }]
|
|
653
|
+
},
|
|
654
|
+
primitive: { topology: "triangle-list" }
|
|
655
|
+
}) : null, N = null, P = null, F = null, I = null, L = 0;
|
|
656
|
+
function R() {
|
|
657
|
+
if (!d || !A || !O || !k) return;
|
|
658
|
+
let r = Math.min(Math.max(n.trailScale, .25), 1), i = Math.max(2, Math.round(t.width * r)), a = Math.max(2, Math.round(t.height * r));
|
|
659
|
+
N?.forEach((e) => e.destroy());
|
|
660
|
+
let o = () => e.createTexture({
|
|
661
|
+
label: "[DotFlowField] trail",
|
|
662
|
+
size: {
|
|
663
|
+
width: i,
|
|
664
|
+
height: a
|
|
665
|
+
},
|
|
666
|
+
format: w,
|
|
667
|
+
usage: be | xe
|
|
668
|
+
}), s = o(), c = o();
|
|
669
|
+
N = [s, c], P = [s.createView(), c.createView()];
|
|
670
|
+
let l = (t) => e.createBindGroup({
|
|
671
|
+
layout: A,
|
|
672
|
+
entries: [
|
|
673
|
+
{
|
|
674
|
+
binding: 0,
|
|
675
|
+
resource: { buffer: O }
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
binding: 1,
|
|
679
|
+
resource: k
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
binding: 2,
|
|
683
|
+
resource: t
|
|
684
|
+
}
|
|
685
|
+
]
|
|
686
|
+
});
|
|
687
|
+
F = [l(P[1]), l(P[0])], I = [l(P[0]), l(P[1])];
|
|
688
|
+
}
|
|
689
|
+
let z = ie(), B = ce(), V = new Float32Array(12), H = -1;
|
|
690
|
+
function U() {
|
|
691
|
+
let e = o(), r = t.clientWidth || 320, i = t.clientHeight || 320, a = Math.max(1, Math.round(r * e)), s = Math.max(1, Math.round(i * e));
|
|
692
|
+
if ((t.width !== a || t.height !== s) && (t.width = a, t.height = s), !d) {
|
|
693
|
+
let e = G(n.gridPitch, $(t));
|
|
694
|
+
f = {
|
|
695
|
+
...e,
|
|
696
|
+
count: Math.min(e.count, m.length / 4)
|
|
697
|
+
};
|
|
698
|
+
}
|
|
699
|
+
R();
|
|
700
|
+
}
|
|
701
|
+
function W(i) {
|
|
702
|
+
a?.(i);
|
|
703
|
+
let o = H < 0 ? 0 : Math.min(Math.max(i - H, 0), .05);
|
|
704
|
+
H = i;
|
|
705
|
+
let u = (t.clientWidth || 320) / Math.max(t.clientHeight || 320, 1), m = d ? p : f.count, h = s?.();
|
|
706
|
+
ae(z, n, i, o, f, m, h), e.queue.writeBuffer(v, 0, z.buffer), fe(B, n, i, u, $(t), f, r()), e.queue.writeBuffer(y, 0, B.buffer);
|
|
707
|
+
let g = e.createCommandEncoder({ label: "[DotFlowField] frame" }), _ = g.beginComputePass();
|
|
708
|
+
if (_.setPipeline(x), _.setBindGroup(0, S), _.dispatchWorkgroups(Math.ceil(m / we)), _.end(), d && P && F && I && j && M && O) {
|
|
709
|
+
let t = L, r = 1 - L, a = ee(n.trailHalfLife), o = n.background === "transparent" ? 0 : 1, s = c(n.background === "transparent" ? Be : n.background), u = c(Ve);
|
|
710
|
+
V[0] = a, V[1] = o, V[2] = i, V[4] = s[0], V[5] = s[1], V[6] = s[2], V[8] = u[0], V[9] = u[1], V[10] = u[2], e.queue.writeBuffer(O, 0, V.buffer);
|
|
711
|
+
let d = g.beginRenderPass({ colorAttachments: [{
|
|
712
|
+
view: P[t],
|
|
713
|
+
clearValue: {
|
|
714
|
+
r: 0,
|
|
715
|
+
g: 0,
|
|
716
|
+
b: 0,
|
|
717
|
+
a: 0
|
|
718
|
+
},
|
|
719
|
+
loadOp: "clear",
|
|
720
|
+
storeOp: "store"
|
|
721
|
+
}] });
|
|
722
|
+
d.setPipeline(j), d.setBindGroup(0, F[t]), d.draw(3, 1, 0, 0), d.end();
|
|
723
|
+
let f = g.beginRenderPass({ colorAttachments: [{
|
|
724
|
+
view: P[t],
|
|
725
|
+
loadOp: "load",
|
|
726
|
+
storeOp: "store"
|
|
727
|
+
}] });
|
|
728
|
+
f.setPipeline(T), f.setBindGroup(0, E), f.draw(6, m, 0, 0), f.end();
|
|
729
|
+
let p = l.getCurrentTexture().createView(), h = g.beginRenderPass({ colorAttachments: [{
|
|
730
|
+
view: p,
|
|
731
|
+
clearValue: {
|
|
732
|
+
r: 0,
|
|
733
|
+
g: 0,
|
|
734
|
+
b: 0,
|
|
735
|
+
a: 0
|
|
736
|
+
},
|
|
737
|
+
loadOp: "clear",
|
|
738
|
+
storeOp: "store"
|
|
739
|
+
}] });
|
|
740
|
+
h.setPipeline(M), h.setBindGroup(0, I[t]), h.draw(3, 1, 0, 0), h.end(), L = r;
|
|
741
|
+
} else {
|
|
742
|
+
let e = l.getCurrentTexture().createView(), t = g.beginRenderPass({ colorAttachments: [{
|
|
743
|
+
view: e,
|
|
744
|
+
clearValue: {
|
|
745
|
+
r: 0,
|
|
746
|
+
g: 0,
|
|
747
|
+
b: 0,
|
|
748
|
+
a: 0
|
|
749
|
+
},
|
|
750
|
+
loadOp: "clear",
|
|
751
|
+
storeOp: "store"
|
|
752
|
+
}] });
|
|
753
|
+
t.setPipeline(T), t.setBindGroup(0, E), t.draw(6, m, 0, 0), t.end();
|
|
754
|
+
}
|
|
755
|
+
e.queue.submit([g.finish()]);
|
|
756
|
+
}
|
|
757
|
+
return {
|
|
758
|
+
frame: W,
|
|
759
|
+
shouldContinue: i,
|
|
760
|
+
resize: U,
|
|
761
|
+
teardown: () => {
|
|
762
|
+
_.destroy(), v.destroy(), y.destroy(), O?.destroy(), N?.forEach((e) => e.destroy());
|
|
763
|
+
}
|
|
764
|
+
};
|
|
765
|
+
};
|
|
766
|
+
}
|
|
767
|
+
//#endregion
|
|
768
|
+
//#region src/components/custom/dot-flow-field/shaders/flow-field.glsl.ts
|
|
769
|
+
var Ee = "#version 300 es\nprecision highp float;\nin vec2 aPosition;\nout vec2 vUv;\nvoid main() {\n vUv = aPosition; // [-1,1]² domain\n gl_Position = vec4(aPosition, 0.0, 1.0);\n}", De = `#version 300 es
|
|
770
|
+
precision highp float;
|
|
771
|
+
|
|
772
|
+
#define PI 3.141592653589793
|
|
773
|
+
#define TAU 6.283185307179586
|
|
774
|
+
#define FLOW_GRAVITY 9.81
|
|
775
|
+
#define CURL_EPS 0.012
|
|
776
|
+
#define MAX_WAVE_COMPONENTS 8
|
|
777
|
+
#define MAX_FLOW_STOPS 4
|
|
778
|
+
|
|
779
|
+
in vec2 vUv;
|
|
780
|
+
out vec4 fragColor;
|
|
781
|
+
|
|
782
|
+
uniform float uTime;
|
|
783
|
+
uniform float uWindSpeed;
|
|
784
|
+
uniform float uCurlStrength;
|
|
785
|
+
uniform float uDomainHalf;
|
|
786
|
+
uniform float uAspect;
|
|
787
|
+
uniform float uGridPitchDomain; // lattice pitch in DOMAIN units
|
|
788
|
+
uniform float uDotRadiusDomain; // dot radius in DOMAIN units
|
|
789
|
+
uniform float uDisplaceAmp; // sub-cell drift in pitch fractions
|
|
790
|
+
uniform float uContrast;
|
|
791
|
+
uniform float uBaseBright;
|
|
792
|
+
uniform float uWaveBandCenter;
|
|
793
|
+
uniform float uWaveBandWidth;
|
|
794
|
+
uniform float uGlobeMask;
|
|
795
|
+
uniform int uWaveCount;
|
|
796
|
+
uniform int uStopCount;
|
|
797
|
+
uniform float uHasBackground;
|
|
798
|
+
uniform vec3 uBg;
|
|
799
|
+
uniform vec4 uWaves[MAX_WAVE_COMPONENTS]; // (amplitude, wavelength, directionDeg, phase)
|
|
800
|
+
uniform vec3 uPalette[MAX_FLOW_STOPS]; // linear-sRGB stops
|
|
801
|
+
|
|
802
|
+
const mat2 FBM_ROT = mat2(0.8, 0.6, -0.6, 0.8);
|
|
803
|
+
|
|
804
|
+
${r}
|
|
805
|
+
${a}
|
|
806
|
+
|
|
807
|
+
// ── The Gerstner-sum analytic ∇⊥h velocity (transcribes flowField.ts gerstnerVelocity) ──
|
|
808
|
+
vec2 gerstnerVelocity(vec2 p, float t) {
|
|
809
|
+
float dhdx = 0.0;
|
|
810
|
+
float dhdy = 0.0;
|
|
811
|
+
for (int i = 0; i < MAX_WAVE_COMPONENTS; i++) {
|
|
812
|
+
if (i >= uWaveCount) break;
|
|
813
|
+
vec4 w = uWaves[i];
|
|
814
|
+
float k = TAU / max(w.y, 1e-4);
|
|
815
|
+
float dirRad = w.z * PI / 180.0;
|
|
816
|
+
vec2 d = vec2(cos(dirRad), sin(dirRad));
|
|
817
|
+
float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;
|
|
818
|
+
float theta = k * (d.x * p.x + d.y * p.y) - omega * t + w.w;
|
|
819
|
+
float akc = w.x * k * cos(theta);
|
|
820
|
+
dhdx += akc * d.x;
|
|
821
|
+
dhdy += akc * d.y;
|
|
822
|
+
}
|
|
823
|
+
return vec2(dhdy, -dhdx);
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
// ── The scalar Gerstner HEIGHT (transcribes flowField.ts sampleHeight) ──
|
|
827
|
+
float sampleHeight(vec2 o, float t) {
|
|
828
|
+
float h = 0.0;
|
|
829
|
+
float ampSum = 0.0;
|
|
830
|
+
for (int i = 0; i < MAX_WAVE_COMPONENTS; i++) {
|
|
831
|
+
if (i >= uWaveCount) break;
|
|
832
|
+
vec4 w = uWaves[i];
|
|
833
|
+
float k = TAU / max(w.y, 1e-4);
|
|
834
|
+
float dirRad = w.z * PI / 180.0;
|
|
835
|
+
vec2 d = vec2(cos(dirRad), sin(dirRad));
|
|
836
|
+
float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;
|
|
837
|
+
float theta = k * (d.x * o.x + d.y * o.y) - omega * t + w.w;
|
|
838
|
+
h += w.x * sin(theta);
|
|
839
|
+
ampSum += abs(w.x);
|
|
840
|
+
}
|
|
841
|
+
return h / max(ampSum, 1e-4);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
// ── Shared curl-noise basis (the GLSL twin of flow.glsl.ts curlFBM) ──
|
|
845
|
+
float hash21(vec2 p) {
|
|
846
|
+
vec3 p3 = fract(vec3(p.x, p.y, p.x) * 0.1031);
|
|
847
|
+
p3 += dot(p3, p3.yzx + 33.33);
|
|
848
|
+
return fract((p3.x + p3.y) * p3.z);
|
|
849
|
+
}
|
|
850
|
+
float valueNoise(vec2 p) {
|
|
223
851
|
vec2 i = floor(p);
|
|
224
852
|
vec2 f = fract(p);
|
|
225
853
|
vec2 u2 = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);
|
|
@@ -340,388 +968,326 @@ void main() {
|
|
|
340
968
|
return;
|
|
341
969
|
}
|
|
342
970
|
fragColor = vec4(rgb * alpha, alpha);
|
|
343
|
-
}`,
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
return O(O(c, l, o), O(u, d, o), s);
|
|
377
|
-
}
|
|
378
|
-
function A(e, t) {
|
|
379
|
-
let n = 0, r = .5, i = 1, a = e, o = t;
|
|
380
|
-
for (let e = 0; e < 3; e++) {
|
|
381
|
-
n += r * k(a * i, o * i);
|
|
382
|
-
let e = .8 * a - .6 * o, t = .6 * a + .8 * o;
|
|
383
|
-
a = e, o = t, i *= 2, r *= .5;
|
|
384
|
-
}
|
|
385
|
-
return n;
|
|
386
|
-
}
|
|
387
|
-
function j(e) {
|
|
388
|
-
let t = A(e.x + E, e.y) - A(e.x - E, e.y), n = A(e.x, e.y + E) - A(e.x, e.y - E), r = t / (2 * E);
|
|
389
|
-
return {
|
|
390
|
-
x: n / (2 * E),
|
|
391
|
-
y: -r
|
|
392
|
-
};
|
|
393
|
-
}
|
|
394
|
-
function M(e, t, n, r, i) {
|
|
395
|
-
let a = T(e, t, n, r);
|
|
396
|
-
if (i <= 0) return a;
|
|
397
|
-
let o = j({
|
|
398
|
-
x: e.x * .55 + t * .15,
|
|
399
|
-
y: e.y * .55
|
|
400
|
-
});
|
|
401
|
-
return {
|
|
402
|
-
x: a.x + o.x * i,
|
|
403
|
-
y: a.y + o.y * i
|
|
404
|
-
};
|
|
405
|
-
}
|
|
406
|
-
var N = .85;
|
|
407
|
-
function P(e, t, n) {
|
|
408
|
-
let r = Math.max(t, 1), i = e % r, a = Math.floor(e / r), o = (r - 1) * n / 2;
|
|
409
|
-
return {
|
|
410
|
-
x: i * n - o,
|
|
411
|
-
y: a * n - o
|
|
412
|
-
};
|
|
413
|
-
}
|
|
414
|
-
function F(e, t, n, r) {
|
|
415
|
-
let i = 0, a = 0;
|
|
416
|
-
for (let o of n) {
|
|
417
|
-
let n = C / Math.max(o.wavelength, 1e-4), s = w(o.direction), c = Math.sqrt(S * n) * r, l = n * (s.x * e.x + s.y * e.y) - c * t + o.phase;
|
|
418
|
-
i += o.amplitude * Math.sin(l), a += Math.abs(o.amplitude);
|
|
419
|
-
}
|
|
420
|
-
return i / Math.max(a, 1e-4);
|
|
421
|
-
}
|
|
422
|
-
function I(e, t, n, r, i) {
|
|
423
|
-
let a = M(e, t, n, r, i), o = Math.hypot(a.x, a.y);
|
|
424
|
-
if (o < 1e-5) return {
|
|
425
|
-
x: 0,
|
|
426
|
-
y: 0
|
|
427
|
-
};
|
|
428
|
-
let s = Math.tanh(o) / o;
|
|
429
|
-
return {
|
|
430
|
-
x: a.x * s,
|
|
431
|
-
y: a.y * s
|
|
432
|
-
};
|
|
433
|
-
}
|
|
434
|
-
function L(e, t, n) {
|
|
435
|
-
return 1 - ee(0, Math.max(n, .001), Math.abs(e - t));
|
|
971
|
+
}`, Oe = "\n#define PI 3.141592653589793\n#define TAU 6.283185307179586\n#define FLOW_GRAVITY 9.81\n#define CURL_EPS 0.012\n#define MAX_WAVE_COMPONENTS 8\nconst mat2 FBM_ROT = mat2(0.8, 0.6, -0.6, 0.8);\n\nuniform float uTime;\nuniform float uWindSpeed;\nuniform float uCurlStrength;\nuniform int uWaveCount;\nuniform vec4 uWaves[MAX_WAVE_COMPONENTS]; // (amplitude, wavelength, directionDeg, phase)\n\nvec2 gerstnerVelocity(vec2 p, float t) {\n float dhdx = 0.0; float dhdy = 0.0;\n for (int i = 0; i < MAX_WAVE_COMPONENTS; i++) {\n if (i >= uWaveCount) break;\n vec4 w = uWaves[i];\n float k = TAU / max(w.y, 1e-4);\n float dirRad = w.z * PI / 180.0;\n vec2 d = vec2(cos(dirRad), sin(dirRad));\n float omega = sqrt(FLOW_GRAVITY * k) * uWindSpeed;\n float theta = k * (d.x * p.x + d.y * p.y) - omega * t + w.w;\n float akc = w.x * k * cos(theta);\n dhdx += akc * d.x; dhdy += akc * d.y;\n }\n return vec2(dhdy, -dhdx);\n}\nfloat hash21f(vec2 p) {\n vec3 p3 = fract(vec3(p.x, p.y, p.x) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\nfloat valueNoiseF(vec2 p) {\n vec2 i = floor(p); vec2 f = fract(p);\n vec2 u2 = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n float a = hash21f(i + vec2(0.0, 0.0));\n float b = hash21f(i + vec2(1.0, 0.0));\n float c = hash21f(i + vec2(0.0, 1.0));\n float d = hash21f(i + vec2(1.0, 1.0));\n return mix(mix(a, b, u2.x), mix(c, d, u2.x), u2.y);\n}\nfloat potentialFBMf(vec2 p0) {\n float v = 0.0; float amp = 0.5; float freq = 1.0; vec2 p = p0;\n for (int i = 0; i < 3; i++) { v += amp * valueNoiseF(p * freq); p = FBM_ROT * p; freq *= 2.0; amp *= 0.5; }\n return v;\n}\nvec2 curlFBMf(vec2 p) {\n float dx = potentialFBMf(p + vec2(CURL_EPS, 0.0)) - potentialFBMf(p - vec2(CURL_EPS, 0.0));\n float dy = potentialFBMf(p + vec2(0.0, CURL_EPS)) - potentialFBMf(p - vec2(0.0, CURL_EPS));\n vec2 g = vec2(dx, dy) / (2.0 * CURL_EPS);\n return vec2(g.y, -g.x);\n}\nvec2 sampleVelocityF(vec2 p, float t) {\n vec2 v = gerstnerVelocity(p, t);\n if (uCurlStrength > 0.0) { v += curlFBMf(vec2(p.x * 0.55 + t * 0.15, p.y * 0.55)) * uCurlStrength; }\n return v;\n}\n", Z = "#version 300 es\nprecision highp float;\nin vec2 aPosition;\nout vec2 vUv;\nvoid main() {\n vUv = aPosition * 0.5 + 0.5; // [0,1] texel space\n gl_Position = vec4(aPosition, 0.0, 1.0);\n}", ke = `#version 300 es
|
|
972
|
+
precision highp float;
|
|
973
|
+
in vec2 vUv;
|
|
974
|
+
out vec4 fragColor;
|
|
975
|
+
|
|
976
|
+
uniform sampler2D uState; // prev particle state (RGBA = pos.xy, speed, life)
|
|
977
|
+
uniform float uDt;
|
|
978
|
+
uniform float uDomainHalf;
|
|
979
|
+
uniform float uTurnRate;
|
|
980
|
+
uniform float uSpeedScale;
|
|
981
|
+
uniform float uLifetimeSec;
|
|
982
|
+
uniform float uEdgeBias;
|
|
983
|
+
uniform vec2 uCursor; // pointer in domain space
|
|
984
|
+
uniform vec2 uPointerVel; // pointer velocity (domain/s)
|
|
985
|
+
uniform float uBurst; // flick-burst impulse
|
|
986
|
+
uniform float uPointerActive; // 0/1
|
|
987
|
+
uniform float uVortexRadius;
|
|
988
|
+
uniform float uVortexSpin;
|
|
989
|
+
uniform float uDragGain;
|
|
990
|
+
uniform float uBurstShove;
|
|
991
|
+
|
|
992
|
+
${Oe}
|
|
993
|
+
|
|
994
|
+
vec2 pointerVortex(vec2 p) {
|
|
995
|
+
if (uPointerActive < 0.5) return vec2(0.0);
|
|
996
|
+
vec2 r = p - uCursor;
|
|
997
|
+
float d = length(r);
|
|
998
|
+
float radius = max(uVortexRadius, 1e-3);
|
|
999
|
+
float fall = exp(-(d * d) / (radius * radius));
|
|
1000
|
+
vec2 swirl = normalize(vec2(-r.y, r.x) + vec2(1e-6, 0.0));
|
|
1001
|
+
vec2 radial = r / max(d, 1e-4);
|
|
1002
|
+
vec2 v = swirl * uVortexSpin + uPointerVel * uDragGain + radial * uBurst * uBurstShove;
|
|
1003
|
+
return v * fall;
|
|
436
1004
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
1005
|
+
|
|
1006
|
+
vec2 respawn(vec2 seed, float t) {
|
|
1007
|
+
float rx = hash21f(seed + vec2(t * 0.37, 1.7)) * 2.0 - 1.0;
|
|
1008
|
+
float ry = hash21f(seed.yx + vec2(3.1, t * 0.37)) * 2.0 - 1.0;
|
|
1009
|
+
float bias = clamp(uEdgeBias, 0.0, 1.0);
|
|
1010
|
+
float bx = sign(rx) * pow(abs(rx), mix(1.0, 0.5, bias));
|
|
1011
|
+
float by = sign(ry) * pow(abs(ry), mix(1.0, 0.5, bias));
|
|
1012
|
+
return vec2(bx, by) * uDomainHalf;
|
|
440
1013
|
}
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
1014
|
+
|
|
1015
|
+
void main() {
|
|
1016
|
+
vec4 st = texture(uState, vUv);
|
|
1017
|
+
vec2 pos = st.xy;
|
|
1018
|
+
float life = st.w;
|
|
1019
|
+
float half = uDomainHalf;
|
|
1020
|
+
|
|
1021
|
+
bool dead = life <= 0.0;
|
|
1022
|
+
bool outOfDomain = max(abs(pos.x), abs(pos.y)) > half * 1.05;
|
|
1023
|
+
if (dead || outOfDomain) {
|
|
1024
|
+
pos = respawn(vUv, uTime);
|
|
1025
|
+
life = max(uLifetimeSec, 1e-3) * hash21f(vUv * 7.0 + uTime * 0.11);
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
vec2 vField = sampleVelocityF(pos, uTime) + pointerVortex(pos);
|
|
1029
|
+
// momentum: low turnRate = weighty arcs (eases into the current's turns).
|
|
1030
|
+
vec2 v = vField * uTurnRate * uSpeedScale;
|
|
1031
|
+
// forward-Euler advection (pos = pos + v*dt — the integrand twin of cs_flow).
|
|
1032
|
+
pos = pos + v * uDt * 60.0;
|
|
1033
|
+
life = life - uDt;
|
|
1034
|
+
|
|
1035
|
+
fragColor = vec4(pos, length(v), life);
|
|
1036
|
+
}`, Ae = "#version 300 es\nprecision highp float;\nuniform sampler2D uState;\nuniform int uStateCols;\nuniform float uDomainHalf;\nuniform float uPointSize;\nuniform float uSpeedNorm; // the speed→[0,1] normalizer (modal-speed at ramp middle)\nuniform float uStretchAmp;\nout float vSpeedNorm;\nout float vFade;\nvoid main() {\n int id = gl_VertexID;\n int col = id % uStateCols;\n int row = id / uStateCols;\n vec2 uv = (vec2(float(col), float(row)) + 0.5) / float(uStateCols);\n vec4 st = texture(uState, uv);\n vec2 pos = st.xy;\n float speed = st.z;\n float life = st.w;\n float sn = clamp(speed / max(uSpeedNorm, 1e-4), 0.0, 1.0);\n vSpeedNorm = sn;\n vFade = clamp(life * 3.0, 0.0, 1.0);\n // NDC: domain [-half,half] → [-1,1].\n gl_Position = vec4(pos / uDomainHalf, 0.0, 1.0);\n // faster motes read as larger hot speed-cores (the cartoon \"more\" as point size).\n gl_PointSize = max(uPointSize * (1.0 + sn * (uStretchAmp + 1.0)), 1.0);\n}", je = `#version 300 es
|
|
1037
|
+
precision highp float;
|
|
1038
|
+
#define MAX_FLOW_STOPS 4
|
|
1039
|
+
in float vSpeedNorm;
|
|
1040
|
+
in float vFade;
|
|
1041
|
+
out vec4 fragColor;
|
|
1042
|
+
uniform int uStopCount;
|
|
1043
|
+
uniform vec3 uPalette[MAX_FLOW_STOPS];
|
|
1044
|
+
uniform float uSpeedGlow;
|
|
1045
|
+
|
|
1046
|
+
${r}
|
|
1047
|
+
${a}
|
|
1048
|
+
|
|
1049
|
+
vec3 samplePaletteLin(float t) {
|
|
1050
|
+
if (uStopCount <= 1) return uPalette[0];
|
|
1051
|
+
float n = float(uStopCount);
|
|
1052
|
+
float ft = clamp(t, 0.0, 1.0) * (n - 1.0);
|
|
1053
|
+
int i0 = int(floor(ft));
|
|
1054
|
+
int i1 = min(i0 + 1, uStopCount - 1);
|
|
1055
|
+
float f = ft - float(i0);
|
|
1056
|
+
vec3 lmsA = LINEAR_SRGB_TO_LMS * uPalette[i0];
|
|
1057
|
+
vec3 lmsB = LINEAR_SRGB_TO_LMS * uPalette[i1];
|
|
1058
|
+
vec3 labA = LMS_TO_OKLAB * (sign(lmsA) * pow(abs(lmsA), vec3(1.0 / 3.0)));
|
|
1059
|
+
vec3 labB = LMS_TO_OKLAB * (sign(lmsB) * pow(abs(lmsB), vec3(1.0 / 3.0)));
|
|
1060
|
+
return oklabToLinearSrgb(mix(labA, labB, f));
|
|
453
1061
|
}
|
|
1062
|
+
|
|
1063
|
+
void main() {
|
|
1064
|
+
// soft round sprite — a tight hot core (mask² caps the white wash, H2).
|
|
1065
|
+
vec2 pc = gl_PointCoord * 2.0 - 1.0;
|
|
1066
|
+
float r = length(pc);
|
|
1067
|
+
float mask = 1.0 - smoothstep(0.55, 1.0, r);
|
|
1068
|
+
if (mask < 0.002) discard;
|
|
1069
|
+
float core = mask * mask;
|
|
1070
|
+
float bright = (0.35 + vSpeedNorm * uSpeedGlow) * vFade;
|
|
1071
|
+
vec3 lin = samplePaletteLin(vSpeedNorm) * bright;
|
|
1072
|
+
vec3 rgb = clamp(linearToSrgb(lin), vec3(0.0), vec3(1.0));
|
|
1073
|
+
float a = core * clamp(bright, 0.0, 1.0);
|
|
1074
|
+
fragColor = vec4(rgb * a, a); // additive premultiplied (the trail braids the ribbons)
|
|
1075
|
+
}`, Me = "#version 300 es\nprecision highp float;\nin vec2 vUv;\nout vec4 fragColor;\nuniform sampler2D uPrev;\nuniform float uDecay; // per-frame trail persistence (DERIVED from trailHalfLife)\nvoid main() {\n vec4 prev = texture(uPrev, vUv);\n fragColor = prev * uDecay; // fade toward black; the warm floor is the present-blit's\n}", Ne = `#version 300 es
|
|
1076
|
+
precision highp float;
|
|
1077
|
+
in vec2 vUv;
|
|
1078
|
+
out vec4 fragColor;
|
|
1079
|
+
uniform sampler2D uTrail;
|
|
1080
|
+
uniform vec3 uFloor; // the deep warm-near-black floor (linear-sRGB)
|
|
1081
|
+
uniform vec3 uBloomColor; // the warm rose/magenta corner-bloom (linear-sRGB)
|
|
1082
|
+
uniform float uHasGround; // 0 → transparent (compose over the page field); 1 → opaque floor
|
|
1083
|
+
|
|
1084
|
+
${r}
|
|
1085
|
+
|
|
1086
|
+
void main() {
|
|
1087
|
+
vec3 trail = texture(uTrail, vUv).rgb;
|
|
1088
|
+
// soft tone-map the accumulated additive trail (Reinhard — hot cores, not white wash).
|
|
1089
|
+
vec3 mapped = trail / (trail + vec3(0.85));
|
|
1090
|
+
if (uHasGround < 0.5) {
|
|
1091
|
+
// compose OVER the page's warm field: emit the lit ribbons premultiplied, no floor.
|
|
1092
|
+
vec3 rgb = clamp(linearToSrgb(mapped), vec3(0.0), vec3(1.0));
|
|
1093
|
+
float a = clamp(max(mapped.r, max(mapped.g, mapped.b)), 0.0, 1.0);
|
|
1094
|
+
fragColor = vec4(rgb * a, a);
|
|
1095
|
+
return;
|
|
1096
|
+
}
|
|
1097
|
+
// the corner-bloom: a faint warm rose radial in one corner (NOT teal).
|
|
1098
|
+
float bloom = smoothstep(1.3, 0.0, distance(vUv, vec2(0.12, 0.88)));
|
|
1099
|
+
vec3 floorLin = uFloor + uBloomColor * bloom * 0.5;
|
|
1100
|
+
vec3 lin = floorLin + mapped; // the ribbons sit OVER the warm floor
|
|
1101
|
+
vec3 rgb = clamp(linearToSrgb(lin), vec3(0.0), vec3(1.0));
|
|
1102
|
+
fragColor = vec4(rgb, 1.0);
|
|
1103
|
+
}`;
|
|
454
1104
|
//#endregion
|
|
455
|
-
//#region src/components/custom/dot-flow-field/
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
h: 62
|
|
464
|
-
}], B = R(35, 3, 2.5), V = {
|
|
465
|
-
waveComponents: B,
|
|
466
|
-
windSpeed: .3,
|
|
467
|
-
curlStrength: .12,
|
|
468
|
-
gridPitch: 26,
|
|
469
|
-
dotSize: 2,
|
|
470
|
-
displaceAmp: .18,
|
|
471
|
-
springK: 6,
|
|
472
|
-
waveBandCenter: 0,
|
|
473
|
-
waveBandWidth: .55,
|
|
474
|
-
contrast: .6,
|
|
475
|
-
coherence: .8,
|
|
476
|
-
globeMask: !1,
|
|
477
|
-
palette: z,
|
|
478
|
-
background: "transparent",
|
|
479
|
-
interactive: !1,
|
|
480
|
-
respectReducedMotion: !0
|
|
481
|
-
}, H = N, ie = 16384;
|
|
482
|
-
function U(e, t) {
|
|
483
|
-
let n = Math.min(Math.max(Math.ceil((t || 320) / Math.max(e, 4)) + 2, 4), 128);
|
|
484
|
-
return {
|
|
485
|
-
cols: n,
|
|
486
|
-
count: Math.min(n * n, ie),
|
|
487
|
-
pitchDomain: 2 * H / Math.max(n, 1)
|
|
488
|
-
};
|
|
489
|
-
}
|
|
490
|
-
var ae = 176, W = {
|
|
491
|
-
p0: 0,
|
|
492
|
-
p1: 4,
|
|
493
|
-
ints: 8,
|
|
494
|
-
waves: 12
|
|
495
|
-
};
|
|
496
|
-
function G() {
|
|
497
|
-
let e = new ArrayBuffer(ae);
|
|
498
|
-
return {
|
|
499
|
-
buffer: e,
|
|
500
|
-
f32: new Float32Array(e),
|
|
501
|
-
i32: new Int32Array(e)
|
|
502
|
-
};
|
|
503
|
-
}
|
|
504
|
-
function oe(e, t, n, r, i) {
|
|
505
|
-
let { f32: a, i32: o } = e;
|
|
506
|
-
a[W.p0 + 0] = n, a[W.p0 + 1] = r, a[W.p0 + 2] = t.windSpeed, a[W.p0 + 3] = t.curlStrength, a[W.p1 + 0] = i.pitchDomain, a[W.p1 + 1] = t.displaceAmp, a[W.p1 + 2] = t.springK, a[W.p1 + 3] = i.cols;
|
|
507
|
-
let s = Math.min(t.waveComponents.length, 8);
|
|
508
|
-
return o[W.ints + 0] = s, o[W.ints + 1] = i.count, o[W.ints + 2] = i.cols, o[W.ints + 3] = 0, de(a, W.waves, t.waveComponents), e;
|
|
509
|
-
}
|
|
510
|
-
var se = 144, K = {
|
|
511
|
-
r0: 0,
|
|
512
|
-
r1: 4,
|
|
513
|
-
r2: 8,
|
|
514
|
-
ints: 12,
|
|
515
|
-
bg: 16,
|
|
516
|
-
palette: 20
|
|
517
|
-
};
|
|
518
|
-
function q() {
|
|
519
|
-
let e = new ArrayBuffer(se);
|
|
520
|
-
return {
|
|
521
|
-
buffer: e,
|
|
522
|
-
f32: new Float32Array(e),
|
|
523
|
-
i32: new Int32Array(e)
|
|
524
|
-
};
|
|
1105
|
+
//#region src/components/custom/dot-flow-field/composables/flowGLProgram.ts
|
|
1106
|
+
function Pe(e, t, n) {
|
|
1107
|
+
let r = e.createShader(t);
|
|
1108
|
+
if (e.shaderSource(r, n), e.compileShader(r), !e.getShaderParameter(r, e.COMPILE_STATUS)) {
|
|
1109
|
+
let t = e.getShaderInfoLog(r);
|
|
1110
|
+
throw e.deleteShader(r), Error(`[DotFlowField] shader compile failed: ${t}`);
|
|
1111
|
+
}
|
|
1112
|
+
return r;
|
|
525
1113
|
}
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
return e
|
|
1114
|
+
function Q(e, t, n) {
|
|
1115
|
+
let r = Pe(e, e.VERTEX_SHADER, t), i = Pe(e, e.FRAGMENT_SHADER, n), a = e.createProgram();
|
|
1116
|
+
if (e.attachShader(a, r), e.attachShader(a, i), e.linkProgram(a), !e.getProgramParameter(a, e.LINK_STATUS)) throw Error(`[DotFlowField] link failed: ${e.getProgramInfoLog(a)}`);
|
|
1117
|
+
return e.deleteShader(r), e.deleteShader(i), a;
|
|
530
1118
|
}
|
|
531
|
-
function
|
|
532
|
-
let
|
|
533
|
-
|
|
534
|
-
let
|
|
535
|
-
|
|
536
|
-
else {
|
|
537
|
-
let e = c(t.background);
|
|
538
|
-
s[K.bg + 0] = e[0], s[K.bg + 1] = e[1], s[K.bg + 2] = e[2], s[K.bg + 3] = 1;
|
|
539
|
-
}
|
|
540
|
-
for (let e = 0; e < 4; e++) {
|
|
541
|
-
let t = K.palette + e * 4, n = c(o[Math.min(e, u - 1)] ?? o[0]);
|
|
542
|
-
s[t + 0] = n[0], s[t + 1] = n[1], s[t + 2] = n[2], s[t + 3] = 0;
|
|
543
|
-
}
|
|
544
|
-
return e;
|
|
1119
|
+
function Fe(e, t, n) {
|
|
1120
|
+
let r = e.createTexture(), i = e.createFramebuffer();
|
|
1121
|
+
e.bindTexture(e.TEXTURE_2D, r), e.texImage2D(e.TEXTURE_2D, 0, t, 2, 2, 0, e.RGBA, n, null), e.bindFramebuffer(e.FRAMEBUFFER, i), e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, r, 0);
|
|
1122
|
+
let a = e.checkFramebufferStatus(e.FRAMEBUFFER) === e.FRAMEBUFFER_COMPLETE;
|
|
1123
|
+
return e.bindFramebuffer(e.FRAMEBUFFER, null), e.deleteFramebuffer(i), e.deleteTexture(r), a;
|
|
545
1124
|
}
|
|
546
|
-
function
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
}
|
|
1125
|
+
function Ie(e) {
|
|
1126
|
+
let t = new Uint16Array(e.length);
|
|
1127
|
+
for (let n = 0; n < e.length; n++) t[n] = Le(e[n]);
|
|
1128
|
+
return t;
|
|
551
1129
|
}
|
|
552
|
-
function
|
|
553
|
-
let
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
}
|
|
558
|
-
return i;
|
|
1130
|
+
function Le(e) {
|
|
1131
|
+
let t = new Float32Array(1), n = new Int32Array(t.buffer);
|
|
1132
|
+
t[0] = e;
|
|
1133
|
+
let r = n[0], i = r >> 16 & 32768, a = (r >> 23 & 255) - 127 + 15, o = r & 8388607;
|
|
1134
|
+
return a <= 0 ? i : a >= 31 ? i | 31744 : (o >>= 13, i | a << 10 | o);
|
|
559
1135
|
}
|
|
560
1136
|
//#endregion
|
|
561
|
-
//#region src/components/custom/dot-flow-field/composables/
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
return
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
binding: 1,
|
|
598
|
-
visibility: Q,
|
|
599
|
-
buffer: { type: "storage" }
|
|
600
|
-
}]
|
|
601
|
-
}), _ = e.createComputePipeline({
|
|
602
|
-
label: "[DotFlowField] compute-pipeline",
|
|
603
|
-
layout: e.createPipelineLayout({ bindGroupLayouts: [g] }),
|
|
604
|
-
compute: {
|
|
605
|
-
module: u,
|
|
606
|
-
entryPoint: "cs_main"
|
|
607
|
-
}
|
|
608
|
-
}), b = e.createBindGroup({
|
|
609
|
-
label: "[DotFlowField] compute-bg",
|
|
610
|
-
layout: g,
|
|
611
|
-
entries: [{
|
|
612
|
-
binding: 0,
|
|
613
|
-
resource: { buffer: m }
|
|
614
|
-
}, {
|
|
615
|
-
binding: 1,
|
|
616
|
-
resource: { buffer: p }
|
|
617
|
-
}]
|
|
618
|
-
}), x = e.createBindGroupLayout({
|
|
619
|
-
label: "[DotFlowField] render-bgl",
|
|
620
|
-
entries: [{
|
|
621
|
-
binding: 0,
|
|
622
|
-
visibility: Z | me,
|
|
623
|
-
buffer: { type: "uniform" }
|
|
624
|
-
}, {
|
|
625
|
-
binding: 1,
|
|
626
|
-
visibility: Z,
|
|
627
|
-
buffer: { type: "read-only-storage" }
|
|
628
|
-
}]
|
|
629
|
-
}), S = e.createRenderPipeline({
|
|
630
|
-
label: "[DotFlowField] render-pipeline",
|
|
631
|
-
layout: e.createPipelineLayout({ bindGroupLayouts: [x] }),
|
|
632
|
-
vertex: {
|
|
633
|
-
module: d,
|
|
634
|
-
entryPoint: "vs_main"
|
|
635
|
-
},
|
|
636
|
-
fragment: {
|
|
637
|
-
module: d,
|
|
638
|
-
entryPoint: "fs_main",
|
|
639
|
-
targets: [{
|
|
640
|
-
format: c,
|
|
641
|
-
blend: {
|
|
642
|
-
color: {
|
|
643
|
-
srcFactor: "one",
|
|
644
|
-
dstFactor: "one-minus-src-alpha",
|
|
645
|
-
operation: "add"
|
|
646
|
-
},
|
|
647
|
-
alpha: {
|
|
648
|
-
srcFactor: "one",
|
|
649
|
-
dstFactor: "one-minus-src-alpha",
|
|
650
|
-
operation: "add"
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
}]
|
|
654
|
-
},
|
|
655
|
-
primitive: { topology: "triangle-list" }
|
|
656
|
-
}), C = e.createBindGroup({
|
|
657
|
-
label: "[DotFlowField] render-bg",
|
|
658
|
-
layout: x,
|
|
659
|
-
entries: [{
|
|
660
|
-
binding: 0,
|
|
661
|
-
resource: { buffer: h }
|
|
662
|
-
}, {
|
|
663
|
-
binding: 1,
|
|
664
|
-
resource: { buffer: p }
|
|
665
|
-
}]
|
|
666
|
-
}), w = G(), T = q(), E = -1;
|
|
667
|
-
function D() {
|
|
668
|
-
let e = o(), r = t.clientWidth || 320, i = t.clientHeight || 320, a = Math.max(1, Math.round(r * e)), s = Math.max(1, Math.round(i * e));
|
|
669
|
-
(t.width !== a || t.height !== s) && (t.width = a, t.height = s);
|
|
670
|
-
let c = U(n.gridPitch, $(t));
|
|
671
|
-
l = {
|
|
672
|
-
...c,
|
|
673
|
-
count: Math.min(c.count, f.length / 4)
|
|
674
|
-
};
|
|
1137
|
+
//#region src/components/custom/dot-flow-field/composables/flowSetupGLFlow.ts
|
|
1138
|
+
function Re(e) {
|
|
1139
|
+
let { canvas: t, config: n, getPalette: r, shouldContinue: i, onFrame: a, getPointer: s } = e;
|
|
1140
|
+
return function(e) {
|
|
1141
|
+
let l = He(n), u = Ue(l);
|
|
1142
|
+
e.getExtension("EXT_color_buffer_float"), e.getExtension("EXT_color_buffer_half_float"), e.getExtension("OES_texture_float_linear");
|
|
1143
|
+
let d = Fe(e, e.RGBA32F, e.FLOAT) ? {
|
|
1144
|
+
internal: e.RGBA32F,
|
|
1145
|
+
type: e.FLOAT
|
|
1146
|
+
} : {
|
|
1147
|
+
internal: e.RGBA16F,
|
|
1148
|
+
type: e.HALF_FLOAT
|
|
1149
|
+
}, f = Fe(e, e.RGBA16F, e.HALF_FLOAT) ? {
|
|
1150
|
+
internal: e.RGBA16F,
|
|
1151
|
+
type: e.HALF_FLOAT
|
|
1152
|
+
} : {
|
|
1153
|
+
internal: e.RGBA8,
|
|
1154
|
+
type: e.UNSIGNED_BYTE
|
|
1155
|
+
}, p = Q(e, Z, ke), m = Q(e, Ae, je), h = Q(e, Z, Me), g = Q(e, Z, Ne), _ = e.createVertexArray();
|
|
1156
|
+
e.bindVertexArray(_);
|
|
1157
|
+
let v = e.createBuffer();
|
|
1158
|
+
e.bindBuffer(e.ARRAY_BUFFER, v), e.bufferData(e.ARRAY_BUFFER, new Float32Array([
|
|
1159
|
+
-1,
|
|
1160
|
+
-1,
|
|
1161
|
+
3,
|
|
1162
|
+
-1,
|
|
1163
|
+
-1,
|
|
1164
|
+
3
|
|
1165
|
+
]), e.STATIC_DRAW);
|
|
1166
|
+
for (let t of [
|
|
1167
|
+
p,
|
|
1168
|
+
h,
|
|
1169
|
+
g
|
|
1170
|
+
]) {
|
|
1171
|
+
let n = e.getAttribLocation(t, "aPosition");
|
|
1172
|
+
n >= 0 && (e.enableVertexAttribArray(n), e.vertexAttribPointer(n, 2, e.FLOAT, !1, 0, 0));
|
|
675
1173
|
}
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
let
|
|
681
|
-
|
|
682
|
-
let
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
1174
|
+
e.bindVertexArray(null);
|
|
1175
|
+
let y = e.createVertexArray(), b = he(l, n.lifetimeSec), x = new Float32Array(u * u * 4);
|
|
1176
|
+
x.set(b.subarray(0, Math.min(b.length, x.length)));
|
|
1177
|
+
function S(t) {
|
|
1178
|
+
let n = e.createTexture();
|
|
1179
|
+
e.bindTexture(e.TEXTURE_2D, n), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE);
|
|
1180
|
+
let r = t && d.type === e.FLOAT ? t : t ? Ie(t) : null;
|
|
1181
|
+
return e.texImage2D(e.TEXTURE_2D, 0, d.internal, u, u, 0, e.RGBA, d.type, r), n;
|
|
1182
|
+
}
|
|
1183
|
+
let C = [S(x), S(null)], w = [e.createFramebuffer(), e.createFramebuffer()];
|
|
1184
|
+
for (let t = 0; t < 2; t++) e.bindFramebuffer(e.FRAMEBUFFER, w[t]), e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, C[t], 0);
|
|
1185
|
+
e.bindFramebuffer(e.FRAMEBUFFER, null);
|
|
1186
|
+
let T = null, E = null, D = 2, O = 2;
|
|
1187
|
+
function k() {
|
|
1188
|
+
let r = Math.min(Math.max(n.trailScale, .25), 1);
|
|
1189
|
+
D = Math.max(2, Math.round(t.width * r)), O = Math.max(2, Math.round(t.height * r)), T?.forEach((t) => e.deleteTexture(t)), E?.forEach((t) => e.deleteFramebuffer(t));
|
|
1190
|
+
let i = () => {
|
|
1191
|
+
let t = e.createTexture();
|
|
1192
|
+
return e.bindTexture(e.TEXTURE_2D, t), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.NEAREST), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texImage2D(e.TEXTURE_2D, 0, f.internal, D, O, 0, e.RGBA, f.type, null), t;
|
|
1193
|
+
}, a = i(), o = i();
|
|
1194
|
+
T = [a, o];
|
|
1195
|
+
let s = e.createFramebuffer(), c = e.createFramebuffer();
|
|
1196
|
+
e.bindFramebuffer(e.FRAMEBUFFER, s), e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, a, 0), e.bindFramebuffer(e.FRAMEBUFFER, c), e.framebufferTexture2D(e.FRAMEBUFFER, e.COLOR_ATTACHMENT0, e.TEXTURE_2D, o, 0), e.bindFramebuffer(e.FRAMEBUFFER, null);
|
|
1197
|
+
for (let t of [s, c]) e.bindFramebuffer(e.FRAMEBUFFER, t), e.viewport(0, 0, D, O), e.clearColor(0, 0, 0, 0), e.clear(e.COLOR_BUFFER_BIT);
|
|
1198
|
+
e.bindFramebuffer(e.FRAMEBUFFER, null), E = [s, c];
|
|
1199
|
+
}
|
|
1200
|
+
let A = (t) => e.getUniformLocation(p, t), j = {
|
|
1201
|
+
uState: A("uState"),
|
|
1202
|
+
uDt: A("uDt"),
|
|
1203
|
+
uDomainHalf: A("uDomainHalf"),
|
|
1204
|
+
uTurnRate: A("uTurnRate"),
|
|
1205
|
+
uSpeedScale: A("uSpeedScale"),
|
|
1206
|
+
uLifetimeSec: A("uLifetimeSec"),
|
|
1207
|
+
uEdgeBias: A("uEdgeBias"),
|
|
1208
|
+
uCursor: A("uCursor"),
|
|
1209
|
+
uPointerVel: A("uPointerVel"),
|
|
1210
|
+
uBurst: A("uBurst"),
|
|
1211
|
+
uPointerActive: A("uPointerActive"),
|
|
1212
|
+
uVortexRadius: A("uVortexRadius"),
|
|
1213
|
+
uVortexSpin: A("uVortexSpin"),
|
|
1214
|
+
uDragGain: A("uDragGain"),
|
|
1215
|
+
uBurstShove: A("uBurstShove"),
|
|
1216
|
+
uTime: A("uTime"),
|
|
1217
|
+
uWindSpeed: A("uWindSpeed"),
|
|
1218
|
+
uCurlStrength: A("uCurlStrength"),
|
|
1219
|
+
uWaveCount: A("uWaveCount"),
|
|
1220
|
+
uWaves: A("uWaves[0]")
|
|
1221
|
+
}, M = (t) => e.getUniformLocation(m, t), N = {
|
|
1222
|
+
uState: M("uState"),
|
|
1223
|
+
uStateCols: M("uStateCols"),
|
|
1224
|
+
uDomainHalf: M("uDomainHalf"),
|
|
1225
|
+
uPointSize: M("uPointSize"),
|
|
1226
|
+
uSpeedNorm: M("uSpeedNorm"),
|
|
1227
|
+
uStretchAmp: M("uStretchAmp"),
|
|
1228
|
+
uStopCount: M("uStopCount"),
|
|
1229
|
+
uPalette: M("uPalette[0]"),
|
|
1230
|
+
uSpeedGlow: M("uSpeedGlow")
|
|
1231
|
+
}, P = (t) => e.getUniformLocation(h, t), F = {
|
|
1232
|
+
uPrev: P("uPrev"),
|
|
1233
|
+
uDecay: P("uDecay")
|
|
1234
|
+
}, I = (t) => e.getUniformLocation(g, t), L = {
|
|
1235
|
+
uTrail: I("uTrail"),
|
|
1236
|
+
uFloor: I("uFloor"),
|
|
1237
|
+
uBloom: I("uBloomColor"),
|
|
1238
|
+
uHasGround: I("uHasGround")
|
|
1239
|
+
}, R = 0, z = -1;
|
|
1240
|
+
function B() {
|
|
1241
|
+
let e = o(), n = t.clientWidth || 320, r = t.clientHeight || 320, i = Math.max(1, Math.round(n * e)), a = Math.max(1, Math.round(r * e));
|
|
1242
|
+
(t.width !== i || t.height !== a) && (t.width = i, t.height = a), k();
|
|
1243
|
+
}
|
|
1244
|
+
function V(i) {
|
|
1245
|
+
a?.(i), (!E || !T) && k();
|
|
1246
|
+
let d = z < 0 ? 0 : Math.min(Math.max(i - z, 0), .05);
|
|
1247
|
+
z = i;
|
|
1248
|
+
let f = s?.(), v = R, b = 1 - R;
|
|
1249
|
+
e.disable(e.BLEND), e.bindFramebuffer(e.FRAMEBUFFER, w[v]), e.viewport(0, 0, u, u), e.useProgram(p), e.bindVertexArray(_), e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, C[b]), e.uniform1i(j.uState, 0), e.uniform1f(j.uDt, d), e.uniform1f(j.uDomainHalf, W), e.uniform1f(j.uTurnRate, n.turnRate), e.uniform1f(j.uSpeedScale, n.speedScale), e.uniform1f(j.uLifetimeSec, n.lifetimeSec), e.uniform1f(j.uEdgeBias, n.edgeBias), e.uniform1f(j.uTime, i), e.uniform1f(j.uWindSpeed, n.windSpeed), e.uniform1f(j.uCurlStrength, n.curlStrength), e.uniform1f(j.uVortexRadius, n.vortexRadius), e.uniform1f(j.uVortexSpin, n.vortexSpin), e.uniform1f(j.uDragGain, n.dragGain), e.uniform1f(j.uBurstShove, n.burstShove), f ? (e.uniform2f(j.uCursor, f.cursorX, f.cursorY), e.uniform2f(j.uPointerVel, f.velX, f.velY), e.uniform1f(j.uBurst, f.burst), e.uniform1f(j.uPointerActive, f.active)) : e.uniform1f(j.uPointerActive, 0);
|
|
1250
|
+
let x = Math.min(n.waveComponents.length, 8);
|
|
1251
|
+
e.uniform1i(j.uWaveCount, x);
|
|
1252
|
+
let S = new Float32Array(32);
|
|
1253
|
+
for (let e = 0; e < 8; e++) {
|
|
1254
|
+
let t = n.waveComponents[e];
|
|
1255
|
+
S[e * 4 + 0] = t?.amplitude ?? 0, S[e * 4 + 1] = t?.wavelength ?? 1, S[e * 4 + 2] = t?.direction ?? 0, S[e * 4 + 3] = t?.phase ?? 0;
|
|
1256
|
+
}
|
|
1257
|
+
e.uniform4fv(j.uWaves, S), e.drawArrays(e.TRIANGLES, 0, 3), e.bindFramebuffer(e.FRAMEBUFFER, E[v]), e.viewport(0, 0, D, O), e.disable(e.BLEND), e.useProgram(h), e.bindVertexArray(_), e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, T[b]), e.uniform1i(F.uPrev, 0), e.uniform1f(F.uDecay, ee(n.trailHalfLife)), e.drawArrays(e.TRIANGLES, 0, 3), e.enable(e.BLEND), e.blendFunc(e.ONE, e.ONE), e.useProgram(m), e.bindVertexArray(y), e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, C[v]), e.uniform1i(N.uState, 0), e.uniform1i(N.uStateCols, u), e.uniform1f(N.uDomainHalf, W);
|
|
1258
|
+
let A = o();
|
|
1259
|
+
e.uniform1f(N.uPointSize, Math.max(n.dotSize * A * 1.5, 1)), e.uniform1f(N.uSpeedNorm, se), e.uniform1f(N.uStretchAmp, n.stretchAmp), e.uniform1f(N.uSpeedGlow, n.speedGlow);
|
|
1260
|
+
let M = r(), P = Math.min(M.length, 4);
|
|
1261
|
+
e.uniform1i(N.uStopCount, P);
|
|
1262
|
+
let I = new Float32Array(12);
|
|
1263
|
+
for (let e = 0; e < 4; e++) {
|
|
1264
|
+
let t = c(M[Math.min(e, P - 1)] ?? M[0]);
|
|
1265
|
+
I[e * 3 + 0] = t[0], I[e * 3 + 1] = t[1], I[e * 3 + 2] = t[2];
|
|
1266
|
+
}
|
|
1267
|
+
e.uniform3fv(N.uPalette, I), e.drawArrays(e.POINTS, 0, l), e.bindFramebuffer(e.FRAMEBUFFER, null), e.viewport(0, 0, t.width, t.height), e.disable(e.BLEND), e.useProgram(g), e.bindVertexArray(_), e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, T[v]), e.uniform1i(L.uTrail, 0);
|
|
1268
|
+
let B = n.background === "transparent" ? 0 : 1, V = c(n.background === "transparent" ? Be : n.background), H = c(Ve);
|
|
1269
|
+
e.uniform3f(L.uFloor, V[0], V[1], V[2]), e.uniform3f(L.uBloom, H[0], H[1], H[2]), e.uniform1f(L.uHasGround, B), e.drawArrays(e.TRIANGLES, 0, 3), e.bindVertexArray(null), R = b;
|
|
696
1270
|
}
|
|
697
1271
|
return {
|
|
698
|
-
frame:
|
|
1272
|
+
frame: V,
|
|
699
1273
|
shouldContinue: i,
|
|
700
|
-
resize:
|
|
1274
|
+
resize: B,
|
|
701
1275
|
teardown: () => {
|
|
702
|
-
p.
|
|
1276
|
+
e.deleteProgram(p), e.deleteProgram(m), e.deleteProgram(h), e.deleteProgram(g), e.deleteVertexArray(_), e.deleteVertexArray(y), e.deleteBuffer(v), C.forEach((t) => e.deleteTexture(t)), w.forEach((t) => e.deleteFramebuffer(t)), T?.forEach((t) => e.deleteTexture(t)), E?.forEach((t) => e.deleteFramebuffer(t));
|
|
703
1277
|
}
|
|
704
1278
|
};
|
|
705
1279
|
};
|
|
706
1280
|
}
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
throw e.deleteShader(r), Error(`[DotFlowField] shader compile failed: ${t}`);
|
|
712
|
-
}
|
|
713
|
-
return r;
|
|
714
|
-
}
|
|
715
|
-
function ve(e) {
|
|
1281
|
+
//#endregion
|
|
1282
|
+
//#region src/components/custom/dot-flow-field/composables/flowSetupGL.ts
|
|
1283
|
+
function ze(e) {
|
|
1284
|
+
if (e.config.mode === "flow") return Re(e);
|
|
716
1285
|
let { canvas: t, config: n, getPalette: r, shouldContinue: i, onFrame: a } = e;
|
|
717
1286
|
return function(e) {
|
|
718
|
-
let s =
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
e.bindVertexArray(d);
|
|
723
|
-
let f = e.createBuffer();
|
|
724
|
-
e.bindBuffer(e.ARRAY_BUFFER, f), e.bufferData(e.ARRAY_BUFFER, new Float32Array([
|
|
1287
|
+
let s = Q(e, Ee, De), l = e.createVertexArray();
|
|
1288
|
+
e.bindVertexArray(l);
|
|
1289
|
+
let u = e.createBuffer();
|
|
1290
|
+
e.bindBuffer(e.ARRAY_BUFFER, u), e.bufferData(e.ARRAY_BUFFER, new Float32Array([
|
|
725
1291
|
-1,
|
|
726
1292
|
-1,
|
|
727
1293
|
3,
|
|
@@ -729,134 +1295,159 @@ function ve(e) {
|
|
|
729
1295
|
-1,
|
|
730
1296
|
3
|
|
731
1297
|
]), e.STATIC_DRAW);
|
|
732
|
-
let
|
|
733
|
-
e.enableVertexAttribArray(
|
|
734
|
-
let
|
|
735
|
-
function
|
|
1298
|
+
let d = e.getAttribLocation(s, "aPosition");
|
|
1299
|
+
e.enableVertexAttribArray(d), e.vertexAttribPointer(d, 2, e.FLOAT, !1, 0, 0), e.bindVertexArray(null);
|
|
1300
|
+
let f = (t) => e.getUniformLocation(s, t), p = f("uTime"), m = f("uWindSpeed"), h = f("uCurlStrength"), g = f("uDomainHalf"), _ = f("uAspect"), v = f("uGridPitchDomain"), y = f("uDotRadiusDomain"), b = f("uDisplaceAmp"), x = f("uContrast"), S = f("uBaseBright"), C = f("uWaveBandCenter"), w = f("uWaveBandWidth"), T = f("uGlobeMask"), E = f("uWaveCount"), D = f("uStopCount"), O = f("uHasBackground"), k = f("uBg"), A = f("uWaves[0]"), j = f("uPalette[0]");
|
|
1301
|
+
function M() {
|
|
736
1302
|
let n = o(), r = t.clientWidth || 320, i = t.clientHeight || 320, a = Math.max(1, Math.round(r * n)), s = Math.max(1, Math.round(i * n));
|
|
737
1303
|
(t.width !== a || t.height !== s) && (t.width = a, t.height = s), e.viewport(0, 0, t.width, t.height);
|
|
738
1304
|
}
|
|
739
|
-
function
|
|
1305
|
+
function N(i) {
|
|
740
1306
|
a?.(i);
|
|
741
|
-
let o = $(t),
|
|
742
|
-
e.useProgram(
|
|
743
|
-
let
|
|
744
|
-
if (e.uniform1i(
|
|
1307
|
+
let o = $(t), u = (t.clientWidth || 320) / Math.max(t.clientHeight || 320, 1), d = G(n.gridPitch, o), f = o / (2 * W), M = n.dotSize / Math.max(f, 1e-4);
|
|
1308
|
+
e.useProgram(s), e.bindVertexArray(l), e.enable(e.BLEND), e.blendFunc(e.ONE, e.ONE_MINUS_SRC_ALPHA), e.clearColor(0, 0, 0, 0), e.clear(e.COLOR_BUFFER_BIT), e.uniform1f(p, i), e.uniform1f(m, n.windSpeed), e.uniform1f(h, n.curlStrength), e.uniform1f(g, W), e.uniform1f(_, u), e.uniform1f(v, d.pitchDomain), e.uniform1f(y, M), e.uniform1f(b, n.displaceAmp), e.uniform1f(x, n.contrast), e.uniform1f(S, le), e.uniform1f(C, n.waveBandCenter), e.uniform1f(w, n.waveBandWidth), e.uniform1f(T, +!!n.globeMask);
|
|
1309
|
+
let N = Math.min(n.waveComponents.length, 8), P = r(), F = Math.min(P.length, 4);
|
|
1310
|
+
if (e.uniform1i(E, N), e.uniform1i(D, F), n.background === "transparent") e.uniform1f(O, 0), e.uniform3f(k, 0, 0, 0);
|
|
745
1311
|
else {
|
|
746
|
-
e.uniform1f(
|
|
1312
|
+
e.uniform1f(O, 1);
|
|
747
1313
|
let t = c(n.background);
|
|
748
|
-
e.uniform3f(
|
|
1314
|
+
e.uniform3f(k, t[0], t[1], t[2]);
|
|
749
1315
|
}
|
|
750
1316
|
let I = new Float32Array(32);
|
|
751
1317
|
for (let e = 0; e < 8; e++) {
|
|
752
1318
|
let t = n.waveComponents[e];
|
|
753
1319
|
I[e * 4 + 0] = t?.amplitude ?? 0, I[e * 4 + 1] = t?.wavelength ?? 1, I[e * 4 + 2] = t?.direction ?? 0, I[e * 4 + 3] = t?.phase ?? 0;
|
|
754
1320
|
}
|
|
755
|
-
e.uniform4fv(
|
|
1321
|
+
e.uniform4fv(A, I);
|
|
756
1322
|
let L = new Float32Array(12);
|
|
757
1323
|
for (let e = 0; e < 4; e++) {
|
|
758
|
-
let t = c(
|
|
1324
|
+
let t = c(P[Math.min(e, F - 1)] ?? P[0]);
|
|
759
1325
|
L[e * 3 + 0] = t[0], L[e * 3 + 1] = t[1], L[e * 3 + 2] = t[2];
|
|
760
1326
|
}
|
|
761
|
-
e.uniform3fv(
|
|
1327
|
+
e.uniform3fv(j, L), e.drawArrays(e.TRIANGLES, 0, 3), e.bindVertexArray(null);
|
|
762
1328
|
}
|
|
763
1329
|
return {
|
|
764
|
-
frame:
|
|
1330
|
+
frame: N,
|
|
765
1331
|
shouldContinue: i,
|
|
766
|
-
resize:
|
|
1332
|
+
resize: M,
|
|
767
1333
|
teardown: () => {
|
|
768
|
-
e.deleteProgram(
|
|
1334
|
+
e.deleteProgram(s), e.deleteVertexArray(l), e.deleteBuffer(u);
|
|
769
1335
|
}
|
|
770
1336
|
};
|
|
771
1337
|
};
|
|
772
1338
|
}
|
|
773
1339
|
//#endregion
|
|
1340
|
+
//#region src/components/custom/dot-flow-field/composables/useFlowParticles.ts
|
|
1341
|
+
var Be = {
|
|
1342
|
+
L: .11,
|
|
1343
|
+
C: .012,
|
|
1344
|
+
h: 50
|
|
1345
|
+
}, Ve = {
|
|
1346
|
+
L: .5,
|
|
1347
|
+
C: .16,
|
|
1348
|
+
h: 330
|
|
1349
|
+
};
|
|
1350
|
+
function $(e) {
|
|
1351
|
+
return Math.min(e.clientWidth || 320, e.clientHeight || 320);
|
|
1352
|
+
}
|
|
1353
|
+
function He(e) {
|
|
1354
|
+
return Math.min(Math.max(Math.floor(e.particleCount), 1), te);
|
|
1355
|
+
}
|
|
1356
|
+
function Ue(e) {
|
|
1357
|
+
return Math.max(1, Math.ceil(Math.sqrt(e)));
|
|
1358
|
+
}
|
|
1359
|
+
//#endregion
|
|
774
1360
|
//#region src/components/custom/dot-flow-field/composables/useDotFlowField.ts
|
|
775
|
-
function
|
|
1361
|
+
function We(e, n) {
|
|
776
1362
|
let { config: r, getPalette: i } = n, a = n.mode ?? "live", o = t({ respectReducedMotion: r.respectReducedMotion }), c = {
|
|
777
1363
|
displaceBoost: 1,
|
|
778
1364
|
bloom: 0
|
|
779
|
-
}, l = { ...
|
|
780
|
-
|
|
781
|
-
let
|
|
782
|
-
|
|
1365
|
+
}, l = { ...re }, u = () => {
|
|
1366
|
+
if (!r.interactive || !o.active.value) return l.active = 0, l;
|
|
1367
|
+
let e = o.position.value, t = o.velocity.value, n = 2 * W;
|
|
1368
|
+
return l.cursorX = (e.x * 2 - 1) * W, l.cursorY = (1 - e.y * 2) * W, l.velX = t.x * n, l.velY = -t.y * n, l.burst = o.burst.value, l.active = 1, l;
|
|
1369
|
+
}, d = { ...r }, f = () => (Object.assign(d, r), d.displaceAmp = r.displaceAmp * c.displaceBoost, d.contrast = r.contrast * (1 + c.bloom * .8), d), p = null, h = 0;
|
|
1370
|
+
function g(e) {
|
|
1371
|
+
let t = h > 0 ? (e - h) * 1e3 : 16.7;
|
|
1372
|
+
if (h = e, o.tick(t), !r.interactive || !o.active.value) {
|
|
783
1373
|
c.displaceBoost += (1 - c.displaceBoost) * .1, c.bloom *= .9;
|
|
784
1374
|
return;
|
|
785
1375
|
}
|
|
786
1376
|
let n = o.speed.value, i = 1 + Math.min(2.5, n * 3);
|
|
787
1377
|
c.displaceBoost += (i - c.displaceBoost) * .2, c.bloom = Math.max(c.bloom * .9, o.burst.value);
|
|
788
1378
|
}
|
|
789
|
-
let
|
|
790
|
-
o.onPointerEnter(), r.interactive &&
|
|
791
|
-
},
|
|
792
|
-
o.onPointerMove(e), r.interactive &&
|
|
793
|
-
},
|
|
794
|
-
function
|
|
795
|
-
let t =
|
|
796
|
-
t.addEventListener("pointermove",
|
|
1379
|
+
let _ = () => {
|
|
1380
|
+
o.onPointerEnter(), r.interactive && p?.wake();
|
|
1381
|
+
}, v = (e) => {
|
|
1382
|
+
o.onPointerMove(e), r.interactive && p?.wake();
|
|
1383
|
+
}, y = (e) => e.parentElement ?? e;
|
|
1384
|
+
function b(e) {
|
|
1385
|
+
let t = y(e);
|
|
1386
|
+
t.addEventListener("pointermove", v), t.addEventListener("pointerenter", _), t.addEventListener("pointerleave", o.onPointerLeave);
|
|
797
1387
|
}
|
|
798
|
-
function
|
|
799
|
-
let t =
|
|
800
|
-
t.removeEventListener("pointermove",
|
|
1388
|
+
function x(e) {
|
|
1389
|
+
let t = y(e);
|
|
1390
|
+
t.removeEventListener("pointermove", v), t.removeEventListener("pointerenter", _), t.removeEventListener("pointerleave", o.onPointerLeave);
|
|
801
1391
|
}
|
|
802
|
-
let
|
|
1392
|
+
let S = () => {
|
|
803
1393
|
let t = e.value;
|
|
804
1394
|
if (!t) return null;
|
|
805
|
-
if (!
|
|
806
|
-
|
|
1395
|
+
if (!p) {
|
|
1396
|
+
b(t);
|
|
807
1397
|
let e = {
|
|
808
1398
|
canvas: t,
|
|
809
|
-
config:
|
|
1399
|
+
config: f(),
|
|
810
1400
|
getPalette: i,
|
|
1401
|
+
getPointer: u,
|
|
811
1402
|
shouldContinue: () => !0,
|
|
812
|
-
onFrame:
|
|
1403
|
+
onFrame: g
|
|
813
1404
|
};
|
|
814
|
-
|
|
1405
|
+
p = s(t, {
|
|
815
1406
|
mode: a,
|
|
816
1407
|
respectReducedMotion: r.respectReducedMotion,
|
|
817
|
-
setupWGPU:
|
|
1408
|
+
setupWGPU: Te({
|
|
818
1409
|
...e,
|
|
819
|
-
config:
|
|
1410
|
+
config: d,
|
|
820
1411
|
onFrame: (e) => {
|
|
821
|
-
|
|
1412
|
+
g(e), f();
|
|
822
1413
|
}
|
|
823
1414
|
}),
|
|
824
|
-
setupGL:
|
|
1415
|
+
setupGL: ze({
|
|
825
1416
|
...e,
|
|
826
|
-
config:
|
|
1417
|
+
config: d,
|
|
827
1418
|
onFrame: (e) => {
|
|
828
|
-
|
|
1419
|
+
g(e), f();
|
|
829
1420
|
}
|
|
830
1421
|
})
|
|
831
|
-
}),
|
|
1422
|
+
}), p.armAsync();
|
|
832
1423
|
}
|
|
833
|
-
return
|
|
1424
|
+
return p;
|
|
834
1425
|
};
|
|
835
|
-
queueMicrotask(() =>
|
|
836
|
-
let
|
|
1426
|
+
queueMicrotask(() => S());
|
|
1427
|
+
let C = {
|
|
837
1428
|
get backend() {
|
|
838
|
-
return
|
|
1429
|
+
return S()?.backend ?? "webgpu";
|
|
839
1430
|
},
|
|
840
|
-
pause: () =>
|
|
841
|
-
resume: () =>
|
|
842
|
-
wake: () =>
|
|
843
|
-
renderAt: (e) =>
|
|
1431
|
+
pause: () => S()?.suspend("manual"),
|
|
1432
|
+
resume: () => S()?.resume("manual"),
|
|
1433
|
+
wake: () => S()?.wake(),
|
|
1434
|
+
renderAt: (e) => S()?.renderAt(e),
|
|
844
1435
|
get reducedMotion() {
|
|
845
|
-
return
|
|
1436
|
+
return p?.reducedMotion ?? !1;
|
|
846
1437
|
},
|
|
847
1438
|
dispose: () => {
|
|
848
1439
|
let t = e.value;
|
|
849
|
-
t &&
|
|
1440
|
+
t && x(t), o.dispose(), p?.dispose();
|
|
850
1441
|
}
|
|
851
1442
|
};
|
|
852
|
-
return m(() =>
|
|
1443
|
+
return m(() => C.dispose()), C;
|
|
853
1444
|
}
|
|
854
1445
|
//#endregion
|
|
855
1446
|
//#region src/components/custom/dot-flow-field/DotFlowField.vue
|
|
856
|
-
var
|
|
1447
|
+
var Ge = /* @__PURE__ */ e(/* @__PURE__ */ f({
|
|
857
1448
|
__name: "DotFlowField",
|
|
858
1449
|
props: {
|
|
859
|
-
config: { default: () =>
|
|
1450
|
+
config: { default: () => U },
|
|
860
1451
|
paused: {
|
|
861
1452
|
type: Boolean,
|
|
862
1453
|
default: !1
|
|
@@ -864,7 +1455,7 @@ var be = /* @__PURE__ */ e(/* @__PURE__ */ f({
|
|
|
864
1455
|
},
|
|
865
1456
|
emits: ["update:paused"],
|
|
866
1457
|
setup(e, { expose: t }) {
|
|
867
|
-
let n = g("canvasRef"), r =
|
|
1458
|
+
let n = g("canvasRef"), r = We(n, {
|
|
868
1459
|
config: e.config,
|
|
869
1460
|
getPalette: () => e.config.palette
|
|
870
1461
|
});
|
|
@@ -891,4 +1482,4 @@ var be = /* @__PURE__ */ e(/* @__PURE__ */ f({
|
|
|
891
1482
|
}
|
|
892
1483
|
}), [["__scopeId", "data-v-01c7721a"]]);
|
|
893
1484
|
//#endregion
|
|
894
|
-
export {
|
|
1485
|
+
export { U as DEFAULT_FLOW_CONFIG, H as DEFAULT_WAVE_COMPONENTS, Ge as DotFlowField, A as FLOW_DOMAIN_HALF, v as FLOW_GRAVITY, z as MAX_FLOW_STOPS, L as MAX_PARTICLES, R as MAX_WAVE_COMPONENTS, V as WARM_IDENTITY_PALETTE, I as buildWaveLadder, D as curlFBM, x as gerstnerVelocity, j as gridOrigin, k as pointerVortex, N as sampleDisplacement, M as sampleHeight, O as sampleVelocity, We as useDotFlowField, P as waveBand };
|