@remotion/transitions 4.0.465 → 4.0.467

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 (42) hide show
  1. package/book-flip.js +2 -0
  2. package/cross-zoom.js +2 -0
  3. package/crosswarp.js +2 -0
  4. package/dist/TransitionSeries.js +16 -6
  5. package/dist/esm/book-flip.mjs +434 -0
  6. package/dist/esm/cross-zoom.mjs +377 -0
  7. package/dist/esm/crosswarp.mjs +331 -0
  8. package/dist/esm/dissolve.mjs +4 -3
  9. package/dist/esm/dreamy-zoom.mjs +348 -0
  10. package/dist/esm/film-burn.mjs +443 -0
  11. package/dist/esm/index.mjs +1020 -209
  12. package/dist/esm/linear-blur.mjs +343 -0
  13. package/dist/esm/ripple.mjs +342 -0
  14. package/dist/esm/swap.mjs +394 -0
  15. package/dist/esm/zoom-blur.mjs +4 -3
  16. package/dist/esm/zoom-in-out.mjs +4 -3
  17. package/dist/html-in-canvas-presentation.js +4 -5
  18. package/dist/index.d.ts +13 -3
  19. package/dist/index.js +9 -1
  20. package/dist/presentations/book-flip.d.ts +14 -0
  21. package/dist/presentations/book-flip.js +255 -0
  22. package/dist/presentations/cross-zoom.d.ts +13 -0
  23. package/dist/presentations/cross-zoom.js +199 -0
  24. package/dist/presentations/crosswarp.d.ts +11 -0
  25. package/dist/presentations/crosswarp.js +154 -0
  26. package/dist/presentations/dreamy-zoom.d.ts +14 -0
  27. package/dist/presentations/dreamy-zoom.js +169 -0
  28. package/dist/presentations/film-burn.d.ts +13 -0
  29. package/dist/presentations/film-burn.js +265 -0
  30. package/dist/presentations/linear-blur.d.ts +13 -0
  31. package/dist/presentations/linear-blur.js +164 -0
  32. package/dist/presentations/ripple.d.ts +14 -0
  33. package/dist/presentations/ripple.js +164 -0
  34. package/dist/presentations/swap.d.ts +15 -0
  35. package/dist/presentations/swap.js +212 -0
  36. package/dist/types.d.ts +1 -1
  37. package/dreamy-zoom.js +2 -0
  38. package/film-burn.js +2 -0
  39. package/linear-blur.js +2 -0
  40. package/package.json +80 -8
  41. package/ripple.js +2 -0
  42. package/swap.js +2 -0
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dreamyZoom = exports.dreamyZoomShader = void 0;
4
+ const html_in_canvas_presentation_1 = require("../html-in-canvas-presentation");
5
+ const DEFAULT_ROTATION = 6;
6
+ const DEFAULT_SCALE = 1.2;
7
+ const VERTEX_SHADER = `#version 300 es
8
+ in vec2 a_pos;
9
+ out vec2 v_uv;
10
+ void main() {
11
+ v_uv = vec2(a_pos.x * 0.5 + 0.5, 0.5 - a_pos.y * 0.5);
12
+ gl_Position = vec4(a_pos, 0.0, 1.0);
13
+ }`;
14
+ // Adapted from https://gl-transitions.com/editor/DreamyZoom
15
+ // Author: Zeh Fernando · License: MIT
16
+ const FRAGMENT_SHADER = `#version 300 es
17
+ precision highp float;
18
+
19
+ uniform sampler2D u_prev;
20
+ uniform sampler2D u_next;
21
+ uniform float u_time;
22
+ uniform float u_rotation;
23
+ uniform float u_scale;
24
+ uniform float u_ratio;
25
+
26
+ in vec2 v_uv;
27
+ out vec4 outColor;
28
+
29
+ const float DEG2RAD = 0.03926990816987241548078304229099;
30
+
31
+ vec4 transition(vec2 uv, float progress) {
32
+ float phase = progress < 0.5 ? progress * 2.0 : (progress - 0.5) * 2.0;
33
+ float angleOffset = progress < 0.5 ? mix(0.0, u_rotation * DEG2RAD, phase) : mix(-u_rotation * DEG2RAD, 0.0, phase);
34
+ float newScale = progress < 0.5 ? mix(1.0, u_scale, phase) : mix(u_scale, 1.0, phase);
35
+
36
+ vec2 center = vec2(0.0, 0.0);
37
+ vec2 p = (uv.xy - vec2(0.5, 0.5)) / newScale * vec2(u_ratio, 1.0);
38
+ float angle = atan(p.y, p.x) + angleOffset;
39
+ float dist = distance(center, p);
40
+
41
+ p.x = cos(angle) * dist / u_ratio + 0.5;
42
+ p.y = sin(angle) * dist + 0.5;
43
+
44
+ vec4 c = progress < 0.5 ? texture(u_prev, p) : texture(u_next, p);
45
+ return c + (progress < 0.5 ? mix(0.0, 1.0, phase) : mix(1.0, 0.0, phase));
46
+ }
47
+
48
+ void main() {
49
+ float progress = 1.0 - u_time;
50
+ outColor = transition(v_uv, progress);
51
+ }`;
52
+ const compileShader = (gl, source, type) => {
53
+ const shader = gl.createShader(type);
54
+ if (!shader) {
55
+ throw new Error('Failed to create shader');
56
+ }
57
+ gl.shaderSource(shader, source);
58
+ gl.compileShader(shader);
59
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
60
+ const log = gl.getShaderInfoLog(shader);
61
+ gl.deleteShader(shader);
62
+ throw new Error(`Failed to compile shader: ${log}`);
63
+ }
64
+ return shader;
65
+ };
66
+ const createProgram = (gl) => {
67
+ const program = gl.createProgram();
68
+ if (!program) {
69
+ throw new Error('Failed to create WebGL program');
70
+ }
71
+ const vs = compileShader(gl, VERTEX_SHADER, gl.VERTEX_SHADER);
72
+ const fs = compileShader(gl, FRAGMENT_SHADER, gl.FRAGMENT_SHADER);
73
+ gl.attachShader(program, vs);
74
+ gl.attachShader(program, fs);
75
+ gl.linkProgram(program);
76
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
77
+ const log = gl.getProgramInfoLog(program);
78
+ gl.deleteProgram(program);
79
+ throw new Error(`Failed to link program: ${log}`);
80
+ }
81
+ return program;
82
+ };
83
+ const createTexture = (gl) => {
84
+ const tex = gl.createTexture();
85
+ if (!tex) {
86
+ throw new Error('Failed to create texture');
87
+ }
88
+ gl.bindTexture(gl.TEXTURE_2D, tex);
89
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
90
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
91
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
92
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
93
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));
94
+ return tex;
95
+ };
96
+ const dreamyZoomShader = (canvas) => {
97
+ const gl = canvas.getContext('webgl2', { premultipliedAlpha: true });
98
+ if (!gl) {
99
+ throw new Error('Failed to create WebGL2 context');
100
+ }
101
+ const program = createProgram(gl);
102
+ const prevTex = createTexture(gl);
103
+ const nextTex = createTexture(gl);
104
+ const vao = gl.createVertexArray();
105
+ gl.bindVertexArray(vao);
106
+ const buffer = gl.createBuffer();
107
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
108
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);
109
+ const aPos = gl.getAttribLocation(program, 'a_pos');
110
+ gl.enableVertexAttribArray(aPos);
111
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);
112
+ const uTime = gl.getUniformLocation(program, 'u_time');
113
+ const uPrev = gl.getUniformLocation(program, 'u_prev');
114
+ const uNext = gl.getUniformLocation(program, 'u_next');
115
+ const uRotation = gl.getUniformLocation(program, 'u_rotation');
116
+ const uScale = gl.getUniformLocation(program, 'u_scale');
117
+ const uRatio = gl.getUniformLocation(program, 'u_ratio');
118
+ const cleanup = () => {
119
+ gl.deleteProgram(program);
120
+ gl.deleteTexture(prevTex);
121
+ gl.deleteTexture(nextTex);
122
+ };
123
+ const clear = () => {
124
+ gl.clearColor(0, 0, 0, 0);
125
+ gl.clear(gl.COLOR_BUFFER_BIT);
126
+ };
127
+ const draw = ({ prevImage, nextImage, width, height, time, passedProps, }) => {
128
+ const { rotation = DEFAULT_ROTATION, scale = DEFAULT_SCALE } = passedProps;
129
+ if (!prevImage && !nextImage) {
130
+ return;
131
+ }
132
+ if (prevImage && (prevImage.width === 0 || prevImage.height === 0)) {
133
+ return;
134
+ }
135
+ if (nextImage && (nextImage.width === 0 || nextImage.height === 0)) {
136
+ return;
137
+ }
138
+ // At time=0 the shader outputs nextImage. At time=1 the shader outputs prevImage.
139
+ const effectiveTime = !prevImage ? 0 : !nextImage ? 1 : time;
140
+ gl.viewport(0, 0, width, height);
141
+ gl.clearColor(0, 0, 0, 0);
142
+ gl.clear(gl.COLOR_BUFFER_BIT);
143
+ gl.useProgram(program);
144
+ gl.activeTexture(gl.TEXTURE0);
145
+ gl.bindTexture(gl.TEXTURE_2D, prevTex);
146
+ if (prevImage) {
147
+ gl.texElementImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, prevImage);
148
+ }
149
+ gl.uniform1i(uPrev, 0);
150
+ gl.activeTexture(gl.TEXTURE1);
151
+ gl.bindTexture(gl.TEXTURE_2D, nextTex);
152
+ if (nextImage) {
153
+ gl.texElementImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, nextImage);
154
+ }
155
+ gl.uniform1i(uNext, 1);
156
+ gl.uniform1f(uTime, effectiveTime);
157
+ gl.uniform1f(uRotation, rotation);
158
+ gl.uniform1f(uScale, scale);
159
+ gl.uniform1f(uRatio, width / height);
160
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
161
+ };
162
+ return {
163
+ clear,
164
+ cleanup,
165
+ draw,
166
+ };
167
+ };
168
+ exports.dreamyZoomShader = dreamyZoomShader;
169
+ exports.dreamyZoom = (0, html_in_canvas_presentation_1.makeHtmlInCanvasPresentation)(exports.dreamyZoomShader);
@@ -0,0 +1,13 @@
1
+ export type FilmBurnProps = {
2
+ seed?: number;
3
+ };
4
+ export declare const filmBurnShader: (canvas: OffscreenCanvas) => {
5
+ clear: () => void;
6
+ cleanup: () => void;
7
+ draw: import("..").HtmlInCanvasShaderDraw<FilmBurnProps>;
8
+ };
9
+ export declare const filmBurn: (props: FilmBurnProps & {
10
+ effects?: import("remotion").EffectsProp | undefined;
11
+ }) => import("..").TransitionPresentation<FilmBurnProps & {
12
+ effects?: import("remotion").EffectsProp | undefined;
13
+ }>;
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filmBurn = exports.filmBurnShader = void 0;
4
+ const html_in_canvas_presentation_1 = require("../html-in-canvas-presentation");
5
+ const DEFAULT_SEED = 2.31;
6
+ const VERTEX_SHADER = `#version 300 es
7
+ in vec2 a_pos;
8
+ out vec2 v_uv;
9
+ void main() {
10
+ v_uv = vec2(a_pos.x * 0.5 + 0.5, 0.5 - a_pos.y * 0.5);
11
+ gl_Position = vec4(a_pos, 0.0, 1.0);
12
+ }`;
13
+ // Adapted from https://gl-transitions.com/editor/FilmBurn
14
+ // Author: Anastasia Dunbar · License: MIT
15
+ const FRAGMENT_SHADER = `#version 300 es
16
+ precision highp float;
17
+
18
+ uniform sampler2D u_prev;
19
+ uniform sampler2D u_next;
20
+ uniform float u_time;
21
+ uniform float u_seed;
22
+
23
+ in vec2 v_uv;
24
+ out vec4 outColor;
25
+
26
+ #define PI 3.14159265358979323
27
+ #define CLAMPS(x) clamp(x, 0.0, 1.0)
28
+ #define REPEATS 50.0
29
+
30
+ float sigmoid(float x, float a) {
31
+ float b = pow(x * 2.0, a) / 2.0;
32
+ if (x > 0.5) {
33
+ b = 1.0 - pow(2.0 - (x * 2.0), a) / 2.0;
34
+ }
35
+ return b;
36
+ }
37
+
38
+ float rand(float co) {
39
+ return fract(sin((co * 24.9898) + u_seed) * 43758.5453);
40
+ }
41
+
42
+ float rand(vec2 co) {
43
+ return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);
44
+ }
45
+
46
+ float apow(float a, float b) {
47
+ return pow(abs(a), b) * sign(b);
48
+ }
49
+
50
+ vec3 pow3(vec3 a, vec3 b) {
51
+ return vec3(apow(a.r, b.r), apow(a.g, b.g), apow(a.b, b.b));
52
+ }
53
+
54
+ float smoothMix(float a, float b, float c) {
55
+ return mix(a, b, sigmoid(c, 2.0));
56
+ }
57
+
58
+ float random(vec2 co, float shft) {
59
+ co += 10.0;
60
+ return smoothMix(
61
+ fract(
62
+ sin(
63
+ dot(
64
+ co.xy,
65
+ vec2(12.9898 + (floor(shft) * 0.5), 78.233 + u_seed)
66
+ )
67
+ ) * 43758.5453
68
+ ),
69
+ fract(
70
+ sin(
71
+ dot(
72
+ co.xy,
73
+ vec2(12.9898 + (floor(shft + 1.0) * 0.5), 78.233 + u_seed)
74
+ )
75
+ ) * 43758.5453
76
+ ),
77
+ fract(shft)
78
+ );
79
+ }
80
+
81
+ float smoothRandom(vec2 co, float shft) {
82
+ return smoothMix(
83
+ smoothMix(
84
+ random(floor(co), shft),
85
+ random(floor(co + vec2(1.0, 0.0)), shft),
86
+ fract(co.x)
87
+ ),
88
+ smoothMix(
89
+ random(floor(co + vec2(0.0, 1.0)), shft),
90
+ random(floor(co + vec2(1.0, 1.0)), shft),
91
+ fract(co.x)
92
+ ),
93
+ fract(co.y)
94
+ );
95
+ }
96
+
97
+ vec4 sampleTexture(vec2 p, float progress) {
98
+ return mix(texture(u_prev, p), texture(u_next, p), sigmoid(progress, 10.0));
99
+ }
100
+
101
+ vec4 transition(vec2 p, float progress) {
102
+ vec3 f = vec3(0.0);
103
+ for (float i = 0.0; i < 13.0; i++) {
104
+ f += sin(((p.x * rand(i) * 6.0) + (progress * 8.0)) + rand(i + 1.43)) *
105
+ sin(
106
+ ((p.y * rand(i + 4.4) * 6.0) + (progress * 6.0)) +
107
+ rand(i + 2.4)
108
+ );
109
+ f += 1.0 - CLAMPS(
110
+ length(
111
+ p -
112
+ vec2(
113
+ smoothRandom(vec2(progress * 1.3), i + 1.0),
114
+ smoothRandom(vec2(progress * 0.5), i + 6.25)
115
+ )
116
+ ) * mix(20.0, 70.0, rand(i))
117
+ );
118
+ }
119
+
120
+ f += 4.0;
121
+ f /= 11.0;
122
+ f = pow3(
123
+ f * vec3(1.0, 0.7, 0.6),
124
+ vec3(1.0, 2.0 - sin(progress * PI), 1.3)
125
+ );
126
+ f *= sin(progress * PI);
127
+
128
+ p -= 0.5;
129
+ p *= 1.0 + (smoothRandom(vec2(progress * 5.0), 6.3) * sin(progress * PI) * 0.05);
130
+ p += 0.5;
131
+
132
+ vec4 blurredImage = vec4(0.0);
133
+ float blurAmount = sin(progress * PI) * 0.03;
134
+ for (float i = 0.0; i < REPEATS; i++) {
135
+ vec2 q = vec2(
136
+ cos(degrees((i / REPEATS) * 360.0)),
137
+ sin(degrees((i / REPEATS) * 360.0))
138
+ ) * (rand(vec2(i, p.x + p.y)) + blurAmount);
139
+ vec2 uv2 = p + (q * blurAmount);
140
+ blurredImage += sampleTexture(uv2, progress);
141
+ }
142
+
143
+ blurredImage /= REPEATS;
144
+ return blurredImage + vec4(f, 0.0);
145
+ }
146
+
147
+ void main() {
148
+ float progress = 1.0 - u_time;
149
+ outColor = transition(v_uv, progress);
150
+ }`;
151
+ const compileShader = (gl, source, type) => {
152
+ const shader = gl.createShader(type);
153
+ if (!shader) {
154
+ throw new Error('Failed to create shader');
155
+ }
156
+ gl.shaderSource(shader, source);
157
+ gl.compileShader(shader);
158
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
159
+ const log = gl.getShaderInfoLog(shader);
160
+ gl.deleteShader(shader);
161
+ throw new Error(`Failed to compile shader: ${log}`);
162
+ }
163
+ return shader;
164
+ };
165
+ const createProgram = (gl) => {
166
+ const program = gl.createProgram();
167
+ if (!program) {
168
+ throw new Error('Failed to create WebGL program');
169
+ }
170
+ const vs = compileShader(gl, VERTEX_SHADER, gl.VERTEX_SHADER);
171
+ const fs = compileShader(gl, FRAGMENT_SHADER, gl.FRAGMENT_SHADER);
172
+ gl.attachShader(program, vs);
173
+ gl.attachShader(program, fs);
174
+ gl.linkProgram(program);
175
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
176
+ const log = gl.getProgramInfoLog(program);
177
+ gl.deleteProgram(program);
178
+ throw new Error(`Failed to link program: ${log}`);
179
+ }
180
+ return program;
181
+ };
182
+ const createTexture = (gl) => {
183
+ const tex = gl.createTexture();
184
+ if (!tex) {
185
+ throw new Error('Failed to create texture');
186
+ }
187
+ gl.bindTexture(gl.TEXTURE_2D, tex);
188
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
189
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
190
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
191
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
192
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));
193
+ return tex;
194
+ };
195
+ const filmBurnShader = (canvas) => {
196
+ const gl = canvas.getContext('webgl2', { premultipliedAlpha: true });
197
+ if (!gl) {
198
+ throw new Error('Failed to create WebGL2 context');
199
+ }
200
+ const program = createProgram(gl);
201
+ const prevTex = createTexture(gl);
202
+ const nextTex = createTexture(gl);
203
+ const vao = gl.createVertexArray();
204
+ gl.bindVertexArray(vao);
205
+ const buffer = gl.createBuffer();
206
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
207
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);
208
+ const aPos = gl.getAttribLocation(program, 'a_pos');
209
+ gl.enableVertexAttribArray(aPos);
210
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);
211
+ const uTime = gl.getUniformLocation(program, 'u_time');
212
+ const uPrev = gl.getUniformLocation(program, 'u_prev');
213
+ const uNext = gl.getUniformLocation(program, 'u_next');
214
+ const uSeed = gl.getUniformLocation(program, 'u_seed');
215
+ const cleanup = () => {
216
+ gl.deleteProgram(program);
217
+ gl.deleteTexture(prevTex);
218
+ gl.deleteTexture(nextTex);
219
+ };
220
+ const clear = () => {
221
+ gl.clearColor(0, 0, 0, 0);
222
+ gl.clear(gl.COLOR_BUFFER_BIT);
223
+ };
224
+ const draw = ({ prevImage, nextImage, width, height, time, passedProps, }) => {
225
+ const { seed = DEFAULT_SEED } = passedProps;
226
+ if (!prevImage && !nextImage) {
227
+ return;
228
+ }
229
+ if (prevImage && (prevImage.width === 0 || prevImage.height === 0)) {
230
+ return;
231
+ }
232
+ if (nextImage && (nextImage.width === 0 || nextImage.height === 0)) {
233
+ return;
234
+ }
235
+ // When one side is missing, force the mix to fully show the other.
236
+ // At time=0 the shader outputs nextImage. At time=1 the shader outputs prevImage.
237
+ const effectiveTime = !prevImage ? 0 : !nextImage ? 1 : time;
238
+ gl.viewport(0, 0, width, height);
239
+ gl.clearColor(0, 0, 0, 0);
240
+ gl.clear(gl.COLOR_BUFFER_BIT);
241
+ gl.useProgram(program);
242
+ gl.activeTexture(gl.TEXTURE0);
243
+ gl.bindTexture(gl.TEXTURE_2D, prevTex);
244
+ if (prevImage) {
245
+ gl.texElementImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, prevImage);
246
+ }
247
+ gl.uniform1i(uPrev, 0);
248
+ gl.activeTexture(gl.TEXTURE1);
249
+ gl.bindTexture(gl.TEXTURE_2D, nextTex);
250
+ if (nextImage) {
251
+ gl.texElementImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, nextImage);
252
+ }
253
+ gl.uniform1i(uNext, 1);
254
+ gl.uniform1f(uTime, effectiveTime);
255
+ gl.uniform1f(uSeed, seed);
256
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
257
+ };
258
+ return {
259
+ clear,
260
+ cleanup,
261
+ draw,
262
+ };
263
+ };
264
+ exports.filmBurnShader = filmBurnShader;
265
+ exports.filmBurn = (0, html_in_canvas_presentation_1.makeHtmlInCanvasPresentation)(exports.filmBurnShader);
@@ -0,0 +1,13 @@
1
+ export type LinearBlurProps = {
2
+ intensity?: number;
3
+ };
4
+ export declare const linearBlurShader: (canvas: OffscreenCanvas) => {
5
+ clear: () => void;
6
+ cleanup: () => void;
7
+ draw: import("..").HtmlInCanvasShaderDraw<LinearBlurProps>;
8
+ };
9
+ export declare const linearBlur: (props: LinearBlurProps & {
10
+ effects?: import("remotion").EffectsProp | undefined;
11
+ }) => import("..").TransitionPresentation<LinearBlurProps & {
12
+ effects?: import("remotion").EffectsProp | undefined;
13
+ }>;
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.linearBlur = exports.linearBlurShader = void 0;
4
+ const html_in_canvas_presentation_1 = require("../html-in-canvas-presentation");
5
+ const VERTEX_SHADER = `#version 300 es
6
+ in vec2 a_pos;
7
+ out vec2 v_uv;
8
+ void main() {
9
+ v_uv = vec2(a_pos.x * 0.5 + 0.5, 0.5 - a_pos.y * 0.5);
10
+ gl_Position = vec4(a_pos, 0.0, 1.0);
11
+ }`;
12
+ // Adapted from https://gl-transitions.com/editor/LinearBlur
13
+ // Author: gre · License: MIT
14
+ const FRAGMENT_SHADER = `#version 300 es
15
+ precision highp float;
16
+
17
+ uniform sampler2D u_prev;
18
+ uniform sampler2D u_next;
19
+ uniform float u_time;
20
+ uniform float u_intensity;
21
+
22
+ in vec2 v_uv;
23
+ out vec4 outColor;
24
+
25
+ const int PASSES = 6;
26
+
27
+ vec4 transition(vec2 uv, float progress) {
28
+ vec4 c1 = vec4(0.0);
29
+ vec4 c2 = vec4(0.0);
30
+
31
+ float disp = u_intensity * (0.5 - distance(0.5, progress));
32
+ for (int xi = 0; xi < PASSES; xi++) {
33
+ float x = float(xi) / float(PASSES) - 0.5;
34
+ for (int yi = 0; yi < PASSES; yi++) {
35
+ float y = float(yi) / float(PASSES) - 0.5;
36
+ vec2 v = vec2(x, y);
37
+ c1 += texture(u_prev, uv + disp * v);
38
+ c2 += texture(u_next, uv + disp * v);
39
+ }
40
+ }
41
+
42
+ c1 /= float(PASSES * PASSES);
43
+ c2 /= float(PASSES * PASSES);
44
+ return mix(c1, c2, progress);
45
+ }
46
+
47
+ void main() {
48
+ float progress = 1.0 - u_time;
49
+ outColor = transition(v_uv, progress);
50
+ }`;
51
+ const compileShader = (gl, source, type) => {
52
+ const shader = gl.createShader(type);
53
+ if (!shader) {
54
+ throw new Error('Failed to create shader');
55
+ }
56
+ gl.shaderSource(shader, source);
57
+ gl.compileShader(shader);
58
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
59
+ const log = gl.getShaderInfoLog(shader);
60
+ gl.deleteShader(shader);
61
+ throw new Error(`Failed to compile shader: ${log}`);
62
+ }
63
+ return shader;
64
+ };
65
+ const createProgram = (gl) => {
66
+ const program = gl.createProgram();
67
+ if (!program) {
68
+ throw new Error('Failed to create WebGL program');
69
+ }
70
+ const vs = compileShader(gl, VERTEX_SHADER, gl.VERTEX_SHADER);
71
+ const fs = compileShader(gl, FRAGMENT_SHADER, gl.FRAGMENT_SHADER);
72
+ gl.attachShader(program, vs);
73
+ gl.attachShader(program, fs);
74
+ gl.linkProgram(program);
75
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
76
+ const log = gl.getProgramInfoLog(program);
77
+ gl.deleteProgram(program);
78
+ throw new Error(`Failed to link program: ${log}`);
79
+ }
80
+ return program;
81
+ };
82
+ const createTexture = (gl) => {
83
+ const tex = gl.createTexture();
84
+ if (!tex) {
85
+ throw new Error('Failed to create texture');
86
+ }
87
+ gl.bindTexture(gl.TEXTURE_2D, tex);
88
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
89
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
90
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
91
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
92
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 0]));
93
+ return tex;
94
+ };
95
+ const linearBlurShader = (canvas) => {
96
+ const gl = canvas.getContext('webgl2', { premultipliedAlpha: true });
97
+ if (!gl) {
98
+ throw new Error('Failed to create WebGL2 context');
99
+ }
100
+ const program = createProgram(gl);
101
+ const prevTex = createTexture(gl);
102
+ const nextTex = createTexture(gl);
103
+ const vao = gl.createVertexArray();
104
+ gl.bindVertexArray(vao);
105
+ const buffer = gl.createBuffer();
106
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
107
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);
108
+ const aPos = gl.getAttribLocation(program, 'a_pos');
109
+ gl.enableVertexAttribArray(aPos);
110
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);
111
+ const uTime = gl.getUniformLocation(program, 'u_time');
112
+ const uPrev = gl.getUniformLocation(program, 'u_prev');
113
+ const uNext = gl.getUniformLocation(program, 'u_next');
114
+ const uIntensity = gl.getUniformLocation(program, 'u_intensity');
115
+ const cleanup = () => {
116
+ gl.deleteProgram(program);
117
+ gl.deleteTexture(prevTex);
118
+ gl.deleteTexture(nextTex);
119
+ };
120
+ const clear = () => {
121
+ gl.clearColor(0, 0, 0, 0);
122
+ gl.clear(gl.COLOR_BUFFER_BIT);
123
+ };
124
+ const draw = ({ prevImage, nextImage, width, height, time, passedProps, }) => {
125
+ const { intensity = 0.1 } = passedProps;
126
+ if (!prevImage && !nextImage) {
127
+ return;
128
+ }
129
+ if (prevImage && (prevImage.width === 0 || prevImage.height === 0)) {
130
+ return;
131
+ }
132
+ if (nextImage && (nextImage.width === 0 || nextImage.height === 0)) {
133
+ return;
134
+ }
135
+ // At time=0 the shader outputs nextImage. At time=1 the shader outputs prevImage.
136
+ const effectiveTime = !prevImage ? 0 : !nextImage ? 1 : time;
137
+ gl.viewport(0, 0, width, height);
138
+ gl.clearColor(0, 0, 0, 0);
139
+ gl.clear(gl.COLOR_BUFFER_BIT);
140
+ gl.useProgram(program);
141
+ gl.activeTexture(gl.TEXTURE0);
142
+ gl.bindTexture(gl.TEXTURE_2D, prevTex);
143
+ if (prevImage) {
144
+ gl.texElementImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, prevImage);
145
+ }
146
+ gl.uniform1i(uPrev, 0);
147
+ gl.activeTexture(gl.TEXTURE1);
148
+ gl.bindTexture(gl.TEXTURE_2D, nextTex);
149
+ if (nextImage) {
150
+ gl.texElementImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, nextImage);
151
+ }
152
+ gl.uniform1i(uNext, 1);
153
+ gl.uniform1f(uTime, effectiveTime);
154
+ gl.uniform1f(uIntensity, intensity);
155
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
156
+ };
157
+ return {
158
+ clear,
159
+ cleanup,
160
+ draw,
161
+ };
162
+ };
163
+ exports.linearBlurShader = linearBlurShader;
164
+ exports.linearBlur = (0, html_in_canvas_presentation_1.makeHtmlInCanvasPresentation)(exports.linearBlurShader);
@@ -0,0 +1,14 @@
1
+ export type RippleProps = {
2
+ amplitude?: number;
3
+ speed?: number;
4
+ };
5
+ export declare const rippleShader: (canvas: OffscreenCanvas) => {
6
+ clear: () => void;
7
+ cleanup: () => void;
8
+ draw: import("..").HtmlInCanvasShaderDraw<RippleProps>;
9
+ };
10
+ export declare const ripple: (props: RippleProps & {
11
+ effects?: import("remotion").EffectsProp | undefined;
12
+ }) => import("..").TransitionPresentation<RippleProps & {
13
+ effects?: import("remotion").EffectsProp | undefined;
14
+ }>;