@pixerate/flair 0.0.0-stage → 0.1.1
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/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +254 -2
- package/dist/catalog/index.d.ts +74 -0
- package/dist/catalog/index.js +47 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/chunk-36DTNSHU.js +160 -0
- package/dist/chunk-36DTNSHU.js.map +1 -0
- package/dist/chunk-3FAUZOGL.js +331 -0
- package/dist/chunk-3FAUZOGL.js.map +1 -0
- package/dist/chunk-CFCLT2XL.js +1 -0
- package/dist/chunk-CFCLT2XL.js.map +1 -0
- package/dist/chunk-EHDJ3CPJ.js +327 -0
- package/dist/chunk-EHDJ3CPJ.js.map +1 -0
- package/dist/chunk-G5FNZDTA.js +536 -0
- package/dist/chunk-G5FNZDTA.js.map +1 -0
- package/dist/chunk-HKXOHRCD.js +763 -0
- package/dist/chunk-HKXOHRCD.js.map +1 -0
- package/dist/chunk-J55UBNAT.js +164 -0
- package/dist/chunk-J55UBNAT.js.map +1 -0
- package/dist/chunk-JWZCPMFG.js +2074 -0
- package/dist/chunk-JWZCPMFG.js.map +1 -0
- package/dist/chunk-MWVTQFV5.js +1894 -0
- package/dist/chunk-MWVTQFV5.js.map +1 -0
- package/dist/chunk-UQQNZSYL.js +594 -0
- package/dist/chunk-UQQNZSYL.js.map +1 -0
- package/dist/chunk-WMZQCUFJ.js +73 -0
- package/dist/chunk-WMZQCUFJ.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +331 -0
- package/dist/cli.js.map +1 -0
- package/dist/clock-BhdXWH-n.d.ts +47 -0
- package/dist/controls-DdXMbovi.d.ts +97 -0
- package/dist/editor/index.d.ts +413 -0
- package/dist/editor/index.js +1009 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/export-FEBPEEO7.js +22 -0
- package/dist/export-FEBPEEO7.js.map +1 -0
- package/dist/index.d.ts +1431 -0
- package/dist/index.js +1263 -0
- package/dist/index.js.map +1 -0
- package/dist/motion-D0TVv2CF.d.ts +148 -0
- package/dist/node.d.ts +24 -0
- package/dist/node.js +10 -0
- package/dist/node.js.map +1 -0
- package/dist/recorder-WJTWMEQN.js +10 -0
- package/dist/recorder-WJTWMEQN.js.map +1 -0
- package/dist/renderer-Oyynz-fs.d.ts +293 -0
- package/dist/types-CkKkavvB.d.ts +71 -0
- package/dist/vector/index.d.ts +83 -0
- package/dist/vector/index.js +39 -0
- package/dist/vector/index.js.map +1 -0
- package/package.json +93 -3
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
// src/shader/transition.ts
|
|
2
|
+
var ALL_TRANSITION_TYPES = [
|
|
3
|
+
"linearWipe",
|
|
4
|
+
"radialIris",
|
|
5
|
+
"blockDissolve",
|
|
6
|
+
"gridWipe",
|
|
7
|
+
"glassWipe",
|
|
8
|
+
"twister",
|
|
9
|
+
"lightLeak",
|
|
10
|
+
"crossZoom"
|
|
11
|
+
];
|
|
12
|
+
function clamp01(v) {
|
|
13
|
+
return Math.max(0, Math.min(1, v));
|
|
14
|
+
}
|
|
15
|
+
function smoothstep(edge0, edge1, x) {
|
|
16
|
+
if (Math.abs(edge1 - edge0) < 1e-7) return x < edge0 ? 0 : 1;
|
|
17
|
+
const t = clamp01((x - edge0) / (edge1 - edge0));
|
|
18
|
+
return t * t * (3 - 2 * t);
|
|
19
|
+
}
|
|
20
|
+
function hash2d(x, y, seed) {
|
|
21
|
+
let n = x * 374761393 + y * 668265263 + seed * 362827313 | 0;
|
|
22
|
+
n = Math.imul(n ^ n >>> 13, 1274126177);
|
|
23
|
+
return ((n ^ n >>> 16) >>> 0) / 4294967296;
|
|
24
|
+
}
|
|
25
|
+
function sampleTransition(type, uv, progress, options) {
|
|
26
|
+
const p = clamp01(progress);
|
|
27
|
+
const u = uv[0];
|
|
28
|
+
const v = uv[1];
|
|
29
|
+
switch (type) {
|
|
30
|
+
case "linearWipe": {
|
|
31
|
+
const opts = options || {};
|
|
32
|
+
const deg = opts.angle ?? 0;
|
|
33
|
+
const feather = Math.max(1e-4, opts.feather ?? 0.1);
|
|
34
|
+
const rad = deg * Math.PI / 180;
|
|
35
|
+
const dx = Math.cos(rad);
|
|
36
|
+
const dy = Math.sin(rad);
|
|
37
|
+
const proj = (u - 0.5) * dx + (v - 0.5) * dy;
|
|
38
|
+
const span = Math.abs(dx) + Math.abs(dy);
|
|
39
|
+
const halfSpan = span * 0.5;
|
|
40
|
+
const edge = -halfSpan - feather + p * (span + 2 * feather);
|
|
41
|
+
const weight = 1 - smoothstep(edge - feather * 0.5, edge + feather * 0.5, proj);
|
|
42
|
+
return { weight, uvA: [u, v], uvB: [u, v], additive: [0, 0, 0] };
|
|
43
|
+
}
|
|
44
|
+
case "radialIris": {
|
|
45
|
+
const opts = options || {};
|
|
46
|
+
const center = opts.center ?? [0.5, 0.5];
|
|
47
|
+
const shape = opts.shape ?? "circle";
|
|
48
|
+
const feather = Math.max(1e-4, opts.feather ?? 0.1);
|
|
49
|
+
const du = u - center[0];
|
|
50
|
+
const dv = v - center[1];
|
|
51
|
+
let dist = 0;
|
|
52
|
+
let maxDist = 1;
|
|
53
|
+
if (shape === "circle") {
|
|
54
|
+
dist = Math.sqrt(du * du + dv * dv);
|
|
55
|
+
const cdu = Math.max(center[0], 1 - center[0]);
|
|
56
|
+
const cdv = Math.max(center[1], 1 - center[1]);
|
|
57
|
+
maxDist = Math.sqrt(cdu * cdu + cdv * cdv);
|
|
58
|
+
} else if (shape === "box") {
|
|
59
|
+
dist = Math.max(Math.abs(du), Math.abs(dv));
|
|
60
|
+
maxDist = Math.max(center[0], 1 - center[0], center[1], 1 - center[1]);
|
|
61
|
+
} else {
|
|
62
|
+
dist = Math.abs(du) + Math.abs(dv);
|
|
63
|
+
const cdu = Math.max(center[0], 1 - center[0]);
|
|
64
|
+
const cdv = Math.max(center[1], 1 - center[1]);
|
|
65
|
+
maxDist = cdu + cdv;
|
|
66
|
+
}
|
|
67
|
+
const radius = p * (maxDist + feather);
|
|
68
|
+
const weight = 1 - smoothstep(radius - feather, radius, dist);
|
|
69
|
+
return { weight, uvA: [u, v], uvB: [u, v], additive: [0, 0, 0] };
|
|
70
|
+
}
|
|
71
|
+
case "blockDissolve": {
|
|
72
|
+
const opts = options || {};
|
|
73
|
+
const count = opts.blockCount ?? 32;
|
|
74
|
+
const seed = opts.seed ?? 1337;
|
|
75
|
+
const feather = Math.max(1e-4, opts.feather ?? 0.05);
|
|
76
|
+
const bx = Math.floor(u * count);
|
|
77
|
+
const by = Math.floor(v * count);
|
|
78
|
+
const h = hash2d(bx, by, seed);
|
|
79
|
+
const edge = p * (1 + feather);
|
|
80
|
+
const weight = smoothstep(h - feather, h, edge);
|
|
81
|
+
return { weight, uvA: [u, v], uvB: [u, v], additive: [0, 0, 0] };
|
|
82
|
+
}
|
|
83
|
+
case "gridWipe": {
|
|
84
|
+
const opts = options || {};
|
|
85
|
+
const [cols, rows] = opts.gridSize ?? [16, 10];
|
|
86
|
+
const order = opts.order ?? "diagonal";
|
|
87
|
+
const cx = Math.floor(u * cols);
|
|
88
|
+
const cy = Math.floor(v * rows);
|
|
89
|
+
let cellRank = 0;
|
|
90
|
+
if (order === "ltr") {
|
|
91
|
+
cellRank = (cx + cy * cols) / (cols * rows);
|
|
92
|
+
} else if (order === "diagonal") {
|
|
93
|
+
cellRank = (cx / (cols - 1 || 1) + cy / (rows - 1 || 1)) * 0.5;
|
|
94
|
+
} else if (order === "radial") {
|
|
95
|
+
const nx = (cx + 0.5) / cols - 0.5;
|
|
96
|
+
const ny = (cy + 0.5) / rows - 0.5;
|
|
97
|
+
cellRank = Math.sqrt(nx * nx + ny * ny) * Math.SQRT2;
|
|
98
|
+
} else {
|
|
99
|
+
cellRank = hash2d(cx, cy, 42);
|
|
100
|
+
}
|
|
101
|
+
const width = 0.15;
|
|
102
|
+
const weight = smoothstep(cellRank - width, cellRank + width, p * (1 + 2 * width) - width);
|
|
103
|
+
return { weight, uvA: [u, v], uvB: [u, v], additive: [0, 0, 0] };
|
|
104
|
+
}
|
|
105
|
+
case "glassWipe": {
|
|
106
|
+
const opts = options || {};
|
|
107
|
+
const deg = opts.angle ?? 45;
|
|
108
|
+
const amp = opts.amplitude ?? 0.08;
|
|
109
|
+
const freq = opts.frequency ?? 12;
|
|
110
|
+
const rad = deg * Math.PI / 180;
|
|
111
|
+
const nx = Math.cos(rad);
|
|
112
|
+
const ny = Math.sin(rad);
|
|
113
|
+
const sweep = (u - 0.5) * nx + (v - 0.5) * ny;
|
|
114
|
+
const waveCenter = (p - 0.5) * 1.6;
|
|
115
|
+
const waveDist = sweep - waveCenter;
|
|
116
|
+
const envelope = Math.exp(-waveDist * waveDist * 30);
|
|
117
|
+
const disp = Math.cos(waveDist * freq) * amp * envelope;
|
|
118
|
+
const uvA = [clamp01(u + disp * ny), clamp01(v - disp * nx)];
|
|
119
|
+
const uvB = [clamp01(u - disp * ny), clamp01(v + disp * nx)];
|
|
120
|
+
const weight = smoothstep(-0.1, 0.1, waveDist);
|
|
121
|
+
return { weight, uvA, uvB, additive: [0, 0, 0] };
|
|
122
|
+
}
|
|
123
|
+
case "twister": {
|
|
124
|
+
const opts = options || {};
|
|
125
|
+
const maxTwist = opts.twist ?? Math.PI * 2;
|
|
126
|
+
const center = opts.center ?? [0.5, 0.5];
|
|
127
|
+
const du = u - center[0];
|
|
128
|
+
const dv = v - center[1];
|
|
129
|
+
const dist = Math.sqrt(du * du + dv * dv);
|
|
130
|
+
const angle = (1 - Math.cos(p * Math.PI * 2)) * 0.5 * maxTwist * Math.max(0, 1 - dist);
|
|
131
|
+
const cosA = Math.cos(angle);
|
|
132
|
+
const sinA = Math.sin(angle);
|
|
133
|
+
const ru = du * cosA - dv * sinA + center[0];
|
|
134
|
+
const rv = du * sinA + dv * cosA + center[1];
|
|
135
|
+
const weight = smoothstep(0.4, 0.6, p);
|
|
136
|
+
return {
|
|
137
|
+
weight,
|
|
138
|
+
uvA: [clamp01(ru), clamp01(rv)],
|
|
139
|
+
uvB: [clamp01(ru), clamp01(rv)],
|
|
140
|
+
additive: [0, 0, 0]
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
case "lightLeak": {
|
|
144
|
+
const opts = options || {};
|
|
145
|
+
const color = opts.color ?? [1, 0.85, 0.6];
|
|
146
|
+
const intensity = opts.intensity ?? 1.5;
|
|
147
|
+
const peak = Math.sin(p * Math.PI);
|
|
148
|
+
const leak = Math.pow(peak, 3) * intensity;
|
|
149
|
+
const additive = [
|
|
150
|
+
color[0] * leak,
|
|
151
|
+
color[1] * leak,
|
|
152
|
+
color[2] * leak
|
|
153
|
+
];
|
|
154
|
+
const weight = smoothstep(0.3, 0.7, p);
|
|
155
|
+
return { weight, uvA: [u, v], uvB: [u, v], additive };
|
|
156
|
+
}
|
|
157
|
+
case "crossZoom": {
|
|
158
|
+
const opts = options || {};
|
|
159
|
+
const str = opts.strength ?? 0.3;
|
|
160
|
+
const center = opts.center ?? [0.5, 0.5];
|
|
161
|
+
const du = u - center[0];
|
|
162
|
+
const dv = v - center[1];
|
|
163
|
+
const zoomA = 1 + p * str;
|
|
164
|
+
const zoomB = 1 + (1 - p) * str;
|
|
165
|
+
const uvA = [
|
|
166
|
+
clamp01(center[0] + du / zoomA),
|
|
167
|
+
clamp01(center[1] + dv / zoomA)
|
|
168
|
+
];
|
|
169
|
+
const uvB = [
|
|
170
|
+
clamp01(center[0] + du / zoomB),
|
|
171
|
+
clamp01(center[1] + dv / zoomB)
|
|
172
|
+
];
|
|
173
|
+
const weight = smoothstep(0.4, 0.6, p);
|
|
174
|
+
return { weight, uvA, uvB, additive: [0, 0, 0] };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function blendTransitionPixel(colA, colB, sample) {
|
|
179
|
+
const w = sample.weight;
|
|
180
|
+
const invW = 1 - w;
|
|
181
|
+
const r = clamp01(colA[0] * invW + colB[0] * w + sample.additive[0]);
|
|
182
|
+
const g = clamp01(colA[1] * invW + colB[1] * w + sample.additive[1]);
|
|
183
|
+
const b = clamp01(colA[2] * invW + colB[2] * w + sample.additive[2]);
|
|
184
|
+
const a = clamp01(colA[3] * invW + colB[3] * w);
|
|
185
|
+
return [r, g, b, a];
|
|
186
|
+
}
|
|
187
|
+
function getTransitionGLSL(type) {
|
|
188
|
+
switch (type) {
|
|
189
|
+
case "linearWipe":
|
|
190
|
+
return `
|
|
191
|
+
// Flair Transition: Linear Wipe
|
|
192
|
+
vec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {
|
|
193
|
+
float p = clamp(progress, 0.0, 1.0);
|
|
194
|
+
float feather = 0.1;
|
|
195
|
+
float span = 1.0;
|
|
196
|
+
float edge = -0.5 - feather + p * (span + 2.0 * feather);
|
|
197
|
+
float proj = uv.x - 0.5;
|
|
198
|
+
float w = 1.0 - smoothstep(edge - feather * 0.5, edge + feather * 0.5, proj);
|
|
199
|
+
vec4 a = texture(texA, uv);
|
|
200
|
+
vec4 b = texture(texB, uv);
|
|
201
|
+
return mix(a, b, w);
|
|
202
|
+
}
|
|
203
|
+
`.trim();
|
|
204
|
+
case "radialIris":
|
|
205
|
+
return `
|
|
206
|
+
// Flair Transition: Radial Iris
|
|
207
|
+
vec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {
|
|
208
|
+
float p = clamp(progress, 0.0, 1.0);
|
|
209
|
+
float dist = distance(uv, vec2(0.5));
|
|
210
|
+
float maxDist = 0.70710678;
|
|
211
|
+
float radius = p * (maxDist + 0.1);
|
|
212
|
+
float w = 1.0 - smoothstep(radius - 0.1, radius, dist);
|
|
213
|
+
vec4 a = texture(texA, uv);
|
|
214
|
+
vec4 b = texture(texB, uv);
|
|
215
|
+
return mix(a, b, w);
|
|
216
|
+
}
|
|
217
|
+
`.trim();
|
|
218
|
+
case "blockDissolve":
|
|
219
|
+
return `
|
|
220
|
+
// Flair Transition: Block Dissolve
|
|
221
|
+
float flair_hash(vec2 p) {
|
|
222
|
+
vec2 k = vec2(0.3183099, 0.3678794);
|
|
223
|
+
p = p * k + vec2(k.y, k.x);
|
|
224
|
+
return fract(16.0 * k.x * fract(p.x * p.y * (p.x + p.y)));
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
vec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {
|
|
228
|
+
float p = clamp(progress, 0.0, 1.0);
|
|
229
|
+
float blocks = 32.0;
|
|
230
|
+
vec2 cell = floor(uv * blocks);
|
|
231
|
+
float h = flair_hash(cell);
|
|
232
|
+
float w = smoothstep(h - 0.05, h, p * 1.05);
|
|
233
|
+
vec4 a = texture(texA, uv);
|
|
234
|
+
vec4 b = texture(texB, uv);
|
|
235
|
+
return mix(a, b, w);
|
|
236
|
+
}
|
|
237
|
+
`.trim();
|
|
238
|
+
case "gridWipe":
|
|
239
|
+
return `
|
|
240
|
+
// Flair Transition: Grid Wipe
|
|
241
|
+
vec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {
|
|
242
|
+
float p = clamp(progress, 0.0, 1.0);
|
|
243
|
+
vec2 grid = vec2(16.0, 10.0);
|
|
244
|
+
vec2 cell = floor(uv * grid) / grid;
|
|
245
|
+
float rank = (cell.x + cell.y) * 0.5;
|
|
246
|
+
float w = smoothstep(rank - 0.15, rank + 0.15, p * 1.3 - 0.15);
|
|
247
|
+
vec4 a = texture(texA, uv);
|
|
248
|
+
vec4 b = texture(texB, uv);
|
|
249
|
+
return mix(a, b, w);
|
|
250
|
+
}
|
|
251
|
+
`.trim();
|
|
252
|
+
case "glassWipe":
|
|
253
|
+
return `
|
|
254
|
+
// Flair Transition: Glass Wipe
|
|
255
|
+
vec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {
|
|
256
|
+
float p = clamp(progress, 0.0, 1.0);
|
|
257
|
+
float sweep = (uv.x - 0.5) * 0.7071 + (uv.y - 0.5) * 0.7071;
|
|
258
|
+
float waveCenter = (p - 0.5) * 1.6;
|
|
259
|
+
float waveDist = sweep - waveCenter;
|
|
260
|
+
float envelope = exp(-waveDist * waveDist * 30.0);
|
|
261
|
+
float disp = sin(waveDist * 12.0) * 0.08 * envelope;
|
|
262
|
+
vec2 uvA = clamp(uv + vec2(disp * 0.7071, -disp * 0.7071), 0.0, 1.0);
|
|
263
|
+
vec2 uvB = clamp(uv - vec2(disp * 0.7071, -disp * 0.7071), 0.0, 1.0);
|
|
264
|
+
float w = smoothstep(-0.1, 0.1, waveDist);
|
|
265
|
+
vec4 a = texture(texA, uvA);
|
|
266
|
+
vec4 b = texture(texB, uvB);
|
|
267
|
+
return mix(a, b, w);
|
|
268
|
+
}
|
|
269
|
+
`.trim();
|
|
270
|
+
case "twister":
|
|
271
|
+
return `
|
|
272
|
+
// Flair Transition: Twister
|
|
273
|
+
vec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {
|
|
274
|
+
float p = clamp(progress, 0.0, 1.0);
|
|
275
|
+
vec2 d = uv - vec2(0.5);
|
|
276
|
+
float dist = length(d);
|
|
277
|
+
float angle = (1.0 - cos(p * 6.2831853)) * 0.5 * 6.2831853 * max(0.0, 1.0 - dist);
|
|
278
|
+
float c = cos(angle);
|
|
279
|
+
float s = sin(angle);
|
|
280
|
+
vec2 ruv = clamp(vec2(d.x * c - d.y * s, d.x * s + d.y * c) + vec2(0.5), 0.0, 1.0);
|
|
281
|
+
float w = smoothstep(0.4, 0.6, p);
|
|
282
|
+
vec4 a = texture(texA, ruv);
|
|
283
|
+
vec4 b = texture(texB, ruv);
|
|
284
|
+
return mix(a, b, w);
|
|
285
|
+
}
|
|
286
|
+
`.trim();
|
|
287
|
+
case "lightLeak":
|
|
288
|
+
return `
|
|
289
|
+
// Flair Transition: Light Leak
|
|
290
|
+
vec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {
|
|
291
|
+
float p = clamp(progress, 0.0, 1.0);
|
|
292
|
+
float peak = sin(p * 3.14159265);
|
|
293
|
+
float leak = pow(peak, 3.0) * 1.5;
|
|
294
|
+
vec3 tint = vec3(1.0, 0.85, 0.6) * leak;
|
|
295
|
+
float w = smoothstep(0.3, 0.7, p);
|
|
296
|
+
vec4 a = texture(texA, uv);
|
|
297
|
+
vec4 b = texture(texB, uv);
|
|
298
|
+
vec4 res = mix(a, b, w);
|
|
299
|
+
return vec4(clamp(res.rgb + tint, 0.0, 1.0), res.a);
|
|
300
|
+
}
|
|
301
|
+
`.trim();
|
|
302
|
+
case "crossZoom":
|
|
303
|
+
return `
|
|
304
|
+
// Flair Transition: Cross Zoom
|
|
305
|
+
vec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {
|
|
306
|
+
float p = clamp(progress, 0.0, 1.0);
|
|
307
|
+
vec2 d = uv - vec2(0.5);
|
|
308
|
+
float zA = 1.0 + p * 0.3;
|
|
309
|
+
float zB = 1.0 + (1.0 - p) * 0.3;
|
|
310
|
+
vec2 uvA = clamp(vec2(0.5) + d / zA, 0.0, 1.0);
|
|
311
|
+
vec2 uvB = clamp(vec2(0.5) + d / zB, 0.0, 1.0);
|
|
312
|
+
float w = smoothstep(0.4, 0.6, p);
|
|
313
|
+
vec4 a = texture(texA, uvA);
|
|
314
|
+
vec4 b = texture(texB, uvB);
|
|
315
|
+
return mix(a, b, w);
|
|
316
|
+
}
|
|
317
|
+
`.trim();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export {
|
|
322
|
+
ALL_TRANSITION_TYPES,
|
|
323
|
+
sampleTransition,
|
|
324
|
+
blendTransitionPixel,
|
|
325
|
+
getTransitionGLSL
|
|
326
|
+
};
|
|
327
|
+
//# sourceMappingURL=chunk-EHDJ3CPJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shader/transition.ts"],"sourcesContent":["/**\n * Procedural WebGL Fragment Shader Transitions & CPU Compositing.\n * Inspired by professional NLE/After Effects/EffectCraft transitions:\n * Linear Wipe, Radial Iris, Block Dissolve, Grid Wipe, Glass Wipe,\n * Twister, Light Leak, and Cross Zoom.\n */\n\nexport type TransitionType =\n | 'linearWipe'\n | 'radialIris'\n | 'blockDissolve'\n | 'gridWipe'\n | 'glassWipe'\n | 'twister'\n | 'lightLeak'\n | 'crossZoom';\n\nexport const ALL_TRANSITION_TYPES: readonly TransitionType[] = [\n 'linearWipe',\n 'radialIris',\n 'blockDissolve',\n 'gridWipe',\n 'glassWipe',\n 'twister',\n 'lightLeak',\n 'crossZoom',\n];\n\nexport interface LinearWipeOptions {\n /** Angle in degrees clockwise from right (0 = left-to-right, 90 = top-to-bottom). Default: 0 */\n angle?: number;\n /** Feather softness width [0..1]. Default: 0.1 */\n feather?: number;\n}\n\nexport interface RadialIrisOptions {\n /** Center point in normalized UV coordinates [0..1]. Default: [0.5, 0.5] */\n center?: [number, number];\n /** Geometric iris shape. Default: 'circle' */\n shape?: 'circle' | 'box' | 'diamond';\n /** Feather softness [0..1]. Default: 0.1 */\n feather?: number;\n}\n\nexport interface BlockDissolveOptions {\n /** Block cell count along width. Default: 32 */\n blockCount?: number;\n /** Pseudo-random seed integer. Default: 1337 */\n seed?: number;\n /** Softness of dissolve per block. Default: 0.05 */\n feather?: number;\n}\n\nexport interface GridWipeOptions {\n /** Number of grid cells [x, y]. Default: [16, 10] */\n gridSize?: [number, number];\n /** Order in which cells wipe: 'ltr' | 'diagonal' | 'radial' | 'random'. Default: 'diagonal' */\n order?: 'ltr' | 'diagonal' | 'radial' | 'random';\n}\n\nexport interface GlassWipeOptions {\n /** Angle in degrees. Default: 45 */\n angle?: number;\n /** Wave displacement amplitude. Default: 0.08 */\n amplitude?: number;\n /** Wave frequency. Default: 12.0 */\n frequency?: number;\n}\n\nexport interface TwisterOptions {\n /** Maximum twist angle in radians. Default: Math.PI * 2 */\n twist?: number;\n /** Center of swirl. Default: [0.5, 0.5] */\n center?: [number, number];\n}\n\nexport interface LightLeakOptions {\n /** Leak tint RGB [0..1]. Default: [1.0, 0.85, 0.6] (warm golden light) */\n color?: [number, number, number];\n /** Peak intensity of light bloom at progress 0.5. Default: 1.5 */\n intensity?: number;\n}\n\nexport interface CrossZoomOptions {\n /** Zoom strength. Default: 0.3 */\n strength?: number;\n /** Center of zoom. Default: [0.5, 0.5] */\n center?: [number, number];\n}\n\nexport type TransitionOptions =\n | LinearWipeOptions\n | RadialIrisOptions\n | BlockDissolveOptions\n | GridWipeOptions\n | GlassWipeOptions\n | TwisterOptions\n | LightLeakOptions\n | CrossZoomOptions;\n\nexport interface TransitionSample {\n /** Weight of scene B in [0..1] (0 = fully A, 1 = fully B). */\n weight: number;\n /** Sample coordinate for scene A [u, v]. */\n uvA: [number, number];\n /** Sample coordinate for scene B [u, v]. */\n uvB: [number, number];\n /** Additive color light bloom [r, g, b]. */\n additive: [number, number, number];\n}\n\nfunction clamp01(v: number): number {\n return Math.max(0, Math.min(1, v));\n}\n\nfunction smoothstep(edge0: number, edge1: number, x: number): number {\n if (Math.abs(edge1 - edge0) < 1e-7) return x < edge0 ? 0 : 1;\n const t = clamp01((x - edge0) / (edge1 - edge0));\n return t * t * (3 - 2 * t);\n}\n\n/** 2D integer spatial hash for block dissolve and random grid wipes */\nfunction hash2d(x: number, y: number, seed: number): number {\n let n = (x * 374761393 + y * 668265263 + seed * 362827313) | 0;\n n = Math.imul(n ^ (n >>> 13), 1274126177);\n return ((n ^ (n >>> 16)) >>> 0) / 4294967296;\n}\n\n/**\n * Evaluates the transition at a given UV coordinate and progress [0..1].\n * Returns displaced UVs, B weight, and any additive optical bloom.\n */\nexport function sampleTransition(\n type: TransitionType,\n uv: [number, number],\n progress: number,\n options?: TransitionOptions\n): TransitionSample {\n const p = clamp01(progress);\n const u = uv[0];\n const v = uv[1];\n\n switch (type) {\n case 'linearWipe': {\n const opts = (options as LinearWipeOptions) || {};\n const deg = opts.angle ?? 0;\n const feather = Math.max(1e-4, opts.feather ?? 0.1);\n const rad = (deg * Math.PI) / 180;\n const dx = Math.cos(rad);\n const dy = Math.sin(rad);\n\n // Project UV onto normal vector centered at 0.5\n // Max projection span along unit square is sqrt(2) * 0.5\n const proj = (u - 0.5) * dx + (v - 0.5) * dy;\n // Map progress [0, 1] across projected range [-0.707, 0.707]\n const span = Math.abs(dx) + Math.abs(dy); // exact bounding box projection span\n const halfSpan = span * 0.5;\n const edge = -halfSpan - feather + p * (span + 2 * feather);\n const weight = 1 - smoothstep(edge - feather * 0.5, edge + feather * 0.5, proj);\n\n return { weight, uvA: [u, v], uvB: [u, v], additive: [0, 0, 0] };\n }\n\n case 'radialIris': {\n const opts = (options as RadialIrisOptions) || {};\n const center = opts.center ?? [0.5, 0.5];\n const shape = opts.shape ?? 'circle';\n const feather = Math.max(1e-4, opts.feather ?? 0.1);\n\n const du = u - center[0];\n const dv = v - center[1];\n let dist = 0;\n let maxDist = 1;\n\n if (shape === 'circle') {\n dist = Math.sqrt(du * du + dv * dv);\n // Corner distance from center\n const cdu = Math.max(center[0], 1 - center[0]);\n const cdv = Math.max(center[1], 1 - center[1]);\n maxDist = Math.sqrt(cdu * cdu + cdv * cdv);\n } else if (shape === 'box') {\n dist = Math.max(Math.abs(du), Math.abs(dv));\n maxDist = Math.max(center[0], 1 - center[0], center[1], 1 - center[1]);\n } else {\n // diamond\n dist = Math.abs(du) + Math.abs(dv);\n const cdu = Math.max(center[0], 1 - center[0]);\n const cdv = Math.max(center[1], 1 - center[1]);\n maxDist = cdu + cdv;\n }\n\n const radius = p * (maxDist + feather);\n const weight = 1 - smoothstep(radius - feather, radius, dist);\n\n return { weight, uvA: [u, v], uvB: [u, v], additive: [0, 0, 0] };\n }\n\n case 'blockDissolve': {\n const opts = (options as BlockDissolveOptions) || {};\n const count = opts.blockCount ?? 32;\n const seed = opts.seed ?? 1337;\n const feather = Math.max(1e-4, opts.feather ?? 0.05);\n\n const bx = Math.floor(u * count);\n const by = Math.floor(v * count);\n const h = hash2d(bx, by, seed);\n\n // Transition occurs as p increases past h\n const edge = p * (1 + feather);\n const weight = smoothstep(h - feather, h, edge);\n\n return { weight, uvA: [u, v], uvB: [u, v], additive: [0, 0, 0] };\n }\n\n case 'gridWipe': {\n const opts = (options as GridWipeOptions) || {};\n const [cols, rows] = opts.gridSize ?? [16, 10];\n const order = opts.order ?? 'diagonal';\n\n const cx = Math.floor(u * cols);\n const cy = Math.floor(v * rows);\n\n let cellRank = 0;\n if (order === 'ltr') {\n cellRank = (cx + cy * cols) / (cols * rows);\n } else if (order === 'diagonal') {\n cellRank = (cx / (cols - 1 || 1) + cy / (rows - 1 || 1)) * 0.5;\n } else if (order === 'radial') {\n const nx = (cx + 0.5) / cols - 0.5;\n const ny = (cy + 0.5) / rows - 0.5;\n cellRank = Math.sqrt(nx * nx + ny * ny) * Math.SQRT2;\n } else {\n cellRank = hash2d(cx, cy, 42);\n }\n\n const width = 0.15;\n const weight = smoothstep(cellRank - width, cellRank + width, p * (1 + 2 * width) - width);\n\n return { weight, uvA: [u, v], uvB: [u, v], additive: [0, 0, 0] };\n }\n\n case 'glassWipe': {\n const opts = (options as GlassWipeOptions) || {};\n const deg = opts.angle ?? 45;\n const amp = opts.amplitude ?? 0.08;\n const freq = opts.frequency ?? 12.0;\n\n const rad = (deg * Math.PI) / 180;\n const nx = Math.cos(rad);\n const ny = Math.sin(rad);\n\n // Distance along sweep line\n const sweep = (u - 0.5) * nx + (v - 0.5) * ny;\n const waveCenter = (p - 0.5) * 1.6;\n const waveDist = sweep - waveCenter;\n\n // Bell curve packet around the wavefront with non-zero peak at the wavefront\n const envelope = Math.exp(-waveDist * waveDist * 30);\n const disp = Math.cos(waveDist * freq) * amp * envelope;\n\n const uvA: [number, number] = [clamp01(u + disp * ny), clamp01(v - disp * nx)];\n const uvB: [number, number] = [clamp01(u - disp * ny), clamp01(v + disp * nx)];\n const weight = smoothstep(-0.1, 0.1, waveDist);\n\n return { weight, uvA, uvB, additive: [0, 0, 0] };\n }\n\n case 'twister': {\n const opts = (options as TwisterOptions) || {};\n const maxTwist = opts.twist ?? Math.PI * 2;\n const center = opts.center ?? [0.5, 0.5];\n\n const du = u - center[0];\n const dv = v - center[1];\n const dist = Math.sqrt(du * du + dv * dv);\n\n // Twist angle peaks at progress 0.5\n const angle = (1 - Math.cos(p * Math.PI * 2)) * 0.5 * maxTwist * Math.max(0, 1 - dist);\n\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n const ru = du * cosA - dv * sinA + center[0];\n const rv = du * sinA + dv * cosA + center[1];\n\n const weight = smoothstep(0.4, 0.6, p);\n return {\n weight,\n uvA: [clamp01(ru), clamp01(rv)],\n uvB: [clamp01(ru), clamp01(rv)],\n additive: [0, 0, 0],\n };\n }\n\n case 'lightLeak': {\n const opts = (options as LightLeakOptions) || {};\n const color = opts.color ?? [1.0, 0.85, 0.6];\n const intensity = opts.intensity ?? 1.5;\n\n // Light flash peaks symmetrically at progress 0.5\n const peak = Math.sin(p * Math.PI);\n const leak = Math.pow(peak, 3) * intensity;\n const additive: [number, number, number] = [\n color[0] * leak,\n color[1] * leak,\n color[2] * leak,\n ];\n\n const weight = smoothstep(0.3, 0.7, p);\n return { weight, uvA: [u, v], uvB: [u, v], additive };\n }\n\n case 'crossZoom': {\n const opts = (options as CrossZoomOptions) || {};\n const str = opts.strength ?? 0.3;\n const center = opts.center ?? [0.5, 0.5];\n\n const du = u - center[0];\n const dv = v - center[1];\n\n // Zoom in on A up to 0.5, zoom out on B from 0.5 to 1.0\n const zoomA = 1 + p * str;\n const zoomB = 1 + (1 - p) * str;\n\n const uvA: [number, number] = [\n clamp01(center[0] + du / zoomA),\n clamp01(center[1] + dv / zoomA),\n ];\n const uvB: [number, number] = [\n clamp01(center[0] + du / zoomB),\n clamp01(center[1] + dv / zoomB),\n ];\n\n const weight = smoothstep(0.4, 0.6, p);\n return { weight, uvA, uvB, additive: [0, 0, 0] };\n }\n }\n}\n\n/**\n * CPU Compositing: blends two RGBA pixels across a transition.\n */\nexport function blendTransitionPixel(\n colA: [number, number, number, number],\n colB: [number, number, number, number],\n sample: TransitionSample\n): [number, number, number, number] {\n const w = sample.weight;\n const invW = 1 - w;\n\n const r = clamp01(colA[0] * invW + colB[0] * w + sample.additive[0]);\n const g = clamp01(colA[1] * invW + colB[1] * w + sample.additive[1]);\n const b = clamp01(colA[2] * invW + colB[2] * w + sample.additive[2]);\n const a = clamp01(colA[3] * invW + colB[3] * w);\n\n return [r, g, b, a];\n}\n\n/**\n * Returns self-contained WebGL GLSL fragment shader code implementing\n * the selected transition function.\n * Signature: `vec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress)`\n */\nexport function getTransitionGLSL(type: TransitionType): string {\n switch (type) {\n case 'linearWipe':\n return `\n// Flair Transition: Linear Wipe\nvec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {\n float p = clamp(progress, 0.0, 1.0);\n float feather = 0.1;\n float span = 1.0;\n float edge = -0.5 - feather + p * (span + 2.0 * feather);\n float proj = uv.x - 0.5;\n float w = 1.0 - smoothstep(edge - feather * 0.5, edge + feather * 0.5, proj);\n vec4 a = texture(texA, uv);\n vec4 b = texture(texB, uv);\n return mix(a, b, w);\n}\n`.trim();\n\n case 'radialIris':\n return `\n// Flair Transition: Radial Iris\nvec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {\n float p = clamp(progress, 0.0, 1.0);\n float dist = distance(uv, vec2(0.5));\n float maxDist = 0.70710678;\n float radius = p * (maxDist + 0.1);\n float w = 1.0 - smoothstep(radius - 0.1, radius, dist);\n vec4 a = texture(texA, uv);\n vec4 b = texture(texB, uv);\n return mix(a, b, w);\n}\n`.trim();\n\n case 'blockDissolve':\n return `\n// Flair Transition: Block Dissolve\nfloat flair_hash(vec2 p) {\n vec2 k = vec2(0.3183099, 0.3678794);\n p = p * k + vec2(k.y, k.x);\n return fract(16.0 * k.x * fract(p.x * p.y * (p.x + p.y)));\n}\n\nvec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {\n float p = clamp(progress, 0.0, 1.0);\n float blocks = 32.0;\n vec2 cell = floor(uv * blocks);\n float h = flair_hash(cell);\n float w = smoothstep(h - 0.05, h, p * 1.05);\n vec4 a = texture(texA, uv);\n vec4 b = texture(texB, uv);\n return mix(a, b, w);\n}\n`.trim();\n\n case 'gridWipe':\n return `\n// Flair Transition: Grid Wipe\nvec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {\n float p = clamp(progress, 0.0, 1.0);\n vec2 grid = vec2(16.0, 10.0);\n vec2 cell = floor(uv * grid) / grid;\n float rank = (cell.x + cell.y) * 0.5;\n float w = smoothstep(rank - 0.15, rank + 0.15, p * 1.3 - 0.15);\n vec4 a = texture(texA, uv);\n vec4 b = texture(texB, uv);\n return mix(a, b, w);\n}\n`.trim();\n\n case 'glassWipe':\n return `\n// Flair Transition: Glass Wipe\nvec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {\n float p = clamp(progress, 0.0, 1.0);\n float sweep = (uv.x - 0.5) * 0.7071 + (uv.y - 0.5) * 0.7071;\n float waveCenter = (p - 0.5) * 1.6;\n float waveDist = sweep - waveCenter;\n float envelope = exp(-waveDist * waveDist * 30.0);\n float disp = sin(waveDist * 12.0) * 0.08 * envelope;\n vec2 uvA = clamp(uv + vec2(disp * 0.7071, -disp * 0.7071), 0.0, 1.0);\n vec2 uvB = clamp(uv - vec2(disp * 0.7071, -disp * 0.7071), 0.0, 1.0);\n float w = smoothstep(-0.1, 0.1, waveDist);\n vec4 a = texture(texA, uvA);\n vec4 b = texture(texB, uvB);\n return mix(a, b, w);\n}\n`.trim();\n\n case 'twister':\n return `\n// Flair Transition: Twister\nvec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {\n float p = clamp(progress, 0.0, 1.0);\n vec2 d = uv - vec2(0.5);\n float dist = length(d);\n float angle = (1.0 - cos(p * 6.2831853)) * 0.5 * 6.2831853 * max(0.0, 1.0 - dist);\n float c = cos(angle);\n float s = sin(angle);\n vec2 ruv = clamp(vec2(d.x * c - d.y * s, d.x * s + d.y * c) + vec2(0.5), 0.0, 1.0);\n float w = smoothstep(0.4, 0.6, p);\n vec4 a = texture(texA, ruv);\n vec4 b = texture(texB, ruv);\n return mix(a, b, w);\n}\n`.trim();\n\n case 'lightLeak':\n return `\n// Flair Transition: Light Leak\nvec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {\n float p = clamp(progress, 0.0, 1.0);\n float peak = sin(p * 3.14159265);\n float leak = pow(peak, 3.0) * 1.5;\n vec3 tint = vec3(1.0, 0.85, 0.6) * leak;\n float w = smoothstep(0.3, 0.7, p);\n vec4 a = texture(texA, uv);\n vec4 b = texture(texB, uv);\n vec4 res = mix(a, b, w);\n return vec4(clamp(res.rgb + tint, 0.0, 1.0), res.a);\n}\n`.trim();\n\n case 'crossZoom':\n return `\n// Flair Transition: Cross Zoom\nvec4 flair_transition(sampler2D texA, sampler2D texB, vec2 uv, float progress) {\n float p = clamp(progress, 0.0, 1.0);\n vec2 d = uv - vec2(0.5);\n float zA = 1.0 + p * 0.3;\n float zB = 1.0 + (1.0 - p) * 0.3;\n vec2 uvA = clamp(vec2(0.5) + d / zA, 0.0, 1.0);\n vec2 uvB = clamp(vec2(0.5) + d / zB, 0.0, 1.0);\n float w = smoothstep(0.4, 0.6, p);\n vec4 a = texture(texA, uvA);\n vec4 b = texture(texB, uvB);\n return mix(a, b, w);\n}\n`.trim();\n }\n}\n"],"mappings":"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","names":[]}
|