@remotion/three 4.0.501 → 4.0.503

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,4 +5,13 @@ export type ThreeCanvasProps = React.ComponentProps<typeof Canvas> & {
5
5
  readonly height: number;
6
6
  readonly children: React.ReactNode;
7
7
  };
8
+ export type ThreeCanvasFrameRendererProps = {
9
+ readonly onRendered: () => void;
10
+ };
11
+ type ThreeCanvasInternalsProps = ThreeCanvasProps & {
12
+ readonly FrameRenderer: React.ComponentType<ThreeCanvasFrameRendererProps>;
13
+ readonly advanceOnCreated: boolean;
14
+ };
15
+ export declare const ThreeCanvasInternals: (props: ThreeCanvasInternalsProps) => import("react/jsx-runtime").JSX.Element;
8
16
  export declare const ThreeCanvas: (props: ThreeCanvasProps) => import("react/jsx-runtime").JSX.Element;
17
+ export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ThreeCanvas = void 0;
3
+ exports.ThreeCanvas = exports.ThreeCanvasInternals = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const fiber_1 = require("@react-three/fiber");
6
6
  const react_1 = require("react");
@@ -17,7 +17,7 @@ const Scale = ({ width, height, }) => {
17
17
  }, [setSize, width, height, set]);
18
18
  return null;
19
19
  };
20
- const ManualFrameRenderer = ({ onRendered, }) => {
20
+ const ManualFrameRenderer = ({ onRendered }) => {
21
21
  const { advance } = (0, fiber_1.useThree)();
22
22
  const frame = (0, remotion_1.useCurrentFrame)();
23
23
  (0, react_1.useEffect)(() => {
@@ -26,12 +26,8 @@ const ManualFrameRenderer = ({ onRendered, }) => {
26
26
  }, [frame, advance, onRendered]);
27
27
  return null;
28
28
  };
29
- /*
30
- * @description A wrapper for React Three Fiber's <Canvas /> which synchronizes with Remotion's useCurrentFrame().
31
- * @see [Documentation](https://www.remotion.dev/docs/three-canvas)
32
- */
33
- const ThreeCanvas = (props) => {
34
- const { children, width, height, style, frameloop, onCreated, ...rest } = props;
29
+ const ThreeCanvasInternals = (props) => {
30
+ const { children, width, height, style, frameloop, onCreated, FrameRenderer, advanceOnCreated, ...rest } = props;
35
31
  const { isRendering } = (0, remotion_1.useRemotionEnvironment)();
36
32
  const { delayRender, continueRender } = (0, remotion_1.useDelayRender)();
37
33
  const contexts = remotion_1.Internals.useRemotionContexts();
@@ -46,12 +42,12 @@ const ThreeCanvas = (props) => {
46
42
  ...style,
47
43
  };
48
44
  const remotion_onCreated = (0, react_1.useCallback)((state) => {
49
- if (isRendering) {
45
+ if (isRendering && advanceOnCreated) {
50
46
  state.advance(performance.now());
51
47
  }
52
48
  continueRender(waitForCreated);
53
49
  onCreated === null || onCreated === void 0 ? void 0 : onCreated(state);
54
- }, [onCreated, waitForCreated, continueRender, isRendering]);
50
+ }, [onCreated, waitForCreated, continueRender, isRendering, advanceOnCreated]);
55
51
  (0, react_1.useLayoutEffect)(() => {
56
52
  if (!isRendering || frame === 0) {
57
53
  return;
@@ -70,7 +66,15 @@ const ThreeCanvas = (props) => {
70
66
  }
71
67
  }, [continueRender]);
72
68
  return (jsx_runtime_1.jsx(SuspenseLoader_1.SuspenseLoader, { children: jsx_runtime_1.jsxs(fiber_1.Canvas, { style: actualStyle, ...rest, frameloop: isRendering ? 'never' : (frameloop !== null && frameloop !== void 0 ? frameloop : 'always'), onCreated: remotion_onCreated, children: [
73
- jsx_runtime_1.jsx(Scale, { width: width, height: height }), jsx_runtime_1.jsxs(remotion_1.Internals.RemotionContextProvider, { contexts: contexts, children: [isRendering && jsx_runtime_1.jsx(ManualFrameRenderer, { onRendered: handleRendered }), children] })
69
+ jsx_runtime_1.jsx(Scale, { width: width, height: height }), jsx_runtime_1.jsxs(remotion_1.Internals.RemotionContextProvider, { contexts: contexts, children: [isRendering && jsx_runtime_1.jsx(FrameRenderer, { onRendered: handleRendered }), children] })
74
70
  ] }) }));
75
71
  };
72
+ exports.ThreeCanvasInternals = ThreeCanvasInternals;
73
+ /*
74
+ * @description A wrapper for React Three Fiber's <Canvas /> which synchronizes with Remotion's useCurrentFrame().
75
+ * @see [Documentation](https://www.remotion.dev/docs/three-canvas)
76
+ */
77
+ const ThreeCanvas = (props) => {
78
+ return (jsx_runtime_1.jsx(exports.ThreeCanvasInternals, { ...props, FrameRenderer: ManualFrameRenderer, advanceOnCreated: true }));
79
+ };
76
80
  exports.ThreeCanvas = ThreeCanvas;
@@ -0,0 +1,3 @@
1
+ import type { ThreeCanvasProps } from './ThreeCanvas';
2
+ export type ThreeWebGPUCanvasProps = Omit<ThreeCanvasProps, 'gl'>;
3
+ export declare const ThreeWebGPUCanvas: (props: ThreeWebGPUCanvasProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThreeWebGPUCanvas = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const fiber_1 = require("@react-three/fiber");
6
+ const react_1 = require("react");
7
+ const remotion_1 = require("remotion");
8
+ const webgpu_1 = require("three/webgpu");
9
+ const ThreeCanvas_1 = require("./ThreeCanvas");
10
+ const waitForGpu = async (renderer) => {
11
+ var _a, _b, _c;
12
+ await ((_c = (_b = (_a = renderer.backend) === null || _a === void 0 ? void 0 : _a.device) === null || _b === void 0 ? void 0 : _b.queue) === null || _c === void 0 ? void 0 : _c.onSubmittedWorkDone());
13
+ };
14
+ const WebGPUFrameRenderer = ({ onRendered }) => {
15
+ const { advance, camera, gl, scene } = (0, fiber_1.useThree)();
16
+ const frame = (0, remotion_1.useCurrentFrame)();
17
+ const { cancelRender, continueRender, delayRender } = (0, remotion_1.useDelayRender)();
18
+ const initializationPromise = (0, react_1.useRef)(null);
19
+ const frameDelayHandle = (0, react_1.useRef)(null);
20
+ (0, react_1.useLayoutEffect)(() => {
21
+ frameDelayHandle.current = delayRender(`Waiting for WebGPU to render frame ${frame}`);
22
+ return () => {
23
+ if (frameDelayHandle.current !== null) {
24
+ continueRender(frameDelayHandle.current);
25
+ frameDelayHandle.current = null;
26
+ }
27
+ };
28
+ }, [continueRender, delayRender, frame]);
29
+ (0, react_1.useEffect)(() => {
30
+ let cancelled = false;
31
+ const renderFrame = async () => {
32
+ var _a;
33
+ const renderer = gl;
34
+ if (!renderer.isWebGPURenderer) {
35
+ throw new Error('<ThreeWebGPUCanvas> expected a Three.js WebGPURenderer.');
36
+ }
37
+ (_a = initializationPromise.current) !== null && _a !== void 0 ? _a : (initializationPromise.current = (async () => {
38
+ await renderer.compileAsync(scene, camera);
39
+ // The first WebGPU render initializes material and lighting node bindings
40
+ // which compileAsync() alone does not make ready for frame capture.
41
+ await renderer.renderAsync(scene, camera);
42
+ await waitForGpu(renderer);
43
+ })());
44
+ await initializationPromise.current;
45
+ if (cancelled) {
46
+ return;
47
+ }
48
+ advance(performance.now());
49
+ await waitForGpu(renderer);
50
+ if (cancelled) {
51
+ return;
52
+ }
53
+ if (frameDelayHandle.current !== null) {
54
+ continueRender(frameDelayHandle.current);
55
+ frameDelayHandle.current = null;
56
+ }
57
+ onRendered();
58
+ };
59
+ renderFrame().catch((error) => {
60
+ if (!cancelled) {
61
+ cancelRender(error);
62
+ }
63
+ });
64
+ return () => {
65
+ cancelled = true;
66
+ };
67
+ }, [
68
+ advance,
69
+ camera,
70
+ cancelRender,
71
+ continueRender,
72
+ frame,
73
+ gl,
74
+ onRendered,
75
+ scene,
76
+ ]);
77
+ return null;
78
+ };
79
+ const createWebGPURenderer = async (props) => {
80
+ const renderer = new webgpu_1.WebGPURenderer({
81
+ alpha: props.alpha,
82
+ antialias: props.antialias,
83
+ canvas: props.canvas,
84
+ depth: props.depth,
85
+ logarithmicDepthBuffer: props.logarithmicDepthBuffer,
86
+ powerPreference: props.powerPreference === 'default' ? undefined : props.powerPreference,
87
+ stencil: props.stencil,
88
+ });
89
+ await renderer.init();
90
+ return renderer;
91
+ };
92
+ /*
93
+ * @description A wrapper for React Three Fiber's <Canvas /> which uses Three.js's WebGPURenderer and synchronizes with Remotion's useCurrentFrame().
94
+ * @see [Documentation](https://www.remotion.dev/docs/three-webgpu-canvas)
95
+ */
96
+ const ThreeWebGPUCanvas = (props) => {
97
+ return (jsx_runtime_1.jsx(ThreeCanvas_1.ThreeCanvasInternals, { ...props, gl: createWebGPURenderer, FrameRenderer: WebGPUFrameRenderer, advanceOnCreated: false }));
98
+ };
99
+ exports.ThreeWebGPUCanvas = ThreeWebGPUCanvas;
@@ -80,9 +80,7 @@ var Scale = ({
80
80
  }, [setSize, width, height, set]);
81
81
  return null;
82
82
  };
83
- var ManualFrameRenderer = ({
84
- onRendered
85
- }) => {
83
+ var ManualFrameRenderer = ({ onRendered }) => {
86
84
  const { advance } = useThree();
87
85
  const frame = useCurrentFrame();
88
86
  useEffect(() => {
@@ -91,8 +89,18 @@ var ManualFrameRenderer = ({
91
89
  }, [frame, advance, onRendered]);
92
90
  return null;
93
91
  };
94
- var ThreeCanvas = (props) => {
95
- const { children, width, height, style, frameloop, onCreated, ...rest } = props;
92
+ var ThreeCanvasInternals = (props) => {
93
+ const {
94
+ children,
95
+ width,
96
+ height,
97
+ style,
98
+ frameloop,
99
+ onCreated,
100
+ FrameRenderer,
101
+ advanceOnCreated,
102
+ ...rest
103
+ } = props;
96
104
  const { isRendering } = useRemotionEnvironment();
97
105
  const { delayRender, continueRender } = useDelayRender2();
98
106
  const contexts = Internals.useRemotionContexts();
@@ -107,12 +115,12 @@ var ThreeCanvas = (props) => {
107
115
  ...style
108
116
  };
109
117
  const remotion_onCreated = useCallback((state) => {
110
- if (isRendering) {
118
+ if (isRendering && advanceOnCreated) {
111
119
  state.advance(performance.now());
112
120
  }
113
121
  continueRender(waitForCreated);
114
122
  onCreated?.(state);
115
- }, [onCreated, waitForCreated, continueRender, isRendering]);
123
+ }, [onCreated, waitForCreated, continueRender, isRendering, advanceOnCreated]);
116
124
  useLayoutEffect2(() => {
117
125
  if (!isRendering || frame === 0) {
118
126
  return;
@@ -144,7 +152,7 @@ var ThreeCanvas = (props) => {
144
152
  /* @__PURE__ */ jsxs(Internals.RemotionContextProvider, {
145
153
  contexts,
146
154
  children: [
147
- isRendering && /* @__PURE__ */ jsx2(ManualFrameRenderer, {
155
+ isRendering && /* @__PURE__ */ jsx2(FrameRenderer, {
148
156
  onRendered: handleRendered
149
157
  }),
150
158
  children
@@ -154,6 +162,13 @@ var ThreeCanvas = (props) => {
154
162
  })
155
163
  });
156
164
  };
165
+ var ThreeCanvas = (props) => {
166
+ return /* @__PURE__ */ jsx2(ThreeCanvasInternals, {
167
+ ...props,
168
+ FrameRenderer: ManualFrameRenderer,
169
+ advanceOnCreated: true
170
+ });
171
+ };
157
172
  // src/use-offthread-video-texture.ts
158
173
  import { useCallback as useCallback2, useLayoutEffect as useLayoutEffect3, useMemo, useState as useState2 } from "react";
159
174
  import {
@@ -0,0 +1,269 @@
1
+ var __create = Object.create;
2
+ var __getProtoOf = Object.getPrototypeOf;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __toESM = (mod, isNodeMode, target) => {
7
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
8
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
9
+ for (let key of __getOwnPropNames(mod))
10
+ if (!__hasOwnProp.call(to, key))
11
+ __defProp(to, key, {
12
+ get: () => mod[key],
13
+ enumerable: true
14
+ });
15
+ return to;
16
+ };
17
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
18
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
19
+ }) : x)(function(x) {
20
+ if (typeof require !== "undefined")
21
+ return require.apply(this, arguments);
22
+ throw Error('Dynamic require of "' + x + '" is not supported');
23
+ });
24
+
25
+ // src/webgpu.tsx
26
+ import { useThree as useThree2 } from "@react-three/fiber";
27
+ import { useEffect as useEffect2, useLayoutEffect as useLayoutEffect3, useRef as useRef2 } from "react";
28
+ import { useCurrentFrame as useCurrentFrame2, useDelayRender as useDelayRender3 } from "remotion";
29
+ import { WebGPURenderer } from "three/webgpu";
30
+
31
+ // src/ThreeCanvas.tsx
32
+ import { Canvas, useThree } from "@react-three/fiber";
33
+ import {
34
+ useCallback,
35
+ useEffect,
36
+ useLayoutEffect as useLayoutEffect2,
37
+ useRef,
38
+ useState
39
+ } from "react";
40
+ import {
41
+ Internals,
42
+ useCurrentFrame,
43
+ useDelayRender as useDelayRender2,
44
+ useRemotionEnvironment
45
+ } from "remotion";
46
+
47
+ // src/SuspenseLoader.tsx
48
+ import { Suspense, useLayoutEffect } from "react";
49
+ import { useDelayRender } from "remotion";
50
+ import { jsx } from "react/jsx-runtime";
51
+ var Unblocker = () => {
52
+ const { delayRender, continueRender } = useDelayRender();
53
+ if (typeof document !== "undefined") {
54
+ useLayoutEffect(() => {
55
+ const handle = delayRender(`Waiting for <Suspense /> of <ThreeCanvas /> to resolve`);
56
+ return () => {
57
+ continueRender(handle);
58
+ };
59
+ }, [continueRender, delayRender]);
60
+ }
61
+ return null;
62
+ };
63
+ var SuspenseLoader = ({ children }) => {
64
+ return /* @__PURE__ */ jsx(Suspense, {
65
+ fallback: /* @__PURE__ */ jsx(Unblocker, {}),
66
+ children
67
+ });
68
+ };
69
+
70
+ // src/validate.ts
71
+ import { NoReactInternals } from "remotion/no-react";
72
+ var validateDimension = NoReactInternals.validateDimension;
73
+
74
+ // src/ThreeCanvas.tsx
75
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
76
+ var Scale = ({
77
+ width,
78
+ height
79
+ }) => {
80
+ const { set, setSize: threeSetSize } = useThree();
81
+ const [setSize] = useState(() => threeSetSize);
82
+ useLayoutEffect2(() => {
83
+ setSize(width, height);
84
+ set({ setSize: () => null });
85
+ return () => set({ setSize });
86
+ }, [setSize, width, height, set]);
87
+ return null;
88
+ };
89
+ var ManualFrameRenderer = ({ onRendered }) => {
90
+ const { advance } = useThree();
91
+ const frame = useCurrentFrame();
92
+ useEffect(() => {
93
+ advance(performance.now());
94
+ onRendered();
95
+ }, [frame, advance, onRendered]);
96
+ return null;
97
+ };
98
+ var ThreeCanvasInternals = (props) => {
99
+ const {
100
+ children,
101
+ width,
102
+ height,
103
+ style,
104
+ frameloop,
105
+ onCreated,
106
+ FrameRenderer,
107
+ advanceOnCreated,
108
+ ...rest
109
+ } = props;
110
+ const { isRendering } = useRemotionEnvironment();
111
+ const { delayRender, continueRender } = useDelayRender2();
112
+ const contexts = Internals.useRemotionContexts();
113
+ const frame = useCurrentFrame();
114
+ const [waitForCreated] = useState(() => delayRender("Waiting for <ThreeCanvas/> to be created"));
115
+ const frameDelayHandle = useRef(null);
116
+ validateDimension(width, "width", "of the <ThreeCanvas /> component");
117
+ validateDimension(height, "height", "of the <ThreeCanvas /> component");
118
+ const actualStyle = {
119
+ width,
120
+ height,
121
+ ...style
122
+ };
123
+ const remotion_onCreated = useCallback((state) => {
124
+ if (isRendering && advanceOnCreated) {
125
+ state.advance(performance.now());
126
+ }
127
+ continueRender(waitForCreated);
128
+ onCreated?.(state);
129
+ }, [onCreated, waitForCreated, continueRender, isRendering, advanceOnCreated]);
130
+ useLayoutEffect2(() => {
131
+ if (!isRendering || frame === 0) {
132
+ return;
133
+ }
134
+ frameDelayHandle.current = delayRender(`Waiting for R3F to render frame ${frame}`);
135
+ return () => {
136
+ if (frameDelayHandle.current !== null) {
137
+ continueRender(frameDelayHandle.current);
138
+ }
139
+ };
140
+ }, [frame, isRendering, delayRender, continueRender]);
141
+ const handleRendered = useCallback(() => {
142
+ if (frameDelayHandle.current !== null) {
143
+ continueRender(frameDelayHandle.current);
144
+ frameDelayHandle.current = null;
145
+ }
146
+ }, [continueRender]);
147
+ return /* @__PURE__ */ jsx2(SuspenseLoader, {
148
+ children: /* @__PURE__ */ jsxs(Canvas, {
149
+ style: actualStyle,
150
+ ...rest,
151
+ frameloop: isRendering ? "never" : frameloop ?? "always",
152
+ onCreated: remotion_onCreated,
153
+ children: [
154
+ /* @__PURE__ */ jsx2(Scale, {
155
+ width,
156
+ height
157
+ }),
158
+ /* @__PURE__ */ jsxs(Internals.RemotionContextProvider, {
159
+ contexts,
160
+ children: [
161
+ isRendering && /* @__PURE__ */ jsx2(FrameRenderer, {
162
+ onRendered: handleRendered
163
+ }),
164
+ children
165
+ ]
166
+ })
167
+ ]
168
+ })
169
+ });
170
+ };
171
+ var ThreeCanvas = (props) => {
172
+ return /* @__PURE__ */ jsx2(ThreeCanvasInternals, {
173
+ ...props,
174
+ FrameRenderer: ManualFrameRenderer,
175
+ advanceOnCreated: true
176
+ });
177
+ };
178
+
179
+ // src/webgpu.tsx
180
+ import { jsx as jsx3 } from "react/jsx-runtime";
181
+ var waitForGpu = async (renderer) => {
182
+ await renderer.backend?.device?.queue?.onSubmittedWorkDone();
183
+ };
184
+ var WebGPUFrameRenderer = ({ onRendered }) => {
185
+ const { advance, camera, gl, scene } = useThree2();
186
+ const frame = useCurrentFrame2();
187
+ const { cancelRender, continueRender, delayRender } = useDelayRender3();
188
+ const initializationPromise = useRef2(null);
189
+ const frameDelayHandle = useRef2(null);
190
+ useLayoutEffect3(() => {
191
+ frameDelayHandle.current = delayRender(`Waiting for WebGPU to render frame ${frame}`);
192
+ return () => {
193
+ if (frameDelayHandle.current !== null) {
194
+ continueRender(frameDelayHandle.current);
195
+ frameDelayHandle.current = null;
196
+ }
197
+ };
198
+ }, [continueRender, delayRender, frame]);
199
+ useEffect2(() => {
200
+ let cancelled = false;
201
+ const renderFrame = async () => {
202
+ const renderer = gl;
203
+ if (!renderer.isWebGPURenderer) {
204
+ throw new Error("<ThreeWebGPUCanvas> expected a Three.js WebGPURenderer.");
205
+ }
206
+ initializationPromise.current ??= (async () => {
207
+ await renderer.compileAsync(scene, camera);
208
+ await renderer.renderAsync(scene, camera);
209
+ await waitForGpu(renderer);
210
+ })();
211
+ await initializationPromise.current;
212
+ if (cancelled) {
213
+ return;
214
+ }
215
+ advance(performance.now());
216
+ await waitForGpu(renderer);
217
+ if (cancelled) {
218
+ return;
219
+ }
220
+ if (frameDelayHandle.current !== null) {
221
+ continueRender(frameDelayHandle.current);
222
+ frameDelayHandle.current = null;
223
+ }
224
+ onRendered();
225
+ };
226
+ renderFrame().catch((error) => {
227
+ if (!cancelled) {
228
+ cancelRender(error);
229
+ }
230
+ });
231
+ return () => {
232
+ cancelled = true;
233
+ };
234
+ }, [
235
+ advance,
236
+ camera,
237
+ cancelRender,
238
+ continueRender,
239
+ frame,
240
+ gl,
241
+ onRendered,
242
+ scene
243
+ ]);
244
+ return null;
245
+ };
246
+ var createWebGPURenderer = async (props) => {
247
+ const renderer = new WebGPURenderer({
248
+ alpha: props.alpha,
249
+ antialias: props.antialias,
250
+ canvas: props.canvas,
251
+ depth: props.depth,
252
+ logarithmicDepthBuffer: props.logarithmicDepthBuffer,
253
+ powerPreference: props.powerPreference === "default" ? undefined : props.powerPreference,
254
+ stencil: props.stencil
255
+ });
256
+ await renderer.init();
257
+ return renderer;
258
+ };
259
+ var ThreeWebGPUCanvas = (props) => {
260
+ return /* @__PURE__ */ jsx3(ThreeCanvasInternals, {
261
+ ...props,
262
+ gl: createWebGPURenderer,
263
+ FrameRenderer: WebGPUFrameRenderer,
264
+ advanceOnCreated: false
265
+ });
266
+ };
267
+ export {
268
+ ThreeWebGPUCanvas
269
+ };
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.501",
6
+ "version": "4.0.503",
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",
@@ -21,14 +21,14 @@
21
21
  "url": "https://github.com/remotion-dev/remotion/issues"
22
22
  },
23
23
  "dependencies": {
24
- "remotion": "4.0.501"
24
+ "remotion": "4.0.503"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "@react-three/fiber": ">=8.0.0",
28
28
  "react": ">=16.8.0",
29
29
  "react-dom": ">=16.8.0",
30
30
  "three": ">=0.137.0",
31
- "remotion": "4.0.501"
31
+ "remotion": "4.0.503"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@react-three/fiber": "9.2.0",
@@ -37,9 +37,9 @@
37
37
  "@types/web": "0.0.166",
38
38
  "react": "19.2.3",
39
39
  "react-dom": "19.2.3",
40
- "remotion": "4.0.501",
40
+ "remotion": "4.0.503",
41
41
  "three": "0.178.0",
42
- "@remotion/eslint-config-internal": "4.0.501",
42
+ "@remotion/eslint-config-internal": "4.0.503",
43
43
  "eslint": "9.19.0",
44
44
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
45
45
  },
@@ -61,6 +61,19 @@
61
61
  "module": "./dist/esm/index.mjs",
62
62
  "import": "./dist/esm/index.mjs",
63
63
  "require": "./dist/cjs/index.js"
64
+ },
65
+ "./webgpu": {
66
+ "types": "./dist/cjs/webgpu.d.ts",
67
+ "module": "./dist/esm/webgpu.mjs",
68
+ "import": "./dist/esm/webgpu.mjs",
69
+ "require": "./dist/cjs/webgpu.js"
70
+ }
71
+ },
72
+ "typesVersions": {
73
+ ">=1.0": {
74
+ "webgpu": [
75
+ "dist/cjs/webgpu.d.ts"
76
+ ]
64
77
  }
65
78
  },
66
79
  "homepage": "https://www.remotion.dev/docs/three"