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.
- package/LICENSE +20 -0
- package/README.md +313 -0
- package/lib/module/components/Aurora.js +184 -0
- package/lib/module/components/Aurora.js.map +1 -0
- package/lib/module/components/CalicoSwirl.js +155 -0
- package/lib/module/components/CalicoSwirl.js.map +1 -0
- package/lib/module/components/Campfire.js +225 -0
- package/lib/module/components/Campfire.js.map +1 -0
- package/lib/module/components/CircularGradient.js +52 -0
- package/lib/module/components/CircularGradient.js.map +1 -0
- package/lib/module/components/Iridescence.js +57 -0
- package/lib/module/components/Iridescence.js.map +1 -0
- package/lib/module/components/LinearGradient.js +48 -0
- package/lib/module/components/LinearGradient.js.map +1 -0
- package/lib/module/components/LiquidChrome.js +75 -0
- package/lib/module/components/LiquidChrome.js.map +1 -0
- package/lib/module/components/ShaderView/index.js +252 -0
- package/lib/module/components/ShaderView/index.js.map +1 -0
- package/lib/module/components/ShaderView/types.js +4 -0
- package/lib/module/components/ShaderView/types.js.map +1 -0
- package/lib/module/components/ShaderViewWithPanGesture/index.js +196 -0
- package/lib/module/components/ShaderViewWithPanGesture/index.js.map +1 -0
- package/lib/module/components/Silk.js +83 -0
- package/lib/module/components/Silk.js.map +1 -0
- package/lib/module/consts.js +154 -0
- package/lib/module/consts.js.map +1 -0
- package/lib/module/hooks/useClock.js +15 -0
- package/lib/module/hooks/useClock.js.map +1 -0
- package/lib/module/hooks/useParamsSynchronizable.js +37 -0
- package/lib/module/hooks/useParamsSynchronizable.js.map +1 -0
- package/lib/module/hooks/useWGPUSetup.js +54 -0
- package/lib/module/hooks/useWGPUSetup.js.map +1 -0
- package/lib/module/index.js +15 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/shaders/TRIANGLE_VERTEX_SHADER.js +20 -0
- package/lib/module/shaders/TRIANGLE_VERTEX_SHADER.js.map +1 -0
- package/lib/module/shaders/uniforms.js +21 -0
- package/lib/module/shaders/uniforms.js.map +1 -0
- package/lib/module/utils/backgroundRuntime.js +12 -0
- package/lib/module/utils/backgroundRuntime.js.map +1 -0
- package/lib/module/utils/colors.js +94 -0
- package/lib/module/utils/colors.js.map +1 -0
- package/lib/module/utils/initWebGPU.js +40 -0
- package/lib/module/utils/initWebGPU.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/components/Aurora.d.ts +17 -0
- package/lib/typescript/src/components/Aurora.d.ts.map +1 -0
- package/lib/typescript/src/components/CalicoSwirl.d.ts +13 -0
- package/lib/typescript/src/components/CalicoSwirl.d.ts.map +1 -0
- package/lib/typescript/src/components/Campfire.d.ts +17 -0
- package/lib/typescript/src/components/Campfire.d.ts.map +1 -0
- package/lib/typescript/src/components/CircularGradient.d.ts +19 -0
- package/lib/typescript/src/components/CircularGradient.d.ts.map +1 -0
- package/lib/typescript/src/components/Iridescence.d.ts +11 -0
- package/lib/typescript/src/components/Iridescence.d.ts.map +1 -0
- package/lib/typescript/src/components/LinearGradient.d.ts +15 -0
- package/lib/typescript/src/components/LinearGradient.d.ts.map +1 -0
- package/lib/typescript/src/components/LiquidChrome.d.ts +17 -0
- package/lib/typescript/src/components/LiquidChrome.d.ts.map +1 -0
- package/lib/typescript/src/components/ShaderView/index.d.ts +3 -0
- package/lib/typescript/src/components/ShaderView/index.d.ts.map +1 -0
- package/lib/typescript/src/components/ShaderView/types.d.ts +35 -0
- package/lib/typescript/src/components/ShaderView/types.d.ts.map +1 -0
- package/lib/typescript/src/components/ShaderViewWithPanGesture/index.d.ts +35 -0
- package/lib/typescript/src/components/ShaderViewWithPanGesture/index.d.ts.map +1 -0
- package/lib/typescript/src/components/Silk.d.ts +17 -0
- package/lib/typescript/src/components/Silk.d.ts.map +1 -0
- package/lib/typescript/src/consts.d.ts +2 -0
- package/lib/typescript/src/consts.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useClock.d.ts +3 -0
- package/lib/typescript/src/hooks/useClock.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useParamsSynchronizable.d.ts +22 -0
- package/lib/typescript/src/hooks/useParamsSynchronizable.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useWGPUSetup.d.ts +15 -0
- package/lib/typescript/src/hooks/useWGPUSetup.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +16 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/shaders/TRIANGLE_VERTEX_SHADER.d.ts +2 -0
- package/lib/typescript/src/shaders/TRIANGLE_VERTEX_SHADER.d.ts.map +1 -0
- package/lib/typescript/src/shaders/uniforms.d.ts +6 -0
- package/lib/typescript/src/shaders/uniforms.d.ts.map +1 -0
- package/lib/typescript/src/utils/backgroundRuntime.d.ts +3 -0
- package/lib/typescript/src/utils/backgroundRuntime.d.ts.map +1 -0
- package/lib/typescript/src/utils/colors.d.ts +22 -0
- package/lib/typescript/src/utils/colors.d.ts.map +1 -0
- package/lib/typescript/src/utils/initWebGPU.d.ts +23 -0
- package/lib/typescript/src/utils/initWebGPU.d.ts.map +1 -0
- package/package.json +175 -7
- package/src/components/Aurora.tsx +203 -0
- package/src/components/CalicoSwirl.tsx +167 -0
- package/src/components/Campfire.tsx +244 -0
- package/src/components/CircularGradient.tsx +76 -0
- package/src/components/Iridescence.tsx +67 -0
- package/src/components/LinearGradient.tsx +62 -0
- package/src/components/LiquidChrome.tsx +94 -0
- package/src/components/ShaderView/index.tsx +262 -0
- package/src/components/ShaderView/types.ts +36 -0
- package/src/components/ShaderViewWithPanGesture/index.tsx +225 -0
- package/src/components/Silk.tsx +102 -0
- package/src/consts.ts +152 -0
- package/src/hooks/useClock.ts +20 -0
- package/src/hooks/useParamsSynchronizable.ts +52 -0
- package/src/hooks/useWGPUSetup.tsx +73 -0
- package/src/index.tsx +32 -0
- package/src/shaders/TRIANGLE_VERTEX_SHADER.ts +17 -0
- package/src/shaders/uniforms.ts +18 -0
- package/src/utils/backgroundRuntime.ts +10 -0
- package/src/utils/colors.ts +117 -0
- 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 @@
|
|
|
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":[]}
|