react-native-effects 0.1.0 → 0.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.
Files changed (51) hide show
  1. package/README.md +75 -13
  2. package/lib/module/components/ShaderView/index.js +33 -5
  3. package/lib/module/components/ShaderView/index.js.map +1 -1
  4. package/lib/module/components/ShaderViewWithPanGesture/index.js +196 -0
  5. package/lib/module/components/ShaderViewWithPanGesture/index.js.map +1 -0
  6. package/lib/module/hooks/useParamsSynchronizable.js +37 -0
  7. package/lib/module/hooks/useParamsSynchronizable.js.map +1 -0
  8. package/lib/module/hooks/useWGPUSetup.js +1 -1
  9. package/lib/module/hooks/useWGPUSetup.js.map +1 -1
  10. package/lib/module/index.js +3 -1
  11. package/lib/module/index.js.map +1 -1
  12. package/lib/module/shaders/uniforms.js +4 -3
  13. package/lib/module/shaders/uniforms.js.map +1 -1
  14. package/lib/typescript/src/components/Aurora.d.ts +1 -1
  15. package/lib/typescript/src/components/Aurora.d.ts.map +1 -1
  16. package/lib/typescript/src/components/CalicoSwirl.d.ts +1 -1
  17. package/lib/typescript/src/components/CalicoSwirl.d.ts.map +1 -1
  18. package/lib/typescript/src/components/Campfire.d.ts +1 -1
  19. package/lib/typescript/src/components/Campfire.d.ts.map +1 -1
  20. package/lib/typescript/src/components/CircularGradient.d.ts +1 -1
  21. package/lib/typescript/src/components/CircularGradient.d.ts.map +1 -1
  22. package/lib/typescript/src/components/Iridescence.d.ts +1 -1
  23. package/lib/typescript/src/components/Iridescence.d.ts.map +1 -1
  24. package/lib/typescript/src/components/LinearGradient.d.ts +1 -1
  25. package/lib/typescript/src/components/LinearGradient.d.ts.map +1 -1
  26. package/lib/typescript/src/components/LiquidChrome.d.ts +1 -1
  27. package/lib/typescript/src/components/LiquidChrome.d.ts.map +1 -1
  28. package/lib/typescript/src/components/ShaderView/index.d.ts +1 -1
  29. package/lib/typescript/src/components/ShaderView/index.d.ts.map +1 -1
  30. package/lib/typescript/src/components/ShaderView/types.d.ts +20 -0
  31. package/lib/typescript/src/components/ShaderView/types.d.ts.map +1 -1
  32. package/lib/typescript/src/components/ShaderViewWithPanGesture/index.d.ts +35 -0
  33. package/lib/typescript/src/components/ShaderViewWithPanGesture/index.d.ts.map +1 -0
  34. package/lib/typescript/src/components/Silk.d.ts +1 -1
  35. package/lib/typescript/src/components/Silk.d.ts.map +1 -1
  36. package/lib/typescript/src/hooks/useParamsSynchronizable.d.ts +22 -0
  37. package/lib/typescript/src/hooks/useParamsSynchronizable.d.ts.map +1 -0
  38. package/lib/typescript/src/hooks/useWGPUSetup.d.ts +1 -1
  39. package/lib/typescript/src/hooks/useWGPUSetup.d.ts.map +1 -1
  40. package/lib/typescript/src/index.d.ts +6 -2
  41. package/lib/typescript/src/index.d.ts.map +1 -1
  42. package/lib/typescript/src/shaders/uniforms.d.ts +3 -3
  43. package/lib/typescript/src/shaders/uniforms.d.ts.map +1 -1
  44. package/package.json +31 -30
  45. package/src/components/ShaderView/index.tsx +42 -5
  46. package/src/components/ShaderView/types.ts +21 -0
  47. package/src/components/ShaderViewWithPanGesture/index.tsx +225 -0
  48. package/src/hooks/useParamsSynchronizable.ts +52 -0
  49. package/src/hooks/useWGPUSetup.tsx +1 -1
  50. package/src/index.tsx +10 -1
  51. package/src/shaders/uniforms.ts +4 -3
package/README.md CHANGED
@@ -4,11 +4,11 @@ https://github.com/user-attachments/assets/5141208a-655a-4de8-94fb-3e66351bf36f
4
4
 
5
5
  > **Experimental** — APIs may change without notice. Relies on `react-native-worklets` bundle mode, which is not enabled by default yet.
6
6
 
7
- WebGPU-powered effects running on **background thread** in React Native.
7
+ WebGPU-powered effects running on **background thread** in React Native.
8
8
 
9
9
  ## Features
10
10
 
11
- - **WebGPU rendering** via `react-native-wgpu`
11
+ - **WebGPU rendering** via `react-native-webgpu`
12
12
  - **Off-thread rendering** using `react-native-worklets` bundle mode — the GPU render loop runs on a separate JS runtime, keeping the main thread free
13
13
  - **Drop-in components** — use like any React Native `View`
14
14
  - **Customizable** — control colors, speed, intensity, and effect-specific parameters
@@ -44,16 +44,55 @@ import { ShaderView } from 'react-native-effects';
44
44
  />;
45
45
  ```
46
46
 
47
- | Prop | Type | Default | Description |
48
- | ---------------- | -------------- | ------- | -------------------------------------------------------------- |
49
- | `fragmentShader` | `string` | — | WGSL fragment shader source |
50
- | `colors` | `ColorInput[]` | `[]` | Up to 2 colors mapped to `u.color0` and `u.color1` |
51
- | `params` | `number[]` | `[]` | Up to 8 floats mapped to `u.params0.xyzw` and `u.params1.xyzw` |
52
- | `speed` | `number` | `1.0` | Animation speed multiplier |
53
- | `isStatic` | `boolean` | `false` | Render once then stop the animation loop |
47
+ | Prop | Type | Default | Description |
48
+ | ---------------------- | ---------------------- | ------- | ------------------------------------------------------------------------------------------------------- |
49
+ | `fragmentShader` | `string` | — | WGSL fragment shader source |
50
+ | `colors` | `ColorInput[]` | `[]` | Up to 2 colors mapped to `u.color0` and `u.color1` |
51
+ | `params` | `number[]` | `[]` | Up to 8 floats mapped to `u.params0.xyzw` and `u.params1.xyzw` |
52
+ | `speed` | `number` | `1.0` | Animation speed multiplier |
53
+ | `isStatic` | `boolean` | `false` | Render once then stop the animation loop |
54
+ | `transparent` | `boolean` | `false` | Clear the canvas to alpha `0` for an overlay-friendly transparent background |
55
+ | `paramsSynchronizable` | `ParamsSynchronizable` | — | Live 4-float input written into the dedicated `u.live` slot every frame (touch/scroll/audio). See below |
54
56
 
55
57
  All built-in effects (Silk, Aurora, Campfire, etc.) are thin wrappers around `ShaderView`. You can use it directly to create your own custom effects — see the [Custom Effects Guide](CUSTOM_EFFECTS.md) for a full walkthrough and a ready-to-use AI prompt.
56
58
 
59
+ ### Live input with `paramsSynchronizable`
60
+
61
+ Static `params` are great for values that change on the JS thread occasionally, but the render loop runs off-thread — so feeding it fast, per-frame input (a finger drag, scroll progress, audio level) through React props would be laggy. `paramsSynchronizable` is the bridge: a 4-float [Synchronizable](https://docs.swmansion.com/react-native-worklets/docs/synchronization/synchronizable) that the off-thread render loop reads every frame and writes into its own dedicated `u.live` slot — so it never collides with the static `params` (you keep all 8 _and_ get a live channel).
62
+
63
+ Create one with the `useParamsSynchronizable` hook and update it from your gesture or scroll handlers:
64
+
65
+ ```tsx
66
+ import { ShaderView, useParamsSynchronizable } from 'react-native-effects';
67
+
68
+ function TouchReactive() {
69
+ // initial resting value, read once: (x, y, active, extra)
70
+ const { paramsSynchronizable, setParamsSynchronizable } =
71
+ useParamsSynchronizable([0.5, 0.5, 0, 0]);
72
+
73
+ return (
74
+ <ShaderView
75
+ fragmentShader={myShader}
76
+ paramsSynchronizable={paramsSynchronizable}
77
+ style={{ width: '100%', height: 300 }}
78
+ onTouchMove={(e) => {
79
+ const { locationX, locationY } = e.nativeEvent;
80
+ setParamsSynchronizable(locationX, locationY, 1, 0);
81
+ }}
82
+ />
83
+ );
84
+ }
85
+ ```
86
+
87
+ Inside the shader, declare the `live` field on the `Uniforms` struct (right after `params1`) and read the live values from `u.live`:
88
+
89
+ ```wgsl
90
+ let pointer = u.live.xy; // (x, y) you wrote
91
+ let active = u.live.z; // 1 while touching, 0 otherwise
92
+ ```
93
+
94
+ `setParamsSynchronizable(x, y, active, extra)` runs on the JS thread; the four floats are by convention `(x, y, active, extra)` for pointer input or `(progress, …)` for scroll-driven effects, but the meaning is entirely up to your shader. For a ready-made pan-gesture variant, use [`ShaderViewWithPanGesture`](src/components/ShaderViewWithPanGesture/index.tsx).
95
+
57
96
  ## Installation
58
97
 
59
98
  ```sh
@@ -63,9 +102,25 @@ npm install react-native-effects
63
102
  ### Peer dependencies
64
103
 
65
104
  ```sh
66
- npm install react-native-wgpu react-native-worklets react-native-reanimated react-native-gesture-handler
105
+ npm install react-native-webgpu react-native-worklets react-native-reanimated react-native-gesture-handler
106
+ ```
107
+
108
+ ### Android requirements
109
+
110
+ `react-native-webgpu` uses `AHardwareBuffer` APIs that require **Android API 26+**, so your app must set `minSdkVersion` to at least `26` (the default in many templates is `24`). In an Expo project, use [`expo-build-properties`](https://docs.expo.dev/versions/latest/sdk/build-properties/):
111
+
112
+ ```json
113
+ {
114
+ "expo": {
115
+ "plugins": [
116
+ ["expo-build-properties", { "android": { "minSdkVersion": 26 } }]
117
+ ]
118
+ }
119
+ }
67
120
  ```
68
121
 
122
+ In a bare React Native project, set `minSdkVersion = 26` in `android/build.gradle`.
123
+
69
124
  ### Bundle mode setup
70
125
 
71
126
  This library relies on `react-native-worklets` [Bundle Mode](https://docs.swmansion.com/react-native-worklets/docs/bundleMode). You need to configure Metro, Babel, and package.json in your app.
@@ -101,7 +156,9 @@ module.exports = {
101
156
 
102
157
  ```js
103
158
  const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
104
- const { getBundleModeMetroConfig } = require('react-native-worklets/bundleMode');
159
+ const {
160
+ getBundleModeMetroConfig,
161
+ } = require('react-native-worklets/bundleMode');
105
162
 
106
163
  let config = getDefaultConfig(__dirname);
107
164
  config = getBundleModeMetroConfig(config);
@@ -138,7 +195,10 @@ module.exports = function (api) {
138
195
  return {
139
196
  presets: ['babel-preset-expo'],
140
197
  plugins: [
141
- ['react-native-worklets/plugin', { bundleMode: true, strictGlobal: true }],
198
+ [
199
+ 'react-native-worklets/plugin',
200
+ { bundleMode: true, strictGlobal: true },
201
+ ],
142
202
  ],
143
203
  };
144
204
  };
@@ -148,7 +208,9 @@ module.exports = function (api) {
148
208
 
149
209
  ```js
150
210
  const { getDefaultConfig } = require('expo/metro-config');
151
- const { getBundleModeMetroConfig } = require('react-native-worklets/bundleMode');
211
+ const {
212
+ getBundleModeMetroConfig,
213
+ } = require('react-native-worklets/bundleMode');
152
214
 
153
215
  /** @type {import('expo/metro-config').MetroConfig} */
154
216
  let config = getDefaultConfig(__dirname);
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { PixelRatio, StyleSheet } from 'react-native';
4
- import { Canvas } from 'react-native-wgpu';
4
+ import { Canvas } from 'react-native-webgpu';
5
5
  import { useEffect, useRef } from 'react';
6
6
  import { createSynchronizable, scheduleOnRuntime } from 'react-native-worklets';
7
7
  import { colorToVec4 } from "../../utils/colors.js";
@@ -21,6 +21,8 @@ export default function ShaderView({
21
21
  speed = 1.0,
22
22
  params = [],
23
23
  isStatic = false,
24
+ transparent = false,
25
+ paramsSynchronizable,
24
26
  style,
25
27
  ...viewProps
26
28
  }) {
@@ -87,6 +89,12 @@ export default function ShaderView({
87
89
  presentationFormat
88
90
  } = resources;
89
91
  const dpr = PixelRatio.get();
92
+
93
+ // Per-run cancellation token. On Fast Refresh / dep change / unmount, React
94
+ // runs this effect's cleanup, which flips the flag and stops *this* loop —
95
+ // otherwise the old worklet RAF loop keeps running forever alongside the new
96
+ // one, stacking a duplicate render loop on every Metro reload.
97
+ const cancelled = createSynchronizable(new Float64Array(1));
90
98
  scheduleOnRuntime(runtime, () => {
91
99
  'worklet';
92
100
 
@@ -136,6 +144,12 @@ export default function ShaderView({
136
144
  return;
137
145
  }
138
146
 
147
+ // This loop was superseded (Fast Refresh / unmount) — bail without
148
+ // scheduling another frame so it can be garbage-collected.
149
+ if (cancelled.getDirty()[0] === 1) {
150
+ return;
151
+ }
152
+
139
153
  // Compute dt
140
154
  const dt = lastTimestamp === 0 ? 0 : (timestamp - lastTimestamp) / 1000;
141
155
  lastTimestamp = timestamp;
@@ -150,7 +164,7 @@ export default function ShaderView({
150
164
  const height = canvas.height || 1;
151
165
  const aspect = width / height;
152
166
 
153
- // Fill uniform data (6 × vec4 = 24 floats)
167
+ // Fill uniform data (7 × vec4 = 28 floats)
154
168
  // resolution: vec4<f32>
155
169
  uniformData[0] = width;
156
170
  uniformData[1] = height;
@@ -181,18 +195,29 @@ export default function ShaderView({
181
195
  uniformData[18] = props[IDX_PARAMS + 2];
182
196
  uniformData[19] = props[IDX_PARAMS + 3];
183
197
 
184
- // params1: vec4<f32>
198
+ // params1: vec4<f32> — static params[4..7]
185
199
  uniformData[20] = props[IDX_PARAMS + 4];
186
200
  uniformData[21] = props[IDX_PARAMS + 5];
187
201
  uniformData[22] = props[IDX_PARAMS + 6];
188
202
  uniformData[23] = props[IDX_PARAMS + 7];
203
+
204
+ // live: vec4<f32> — off-thread input (touch/scroll/audio) from
205
+ // paramsSynchronizable, written into its own slot so it never collides
206
+ // with the static params. Stays (0,0,0,0) when no channel is attached.
207
+ if (paramsSynchronizable) {
208
+ const live = paramsSynchronizable.getDirty();
209
+ uniformData[24] = live[0];
210
+ uniformData[25] = live[1];
211
+ uniformData[26] = live[2];
212
+ uniformData[27] = live[3];
213
+ }
189
214
  device.queue.writeBuffer(uniformBuffer, 0, uniformData);
190
215
  const commandEncoder = device.createCommandEncoder();
191
216
  const textureView = context.getCurrentTexture().createView();
192
217
  const passEncoder = commandEncoder.beginRenderPass({
193
218
  colorAttachments: [{
194
219
  view: textureView,
195
- clearValue: [0, 0, 0, 1],
220
+ clearValue: transparent ? [0, 0, 0, 0] : [0, 0, 0, 1],
196
221
  loadOp: 'clear',
197
222
  storeOp: 'store'
198
223
  }]
@@ -209,7 +234,10 @@ export default function ShaderView({
209
234
  }
210
235
  requestAnimationFrame(render);
211
236
  });
212
- }, [resources, runtime, propsSync, fragmentShader, isStatic]);
237
+ return () => {
238
+ cancelled.setBlocking(() => Float64Array.of(1));
239
+ };
240
+ }, [resources, runtime, propsSync, paramsSynchronizable, fragmentShader, isStatic, transparent]);
213
241
  return /*#__PURE__*/_jsx(Canvas, {
214
242
  ref: canvasRef,
215
243
  style: [styles.canvas, style],
@@ -1 +1 @@
1
- {"version":3,"names":["PixelRatio","StyleSheet","Canvas","useEffect","useRef","createSynchronizable","scheduleOnRuntime","colorToVec4","useWGPUSetup","TRIANGLE_VERTEX_SHADER","UNIFORM_BUFFER_SIZE","UNIFORM_FLOAT_COUNT","jsx","_jsx","SYNC_SIZE","IDX_SPEED","IDX_PARAMS","IDX_ALIVE","ShaderView","fragmentShader","colors","speed","params","isStatic","style","viewProps","canvasRef","runtime","resources","propsSync","Float64Array","current","data","undefined","c0","r","g","b","a","c1","i","setBlocking","prev","device","context","presentationFormat","dpr","get","pipeline","createRenderPipeline","layout","vertex","module","createShaderModule","code","entryPoint","fragment","targets","format","primitive","topology","uniformBuffer","createBuffer","size","usage","GPUBufferUsage","UNIFORM","COPY_DST","bindGroup","createBindGroup","getBindGroupLayout","entries","binding","resource","buffer","uniformData","Float32Array","accumulatedTime","lastTimestamp","render","timestamp","props","getDirty","dt","currentSpeed","canvas","width","height","aspect","queue","writeBuffer","commandEncoder","createCommandEncoder","textureView","getCurrentTexture","createView","passEncoder","beginRenderPass","colorAttachments","view","clearValue","loadOp","storeOp","setPipeline","setBindGroup","draw","end","submit","finish","present","requestAnimationFrame","ref","styles","create","flex"],"sourceRoot":"../../../../src","sources":["components/ShaderView/index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["PixelRatio","StyleSheet","Canvas","useEffect","useRef","createSynchronizable","scheduleOnRuntime","colorToVec4","useWGPUSetup","TRIANGLE_VERTEX_SHADER","UNIFORM_BUFFER_SIZE","UNIFORM_FLOAT_COUNT","jsx","_jsx","SYNC_SIZE","IDX_SPEED","IDX_PARAMS","IDX_ALIVE","ShaderView","fragmentShader","colors","speed","params","isStatic","transparent","paramsSynchronizable","style","viewProps","canvasRef","runtime","resources","propsSync","Float64Array","current","data","undefined","c0","r","g","b","a","c1","i","setBlocking","prev","device","context","presentationFormat","dpr","get","cancelled","pipeline","createRenderPipeline","layout","vertex","module","createShaderModule","code","entryPoint","fragment","targets","format","primitive","topology","uniformBuffer","createBuffer","size","usage","GPUBufferUsage","UNIFORM","COPY_DST","bindGroup","createBindGroup","getBindGroupLayout","entries","binding","resource","buffer","uniformData","Float32Array","accumulatedTime","lastTimestamp","render","timestamp","props","getDirty","dt","currentSpeed","canvas","width","height","aspect","live","queue","writeBuffer","commandEncoder","createCommandEncoder","textureView","getCurrentTexture","createView","passEncoder","beginRenderPass","colorAttachments","view","clearValue","loadOp","storeOp","setPipeline","setBindGroup","draw","end","submit","finish","present","requestAnimationFrame","of","ref","styles","create","flex"],"sourceRoot":"../../../../src","sources":["components/ShaderView/index.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,UAAU,QAAQ,cAAc;AACrD,SAASC,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACzC,SAASC,oBAAoB,EAAEC,iBAAiB,QAAQ,uBAAuB;AAC/E,SAASC,WAAW,QAAQ,uBAAoB;AAChD,SAASC,YAAY,QAAQ,6BAA0B;AACvD,SAASC,sBAAsB,QAAQ,yCAAsC;AAC7E,SACEC,mBAAmB,EACnBC,mBAAmB,QACd,2BAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGhC;AACA;AACA,MAAMC,SAAS,GAAG,EAAE;AACpB,MAAMC,SAAS,GAAG,CAAC;AACnB,MAAMC,UAAU,GAAG,CAAC,CAAC,CAAC;AACtB,MAAMC,SAAS,GAAG,EAAE;AAEpB,eAAe,SAASC,UAAUA,CAAC;EACjCC,cAAc;EACdC,MAAM,GAAG,EAAE;EACXC,KAAK,GAAG,GAAG;EACXC,MAAM,GAAG,EAAE;EACXC,QAAQ,GAAG,KAAK;EAChBC,WAAW,GAAG,KAAK;EACnBC,oBAAoB;EACpBC,KAAK;EACL,GAAGC;AACY,CAAC,EAAE;EAClB,MAAM;IAAEC,SAAS;IAAEC,OAAO;IAAEC;EAAU,CAAC,GAAGtB,YAAY,CAAC,CAAC;EAExD,MAAMuB,SAAS,GAAG3B,MAAM,CACtBC,oBAAoB,CAAe,IAAI2B,YAAY,CAAClB,SAAS,CAAC,CAChE,CAAC,CAACmB,OAAO;;EAET;EACA9B,SAAS,CAAC,MAAM;IACd,MAAM+B,IAAI,GAAG,IAAIF,YAAY,CAAClB,SAAS,CAAC;;IAExC;IACA,IAAIM,MAAM,CAAC,CAAC,CAAC,KAAKe,SAAS,EAAE;MAC3B,MAAMC,EAAE,GAAG7B,WAAW,CAACa,MAAM,CAAC,CAAC,CAAC,CAAC;MACjCc,IAAI,CAAC,CAAC,CAAC,GAAGE,EAAE,CAACC,CAAC;MACdH,IAAI,CAAC,CAAC,CAAC,GAAGE,EAAE,CAACE,CAAC;MACdJ,IAAI,CAAC,CAAC,CAAC,GAAGE,EAAE,CAACG,CAAC;MACdL,IAAI,CAAC,CAAC,CAAC,GAAGE,EAAE,CAACI,CAAC;IAChB;;IAEA;IACA,IAAIpB,MAAM,CAAC,CAAC,CAAC,KAAKe,SAAS,EAAE;MAC3B,MAAMM,EAAE,GAAGlC,WAAW,CAACa,MAAM,CAAC,CAAC,CAAC,CAAC;MACjCc,IAAI,CAAC,CAAC,CAAC,GAAGO,EAAE,CAACJ,CAAC;MACdH,IAAI,CAAC,CAAC,CAAC,GAAGO,EAAE,CAACH,CAAC;MACdJ,IAAI,CAAC,CAAC,CAAC,GAAGO,EAAE,CAACF,CAAC;MACdL,IAAI,CAAC,CAAC,CAAC,GAAGO,EAAE,CAACD,CAAC;IAChB;;IAEA;IACAN,IAAI,CAACnB,SAAS,CAAC,GAAGM,KAAK;;IAEvB;IACA,KAAK,IAAIqB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,CAAC,EAAEA,CAAC,EAAE,EAAE;MAC1BR,IAAI,CAAClB,UAAU,GAAG0B,CAAC,CAAC,GAAGpB,MAAM,CAACoB,CAAC,CAAC,IAAI,CAAC;IACvC;;IAEA;IACAR,IAAI,CAACjB,SAAS,CAAC,GAAG,CAAC;IAEnBc,SAAS,CAACY,WAAW,CAAC,MAAMT,IAAI,CAAC;EACnC,CAAC,EAAE,CAACd,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAES,SAAS,CAAC,CAAC;;EAEtC;EACA5B,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACX4B,SAAS,CAACY,WAAW,CAAEC,IAAI,IAAK;QAC9BA,IAAI,CAAC3B,SAAS,CAAC,GAAG,CAAC;QACnB,OAAO2B,IAAI;MACb,CAAC,CAAC;IACJ,CAAC;EACH,CAAC,EAAE,CAACb,SAAS,CAAC,CAAC;;EAEf;EACA5B,SAAS,CAAC,MAAM;IACd,IAAI,CAAC2B,SAAS,EAAE;MACd;IACF;IAEA,MAAM;MAAEe,MAAM;MAAEC,OAAO;MAAEC;IAAmB,CAAC,GAAGjB,SAAS;IACzD,MAAMkB,GAAG,GAAGhD,UAAU,CAACiD,GAAG,CAAC,CAAC;;IAE5B;IACA;IACA;IACA;IACA,MAAMC,SAAS,GAAG7C,oBAAoB,CAAe,IAAI2B,YAAY,CAAC,CAAC,CAAC,CAAC;IAEzE1B,iBAAiB,CAACuB,OAAO,EAAE,MAAM;MAC/B,SAAS;;MAET;MACA,MAAMsB,QAAQ,GAAGN,MAAM,CAACO,oBAAoB,CAAC;QAC3CC,MAAM,EAAE,MAAM;QACdC,MAAM,EAAE;UACNC,MAAM,EAAEV,MAAM,CAACW,kBAAkB,CAAC;YAAEC,IAAI,EAAEhD;UAAuB,CAAC,CAAC;UACnEiD,UAAU,EAAE;QACd,CAAC;QACDC,QAAQ,EAAE;UACRJ,MAAM,EAAEV,MAAM,CAACW,kBAAkB,CAAC;YAAEC,IAAI,EAAEtC;UAAe,CAAC,CAAC;UAC3DuC,UAAU,EAAE,MAAM;UAClBE,OAAO,EAAE,CAAC;YAAEC,MAAM,EAAEd;UAAmB,CAAC;QAC1C,CAAC;QACDe,SAAS,EAAE;UAAEC,QAAQ,EAAE;QAAgB;MACzC,CAAC,CAAC;;MAEF;MACA,MAAMC,aAAa,GAAGnB,MAAM,CAACoB,YAAY,CAAC;QACxCC,IAAI,EAAExD,mBAAmB;QACzByD,KAAK,EAAEC,cAAc,CAACC,OAAO,GAAGD,cAAc,CAACE;MACjD,CAAC,CAAC;MAEF,MAAMC,SAAS,GAAG1B,MAAM,CAAC2B,eAAe,CAAC;QACvCnB,MAAM,EAAEF,QAAQ,CAACsB,kBAAkB,CAAC,CAAC,CAAC;QACtCC,OAAO,EAAE,CAAC;UAAEC,OAAO,EAAE,CAAC;UAAEC,QAAQ,EAAE;YAAEC,MAAM,EAAEb;UAAc;QAAE,CAAC;MAC/D,CAAC,CAAC;MAEF,MAAMc,WAAW,GAAG,IAAIC,YAAY,CAACpE,mBAAmB,CAAC;MACzD,IAAIqE,eAAe,GAAG,CAAC;MACvB,IAAIC,aAAa,GAAG,CAAC;MAErB,SAASC,MAAMA,CAACC,SAAiB,EAAE;QACjC,MAAMC,KAAK,GAAGrD,SAAS,CAACsD,QAAQ,CAAC,CAAC;QAClC,IAAID,KAAK,CAACnE,SAAS,CAAC,KAAK,CAAC,EAAE;UAC1B;QACF;;QAEA;QACA;QACA,IAAIiC,SAAS,CAACmC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;UACjC;QACF;;QAEA;QACA,MAAMC,EAAE,GAAGL,aAAa,KAAK,CAAC,GAAG,CAAC,GAAG,CAACE,SAAS,GAAGF,aAAa,IAAI,IAAI;QACvEA,aAAa,GAAGE,SAAS;;QAEzB;QACA,MAAMI,YAAY,GAAGH,KAAK,CAACrE,SAAS,CAAE;QACtCiE,eAAe,IAAIM,EAAE,GAAGC,YAAY;;QAEpC;QACA,MAAMC,MAAM,GAAG1C,OAAO,CAAC0C,MAGtB;QACD,MAAMC,KAAK,GAAGD,MAAM,CAACC,KAAK,IAAI,CAAC;QAC/B,MAAMC,MAAM,GAAGF,MAAM,CAACE,MAAM,IAAI,CAAC;QACjC,MAAMC,MAAM,GAAGF,KAAK,GAAGC,MAAM;;QAE7B;QACA;QACAZ,WAAW,CAAC,CAAC,CAAC,GAAGW,KAAK;QACtBX,WAAW,CAAC,CAAC,CAAC,GAAGY,MAAM;QACvBZ,WAAW,CAAC,CAAC,CAAC,GAAGa,MAAM;QACvBb,WAAW,CAAC,CAAC,CAAC,GAAG9B,GAAG;;QAEpB;QACA8B,WAAW,CAAC,CAAC,CAAC,GAAGE,eAAe;QAChCF,WAAW,CAAC,CAAC,CAAC,GAAGQ,EAAE;QACnBR,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;QAClBA,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC;;QAElB;QACAA,WAAW,CAAC,CAAC,CAAC,GAAGM,KAAK,CAAC,CAAC,CAAE;QAC1BN,WAAW,CAAC,CAAC,CAAC,GAAGM,KAAK,CAAC,CAAC,CAAE;QAC1BN,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAAC,CAAC,CAAE;QAC3BN,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAAC,CAAC,CAAE;;QAE3B;QACAN,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAAC,CAAC,CAAE;QAC3BN,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAAC,CAAC,CAAE;QAC3BN,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAAC,CAAC,CAAE;QAC3BN,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAAC,CAAC,CAAE;;QAE3B;QACAN,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAACpE,UAAU,CAAE;QACpC8D,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAACpE,UAAU,GAAG,CAAC,CAAE;QACxC8D,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAACpE,UAAU,GAAG,CAAC,CAAE;QACxC8D,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAACpE,UAAU,GAAG,CAAC,CAAE;;QAExC;QACA8D,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAACpE,UAAU,GAAG,CAAC,CAAE;QACxC8D,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAACpE,UAAU,GAAG,CAAC,CAAE;QACxC8D,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAACpE,UAAU,GAAG,CAAC,CAAE;QACxC8D,WAAW,CAAC,EAAE,CAAC,GAAGM,KAAK,CAACpE,UAAU,GAAG,CAAC,CAAE;;QAExC;QACA;QACA;QACA,IAAIS,oBAAoB,EAAE;UACxB,MAAMmE,IAAI,GAAGnE,oBAAoB,CAAC4D,QAAQ,CAAC,CAAC;UAC5CP,WAAW,CAAC,EAAE,CAAC,GAAGc,IAAI,CAAC,CAAC,CAAE;UAC1Bd,WAAW,CAAC,EAAE,CAAC,GAAGc,IAAI,CAAC,CAAC,CAAE;UAC1Bd,WAAW,CAAC,EAAE,CAAC,GAAGc,IAAI,CAAC,CAAC,CAAE;UAC1Bd,WAAW,CAAC,EAAE,CAAC,GAAGc,IAAI,CAAC,CAAC,CAAE;QAC5B;QAEA/C,MAAM,CAACgD,KAAK,CAACC,WAAW,CAAC9B,aAAa,EAAE,CAAC,EAAEc,WAAW,CAAC;QAEvD,MAAMiB,cAAc,GAAGlD,MAAM,CAACmD,oBAAoB,CAAC,CAAC;QACpD,MAAMC,WAAW,GAAGnD,OAAO,CAACoD,iBAAiB,CAAC,CAAC,CAACC,UAAU,CAAC,CAAC;QAC5D,MAAMC,WAAW,GAAGL,cAAc,CAACM,eAAe,CAAC;UACjDC,gBAAgB,EAAE,CAChB;YACEC,IAAI,EAAEN,WAAW;YACjBO,UAAU,EAAEhF,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACrDiF,MAAM,EAAE,OAAO;YACfC,OAAO,EAAE;UACX,CAAC;QAEL,CAAC,CAAC;QAEFN,WAAW,CAACO,WAAW,CAACxD,QAAQ,CAAC;QACjCiD,WAAW,CAACQ,YAAY,CAAC,CAAC,EAAErC,SAAS,CAAC;QACtC6B,WAAW,CAACS,IAAI,CAAC,CAAC,CAAC;QACnBT,WAAW,CAACU,GAAG,CAAC,CAAC;QAEjBjE,MAAM,CAACgD,KAAK,CAACkB,MAAM,CAAC,CAAChB,cAAc,CAACiB,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9ClE,OAAO,CAACmE,OAAO,CAAC,CAAC;QAEjB,IAAI,CAAC1F,QAAQ,EAAE;UACb2F,qBAAqB,CAAChC,MAAM,CAAC;QAC/B;MACF;MAEAgC,qBAAqB,CAAChC,MAAM,CAAC;IAC/B,CAAC,CAAC;IAEF,OAAO,MAAM;MACXhC,SAAS,CAACP,WAAW,CAAC,MAAMX,YAAY,CAACmF,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;EACH,CAAC,EAAE,CACDrF,SAAS,EACTD,OAAO,EACPE,SAAS,EACTN,oBAAoB,EACpBN,cAAc,EACdI,QAAQ,EACRC,WAAW,CACZ,CAAC;EAEF,oBACEX,IAAA,CAACX,MAAM;IAACkH,GAAG,EAAExF,SAAU;IAACF,KAAK,EAAE,CAAC2F,MAAM,CAAC7B,MAAM,EAAE9D,KAAK,CAAE;IAAA,GAAKC;EAAS,CAAG,CAAC;AAE5E;AAEA,MAAM0F,MAAM,GAAGpH,UAAU,CAACqH,MAAM,CAAC;EAC/B9B,MAAM,EAAE;IACN+B,IAAI,EAAE;EACR;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useRef } from 'react';
4
+ import { StyleSheet, View } from 'react-native';
5
+ import { Gesture, GestureDetector } from 'react-native-gesture-handler';
6
+ import { createSynchronizable } from 'react-native-worklets';
7
+ import ShaderView from "../ShaderView/index.js";
8
+ import { useParamsSynchronizable } from "../../hooks/useParamsSynchronizable.js";
9
+
10
+ /**
11
+ * A {@link ShaderView} that feeds touch input into the shader's `u.live`:
12
+ *
13
+ * - `live.x` → pointer X, normalized 0..1 (left → right)
14
+ * - `live.y` → pointer Y, normalized 0..1 (bottom → top, matching UV space)
15
+ * - `live.z` → 1.0 while touching, 0.0 when released
16
+ * - `live.w` → 0.0 (reserved)
17
+ *
18
+ * Dragging moves the pointer **relatively** — it pushes from where the pointer
19
+ * already is rather than jumping under the finger — and a fling lets it glide to
20
+ * a stop. The position is **remembered**: it stays wherever it ended and is
21
+ * never reset; only the "touched" flag (`live.z`) toggles on release. A
22
+ * shader can read `live.xy` as a stable resting position and use `live.z`
23
+ * purely for touch-driven emphasis, so the effect never snaps back.
24
+ *
25
+ * The resting value before the first touch is `[0, 0, 0, 0]` by default; pass
26
+ * `initialParamsSynchronizable` to seed it — e.g. `[0.5, 0.5, 0, 0]` to start a
27
+ * pointer at screen center.
28
+ *
29
+ * The drag runs as a **worklet on the UI thread** and writes the synchronizable
30
+ * directly, so pointer updates never hop to the JS thread — matching the rest of
31
+ * the library, which renders off the JS thread. The render runtime reads the
32
+ * same synchronizable each frame.
33
+ */
34
+ import { jsx as _jsx } from "react/jsx-runtime";
35
+ export default function ShaderViewWithPanGesture({
36
+ style,
37
+ initialParamsSynchronizable = [0, 0, 0, 0],
38
+ ...props
39
+ }) {
40
+ const {
41
+ paramsSynchronizable
42
+ } = useParamsSynchronizable(initialParamsSynchronizable);
43
+
44
+ // View size, read inside the gesture worklets to normalize pointer coords.
45
+ const sizeRef = useRef(null);
46
+ if (sizeRef.current === null) {
47
+ sizeRef.current = createSynchronizable(Float64Array.of(1, 1));
48
+ }
49
+ const sizeSynchronizable = sizeRef.current;
50
+
51
+ // Generation of the current post-release glide; bumped to cancel an old one.
52
+ const momentumRef = useRef(null);
53
+ if (momentumRef.current === null) {
54
+ momentumRef.current = createSynchronizable(Float64Array.of(0));
55
+ }
56
+ const momentumSynchronizable = momentumRef.current;
57
+
58
+ // Pointer position when the current drag began — the pan moves the pointer
59
+ // relative to this, so a drag pushes from where it was rather than jumping.
60
+ const panStartRef = useRef(null);
61
+ if (panStartRef.current === null) {
62
+ panStartRef.current = createSynchronizable(Float64Array.of(0, 0));
63
+ }
64
+ const panStartSynchronizable = panStartRef.current;
65
+ const onLayout = useCallback(e => {
66
+ const {
67
+ width,
68
+ height
69
+ } = e.nativeEvent.layout;
70
+ sizeSynchronizable.setBlocking(() => Float64Array.of(width || 1, height || 1));
71
+ }, [sizeSynchronizable]);
72
+
73
+ // Worklet: runs on the UI thread and writes the normalized pointer straight
74
+ // into the synchronizable the render runtime reads, so a pointer move never
75
+ // touches the JS thread.
76
+ const writePointer = (nx, ny, active) => {
77
+ 'worklet';
78
+
79
+ const x = Math.min(1, Math.max(0, nx));
80
+ const y = Math.min(1, Math.max(0, ny));
81
+ paramsSynchronizable.setBlocking(() => Float64Array.of(x, y, active, 0));
82
+ };
83
+ const stopMomentum = () => {
84
+ 'worklet';
85
+
86
+ const next = (momentumSynchronizable.getDirty()[0] || 0) + 1;
87
+ momentumSynchronizable.setBlocking(() => Float64Array.of(next));
88
+ };
89
+
90
+ // Drop the touched flag in place — safety net for a gesture cancelled with no
91
+ // onEnd, so the flag never sticks.
92
+ const releaseFlag = () => {
93
+ 'worklet';
94
+
95
+ const p = paramsSynchronizable.getDirty();
96
+ const x = p[0] || 0;
97
+ const y = p[1] || 0;
98
+ paramsSynchronizable.setBlocking(() => Float64Array.of(x, y, 0, 0));
99
+ };
100
+
101
+ // After release, drift from the last position along the fling velocity and
102
+ // decay to a stop — a little inertia. Runs on the UI thread via rAF, like the
103
+ // render loop, writing each frame into the same synchronizable.
104
+ const startMomentum = (velX, velY) => {
105
+ 'worklet';
106
+
107
+ const s = sizeSynchronizable.getDirty();
108
+ const w = s[0] || 1;
109
+ const h = s[1] || 1;
110
+
111
+ // Flick speed in normalized units/sec, scaled to a subtle glide (Y flipped).
112
+ const SCALE = 0.12;
113
+ let vx = velX / w * SCALE;
114
+ let vy = -velY / h * SCALE;
115
+ const p = paramsSynchronizable.getDirty();
116
+ let x = p[0] || 0;
117
+ let y = p[1] || 0;
118
+
119
+ // Claim this glide; a newer one bumps the generation and this loop bails.
120
+ const gen = (momentumSynchronizable.getDirty()[0] || 0) + 1;
121
+ momentumSynchronizable.setBlocking(() => Float64Array.of(gen));
122
+ const FRICTION = 2; // 1/s — higher stops sooner
123
+ let last = -1;
124
+
125
+ // Plain closure (no 'worklet') so its accumulators and self-reference
126
+ // survive across frames; a serialized worklet would snapshot them by value.
127
+ const step = now => {
128
+ if ((momentumSynchronizable.getDirty()[0] || 0) !== gen) {
129
+ return;
130
+ }
131
+ const dt = last < 0 ? 0 : (now - last) / 1000;
132
+ last = now;
133
+ x = Math.min(1, Math.max(0, x + vx * dt));
134
+ y = Math.min(1, Math.max(0, y + vy * dt));
135
+ const decay = Math.exp(-FRICTION * dt);
136
+ vx = vx * decay;
137
+ vy = vy * decay;
138
+ paramsSynchronizable.setBlocking(() => Float64Array.of(x, y, 0, 0));
139
+ if (Math.abs(vx) + Math.abs(vy) > 0.0008) {
140
+ requestAnimationFrame(step);
141
+ }
142
+ };
143
+ requestAnimationFrame(step);
144
+ };
145
+
146
+ // Drag moves the pointer *relatively*: grab anywhere and push it from where it
147
+ // is, rather than snapping it under the finger. A plain tap leaves it put.
148
+ const pan = Gesture.Pan().onBegin(() => {
149
+ 'worklet';
150
+
151
+ stopMomentum();
152
+ const p = paramsSynchronizable.getDirty();
153
+ const sx = p[0] || 0;
154
+ const sy = p[1] || 0;
155
+ panStartSynchronizable.setBlocking(() => Float64Array.of(sx, sy));
156
+ writePointer(sx, sy, 1);
157
+ }).onUpdate(e => {
158
+ 'worklet';
159
+
160
+ const s = sizeSynchronizable.getDirty();
161
+ const w = s[0] || 1;
162
+ const h = s[1] || 1;
163
+ const start = panStartSynchronizable.getDirty();
164
+ // Add the drag delta; Y is flipped to match the shader's UV space.
165
+ writePointer((start[0] || 0) + e.translationX / w, (start[1] || 0) - e.translationY / h, 1);
166
+ }).onEnd(e => {
167
+ 'worklet';
168
+
169
+ const p = paramsSynchronizable.getDirty();
170
+ writePointer(p[0] || 0, p[1] || 0, 0);
171
+ startMomentum(e.velocityX, e.velocityY);
172
+ }).onFinalize(() => {
173
+ 'worklet';
174
+
175
+ releaseFlag();
176
+ });
177
+ return /*#__PURE__*/_jsx(GestureDetector, {
178
+ gesture: pan,
179
+ children: /*#__PURE__*/_jsx(View, {
180
+ style: [styles.fill, style],
181
+ onLayout: onLayout,
182
+ collapsable: false,
183
+ children: /*#__PURE__*/_jsx(ShaderView, {
184
+ ...props,
185
+ paramsSynchronizable: paramsSynchronizable,
186
+ style: StyleSheet.absoluteFill
187
+ })
188
+ })
189
+ });
190
+ }
191
+ const styles = StyleSheet.create({
192
+ fill: {
193
+ flex: 1
194
+ }
195
+ });
196
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useRef","StyleSheet","View","Gesture","GestureDetector","createSynchronizable","ShaderView","useParamsSynchronizable","jsx","_jsx","ShaderViewWithPanGesture","style","initialParamsSynchronizable","props","paramsSynchronizable","sizeRef","current","Float64Array","of","sizeSynchronizable","momentumRef","momentumSynchronizable","panStartRef","panStartSynchronizable","onLayout","e","width","height","nativeEvent","layout","setBlocking","writePointer","nx","ny","active","x","Math","min","max","y","stopMomentum","next","getDirty","releaseFlag","p","startMomentum","velX","velY","s","w","h","SCALE","vx","vy","gen","FRICTION","last","step","now","dt","decay","exp","abs","requestAnimationFrame","pan","Pan","onBegin","sx","sy","onUpdate","start","translationX","translationY","onEnd","velocityX","velocityY","onFinalize","gesture","children","styles","fill","collapsable","absoluteFill","create","flex"],"sourceRoot":"../../../../src","sources":["components/ShaderViewWithPanGesture/index.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useRef } from 'react';
4
+ import { createSynchronizable } from 'react-native-worklets';
5
+ /**
6
+ * Creates a {@link ParamsSynchronizable} — a 4-float channel written into the
7
+ * dedicated `u.live` slot of a {@link ShaderView} every frame. It has its own
8
+ * uniform slot, so it leaves all 8 static `params` untouched.
9
+ *
10
+ * The returned `setParamsSynchronizable` runs on the JS thread (call it from gesture or scroll
11
+ * handlers); the values are read by the off-thread render loop. By convention
12
+ * the four floats carry `(x, y, active, extra)` for pointer input, or
13
+ * `(progress, ...)` for scroll-driven effects — but the meaning is up to the
14
+ * shader consuming `u.live`.
15
+ *
16
+ * Pass `initial` to seed the channel's starting value (read once on first
17
+ * render), so the shader has a sane resting state before the first update —
18
+ * e.g. `[0.5, 0.5, 0, 0]` to start a pointer at screen center. Defaults to all
19
+ * zeros.
20
+ */
21
+ export function useParamsSynchronizable(initial = [0, 0, 0, 0]) {
22
+ // Lazily create once; `initial` is only a seed, so it is read on first render
23
+ // and ignored thereafter.
24
+ const ref = useRef(null);
25
+ if (ref.current === null) {
26
+ ref.current = createSynchronizable(Float64Array.of(initial[0], initial[1], initial[2], initial[3]));
27
+ }
28
+ const paramsSynchronizable = ref.current;
29
+ const setParamsSynchronizable = useCallback((x, y, active, extra) => {
30
+ paramsSynchronizable.setBlocking(() => Float64Array.of(x, y, active, extra));
31
+ }, [paramsSynchronizable]);
32
+ return {
33
+ paramsSynchronizable,
34
+ setParamsSynchronizable
35
+ };
36
+ }
37
+ //# sourceMappingURL=useParamsSynchronizable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useRef","createSynchronizable","useParamsSynchronizable","initial","ref","current","Float64Array","of","paramsSynchronizable","setParamsSynchronizable","x","y","active","extra","setBlocking"],"sourceRoot":"../../../src","sources":["hooks/useParamsSynchronizable.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAC3C,SAASC,oBAAoB,QAAQ,uBAAuB;AAG5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,uBAAuBA,CACrCC,OAAkD,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EASjE;EACA;EACA;EACA,MAAMC,GAAG,GAAGJ,MAAM,CAA8B,IAAI,CAAC;EACrD,IAAII,GAAG,CAACC,OAAO,KAAK,IAAI,EAAE;IACxBD,GAAG,CAACC,OAAO,GAAGJ,oBAAoB,CAChCK,YAAY,CAACC,EAAE,CAACJ,OAAO,CAAC,CAAC,CAAC,EAAEA,OAAO,CAAC,CAAC,CAAC,EAAEA,OAAO,CAAC,CAAC,CAAC,EAAEA,OAAO,CAAC,CAAC,CAAC,CAChE,CAAC;EACH;EACA,MAAMK,oBAAoB,GAAGJ,GAAG,CAACC,OAAO;EAExC,MAAMI,uBAAuB,GAAGV,WAAW,CACzC,CAACW,CAAS,EAAEC,CAAS,EAAEC,MAAc,EAAEC,KAAa,KAAK;IACvDL,oBAAoB,CAACM,WAAW,CAAC,MAC/BR,YAAY,CAACC,EAAE,CAACG,CAAC,EAAEC,CAAC,EAAEC,MAAM,EAAEC,KAAK,CACrC,CAAC;EACH,CAAC,EACD,CAACL,oBAAoB,CACvB,CAAC;EAED,OAAO;IAAEA,oBAAoB;IAAEC;EAAwB,CAAC;AAC1D","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { PixelRatio } from 'react-native';
4
- import { useCanvasRef } from 'react-native-wgpu';
4
+ import { useCanvasRef } from 'react-native-webgpu';
5
5
  import { useEffect, useState } from 'react';
6
6
  import { initWebGPU } from "../utils/initWebGPU.js";
7
7
  import { BackgroundRuntime } from "../utils/backgroundRuntime.js";
@@ -1 +1 @@
1
- {"version":3,"names":["PixelRatio","useCanvasRef","useEffect","useState","initWebGPU","BackgroundRuntime","useWGPUSetup","canvasRef","resources","setResources","runtime","cancelled","adapter","navigator","gpu","requestAdapter","device","requestDevice","context","current","getContext","canvas","dpr","get","width","height","presentationFormat","getPreferredCanvasFormat","configure","format","alphaMode"],"sourceRoot":"../../../src","sources":["hooks/useWGPUSetup.tsx"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SACEC,YAAY,QAGP,mBAAmB;AAC1B,SAASC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAE3C,SAASC,UAAU,QAAQ,wBAAqB;AAChD,SAASC,iBAAiB,QAAQ,+BAA4B;AAc9D,OAAO,SAASC,YAAYA,CAAA,EAAoB;EAC9C,MAAMC,SAAS,GAAGN,YAAY,CAAC,CAAC;EAChC,MAAM,CAACO,SAAS,EAAEC,YAAY,CAAC,GAAGN,QAAQ,CAAsB,IAAI,CAAC;EACrE,MAAMO,OAAO,GAAGL,iBAAiB;EAEjCH,SAAS,CAAC,MAAM;IACd,IAAIS,SAAS,GAAG,KAAK;IAErB,CAAC,YAAY;MACX,MAAMC,OAAO,GAAG,MAAMC,SAAS,CAACC,GAAG,CAACC,cAAc,CAAC,CAAC;MACpD,IAAI,CAACH,OAAO,IAAID,SAAS,EAAE;QACzB;MACF;MAEA,MAAMK,MAAM,GAAG,MAAMJ,OAAO,CAACK,aAAa,CAAC,CAAC;MAC5C,IAAIN,SAAS,EAAE;QACb;MACF;MAEA,MAAMO,OAAO,GAAGX,SAAS,CAACY,OAAO,CAAEC,UAAU,CAAC,QAAQ,CAAE;MACxD,MAAMC,MAAM,GAAGH,OAAO,CAACG,MAGtB;MACD,MAAMC,GAAG,GAAGtB,UAAU,CAACuB,GAAG,CAAC,CAAC;MAC5BF,MAAM,CAACG,KAAK,GAAGH,MAAM,CAACG,KAAK,GAAGF,GAAG;MACjCD,MAAM,CAACI,MAAM,GAAGJ,MAAM,CAACI,MAAM,GAAGH,GAAG;MAEnC,MAAMI,kBAAkB,GAAGb,SAAS,CAACC,GAAG,CAACa,wBAAwB,CAAC,CAAC;MACnET,OAAO,CAACU,SAAS,CAAC;QAChBZ,MAAM;QACNa,MAAM,EAAEH,kBAAkB;QAC1BI,SAAS,EAAE;MACb,CAAC,CAAC;MAEF1B,UAAU,CAACM,OAAO,CAAC;MAEnB,IAAI,CAACC,SAAS,EAAE;QACdF,YAAY,CAAC;UAAEO,MAAM;UAAEE,OAAO;UAAEQ;QAAmB,CAAC,CAAC;MACvD;IACF,CAAC,EAAE,CAAC;IAEJ,OAAO,MAAM;MACXf,SAAS,GAAG,IAAI;IAClB,CAAC;IACD;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IAAEJ,SAAS;IAAEG,OAAO;IAAEF;EAAU,CAAC;AAC1C","ignoreList":[]}
1
+ {"version":3,"names":["PixelRatio","useCanvasRef","useEffect","useState","initWebGPU","BackgroundRuntime","useWGPUSetup","canvasRef","resources","setResources","runtime","cancelled","adapter","navigator","gpu","requestAdapter","device","requestDevice","context","current","getContext","canvas","dpr","get","width","height","presentationFormat","getPreferredCanvasFormat","configure","format","alphaMode"],"sourceRoot":"../../../src","sources":["hooks/useWGPUSetup.tsx"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,cAAc;AACzC,SACEC,YAAY,QAGP,qBAAqB;AAC5B,SAASC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAE3C,SAASC,UAAU,QAAQ,wBAAqB;AAChD,SAASC,iBAAiB,QAAQ,+BAA4B;AAc9D,OAAO,SAASC,YAAYA,CAAA,EAAoB;EAC9C,MAAMC,SAAS,GAAGN,YAAY,CAAC,CAAC;EAChC,MAAM,CAACO,SAAS,EAAEC,YAAY,CAAC,GAAGN,QAAQ,CAAsB,IAAI,CAAC;EACrE,MAAMO,OAAO,GAAGL,iBAAiB;EAEjCH,SAAS,CAAC,MAAM;IACd,IAAIS,SAAS,GAAG,KAAK;IAErB,CAAC,YAAY;MACX,MAAMC,OAAO,GAAG,MAAMC,SAAS,CAACC,GAAG,CAACC,cAAc,CAAC,CAAC;MACpD,IAAI,CAACH,OAAO,IAAID,SAAS,EAAE;QACzB;MACF;MAEA,MAAMK,MAAM,GAAG,MAAMJ,OAAO,CAACK,aAAa,CAAC,CAAC;MAC5C,IAAIN,SAAS,EAAE;QACb;MACF;MAEA,MAAMO,OAAO,GAAGX,SAAS,CAACY,OAAO,CAAEC,UAAU,CAAC,QAAQ,CAAE;MACxD,MAAMC,MAAM,GAAGH,OAAO,CAACG,MAGtB;MACD,MAAMC,GAAG,GAAGtB,UAAU,CAACuB,GAAG,CAAC,CAAC;MAC5BF,MAAM,CAACG,KAAK,GAAGH,MAAM,CAACG,KAAK,GAAGF,GAAG;MACjCD,MAAM,CAACI,MAAM,GAAGJ,MAAM,CAACI,MAAM,GAAGH,GAAG;MAEnC,MAAMI,kBAAkB,GAAGb,SAAS,CAACC,GAAG,CAACa,wBAAwB,CAAC,CAAC;MACnET,OAAO,CAACU,SAAS,CAAC;QAChBZ,MAAM;QACNa,MAAM,EAAEH,kBAAkB;QAC1BI,SAAS,EAAE;MACb,CAAC,CAAC;MAEF1B,UAAU,CAACM,OAAO,CAAC;MAEnB,IAAI,CAACC,SAAS,EAAE;QACdF,YAAY,CAAC;UAAEO,MAAM;UAAEE,OAAO;UAAEQ;QAAmB,CAAC,CAAC;MACvD;IACF,CAAC,EAAE,CAAC;IAEJ,OAAO,MAAM;MACXf,SAAS,GAAG,IAAI;IAClB,CAAC;IACD;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,OAAO;IAAEJ,SAAS;IAAEG,OAAO;IAAEF;EAAU,CAAC;AAC1C","ignoreList":[]}
@@ -3,11 +3,13 @@
3
3
  import CircularGradient from "./components/CircularGradient.js";
4
4
  import LinearGradient from "./components/LinearGradient.js";
5
5
  import ShaderView from "./components/ShaderView/index.js";
6
+ import ShaderViewWithPanGesture from "./components/ShaderViewWithPanGesture/index.js";
6
7
  import Iridescence from "./components/Iridescence.js";
7
8
  import LiquidChrome from "./components/LiquidChrome.js";
8
9
  import Silk from "./components/Silk.js";
9
10
  import Campfire from "./components/Campfire.js";
10
11
  import CalicoSwirl from "./components/CalicoSwirl.js";
11
12
  import Aurora from "./components/Aurora.js";
12
- export { CircularGradient, LinearGradient, ShaderView, Iridescence, LiquidChrome, Silk, Campfire, CalicoSwirl, Aurora };
13
+ import { useParamsSynchronizable } from "./hooks/useParamsSynchronizable.js";
14
+ export { CircularGradient, LinearGradient, ShaderView, ShaderViewWithPanGesture, Iridescence, LiquidChrome, Silk, Campfire, CalicoSwirl, Aurora, useParamsSynchronizable };
13
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["CircularGradient","LinearGradient","ShaderView","Iridescence","LiquidChrome","Silk","Campfire","CalicoSwirl","Aurora"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,gBAAgB,MAAM,kCAA+B;AAC5D,OAAOC,cAAc,MAAM,gCAA6B;AACxD,OAAOC,UAAU,MAAM,kCAAyB;AAChD,OAAOC,WAAW,MAAM,6BAA0B;AAClD,OAAOC,YAAY,MAAM,8BAA2B;AACpD,OAAOC,IAAI,MAAM,sBAAmB;AACpC,OAAOC,QAAQ,MAAM,0BAAuB;AAC5C,OAAOC,WAAW,MAAM,6BAA0B;AAClD,OAAOC,MAAM,MAAM,wBAAqB;AAIxC,SACER,gBAAgB,EAChBC,cAAc,EACdC,UAAU,EACVC,WAAW,EACXC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,WAAW,EACXC,MAAM","ignoreList":[]}
1
+ {"version":3,"names":["CircularGradient","LinearGradient","ShaderView","ShaderViewWithPanGesture","Iridescence","LiquidChrome","Silk","Campfire","CalicoSwirl","Aurora","useParamsSynchronizable"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,gBAAgB,MAAM,kCAA+B;AAC5D,OAAOC,cAAc,MAAM,gCAA6B;AACxD,OAAOC,UAAU,MAAM,kCAAyB;AAChD,OAAOC,wBAAwB,MAAM,gDAAuC;AAC5E,OAAOC,WAAW,MAAM,6BAA0B;AAClD,OAAOC,YAAY,MAAM,8BAA2B;AACpD,OAAOC,IAAI,MAAM,sBAAmB;AACpC,OAAOC,QAAQ,MAAM,0BAAuB;AAC5C,OAAOC,WAAW,MAAM,6BAA0B;AAClD,OAAOC,MAAM,MAAM,wBAAqB;AACxC,SAASC,uBAAuB,QAAQ,oCAAiC;AASzE,SACEV,gBAAgB,EAChBC,cAAc,EACdC,UAAU,EACVC,wBAAwB,EACxBC,WAAW,EACXC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,WAAW,EACXC,MAAM,EACNC,uBAAuB","ignoreList":[]}
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
- /** 96 bytes = 6 × vec4<f32> */
4
- export const UNIFORM_BUFFER_SIZE = 96;
3
+ /** 112 bytes = 7 × vec4<f32> */
4
+ export const UNIFORM_BUFFER_SIZE = 112;
5
5
 
6
6
  /** Number of float32 values in the uniform buffer */
7
- export const UNIFORM_FLOAT_COUNT = UNIFORM_BUFFER_SIZE / 4; // 24
7
+ export const UNIFORM_FLOAT_COUNT = UNIFORM_BUFFER_SIZE / 4; // 28
8
8
 
9
9
  export const UNIFORMS_WGSL = /* wgsl */`
10
10
  struct Uniforms {
@@ -14,6 +14,7 @@ struct Uniforms {
14
14
  color1: vec4<f32>, // colors[1] RGBA
15
15
  params0: vec4<f32>, // params[0..3]
16
16
  params1: vec4<f32>, // params[4..7]
17
+ live: vec4<f32>, // paramsSynchronizable (touch/scroll/audio); (0,0,0,0) when unused
17
18
  };
18
19
  @group(0) @binding(0) var<uniform> u: Uniforms;
19
20
  `;
@@ -1 +1 @@
1
- {"version":3,"names":["UNIFORM_BUFFER_SIZE","UNIFORM_FLOAT_COUNT","UNIFORMS_WGSL"],"sourceRoot":"../../../src","sources":["shaders/uniforms.ts"],"mappings":";;AAAA;AACA,OAAO,MAAMA,mBAAmB,GAAG,EAAE;;AAErC;AACA,OAAO,MAAMC,mBAAmB,GAAGD,mBAAmB,GAAG,CAAC,CAAC,CAAC;;AAE5D,OAAO,MAAME,aAAa,GAAG,UAAW;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["UNIFORM_BUFFER_SIZE","UNIFORM_FLOAT_COUNT","UNIFORMS_WGSL"],"sourceRoot":"../../../src","sources":["shaders/uniforms.ts"],"mappings":";;AAAA;AACA,OAAO,MAAMA,mBAAmB,GAAG,GAAG;;AAEtC;AACA,OAAO,MAAMC,mBAAmB,GAAGD,mBAAmB,GAAG,CAAC,CAAC,CAAC;;AAE5D,OAAO,MAAME,aAAa,GAAG,UAAW;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}
@@ -12,6 +12,6 @@ type Props = ViewProps & {
12
12
  /** How wavy/turbulent the curtains are. Default: 1.0 */
13
13
  waviness?: number;
14
14
  };
15
- export default function Aurora({ color, speed, intensity, layers, waviness, ...viewProps }: Props): import("react/jsx-runtime").JSX.Element;
15
+ export default function Aurora({ color, speed, intensity, layers, waviness, ...viewProps }: Props): import("react").JSX.Element;
16
16
  export {};
17
17
  //# sourceMappingURL=Aurora.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Aurora.d.ts","sourceRoot":"","sources":["../../../../src/components/Aurora.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,KAAK,KAAK,GAAG,SAAS,GAAG;IACvB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,KAAiB,EACjB,KAAW,EACX,SAAe,EACf,MAAY,EACZ,QAAc,EACd,GAAG,SAAS,EACb,EAAE,KAAK,2CAiBP"}
1
+ {"version":3,"file":"Aurora.d.ts","sourceRoot":"","sources":["../../../../src/components/Aurora.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,KAAK,KAAK,GAAG,SAAS,GAAG;IACvB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,KAAiB,EACjB,KAAW,EACX,SAAe,EACf,MAAY,EACZ,QAAc,EACd,GAAG,SAAS,EACb,EAAE,KAAK,+BAiBP"}
@@ -8,6 +8,6 @@ type Props = ViewProps & {
8
8
  /** Intensity of the effect. Default: 1.0 */
9
9
  intensity?: number;
10
10
  };
11
- export default function CalicoSwirl({ color, speed, intensity, ...viewProps }: Props): import("react/jsx-runtime").JSX.Element;
11
+ export default function CalicoSwirl({ color, speed, intensity, ...viewProps }: Props): import("react").JSX.Element;
12
12
  export {};
13
13
  //# sourceMappingURL=CalicoSwirl.d.ts.map