@remotion/three 4.0.341 → 4.0.345
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.
|
@@ -5,14 +5,15 @@ const jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const remotion_1 = require("remotion");
|
|
7
7
|
const Unblocker = () => {
|
|
8
|
+
const { delayRender, continueRender } = (0, remotion_1.useDelayRender)();
|
|
8
9
|
if (typeof document !== 'undefined') {
|
|
9
10
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
10
11
|
(0, react_1.useLayoutEffect)(() => {
|
|
11
|
-
const handle =
|
|
12
|
+
const handle = delayRender(`Waiting for <Suspense /> of <ThreeCanvas /> to resolve`);
|
|
12
13
|
return () => {
|
|
13
|
-
|
|
14
|
+
continueRender(handle);
|
|
14
15
|
};
|
|
15
|
-
}, []);
|
|
16
|
+
}, [continueRender, delayRender]);
|
|
16
17
|
}
|
|
17
18
|
return null;
|
|
18
19
|
};
|
package/dist/cjs/ThreeCanvas.js
CHANGED
|
@@ -25,16 +25,17 @@ const FiberFrameInvalidator = () => {
|
|
|
25
25
|
}, [frame, invalidate]);
|
|
26
26
|
return null;
|
|
27
27
|
};
|
|
28
|
-
const { isRendering } = (0, remotion_1.getRemotionEnvironment)();
|
|
29
|
-
// https://r3f.docs.pmnd.rs/advanced/scaling-performance#on-demand-rendering
|
|
30
|
-
const shouldUseFrameloopDemand = isRendering;
|
|
31
28
|
/*
|
|
32
29
|
* @description A wrapper for React Three Fiber's <Canvas /> which synchronizes with Remotion's useCurrentFrame().
|
|
33
30
|
* @see [Documentation](https://www.remotion.dev/docs/three-canvas)
|
|
34
31
|
*/
|
|
35
32
|
const ThreeCanvas = (props) => {
|
|
33
|
+
const { isRendering } = (0, remotion_1.useRemotionEnvironment)();
|
|
34
|
+
// https://r3f.docs.pmnd.rs/advanced/scaling-performance#on-demand-rendering
|
|
35
|
+
const shouldUseFrameloopDemand = isRendering;
|
|
36
36
|
const { children, width, height, style, onCreated, ...rest } = props;
|
|
37
|
-
const
|
|
37
|
+
const { delayRender, continueRender } = (0, remotion_1.useDelayRender)();
|
|
38
|
+
const [waitForCreated] = (0, react_1.useState)(() => delayRender('Waiting for <ThreeCanvas/> to be created'));
|
|
38
39
|
(0, validate_1.validateDimension)(width, 'width', 'of the <ThreeCanvas /> component');
|
|
39
40
|
(0, validate_1.validateDimension)(height, 'height', 'of the <ThreeCanvas /> component');
|
|
40
41
|
const contexts = remotion_1.Internals.useRemotionContexts();
|
|
@@ -44,9 +45,9 @@ const ThreeCanvas = (props) => {
|
|
|
44
45
|
...(style !== null && style !== void 0 ? style : {}),
|
|
45
46
|
};
|
|
46
47
|
const remotion_onCreated = (0, react_1.useCallback)((state) => {
|
|
47
|
-
|
|
48
|
+
continueRender(waitForCreated);
|
|
48
49
|
onCreated === null || onCreated === void 0 ? void 0 : onCreated(state);
|
|
49
|
-
}, [onCreated, waitForCreated]);
|
|
50
|
+
}, [onCreated, waitForCreated, continueRender]);
|
|
50
51
|
return ((0, jsx_runtime_1.jsx)(SuspenseLoader_1.SuspenseLoader, { children: (0, jsx_runtime_1.jsxs)(fiber_1.Canvas, { style: actualStyle, ...rest, frameloop: shouldUseFrameloopDemand ? 'demand' : 'always', onCreated: remotion_onCreated, children: [(0, jsx_runtime_1.jsx)(Scale, { width: width, height: height }), (0, jsx_runtime_1.jsxs)(remotion_1.Internals.RemotionContextProvider, { contexts: contexts, children: [shouldUseFrameloopDemand && (0, jsx_runtime_1.jsx)(FiberFrameInvalidator, {}), children] })] }) }));
|
|
51
52
|
};
|
|
52
53
|
exports.ThreeCanvas = ThreeCanvas;
|
|
@@ -59,8 +59,9 @@ const useInnerVideoTexture = ({ playbackRate, src, transparent, toneMapped, dela
|
|
|
59
59
|
}, [toneMapped, currentTime, src, transparent]);
|
|
60
60
|
const [textLoaderPromise] = (0, react_1.useState)(() => Promise.resolve().then(() => __importStar(require('three/src/loaders/TextureLoader.js'))));
|
|
61
61
|
const [imageTexture, setImageTexture] = (0, react_1.useState)(null);
|
|
62
|
+
const { delayRender, continueRender } = (0, remotion_1.useDelayRender)();
|
|
62
63
|
const fetchTexture = (0, react_1.useCallback)(() => {
|
|
63
|
-
const imageTextureHandle =
|
|
64
|
+
const imageTextureHandle = delayRender('fetch offthread video frame', {
|
|
64
65
|
retries: delayRenderRetries !== null && delayRenderRetries !== void 0 ? delayRenderRetries : undefined,
|
|
65
66
|
timeoutInMilliseconds: delayRenderTimeoutInMilliseconds !== null && delayRenderTimeoutInMilliseconds !== void 0 ? delayRenderTimeoutInMilliseconds : undefined,
|
|
66
67
|
});
|
|
@@ -75,7 +76,7 @@ const useInnerVideoTexture = ({ playbackRate, src, transparent, toneMapped, dela
|
|
|
75
76
|
return;
|
|
76
77
|
}
|
|
77
78
|
setImageTexture(texture);
|
|
78
|
-
|
|
79
|
+
continueRender(imageTextureHandle);
|
|
79
80
|
})
|
|
80
81
|
.catch((err) => {
|
|
81
82
|
(0, remotion_1.cancelRender)(err);
|
|
@@ -84,13 +85,15 @@ const useInnerVideoTexture = ({ playbackRate, src, transparent, toneMapped, dela
|
|
|
84
85
|
return () => {
|
|
85
86
|
cleanedUp = true;
|
|
86
87
|
textureLoaded === null || textureLoaded === void 0 ? void 0 : textureLoaded.dispose();
|
|
87
|
-
|
|
88
|
+
continueRender(imageTextureHandle);
|
|
88
89
|
};
|
|
89
90
|
}, [
|
|
90
91
|
offthreadVideoFrameSrc,
|
|
91
92
|
textLoaderPromise,
|
|
92
93
|
delayRenderRetries,
|
|
93
94
|
delayRenderTimeoutInMilliseconds,
|
|
95
|
+
continueRender,
|
|
96
|
+
delayRender,
|
|
94
97
|
]);
|
|
95
98
|
(0, react_1.useLayoutEffect)(() => {
|
|
96
99
|
const cleanup = fetchTexture();
|
|
@@ -109,9 +112,10 @@ function useOffthreadVideoTexture({ src, playbackRate = 1, transparent = false,
|
|
|
109
112
|
if (!src) {
|
|
110
113
|
throw new Error('src must be provided to useOffthreadVideoTexture');
|
|
111
114
|
}
|
|
112
|
-
const
|
|
115
|
+
const env = (0, remotion_1.useRemotionEnvironment)();
|
|
116
|
+
const { isRendering } = env;
|
|
113
117
|
if (!isRendering) {
|
|
114
|
-
throw new Error('useOffthreadVideoTexture() can only be used during rendering. Use
|
|
118
|
+
throw new Error('useOffthreadVideoTexture() can only be used during rendering. Use useRemotionEnvironment().isRendering to render it conditionally.');
|
|
115
119
|
}
|
|
116
120
|
return (0, exports.useInnerVideoTexture)({
|
|
117
121
|
playbackRate,
|
|
@@ -50,11 +50,12 @@ const warnAboutRequestVideoFrameCallback = () => {
|
|
|
50
50
|
* @see [Documentation](https://www.remotion.dev/docs/use-video-texture)
|
|
51
51
|
*/
|
|
52
52
|
const useVideoTexture = (videoRef) => {
|
|
53
|
+
const { delayRender, continueRender } = (0, remotion_1.useDelayRender)();
|
|
53
54
|
const [loaded] = (0, react_1.useState)(() => {
|
|
54
55
|
if (typeof document === 'undefined') {
|
|
55
56
|
return 0;
|
|
56
57
|
}
|
|
57
|
-
return
|
|
58
|
+
return delayRender(`Waiting for texture in useVideoTexture() to be loaded`);
|
|
58
59
|
});
|
|
59
60
|
const [videoTexture, setVideoTexture] = (0, react_1.useState)(null);
|
|
60
61
|
const [vidText] = (0, react_1.useState)(() => Promise.resolve().then(() => __importStar(require('three/src/textures/VideoTexture.js'))));
|
|
@@ -69,12 +70,12 @@ const useVideoTexture = (videoRef) => {
|
|
|
69
70
|
videoRef.current.width = videoRef.current.videoWidth;
|
|
70
71
|
videoRef.current.height = videoRef.current.videoHeight;
|
|
71
72
|
setVideoTexture(vt);
|
|
72
|
-
|
|
73
|
+
continueRender(loaded);
|
|
73
74
|
})
|
|
74
75
|
.catch((err) => {
|
|
75
76
|
(0, remotion_1.cancelRender)(err);
|
|
76
77
|
});
|
|
77
|
-
}, [loaded, vidText, videoRef]);
|
|
78
|
+
}, [loaded, vidText, videoRef, continueRender]);
|
|
78
79
|
react_1.default.useLayoutEffect(() => {
|
|
79
80
|
if (!videoRef.current) {
|
|
80
81
|
return;
|
|
@@ -105,12 +106,12 @@ const useVideoTexture = (videoRef) => {
|
|
|
105
106
|
(0, react_1.useEffect)(() => {
|
|
106
107
|
// Clean up on unmount
|
|
107
108
|
return () => {
|
|
108
|
-
|
|
109
|
+
continueRender(loaded);
|
|
109
110
|
};
|
|
110
|
-
}, [loaded]);
|
|
111
|
+
}, [loaded, continueRender]);
|
|
111
112
|
if (typeof HTMLVideoElement === 'undefined' ||
|
|
112
113
|
!HTMLVideoElement.prototype.requestVideoFrameCallback) {
|
|
113
|
-
|
|
114
|
+
continueRender(loaded);
|
|
114
115
|
return null;
|
|
115
116
|
}
|
|
116
117
|
return videoTexture;
|
package/dist/esm/index.mjs
CHANGED
|
@@ -27,24 +27,24 @@ import { Canvas, useThree } from "@react-three/fiber";
|
|
|
27
27
|
import { useCallback, useEffect, useLayoutEffect as useLayoutEffect2, useState } from "react";
|
|
28
28
|
import {
|
|
29
29
|
Internals,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
useCurrentFrame
|
|
30
|
+
useCurrentFrame,
|
|
31
|
+
useDelayRender as useDelayRender2,
|
|
32
|
+
useRemotionEnvironment
|
|
34
33
|
} from "remotion";
|
|
35
34
|
|
|
36
35
|
// src/SuspenseLoader.tsx
|
|
37
36
|
import { Suspense, useLayoutEffect } from "react";
|
|
38
|
-
import {
|
|
37
|
+
import { useDelayRender } from "remotion";
|
|
39
38
|
import { jsx } from "react/jsx-runtime";
|
|
40
39
|
var Unblocker = () => {
|
|
40
|
+
const { delayRender, continueRender } = useDelayRender();
|
|
41
41
|
if (typeof document !== "undefined") {
|
|
42
42
|
useLayoutEffect(() => {
|
|
43
43
|
const handle = delayRender(`Waiting for <Suspense /> of <ThreeCanvas /> to resolve`);
|
|
44
44
|
return () => {
|
|
45
45
|
continueRender(handle);
|
|
46
46
|
};
|
|
47
|
-
}, []);
|
|
47
|
+
}, [continueRender, delayRender]);
|
|
48
48
|
}
|
|
49
49
|
return null;
|
|
50
50
|
};
|
|
@@ -82,11 +82,12 @@ var FiberFrameInvalidator = () => {
|
|
|
82
82
|
}, [frame, invalidate]);
|
|
83
83
|
return null;
|
|
84
84
|
};
|
|
85
|
-
var { isRendering } = getRemotionEnvironment();
|
|
86
|
-
var shouldUseFrameloopDemand = isRendering;
|
|
87
85
|
var ThreeCanvas = (props) => {
|
|
86
|
+
const { isRendering } = useRemotionEnvironment();
|
|
87
|
+
const shouldUseFrameloopDemand = isRendering;
|
|
88
88
|
const { children, width, height, style, onCreated, ...rest } = props;
|
|
89
|
-
const
|
|
89
|
+
const { delayRender, continueRender } = useDelayRender2();
|
|
90
|
+
const [waitForCreated] = useState(() => delayRender("Waiting for <ThreeCanvas/> to be created"));
|
|
90
91
|
validateDimension(width, "width", "of the <ThreeCanvas /> component");
|
|
91
92
|
validateDimension(height, "height", "of the <ThreeCanvas /> component");
|
|
92
93
|
const contexts = Internals.useRemotionContexts();
|
|
@@ -96,9 +97,9 @@ var ThreeCanvas = (props) => {
|
|
|
96
97
|
...style ?? {}
|
|
97
98
|
};
|
|
98
99
|
const remotion_onCreated = useCallback((state) => {
|
|
99
|
-
|
|
100
|
+
continueRender(waitForCreated);
|
|
100
101
|
onCreated?.(state);
|
|
101
|
-
}, [onCreated, waitForCreated]);
|
|
102
|
+
}, [onCreated, waitForCreated, continueRender]);
|
|
102
103
|
return /* @__PURE__ */ jsx2(SuspenseLoader, {
|
|
103
104
|
children: /* @__PURE__ */ jsxs(Canvas, {
|
|
104
105
|
style: actualStyle,
|
|
@@ -126,10 +127,9 @@ import { useCallback as useCallback2, useLayoutEffect as useLayoutEffect3, useMe
|
|
|
126
127
|
import {
|
|
127
128
|
Internals as Internals2,
|
|
128
129
|
cancelRender,
|
|
129
|
-
continueRender as continueRender3,
|
|
130
|
-
delayRender as delayRender3,
|
|
131
|
-
getRemotionEnvironment as getRemotionEnvironment2,
|
|
132
130
|
useCurrentFrame as useCurrentFrame2,
|
|
131
|
+
useDelayRender as useDelayRender3,
|
|
132
|
+
useRemotionEnvironment as useRemotionEnvironment2,
|
|
133
133
|
useVideoConfig
|
|
134
134
|
} from "remotion";
|
|
135
135
|
import { NoReactInternals as NoReactInternals2 } from "remotion/no-react";
|
|
@@ -161,8 +161,9 @@ var useInnerVideoTexture = ({
|
|
|
161
161
|
}, [toneMapped, currentTime, src, transparent]);
|
|
162
162
|
const [textLoaderPromise] = useState2(() => import("three/src/loaders/TextureLoader.js"));
|
|
163
163
|
const [imageTexture, setImageTexture] = useState2(null);
|
|
164
|
+
const { delayRender, continueRender } = useDelayRender3();
|
|
164
165
|
const fetchTexture = useCallback2(() => {
|
|
165
|
-
const imageTextureHandle =
|
|
166
|
+
const imageTextureHandle = delayRender("fetch offthread video frame", {
|
|
166
167
|
retries: delayRenderRetries ?? undefined,
|
|
167
168
|
timeoutInMilliseconds: delayRenderTimeoutInMilliseconds ?? undefined
|
|
168
169
|
});
|
|
@@ -175,7 +176,7 @@ var useInnerVideoTexture = ({
|
|
|
175
176
|
return;
|
|
176
177
|
}
|
|
177
178
|
setImageTexture(texture);
|
|
178
|
-
|
|
179
|
+
continueRender(imageTextureHandle);
|
|
179
180
|
}).catch((err) => {
|
|
180
181
|
cancelRender(err);
|
|
181
182
|
});
|
|
@@ -183,13 +184,15 @@ var useInnerVideoTexture = ({
|
|
|
183
184
|
return () => {
|
|
184
185
|
cleanedUp = true;
|
|
185
186
|
textureLoaded?.dispose();
|
|
186
|
-
|
|
187
|
+
continueRender(imageTextureHandle);
|
|
187
188
|
};
|
|
188
189
|
}, [
|
|
189
190
|
offthreadVideoFrameSrc,
|
|
190
191
|
textLoaderPromise,
|
|
191
192
|
delayRenderRetries,
|
|
192
|
-
delayRenderTimeoutInMilliseconds
|
|
193
|
+
delayRenderTimeoutInMilliseconds,
|
|
194
|
+
continueRender,
|
|
195
|
+
delayRender
|
|
193
196
|
]);
|
|
194
197
|
useLayoutEffect3(() => {
|
|
195
198
|
const cleanup = fetchTexture();
|
|
@@ -210,9 +213,10 @@ function useOffthreadVideoTexture({
|
|
|
210
213
|
if (!src) {
|
|
211
214
|
throw new Error("src must be provided to useOffthreadVideoTexture");
|
|
212
215
|
}
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
|
|
216
|
+
const env = useRemotionEnvironment2();
|
|
217
|
+
const { isRendering } = env;
|
|
218
|
+
if (!isRendering) {
|
|
219
|
+
throw new Error("useOffthreadVideoTexture() can only be used during rendering. Use useRemotionEnvironment().isRendering to render it conditionally.");
|
|
216
220
|
}
|
|
217
221
|
return useInnerVideoTexture({
|
|
218
222
|
playbackRate,
|
|
@@ -225,12 +229,7 @@ function useOffthreadVideoTexture({
|
|
|
225
229
|
}
|
|
226
230
|
// src/use-video-texture.ts
|
|
227
231
|
import React3, { useCallback as useCallback3, useEffect as useEffect2, useState as useState3 } from "react";
|
|
228
|
-
import {
|
|
229
|
-
cancelRender as cancelRender2,
|
|
230
|
-
continueRender as continueRender4,
|
|
231
|
-
delayRender as delayRender4,
|
|
232
|
-
useCurrentFrame as useCurrentFrame3
|
|
233
|
-
} from "remotion";
|
|
232
|
+
import { cancelRender as cancelRender2, useCurrentFrame as useCurrentFrame3, useDelayRender as useDelayRender4 } from "remotion";
|
|
234
233
|
var warned = false;
|
|
235
234
|
var warnAboutRequestVideoFrameCallback = () => {
|
|
236
235
|
if (warned) {
|
|
@@ -240,11 +239,12 @@ var warnAboutRequestVideoFrameCallback = () => {
|
|
|
240
239
|
console.warn("Browser does not support requestVideoFrameCallback. Cannot display video.");
|
|
241
240
|
};
|
|
242
241
|
var useVideoTexture = (videoRef) => {
|
|
242
|
+
const { delayRender, continueRender } = useDelayRender4();
|
|
243
243
|
const [loaded] = useState3(() => {
|
|
244
244
|
if (typeof document === "undefined") {
|
|
245
245
|
return 0;
|
|
246
246
|
}
|
|
247
|
-
return
|
|
247
|
+
return delayRender(`Waiting for texture in useVideoTexture() to be loaded`);
|
|
248
248
|
});
|
|
249
249
|
const [videoTexture, setVideoTexture] = useState3(null);
|
|
250
250
|
const [vidText] = useState3(() => import("three/src/textures/VideoTexture.js"));
|
|
@@ -258,11 +258,11 @@ var useVideoTexture = (videoRef) => {
|
|
|
258
258
|
videoRef.current.width = videoRef.current.videoWidth;
|
|
259
259
|
videoRef.current.height = videoRef.current.videoHeight;
|
|
260
260
|
setVideoTexture(vt);
|
|
261
|
-
|
|
261
|
+
continueRender(loaded);
|
|
262
262
|
}).catch((err) => {
|
|
263
263
|
cancelRender2(err);
|
|
264
264
|
});
|
|
265
|
-
}, [loaded, vidText, videoRef]);
|
|
265
|
+
}, [loaded, vidText, videoRef, continueRender]);
|
|
266
266
|
React3.useLayoutEffect(() => {
|
|
267
267
|
if (!videoRef.current) {
|
|
268
268
|
return;
|
|
@@ -289,11 +289,11 @@ var useVideoTexture = (videoRef) => {
|
|
|
289
289
|
}, [frame, loaded, videoRef]);
|
|
290
290
|
useEffect2(() => {
|
|
291
291
|
return () => {
|
|
292
|
-
|
|
292
|
+
continueRender(loaded);
|
|
293
293
|
};
|
|
294
|
-
}, [loaded]);
|
|
294
|
+
}, [loaded, continueRender]);
|
|
295
295
|
if (typeof HTMLVideoElement === "undefined" || !HTMLVideoElement.prototype.requestVideoFrameCallback) {
|
|
296
|
-
|
|
296
|
+
continueRender(loaded);
|
|
297
297
|
return null;
|
|
298
298
|
}
|
|
299
299
|
return videoTexture;
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/three"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/three",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.345",
|
|
7
7
|
"description": "Include React Three Fiber components in a Remotion video",
|
|
8
8
|
"main": "dist/cjs/index.js",
|
|
9
9
|
"types": "dist/cjs/index.d.ts",
|
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
"url": "https://github.com/remotion-dev/remotion/issues"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"remotion": "4.0.
|
|
19
|
+
"remotion": "4.0.345"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"@react-three/fiber": ">=8.0.0",
|
|
23
23
|
"react": ">=16.8.0",
|
|
24
24
|
"react-dom": ">=16.8.0",
|
|
25
25
|
"three": ">=0.137.0",
|
|
26
|
-
"remotion": "4.0.
|
|
26
|
+
"remotion": "4.0.345"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@react-three/fiber": "9.2.0",
|
|
@@ -34,8 +34,8 @@
|
|
|
34
34
|
"react-dom": "19.0.0",
|
|
35
35
|
"three": "0.178.0",
|
|
36
36
|
"eslint": "9.19.0",
|
|
37
|
-
"remotion": "4.0.
|
|
38
|
-
"
|
|
37
|
+
"@remotion/eslint-config-internal": "4.0.345",
|
|
38
|
+
"remotion": "4.0.345"
|
|
39
39
|
},
|
|
40
40
|
"keywords": [
|
|
41
41
|
"remotion",
|