@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.
- package/dist/cjs/ThreeCanvas.d.ts +9 -0
- package/dist/cjs/ThreeCanvas.js +15 -11
- package/dist/cjs/webgpu.d.ts +3 -0
- package/dist/cjs/webgpu.js +99 -0
- package/dist/esm/index.mjs +23 -8
- package/dist/esm/webgpu.mjs +269 -0
- package/package.json +18 -5
|
@@ -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 {};
|
package/dist/cjs/ThreeCanvas.js
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
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,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;
|
package/dist/esm/index.mjs
CHANGED
|
@@ -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
|
|
95
|
-
const {
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
40
|
+
"remotion": "4.0.503",
|
|
41
41
|
"three": "0.178.0",
|
|
42
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
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"
|