react-native-effects 0.0.1 → 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 (110) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +313 -0
  3. package/lib/module/components/Aurora.js +184 -0
  4. package/lib/module/components/Aurora.js.map +1 -0
  5. package/lib/module/components/CalicoSwirl.js +155 -0
  6. package/lib/module/components/CalicoSwirl.js.map +1 -0
  7. package/lib/module/components/Campfire.js +225 -0
  8. package/lib/module/components/Campfire.js.map +1 -0
  9. package/lib/module/components/CircularGradient.js +52 -0
  10. package/lib/module/components/CircularGradient.js.map +1 -0
  11. package/lib/module/components/Iridescence.js +57 -0
  12. package/lib/module/components/Iridescence.js.map +1 -0
  13. package/lib/module/components/LinearGradient.js +48 -0
  14. package/lib/module/components/LinearGradient.js.map +1 -0
  15. package/lib/module/components/LiquidChrome.js +75 -0
  16. package/lib/module/components/LiquidChrome.js.map +1 -0
  17. package/lib/module/components/ShaderView/index.js +252 -0
  18. package/lib/module/components/ShaderView/index.js.map +1 -0
  19. package/lib/module/components/ShaderView/types.js +4 -0
  20. package/lib/module/components/ShaderView/types.js.map +1 -0
  21. package/lib/module/components/ShaderViewWithPanGesture/index.js +196 -0
  22. package/lib/module/components/ShaderViewWithPanGesture/index.js.map +1 -0
  23. package/lib/module/components/Silk.js +83 -0
  24. package/lib/module/components/Silk.js.map +1 -0
  25. package/lib/module/consts.js +154 -0
  26. package/lib/module/consts.js.map +1 -0
  27. package/lib/module/hooks/useClock.js +15 -0
  28. package/lib/module/hooks/useClock.js.map +1 -0
  29. package/lib/module/hooks/useParamsSynchronizable.js +37 -0
  30. package/lib/module/hooks/useParamsSynchronizable.js.map +1 -0
  31. package/lib/module/hooks/useWGPUSetup.js +54 -0
  32. package/lib/module/hooks/useWGPUSetup.js.map +1 -0
  33. package/lib/module/index.js +15 -0
  34. package/lib/module/index.js.map +1 -0
  35. package/lib/module/package.json +1 -0
  36. package/lib/module/shaders/TRIANGLE_VERTEX_SHADER.js +20 -0
  37. package/lib/module/shaders/TRIANGLE_VERTEX_SHADER.js.map +1 -0
  38. package/lib/module/shaders/uniforms.js +21 -0
  39. package/lib/module/shaders/uniforms.js.map +1 -0
  40. package/lib/module/utils/backgroundRuntime.js +12 -0
  41. package/lib/module/utils/backgroundRuntime.js.map +1 -0
  42. package/lib/module/utils/colors.js +94 -0
  43. package/lib/module/utils/colors.js.map +1 -0
  44. package/lib/module/utils/initWebGPU.js +40 -0
  45. package/lib/module/utils/initWebGPU.js.map +1 -0
  46. package/lib/typescript/package.json +1 -0
  47. package/lib/typescript/src/components/Aurora.d.ts +17 -0
  48. package/lib/typescript/src/components/Aurora.d.ts.map +1 -0
  49. package/lib/typescript/src/components/CalicoSwirl.d.ts +13 -0
  50. package/lib/typescript/src/components/CalicoSwirl.d.ts.map +1 -0
  51. package/lib/typescript/src/components/Campfire.d.ts +17 -0
  52. package/lib/typescript/src/components/Campfire.d.ts.map +1 -0
  53. package/lib/typescript/src/components/CircularGradient.d.ts +19 -0
  54. package/lib/typescript/src/components/CircularGradient.d.ts.map +1 -0
  55. package/lib/typescript/src/components/Iridescence.d.ts +11 -0
  56. package/lib/typescript/src/components/Iridescence.d.ts.map +1 -0
  57. package/lib/typescript/src/components/LinearGradient.d.ts +15 -0
  58. package/lib/typescript/src/components/LinearGradient.d.ts.map +1 -0
  59. package/lib/typescript/src/components/LiquidChrome.d.ts +17 -0
  60. package/lib/typescript/src/components/LiquidChrome.d.ts.map +1 -0
  61. package/lib/typescript/src/components/ShaderView/index.d.ts +3 -0
  62. package/lib/typescript/src/components/ShaderView/index.d.ts.map +1 -0
  63. package/lib/typescript/src/components/ShaderView/types.d.ts +35 -0
  64. package/lib/typescript/src/components/ShaderView/types.d.ts.map +1 -0
  65. package/lib/typescript/src/components/ShaderViewWithPanGesture/index.d.ts +35 -0
  66. package/lib/typescript/src/components/ShaderViewWithPanGesture/index.d.ts.map +1 -0
  67. package/lib/typescript/src/components/Silk.d.ts +17 -0
  68. package/lib/typescript/src/components/Silk.d.ts.map +1 -0
  69. package/lib/typescript/src/consts.d.ts +2 -0
  70. package/lib/typescript/src/consts.d.ts.map +1 -0
  71. package/lib/typescript/src/hooks/useClock.d.ts +3 -0
  72. package/lib/typescript/src/hooks/useClock.d.ts.map +1 -0
  73. package/lib/typescript/src/hooks/useParamsSynchronizable.d.ts +22 -0
  74. package/lib/typescript/src/hooks/useParamsSynchronizable.d.ts.map +1 -0
  75. package/lib/typescript/src/hooks/useWGPUSetup.d.ts +15 -0
  76. package/lib/typescript/src/hooks/useWGPUSetup.d.ts.map +1 -0
  77. package/lib/typescript/src/index.d.ts +16 -0
  78. package/lib/typescript/src/index.d.ts.map +1 -0
  79. package/lib/typescript/src/shaders/TRIANGLE_VERTEX_SHADER.d.ts +2 -0
  80. package/lib/typescript/src/shaders/TRIANGLE_VERTEX_SHADER.d.ts.map +1 -0
  81. package/lib/typescript/src/shaders/uniforms.d.ts +6 -0
  82. package/lib/typescript/src/shaders/uniforms.d.ts.map +1 -0
  83. package/lib/typescript/src/utils/backgroundRuntime.d.ts +3 -0
  84. package/lib/typescript/src/utils/backgroundRuntime.d.ts.map +1 -0
  85. package/lib/typescript/src/utils/colors.d.ts +22 -0
  86. package/lib/typescript/src/utils/colors.d.ts.map +1 -0
  87. package/lib/typescript/src/utils/initWebGPU.d.ts +23 -0
  88. package/lib/typescript/src/utils/initWebGPU.d.ts.map +1 -0
  89. package/package.json +175 -7
  90. package/src/components/Aurora.tsx +203 -0
  91. package/src/components/CalicoSwirl.tsx +167 -0
  92. package/src/components/Campfire.tsx +244 -0
  93. package/src/components/CircularGradient.tsx +76 -0
  94. package/src/components/Iridescence.tsx +67 -0
  95. package/src/components/LinearGradient.tsx +62 -0
  96. package/src/components/LiquidChrome.tsx +94 -0
  97. package/src/components/ShaderView/index.tsx +262 -0
  98. package/src/components/ShaderView/types.ts +36 -0
  99. package/src/components/ShaderViewWithPanGesture/index.tsx +225 -0
  100. package/src/components/Silk.tsx +102 -0
  101. package/src/consts.ts +152 -0
  102. package/src/hooks/useClock.ts +20 -0
  103. package/src/hooks/useParamsSynchronizable.ts +52 -0
  104. package/src/hooks/useWGPUSetup.tsx +73 -0
  105. package/src/index.tsx +32 -0
  106. package/src/shaders/TRIANGLE_VERTEX_SHADER.ts +17 -0
  107. package/src/shaders/uniforms.ts +18 -0
  108. package/src/utils/backgroundRuntime.ts +10 -0
  109. package/src/utils/colors.ts +117 -0
  110. package/src/utils/initWebGPU.ts +47 -0
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+
3
+ import { PixelRatio, StyleSheet } from 'react-native';
4
+ import { Canvas } from 'react-native-webgpu';
5
+ import { useEffect, useRef } from 'react';
6
+ import { createSynchronizable, scheduleOnRuntime } from 'react-native-worklets';
7
+ import { colorToVec4 } from "../../utils/colors.js";
8
+ import { useWGPUSetup } from "../../hooks/useWGPUSetup.js";
9
+ import { TRIANGLE_VERTEX_SHADER } from "../../shaders/TRIANGLE_VERTEX_SHADER.js";
10
+ import { UNIFORM_BUFFER_SIZE, UNIFORM_FLOAT_COUNT } from "../../shaders/uniforms.js";
11
+ import { jsx as _jsx } from "react/jsx-runtime";
12
+ // Synchronizable layout: [c0r,c0g,c0b,c0a, c1r,c1g,c1b,c1a, speed, p0..p7, alive]
13
+ // Total: 4 + 4 + 1 + 8 + 1 = 18 floats
14
+ const SYNC_SIZE = 18;
15
+ const IDX_SPEED = 8;
16
+ const IDX_PARAMS = 9; // 9..16
17
+ const IDX_ALIVE = 17;
18
+ export default function ShaderView({
19
+ fragmentShader,
20
+ colors = [],
21
+ speed = 1.0,
22
+ params = [],
23
+ isStatic = false,
24
+ transparent = false,
25
+ paramsSynchronizable,
26
+ style,
27
+ ...viewProps
28
+ }) {
29
+ const {
30
+ canvasRef,
31
+ runtime,
32
+ resources
33
+ } = useWGPUSetup();
34
+ const propsSync = useRef(createSynchronizable(new Float64Array(SYNC_SIZE))).current;
35
+
36
+ // Convert props to flat floats and push to synchronizable
37
+ useEffect(() => {
38
+ const data = new Float64Array(SYNC_SIZE);
39
+
40
+ // color0 (indices 0-3)
41
+ if (colors[0] !== undefined) {
42
+ const c0 = colorToVec4(colors[0]);
43
+ data[0] = c0.r;
44
+ data[1] = c0.g;
45
+ data[2] = c0.b;
46
+ data[3] = c0.a;
47
+ }
48
+
49
+ // color1 (indices 4-7)
50
+ if (colors[1] !== undefined) {
51
+ const c1 = colorToVec4(colors[1]);
52
+ data[4] = c1.r;
53
+ data[5] = c1.g;
54
+ data[6] = c1.b;
55
+ data[7] = c1.a;
56
+ }
57
+
58
+ // speed
59
+ data[IDX_SPEED] = speed;
60
+
61
+ // params (indices 9-16)
62
+ for (let i = 0; i < 8; i++) {
63
+ data[IDX_PARAMS + i] = params[i] ?? 0;
64
+ }
65
+
66
+ // alive
67
+ data[IDX_ALIVE] = 1;
68
+ propsSync.setBlocking(() => data);
69
+ }, [colors, speed, params, propsSync]);
70
+
71
+ // Signal cleanup on unmount
72
+ useEffect(() => {
73
+ return () => {
74
+ propsSync.setBlocking(prev => {
75
+ prev[IDX_ALIVE] = 0;
76
+ return prev;
77
+ });
78
+ };
79
+ }, [propsSync]);
80
+
81
+ // Start render loop when GPU resources are ready
82
+ useEffect(() => {
83
+ if (!resources) {
84
+ return;
85
+ }
86
+ const {
87
+ device,
88
+ context,
89
+ presentationFormat
90
+ } = resources;
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));
98
+ scheduleOnRuntime(runtime, () => {
99
+ 'worklet';
100
+
101
+ // Create pipeline once
102
+ const pipeline = device.createRenderPipeline({
103
+ layout: 'auto',
104
+ vertex: {
105
+ module: device.createShaderModule({
106
+ code: TRIANGLE_VERTEX_SHADER
107
+ }),
108
+ entryPoint: 'main'
109
+ },
110
+ fragment: {
111
+ module: device.createShaderModule({
112
+ code: fragmentShader
113
+ }),
114
+ entryPoint: 'main',
115
+ targets: [{
116
+ format: presentationFormat
117
+ }]
118
+ },
119
+ primitive: {
120
+ topology: 'triangle-list'
121
+ }
122
+ });
123
+
124
+ // Create uniform buffer + bind group once, reuse via writeBuffer
125
+ const uniformBuffer = device.createBuffer({
126
+ size: UNIFORM_BUFFER_SIZE,
127
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
128
+ });
129
+ const bindGroup = device.createBindGroup({
130
+ layout: pipeline.getBindGroupLayout(0),
131
+ entries: [{
132
+ binding: 0,
133
+ resource: {
134
+ buffer: uniformBuffer
135
+ }
136
+ }]
137
+ });
138
+ const uniformData = new Float32Array(UNIFORM_FLOAT_COUNT);
139
+ let accumulatedTime = 0;
140
+ let lastTimestamp = 0;
141
+ function render(timestamp) {
142
+ const props = propsSync.getDirty();
143
+ if (props[IDX_ALIVE] === 0) {
144
+ return;
145
+ }
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
+
153
+ // Compute dt
154
+ const dt = lastTimestamp === 0 ? 0 : (timestamp - lastTimestamp) / 1000;
155
+ lastTimestamp = timestamp;
156
+
157
+ // Accumulate time with speed
158
+ const currentSpeed = props[IDX_SPEED];
159
+ accumulatedTime += dt * currentSpeed;
160
+
161
+ // Resolution
162
+ const canvas = context.canvas;
163
+ const width = canvas.width || 1;
164
+ const height = canvas.height || 1;
165
+ const aspect = width / height;
166
+
167
+ // Fill uniform data (7 × vec4 = 28 floats)
168
+ // resolution: vec4<f32>
169
+ uniformData[0] = width;
170
+ uniformData[1] = height;
171
+ uniformData[2] = aspect;
172
+ uniformData[3] = dpr;
173
+
174
+ // time: vec4<f32>
175
+ uniformData[4] = accumulatedTime;
176
+ uniformData[5] = dt;
177
+ uniformData[6] = 0;
178
+ uniformData[7] = 0;
179
+
180
+ // color0: vec4<f32>
181
+ uniformData[8] = props[0];
182
+ uniformData[9] = props[1];
183
+ uniformData[10] = props[2];
184
+ uniformData[11] = props[3];
185
+
186
+ // color1: vec4<f32>
187
+ uniformData[12] = props[4];
188
+ uniformData[13] = props[5];
189
+ uniformData[14] = props[6];
190
+ uniformData[15] = props[7];
191
+
192
+ // params0: vec4<f32>
193
+ uniformData[16] = props[IDX_PARAMS];
194
+ uniformData[17] = props[IDX_PARAMS + 1];
195
+ uniformData[18] = props[IDX_PARAMS + 2];
196
+ uniformData[19] = props[IDX_PARAMS + 3];
197
+
198
+ // params1: vec4<f32> — static params[4..7]
199
+ uniformData[20] = props[IDX_PARAMS + 4];
200
+ uniformData[21] = props[IDX_PARAMS + 5];
201
+ uniformData[22] = props[IDX_PARAMS + 6];
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
+ }
214
+ device.queue.writeBuffer(uniformBuffer, 0, uniformData);
215
+ const commandEncoder = device.createCommandEncoder();
216
+ const textureView = context.getCurrentTexture().createView();
217
+ const passEncoder = commandEncoder.beginRenderPass({
218
+ colorAttachments: [{
219
+ view: textureView,
220
+ clearValue: transparent ? [0, 0, 0, 0] : [0, 0, 0, 1],
221
+ loadOp: 'clear',
222
+ storeOp: 'store'
223
+ }]
224
+ });
225
+ passEncoder.setPipeline(pipeline);
226
+ passEncoder.setBindGroup(0, bindGroup);
227
+ passEncoder.draw(3);
228
+ passEncoder.end();
229
+ device.queue.submit([commandEncoder.finish()]);
230
+ context.present();
231
+ if (!isStatic) {
232
+ requestAnimationFrame(render);
233
+ }
234
+ }
235
+ requestAnimationFrame(render);
236
+ });
237
+ return () => {
238
+ cancelled.setBlocking(() => Float64Array.of(1));
239
+ };
240
+ }, [resources, runtime, propsSync, paramsSynchronizable, fragmentShader, isStatic, transparent]);
241
+ return /*#__PURE__*/_jsx(Canvas, {
242
+ ref: canvasRef,
243
+ style: [styles.canvas, style],
244
+ ...viewProps
245
+ });
246
+ }
247
+ const styles = StyleSheet.create({
248
+ canvas: {
249
+ flex: 1
250
+ }
251
+ });
252
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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","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":"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","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["components/ShaderView/types.ts"],"mappings":"","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,83 @@
1
+ "use strict";
2
+
3
+ import { useMemo } from 'react';
4
+ import ShaderView from "./ShaderView/index.js";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ export default function Silk({
7
+ color = '#7B7481',
8
+ speed = 1.0,
9
+ scale = 1.0,
10
+ rotation = 0.0,
11
+ noiseIntensity = 1.5,
12
+ ...viewProps
13
+ }) {
14
+ const colors = useMemo(() => [color], [color]);
15
+ const params = useMemo(() => [scale, rotation, noiseIntensity], [scale, rotation, noiseIntensity]);
16
+ return /*#__PURE__*/_jsx(ShaderView, {
17
+ fragmentShader: SILK_SHADER,
18
+ colors: colors,
19
+ params: params,
20
+ speed: speed,
21
+ isStatic: false,
22
+ ...viewProps
23
+ });
24
+ }
25
+ const SILK_SHADER = /* wgsl */`
26
+ struct Uniforms {
27
+ resolution: vec4<f32>,
28
+ time: vec4<f32>,
29
+ color0: vec4<f32>,
30
+ color1: vec4<f32>,
31
+ params0: vec4<f32>,
32
+ params1: vec4<f32>,
33
+ };
34
+ @group(0) @binding(0) var<uniform> u: Uniforms;
35
+
36
+ const e = 2.71828182845904523536;
37
+
38
+ fn noise(texCoord: vec2<f32>) -> f32 {
39
+ let G = e;
40
+ let r = (G * sin(G * texCoord));
41
+ return fract(r.x * r.y * (1.0 + texCoord.x));
42
+ }
43
+
44
+ fn rotateUvs(uv: vec2<f32>, angle: f32) -> vec2<f32> {
45
+ let c = cos(angle);
46
+ let s = sin(angle);
47
+ let rot = mat2x2<f32>(c, -s, s, c);
48
+ return rot * uv;
49
+ }
50
+
51
+ @fragment
52
+ fn main(@location(0) ndc: vec2<f32>) -> @location(0) vec4<f32> {
53
+ let time = u.time.x;
54
+ let scale = u.params0.x;
55
+ let rotation = u.params0.y;
56
+ let noiseIntensity = u.params0.z;
57
+
58
+ let resolution2D = u.resolution.xy;
59
+ let vUv = ndc * 0.5 + vec2<f32>(0.5, 0.5);
60
+ let fragCoord = vUv * resolution2D;
61
+
62
+ let rnd = noise(fragCoord);
63
+ let uv = rotateUvs(vUv * scale, rotation);
64
+ var tex = uv * scale;
65
+ let tOffset = time;
66
+
67
+ tex.y = tex.y + 0.03 * sin(8.0 * tex.x - tOffset);
68
+
69
+ let pattern = 0.6 +
70
+ 0.4 * sin(5.0 * (tex.x + tex.y +
71
+ cos(3.0 * tex.x + 5.0 * tex.y) +
72
+ 0.02 * tOffset) +
73
+ sin(20.0 * (tex.x + tex.y - 0.1 * tOffset)));
74
+
75
+ var col = u.color0 * vec4<f32>(pattern, pattern, pattern, 1.0) -
76
+ vec4<f32>(rnd / 15.0 * noiseIntensity, rnd / 15.0 * noiseIntensity,
77
+ rnd / 15.0 * noiseIntensity, 0.0);
78
+ col.a = u.color0.a;
79
+
80
+ return clamp(col, vec4<f32>(0.0), vec4<f32>(1.0));
81
+ }
82
+ `;
83
+ //# sourceMappingURL=Silk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","ShaderView","jsx","_jsx","Silk","color","speed","scale","rotation","noiseIntensity","viewProps","colors","params","fragmentShader","SILK_SHADER","isStatic"],"sourceRoot":"../../../src","sources":["components/Silk.tsx"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,OAAO;AAG/B,OAAOC,UAAU,MAAM,uBAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAetC,eAAe,SAASC,IAAIA,CAAC;EAC3BC,KAAK,GAAG,SAAS;EACjBC,KAAK,GAAG,GAAG;EACXC,KAAK,GAAG,GAAG;EACXC,QAAQ,GAAG,GAAG;EACdC,cAAc,GAAG,GAAG;EACpB,GAAGC;AACE,CAAC,EAAE;EACR,MAAMC,MAAM,GAAGX,OAAO,CAAC,MAAM,CAACK,KAAK,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EAC9C,MAAMO,MAAM,GAAGZ,OAAO,CACpB,MAAM,CAACO,KAAK,EAAEC,QAAQ,EAAEC,cAAc,CAAC,EACvC,CAACF,KAAK,EAAEC,QAAQ,EAAEC,cAAc,CAClC,CAAC;EAED,oBACEN,IAAA,CAACF,UAAU;IACTY,cAAc,EAAEC,WAAY;IAC5BH,MAAM,EAAEA,MAAO;IACfC,MAAM,EAAEA,MAAO;IACfN,KAAK,EAAEA,KAAM;IACbS,QAAQ,EAAE,KAAM;IAAA,GACZL;EAAS,CACd,CAAC;AAEN;AAEA,MAAMI,WAAW,GAAG,UAAW;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}