@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 = (0, remotion_1.delayRender)(`Waiting for <Suspense /> of <ThreeCanvas /> to resolve`);
12
+ const handle = delayRender(`Waiting for <Suspense /> of <ThreeCanvas /> to resolve`);
12
13
  return () => {
13
- (0, remotion_1.continueRender)(handle);
14
+ continueRender(handle);
14
15
  };
15
- }, []);
16
+ }, [continueRender, delayRender]);
16
17
  }
17
18
  return null;
18
19
  };
@@ -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 [waitForCreated] = (0, react_1.useState)(() => (0, remotion_1.delayRender)('Waiting for <ThreeCanvas/> to be created'));
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
- (0, remotion_1.continueRender)(waitForCreated);
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 = (0, remotion_1.delayRender)('fetch offthread video frame', {
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
- (0, remotion_1.continueRender)(imageTextureHandle);
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
- (0, remotion_1.continueRender)(imageTextureHandle);
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 { isRendering } = (0, remotion_1.getRemotionEnvironment)();
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 getRemotionEnvironment().isRendering to render it conditionally.');
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 (0, remotion_1.delayRender)(`Waiting for texture in useVideoTexture() to be loaded`);
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
- (0, remotion_1.continueRender)(loaded);
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
- (0, remotion_1.continueRender)(loaded);
109
+ continueRender(loaded);
109
110
  };
110
- }, [loaded]);
111
+ }, [loaded, continueRender]);
111
112
  if (typeof HTMLVideoElement === 'undefined' ||
112
113
  !HTMLVideoElement.prototype.requestVideoFrameCallback) {
113
- (0, remotion_1.continueRender)(loaded);
114
+ continueRender(loaded);
114
115
  return null;
115
116
  }
116
117
  return videoTexture;
@@ -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
- continueRender as continueRender2,
31
- delayRender as delayRender2,
32
- getRemotionEnvironment,
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 { continueRender, delayRender } from "remotion";
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 [waitForCreated] = useState(() => delayRender2("Waiting for <ThreeCanvas/> to be created"));
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
- continueRender2(waitForCreated);
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 = delayRender3("fetch offthread video frame", {
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
- continueRender3(imageTextureHandle);
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
- continueRender3(imageTextureHandle);
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 { isRendering: isRendering2 } = getRemotionEnvironment2();
214
- if (!isRendering2) {
215
- throw new Error("useOffthreadVideoTexture() can only be used during rendering. Use getRemotionEnvironment().isRendering to render it conditionally.");
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 delayRender4(`Waiting for texture in useVideoTexture() to be loaded`);
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
- continueRender4(loaded);
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
- continueRender4(loaded);
292
+ continueRender(loaded);
293
293
  };
294
- }, [loaded]);
294
+ }, [loaded, continueRender]);
295
295
  if (typeof HTMLVideoElement === "undefined" || !HTMLVideoElement.prototype.requestVideoFrameCallback) {
296
- continueRender4(loaded);
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.341",
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.341"
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.341"
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.341",
38
- "@remotion/eslint-config-internal": "4.0.341"
37
+ "@remotion/eslint-config-internal": "4.0.345",
38
+ "remotion": "4.0.345"
39
39
  },
40
40
  "keywords": [
41
41
  "remotion",