@react-three/fiber 10.0.0-canary.8f5b4d3 → 10.0.0-canary.ac30da2
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/index.cjs +49 -33
- package/dist/index.d.cts +18 -1
- package/dist/index.d.mts +18 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.mjs +49 -33
- package/dist/legacy.cjs +48 -37
- package/dist/legacy.d.cts +17 -4
- package/dist/legacy.d.mts +17 -4
- package/dist/legacy.d.ts +17 -4
- package/dist/legacy.mjs +48 -37
- package/dist/webgpu/index.cjs +94 -59
- package/dist/webgpu/index.d.cts +40 -51
- package/dist/webgpu/index.d.mts +40 -51
- package/dist/webgpu/index.d.ts +40 -51
- package/dist/webgpu/index.mjs +94 -59
- package/package.json +3 -3
- package/readme.md +1 -1
- package/react-reconciler/constants.d.ts +0 -7
- package/react-reconciler/constants.js +0 -1
- package/react-reconciler/index.d.ts +0 -1044
- package/react-reconciler/index.js +0 -208
package/dist/webgpu/index.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as webgpu from 'three/webgpu';
|
|
2
2
|
import { CubeRenderTarget, RenderTarget, Frustum, Matrix4, Group, BoxGeometry, MeshBasicNodeMaterial, Mesh, Node, NodeUpdateType, Layers, ShaderMaterial, Uniform, SRGBColorSpace, RGBAFormat, UnsignedByteType, Vector3, Vector2, TextureLoader, Texture as Texture$1, CubeReflectionMapping, EquirectangularReflectionMapping, CubeTextureLoader, CanvasTarget, Raycaster, OrthographicCamera, PerspectiveCamera, Scene, PCFShadowMap, VSMShadowMap, BasicShadowMap, ACESFilmicToneMapping, WebGPURenderer, HalfFloatType, Color, Vector4, RenderPipeline } from 'three/webgpu';
|
|
3
|
-
import { Inspector } from 'three/addons/inspector/Inspector.js';
|
|
4
3
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
5
4
|
import * as React from 'react';
|
|
6
5
|
import React__default, { useRef, useMemo, useLayoutEffect, useEffect, useContext, useImperativeHandle, useCallback, useState } from 'react';
|
|
@@ -34,6 +33,10 @@ function _mergeNamespaces(n, m) {
|
|
|
34
33
|
|
|
35
34
|
const R3F_BUILD_LEGACY = false;
|
|
36
35
|
const R3F_BUILD_WEBGPU = true;
|
|
36
|
+
async function loadInspector() {
|
|
37
|
+
const { Inspector } = await import('three/addons/inspector/Inspector.js');
|
|
38
|
+
return Inspector;
|
|
39
|
+
}
|
|
37
40
|
const WebGLRenderer = class WebGLRenderer2 {
|
|
38
41
|
constructor() {
|
|
39
42
|
throw new Error(
|
|
@@ -47,13 +50,13 @@ const WebGLCubeRenderTarget = null;
|
|
|
47
50
|
const THREE = /*#__PURE__*/_mergeNamespaces({
|
|
48
51
|
__proto__: null,
|
|
49
52
|
CubeRenderTargetCompat: CubeRenderTarget,
|
|
50
|
-
Inspector: Inspector,
|
|
51
53
|
R3F_BUILD_LEGACY: R3F_BUILD_LEGACY,
|
|
52
54
|
R3F_BUILD_WEBGPU: R3F_BUILD_WEBGPU,
|
|
53
55
|
RenderTargetCompat: RenderTarget,
|
|
54
56
|
WebGLCubeRenderTarget: WebGLCubeRenderTarget,
|
|
55
57
|
WebGLRenderTarget: WebGLRenderTarget,
|
|
56
|
-
WebGLRenderer: WebGLRenderer
|
|
58
|
+
WebGLRenderer: WebGLRenderer,
|
|
59
|
+
loadInspector: loadInspector
|
|
57
60
|
}, [webgpu]);
|
|
58
61
|
|
|
59
62
|
const primaryRegistry = /* @__PURE__ */ new Map();
|
|
@@ -1051,17 +1054,10 @@ const createStore = (invalidate, advance) => {
|
|
|
1051
1054
|
oldSize = size;
|
|
1052
1055
|
oldDpr = viewport.dpr;
|
|
1053
1056
|
updateCamera(camera, size);
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
if (viewport.dpr > 0) actualRenderer.setPixelRatio(viewport.dpr);
|
|
1059
|
-
actualRenderer.setSize(size.width, size.height, false);
|
|
1060
|
-
if (canvasTarget) {
|
|
1061
|
-
if (viewport.dpr > 0) canvasTarget.setPixelRatio(viewport.dpr);
|
|
1062
|
-
canvasTarget.setSize(size.width, size.height, false);
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1057
|
+
const resizeTarget = canvasTarget ?? actualRenderer;
|
|
1058
|
+
if (viewport.dpr > 0) resizeTarget.setPixelRatio(viewport.dpr);
|
|
1059
|
+
resizeTarget.setSize(size.width, size.height, false);
|
|
1060
|
+
internal.canvasTargetSizeDirty = true;
|
|
1065
1061
|
}
|
|
1066
1062
|
if (camera !== oldCamera) {
|
|
1067
1063
|
oldCamera = camera;
|
|
@@ -1123,7 +1119,11 @@ function useLoader(loader, input, extensions, onProgress, cacheKey) {
|
|
|
1123
1119
|
const results = cacheKeys.map(
|
|
1124
1120
|
(key, index) => suspend(() => fn(loader, inputs[index]), [loader, key], { equal: is.equ })
|
|
1125
1121
|
);
|
|
1126
|
-
|
|
1122
|
+
const stableRef = useRef(null);
|
|
1123
|
+
const previous = stableRef.current;
|
|
1124
|
+
const stable = previous !== null && previous.length === results.length && previous.every((value, i) => value === results[i]) ? previous : results;
|
|
1125
|
+
stableRef.current = stable;
|
|
1126
|
+
return Array.isArray(input) ? stable : stable[0];
|
|
1127
1127
|
}
|
|
1128
1128
|
useLoader.preload = function(loader, input, extensions, onProgress, cacheKey) {
|
|
1129
1129
|
const inputs = Array.isArray(input) ? input : [input];
|
|
@@ -1138,7 +1138,7 @@ useLoader.clear = function(loader, input, cacheKey) {
|
|
|
1138
1138
|
};
|
|
1139
1139
|
useLoader.loader = getLoader$1;
|
|
1140
1140
|
|
|
1141
|
-
function useFrame(callback, priorityOrOptions) {
|
|
1141
|
+
function useFrame$1(callback, priorityOrOptions) {
|
|
1142
1142
|
const store = React.useContext(context);
|
|
1143
1143
|
const isInsideCanvas = store !== null;
|
|
1144
1144
|
const scheduler = getScheduler();
|
|
@@ -1288,6 +1288,11 @@ function getUrls(input) {
|
|
|
1288
1288
|
if (Array.isArray(input)) return input;
|
|
1289
1289
|
return Object.values(input);
|
|
1290
1290
|
}
|
|
1291
|
+
function inputSignature(input) {
|
|
1292
|
+
if (typeof input === "string") return input;
|
|
1293
|
+
if (Array.isArray(input)) return input.join("\0");
|
|
1294
|
+
return Object.keys(input).sort().map((key) => `${key}\0${input[key]}`).join("");
|
|
1295
|
+
}
|
|
1291
1296
|
function allUrlsCached(urls, textureCache) {
|
|
1292
1297
|
return urls.every((url) => textureCache.has(url));
|
|
1293
1298
|
}
|
|
@@ -1306,25 +1311,26 @@ function buildFromCache(input, textureCache) {
|
|
|
1306
1311
|
}
|
|
1307
1312
|
}
|
|
1308
1313
|
function useTexture(input, optionsOrOnLoad) {
|
|
1309
|
-
const renderer = useThree((state) => state.internal.actualRenderer);
|
|
1314
|
+
const renderer = useThree$1((state) => state.internal.actualRenderer);
|
|
1310
1315
|
const store = useStore();
|
|
1311
1316
|
const options = typeof optionsOrOnLoad === "function" ? { onLoad: optionsOrOnLoad } : optionsOrOnLoad ?? {};
|
|
1312
1317
|
const { onLoad, cache = true } = options;
|
|
1313
1318
|
const onLoadRef = useRef(onLoad);
|
|
1314
1319
|
onLoadRef.current = onLoad;
|
|
1315
1320
|
const onLoadCalledForRef = useRef(null);
|
|
1316
|
-
const
|
|
1321
|
+
const inputKey = useMemo(() => inputSignature(input), [input]);
|
|
1322
|
+
const stableInput = useMemo(() => input, [inputKey]);
|
|
1323
|
+
const urls = useMemo(() => getUrls(stableInput), [stableInput]);
|
|
1317
1324
|
const cachedResult = useMemo(() => {
|
|
1318
1325
|
if (!cache) return null;
|
|
1319
1326
|
const textures = store.getState().textures;
|
|
1320
1327
|
if (!allUrlsCached(urls, textures)) return null;
|
|
1321
|
-
return buildFromCache(
|
|
1322
|
-
}, [cache, urls,
|
|
1328
|
+
return buildFromCache(stableInput, textures);
|
|
1329
|
+
}, [cache, urls, stableInput, store]);
|
|
1323
1330
|
const loadedTextures = useLoader(
|
|
1324
1331
|
TextureLoader,
|
|
1325
|
-
IsObject(
|
|
1332
|
+
IsObject(stableInput) ? Object.values(stableInput) : stableInput
|
|
1326
1333
|
);
|
|
1327
|
-
const inputKey = urls.join("\0");
|
|
1328
1334
|
useLayoutEffect(() => {
|
|
1329
1335
|
if (cachedResult) return;
|
|
1330
1336
|
if (onLoadCalledForRef.current === inputKey) return;
|
|
@@ -1351,28 +1357,28 @@ function useTexture(input, optionsOrOnLoad) {
|
|
|
1351
1357
|
}, [renderer, loadedTextures, cachedResult]);
|
|
1352
1358
|
const mappedTextures = useMemo(() => {
|
|
1353
1359
|
if (cachedResult) return cachedResult;
|
|
1354
|
-
if (IsObject(
|
|
1360
|
+
if (IsObject(stableInput)) {
|
|
1355
1361
|
const keyed = {};
|
|
1356
1362
|
const textureArray = loadedTextures;
|
|
1357
1363
|
let i = 0;
|
|
1358
|
-
for (const key in
|
|
1364
|
+
for (const key in stableInput) keyed[key] = textureArray[i++];
|
|
1359
1365
|
return keyed;
|
|
1360
1366
|
} else {
|
|
1361
1367
|
return loadedTextures;
|
|
1362
1368
|
}
|
|
1363
|
-
}, [
|
|
1369
|
+
}, [stableInput, loadedTextures, cachedResult]);
|
|
1364
1370
|
useEffect(() => {
|
|
1365
1371
|
if (!cache) return;
|
|
1366
1372
|
const urlTextureMap = [];
|
|
1367
|
-
if (typeof
|
|
1368
|
-
urlTextureMap.push([
|
|
1369
|
-
} else if (Array.isArray(
|
|
1373
|
+
if (typeof stableInput === "string") {
|
|
1374
|
+
urlTextureMap.push([stableInput, mappedTextures]);
|
|
1375
|
+
} else if (Array.isArray(stableInput)) {
|
|
1370
1376
|
const textureArray = mappedTextures;
|
|
1371
|
-
|
|
1372
|
-
} else if (IsObject(
|
|
1377
|
+
stableInput.forEach((url, i) => urlTextureMap.push([url, textureArray[i]]));
|
|
1378
|
+
} else if (IsObject(stableInput)) {
|
|
1373
1379
|
const textureRecord = mappedTextures;
|
|
1374
|
-
for (const key in
|
|
1375
|
-
const url =
|
|
1380
|
+
for (const key in stableInput) {
|
|
1381
|
+
const url = stableInput[key];
|
|
1376
1382
|
urlTextureMap.push([url, textureRecord[key]]);
|
|
1377
1383
|
}
|
|
1378
1384
|
}
|
|
@@ -1401,7 +1407,7 @@ function useTexture(input, optionsOrOnLoad) {
|
|
|
1401
1407
|
}
|
|
1402
1408
|
return { _textureRefs: refs };
|
|
1403
1409
|
});
|
|
1404
|
-
}, [cache,
|
|
1410
|
+
}, [cache, stableInput, mappedTextures, store]);
|
|
1405
1411
|
return mappedTextures;
|
|
1406
1412
|
}
|
|
1407
1413
|
useTexture.preload = (url) => useLoader.preload(TextureLoader, url);
|
|
@@ -1472,13 +1478,13 @@ function useTextures(selector) {
|
|
|
1472
1478
|
};
|
|
1473
1479
|
}, [store]);
|
|
1474
1480
|
const subscribe = selector ? () => selector(registry) : (state) => state.textures;
|
|
1475
|
-
const selected = useThree(subscribe);
|
|
1481
|
+
const selected = useThree$1(subscribe);
|
|
1476
1482
|
return selector ? selected : registry;
|
|
1477
1483
|
}
|
|
1478
1484
|
|
|
1479
1485
|
function useRenderTarget(widthOrOptions, heightOrOptions, options) {
|
|
1480
|
-
const isLegacy = useThree((s) => s.isLegacy);
|
|
1481
|
-
const size = useThree((s) => s.size);
|
|
1486
|
+
const isLegacy = useThree$1((s) => s.isLegacy);
|
|
1487
|
+
const size = useThree$1((s) => s.size);
|
|
1482
1488
|
let width;
|
|
1483
1489
|
let height;
|
|
1484
1490
|
let opts;
|
|
@@ -1535,7 +1541,7 @@ function useEnvironment({
|
|
|
1535
1541
|
const { extension, isCubemap } = getExtension(files);
|
|
1536
1542
|
const loader = getLoader(extension);
|
|
1537
1543
|
if (!loader) throw new Error("useEnvironment: Unrecognized file extension: " + files);
|
|
1538
|
-
const renderer = useThree((state) => state.renderer);
|
|
1544
|
+
const renderer = useThree$1((state) => state.renderer);
|
|
1539
1545
|
useLayoutEffect(() => {
|
|
1540
1546
|
if (extension !== "webp" && extension !== "jpg" && extension !== "jpeg") return;
|
|
1541
1547
|
function clearGainmapTexture() {
|
|
@@ -1628,7 +1634,7 @@ function useStore() {
|
|
|
1628
1634
|
if (!store) throw new Error("R3F: Hooks can only be used within the Canvas component!");
|
|
1629
1635
|
return store;
|
|
1630
1636
|
}
|
|
1631
|
-
function useThree(selector = (state) => state, equalityFn) {
|
|
1637
|
+
function useThree$1(selector = (state) => state, equalityFn) {
|
|
1632
1638
|
return useStore()(selector, equalityFn);
|
|
1633
1639
|
}
|
|
1634
1640
|
function useInstanceHandle(ref) {
|
|
@@ -12959,7 +12965,10 @@ function releaseInternalPointerCapture(internal, obj, pointerId) {
|
|
|
12959
12965
|
const captureData = pointerState.captured.get(obj);
|
|
12960
12966
|
if (captureData) {
|
|
12961
12967
|
pointerState.captured.delete(obj);
|
|
12962
|
-
|
|
12968
|
+
try {
|
|
12969
|
+
captureData.target.releasePointerCapture?.(pointerId);
|
|
12970
|
+
} catch {
|
|
12971
|
+
}
|
|
12963
12972
|
}
|
|
12964
12973
|
}
|
|
12965
12974
|
function swapInteractivity(store, object, newObject) {
|
|
@@ -13053,7 +13062,9 @@ function createEvents(store) {
|
|
|
13053
13062
|
state2.events.compute?.(event, state2, state2.previousRoot?.getState());
|
|
13054
13063
|
if (state2.raycaster.camera === void 0) state2.raycaster.camera = null;
|
|
13055
13064
|
}
|
|
13056
|
-
|
|
13065
|
+
if (!state2.raycaster.camera) return [];
|
|
13066
|
+
obj.updateWorldMatrix(true, true);
|
|
13067
|
+
return state2.raycaster.intersectObject(obj, true);
|
|
13057
13068
|
}
|
|
13058
13069
|
let hits = eventsObjects.flatMap(handleRaycast).sort((a, b) => {
|
|
13059
13070
|
const aInteractivePriority = a.object.userData?.interactivePriority;
|
|
@@ -14410,6 +14421,10 @@ function createRoot(canvas) {
|
|
|
14410
14421
|
if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
|
|
14411
14422
|
const renderer2 = state2.internal.actualRenderer;
|
|
14412
14423
|
renderer2.setCanvasTarget(state2.internal.canvasTarget);
|
|
14424
|
+
if (state2.internal.canvasTargetSizeDirty) {
|
|
14425
|
+
state2.internal.canvasTargetSizeDirty = false;
|
|
14426
|
+
renderer2.backend?.updateSize?.();
|
|
14427
|
+
}
|
|
14413
14428
|
}
|
|
14414
14429
|
},
|
|
14415
14430
|
{
|
|
@@ -14714,7 +14729,7 @@ function setEnvProps(background, scene, defaultScene, texture, sceneProps = {})
|
|
|
14714
14729
|
};
|
|
14715
14730
|
}
|
|
14716
14731
|
function EnvironmentMap({ scene, background = false, map, ...config }) {
|
|
14717
|
-
const defaultScene = useThree((state) => state.scene);
|
|
14732
|
+
const defaultScene = useThree$1((state) => state.scene);
|
|
14718
14733
|
React.useLayoutEffect(() => {
|
|
14719
14734
|
if (map) return setEnvProps(background, scene, defaultScene, map, config);
|
|
14720
14735
|
});
|
|
@@ -14732,7 +14747,7 @@ function EnvironmentCube({
|
|
|
14732
14747
|
...rest
|
|
14733
14748
|
}) {
|
|
14734
14749
|
const texture = useEnvironment(rest);
|
|
14735
|
-
const defaultScene = useThree((state) => state.scene);
|
|
14750
|
+
const defaultScene = useThree$1((state) => state.scene);
|
|
14736
14751
|
React.useLayoutEffect(() => {
|
|
14737
14752
|
return setEnvProps(background, scene, defaultScene, texture, {
|
|
14738
14753
|
backgroundBlurriness: blur ?? backgroundBlurriness,
|
|
@@ -14769,9 +14784,9 @@ function EnvironmentPortal({
|
|
|
14769
14784
|
preset = void 0,
|
|
14770
14785
|
extensions
|
|
14771
14786
|
}) {
|
|
14772
|
-
const renderer = useThree((state) => state.renderer);
|
|
14773
|
-
const isLegacy = useThree((state) => state.isLegacy);
|
|
14774
|
-
const defaultScene = useThree((state) => state.scene);
|
|
14787
|
+
const renderer = useThree$1((state) => state.renderer);
|
|
14788
|
+
const isLegacy = useThree$1((state) => state.isLegacy);
|
|
14789
|
+
const defaultScene = useThree$1((state) => state.scene);
|
|
14775
14790
|
const camera = React.useRef(null);
|
|
14776
14791
|
const [virtualScene] = React.useState(() => new Scene());
|
|
14777
14792
|
const fbo = React.useMemo(() => {
|
|
@@ -14815,7 +14830,7 @@ function EnvironmentPortal({
|
|
|
14815
14830
|
environmentRotation
|
|
14816
14831
|
]);
|
|
14817
14832
|
let count = 1;
|
|
14818
|
-
useFrame(() => {
|
|
14833
|
+
useFrame$1(() => {
|
|
14819
14834
|
if (frames === Infinity || count < frames) {
|
|
14820
14835
|
const autoClear = renderer.autoClear;
|
|
14821
14836
|
renderer.autoClear = true;
|
|
@@ -14855,7 +14870,7 @@ function EnvironmentGround(props) {
|
|
|
14855
14870
|
] });
|
|
14856
14871
|
}
|
|
14857
14872
|
function EnvironmentColor({ color, scene }) {
|
|
14858
|
-
const defaultScene = useThree((state) => state.scene);
|
|
14873
|
+
const defaultScene = useThree$1((state) => state.scene);
|
|
14859
14874
|
React.useLayoutEffect(() => {
|
|
14860
14875
|
if (color === void 0) return;
|
|
14861
14876
|
const target = resolveScene(scene || defaultScene);
|
|
@@ -15239,6 +15254,7 @@ function CanvasImpl({
|
|
|
15239
15254
|
const canvas = canvasRef.current;
|
|
15240
15255
|
if (canvas) {
|
|
15241
15256
|
return () => {
|
|
15257
|
+
if (canvas.isConnected) return;
|
|
15242
15258
|
unmountComponentAtNode(canvas);
|
|
15243
15259
|
root.current = null;
|
|
15244
15260
|
};
|
|
@@ -15449,6 +15465,11 @@ function createTextureOperations(set) {
|
|
|
15449
15465
|
removeMultiple: (keys) => removeTextures(set, keys)
|
|
15450
15466
|
};
|
|
15451
15467
|
}
|
|
15468
|
+
function scopedNodeName(scope, name) {
|
|
15469
|
+
const raw = scope ? `${scope}_${name}` : name;
|
|
15470
|
+
const safe = raw.replace(/[^A-Za-z0-9_]/g, "_");
|
|
15471
|
+
return /^[A-Za-z_]/.test(safe) ? safe : `_${safe}`;
|
|
15472
|
+
}
|
|
15452
15473
|
function extractTSLValue(value) {
|
|
15453
15474
|
if (value === null || value === void 0) return value;
|
|
15454
15475
|
if (typeof value !== "object") return value;
|
|
@@ -15647,8 +15668,7 @@ function createUniform(inName, node, scope) {
|
|
|
15647
15668
|
const inValue = vectorize(node);
|
|
15648
15669
|
const newUniform = uniform(inValue);
|
|
15649
15670
|
if (typeof newUniform.setName === "function") {
|
|
15650
|
-
|
|
15651
|
-
newUniform.setName(name);
|
|
15671
|
+
newUniform.setName(scopedNodeName(scope, inName));
|
|
15652
15672
|
}
|
|
15653
15673
|
return newUniform;
|
|
15654
15674
|
}
|
|
@@ -15747,7 +15767,7 @@ function useNodes(creatorOrScope, scope) {
|
|
|
15747
15767
|
return creatorOrScope(createLazyCreatorState(store.getState(), store));
|
|
15748
15768
|
},
|
|
15749
15769
|
prepare: (name, node) => {
|
|
15750
|
-
node.setName?.(scope
|
|
15770
|
+
node.setName?.(scopedNodeName(scope, name));
|
|
15751
15771
|
return node;
|
|
15752
15772
|
}
|
|
15753
15773
|
});
|
|
@@ -15856,7 +15876,7 @@ function useBuffers(creatorOrScope, scope) {
|
|
|
15856
15876
|
},
|
|
15857
15877
|
prepare: (name, buffer) => {
|
|
15858
15878
|
if ("setName" in buffer && typeof buffer.setName === "function") {
|
|
15859
|
-
buffer.setName(scope
|
|
15879
|
+
buffer.setName(scopedNodeName(scope, name));
|
|
15860
15880
|
}
|
|
15861
15881
|
return buffer;
|
|
15862
15882
|
}
|
|
@@ -15927,7 +15947,7 @@ function useGPUStorage(creatorOrScope, scope) {
|
|
|
15927
15947
|
return creatorOrScope(createLazyCreatorState(store.getState(), store));
|
|
15928
15948
|
},
|
|
15929
15949
|
prepare: (name, storage) => {
|
|
15930
|
-
const label = scope
|
|
15950
|
+
const label = scopedNodeName(scope, name);
|
|
15931
15951
|
if ("setName" in storage && typeof storage.setName === "function") {
|
|
15932
15952
|
storage.setName(label);
|
|
15933
15953
|
}
|
|
@@ -15958,9 +15978,10 @@ function rebuildAllStorage(store, scope) {
|
|
|
15958
15978
|
|
|
15959
15979
|
function useRenderPipeline(mainCB, setupCB) {
|
|
15960
15980
|
const store = useStore();
|
|
15961
|
-
const { scene, camera, renderer, isLegacy } = useThree();
|
|
15981
|
+
const { scene, camera, renderer, isLegacy } = useThree$1();
|
|
15962
15982
|
const callbacksRanRef = useRef(false);
|
|
15963
15983
|
const scenePassCacheRef = useRef(null);
|
|
15984
|
+
const forceScenePassRebuildRef = useRef(false);
|
|
15964
15985
|
const mainCBRef = useRef(mainCB);
|
|
15965
15986
|
const setupCBRef = useRef(setupCB);
|
|
15966
15987
|
mainCBRef.current = mainCB;
|
|
@@ -15968,7 +15989,7 @@ function useRenderPipeline(mainCB, setupCB) {
|
|
|
15968
15989
|
const [rebuildVersion, setRebuildVersion] = useState(0);
|
|
15969
15990
|
useEffect(() => {
|
|
15970
15991
|
callbacksRanRef.current = false;
|
|
15971
|
-
|
|
15992
|
+
forceScenePassRebuildRef.current = true;
|
|
15972
15993
|
}, []);
|
|
15973
15994
|
const clearPasses = useCallback(() => {
|
|
15974
15995
|
store.setState({ passes: {} });
|
|
@@ -15978,12 +15999,14 @@ function useRenderPipeline(mainCB, setupCB) {
|
|
|
15978
15999
|
renderPipeline: null,
|
|
15979
16000
|
passes: {}
|
|
15980
16001
|
});
|
|
16002
|
+
scenePassCacheRef.current?.scenePass?.dispose?.();
|
|
15981
16003
|
callbacksRanRef.current = false;
|
|
15982
16004
|
scenePassCacheRef.current = null;
|
|
16005
|
+
forceScenePassRebuildRef.current = false;
|
|
15983
16006
|
}, [store]);
|
|
15984
16007
|
const rebuild = useCallback(() => {
|
|
15985
16008
|
callbacksRanRef.current = false;
|
|
15986
|
-
|
|
16009
|
+
forceScenePassRebuildRef.current = true;
|
|
15987
16010
|
setRebuildVersion((v) => v + 1);
|
|
15988
16011
|
}, []);
|
|
15989
16012
|
useLayoutEffect(() => {
|
|
@@ -16001,16 +16024,23 @@ function useRenderPipeline(mainCB, setupCB) {
|
|
|
16001
16024
|
pipeline = new RenderPipeline(renderer);
|
|
16002
16025
|
justCreatedPipeline = true;
|
|
16003
16026
|
}
|
|
16004
|
-
const cacheValid = scenePassCacheRef.current && scenePassCacheRef.current.sceneUuid === scene.uuid && scenePassCacheRef.current.cameraUuid === camera.uuid;
|
|
16027
|
+
const cacheValid = !forceScenePassRebuildRef.current && scenePassCacheRef.current && scenePassCacheRef.current.sceneUuid === scene.uuid && scenePassCacheRef.current.cameraUuid === camera.uuid;
|
|
16028
|
+
let outgoingScenePass = null;
|
|
16005
16029
|
let scenePass;
|
|
16006
16030
|
if (cacheValid) {
|
|
16007
16031
|
scenePass = scenePassCacheRef.current.scenePass;
|
|
16008
16032
|
} else {
|
|
16033
|
+
outgoingScenePass = scenePassCacheRef.current?.scenePass ?? null;
|
|
16009
16034
|
scenePass = pass(scene, camera);
|
|
16010
16035
|
scenePassCacheRef.current = { sceneUuid: scene.uuid, cameraUuid: camera.uuid, scenePass };
|
|
16036
|
+
forceScenePassRebuildRef.current = false;
|
|
16011
16037
|
}
|
|
16012
16038
|
currentPasses.scenePass = scenePass;
|
|
16013
|
-
|
|
16039
|
+
let outputNodeChanged = false;
|
|
16040
|
+
if (!pipeline.outputNode || justCreatedPipeline || pipeline.outputNode === outgoingScenePass) {
|
|
16041
|
+
pipeline.outputNode = scenePass;
|
|
16042
|
+
outputNodeChanged = true;
|
|
16043
|
+
}
|
|
16014
16044
|
set({ renderPipeline: pipeline, passes: currentPasses });
|
|
16015
16045
|
const shouldRunCallbacks = justCreatedPipeline || !callbacksRanRef.current || !cacheValid;
|
|
16016
16046
|
if (shouldRunCallbacks) {
|
|
@@ -16030,14 +16060,17 @@ function useRenderPipeline(mainCB, setupCB) {
|
|
|
16030
16060
|
set({ passes: currentPasses });
|
|
16031
16061
|
}
|
|
16032
16062
|
}
|
|
16063
|
+
outputNodeChanged = true;
|
|
16033
16064
|
callbacksRanRef.current = true;
|
|
16034
16065
|
}
|
|
16066
|
+
if (outputNodeChanged) pipeline.needsUpdate = true;
|
|
16067
|
+
if (outgoingScenePass && outgoingScenePass !== scenePass) outgoingScenePass.dispose?.();
|
|
16035
16068
|
} catch (error) {
|
|
16036
16069
|
console.warn("[useRenderPipeline] Setup failed; the render pipeline was not configured:", error);
|
|
16037
16070
|
}
|
|
16038
16071
|
}, [store, renderer, scene, camera, isLegacy, rebuildVersion]);
|
|
16039
|
-
const passes = useThree((s) => s.passes);
|
|
16040
|
-
const renderPipeline = useThree((s) => s.renderPipeline);
|
|
16072
|
+
const passes = useThree$1((s) => s.passes);
|
|
16073
|
+
const renderPipeline = useThree$1((s) => s.renderPipeline);
|
|
16041
16074
|
return {
|
|
16042
16075
|
passes,
|
|
16043
16076
|
renderPipeline,
|
|
@@ -16050,5 +16083,7 @@ function useRenderPipeline(mainCB, setupCB) {
|
|
|
16050
16083
|
}
|
|
16051
16084
|
|
|
16052
16085
|
extend(THREE);
|
|
16086
|
+
const useThree = useThree$1;
|
|
16087
|
+
const useFrame = useFrame$1;
|
|
16053
16088
|
|
|
16054
16089
|
export { Block, Canvas, Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal, ErrorBoundary, FROM_REF, IsObject, ONCE, Portal, R3F_BUILD_LEGACY, R3F_BUILD_WEBGPU, REACT_INTERNAL_PROPS, RESERVED_PROPS, Texture, _roots, addAfterEffect, addEffect, addTail, advance, applyProps, attach, buildGraph, calculateDpr, clearNodeScope, clearRootNodes, clearRootUniforms, clearScope, context, createEvents, createPointerEvents, createPortal, createRoot, createScopedStore, createStore, createTextureOperations, detach, diffProps, dispose, createPointerEvents as events, extend, findInitialRoot, flushSync, fromRef, getInstanceProps, getPrimary, getPrimaryIds, getRootState, getUuidPrefix, hasConstructor, hasPrimary, invalidate, invalidateInstance, is, isColorRepresentation, isCopyable, isFromRef, isObject3D, isOnce, isOrthographicCamera, isRef$1 as isRef, isRenderer, isTexture, isVectorLike, once, prepare, presetsObj, rebuildAllBuffers, rebuildAllNodes, rebuildAllStorage, rebuildAllUniforms, reconciler, registerPrimary, removeInteractivity, removeNodes, removeUniforms, resolve, swapInteractivity, unmountComponentAtNode, unregisterPrimary, updateCamera, updateFrustum, useBridge, useBuffers, useEnvironment, useFrame, useGPUStorage, useGraph, useInstanceHandle, useIsomorphicLayoutEffect, useLoader, useLocalNodes, useMutableCallback, useNodes, useRenderPipeline, useRenderTarget, useStore, useTexture, useTextures, useThree, useUniform, useUniforms, waitForPrimary };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-three/fiber",
|
|
3
|
-
"version": "10.0.0-canary.
|
|
3
|
+
"version": "10.0.0-canary.ac30da2",
|
|
4
4
|
"description": "A React renderer for Threejs",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -35,7 +35,6 @@
|
|
|
35
35
|
"sideEffects": false,
|
|
36
36
|
"files": [
|
|
37
37
|
"dist",
|
|
38
|
-
"react-reconciler",
|
|
39
38
|
"readme.md"
|
|
40
39
|
],
|
|
41
40
|
"exports": {
|
|
@@ -53,7 +52,8 @@
|
|
|
53
52
|
"types": "./dist/webgpu/index.d.ts",
|
|
54
53
|
"import": "./dist/webgpu/index.mjs",
|
|
55
54
|
"require": "./dist/webgpu/index.cjs"
|
|
56
|
-
}
|
|
55
|
+
},
|
|
56
|
+
"./package.json": "./package.json"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"@babel/runtime": "^7.28.6",
|
package/readme.md
CHANGED
|
@@ -143,7 +143,7 @@ Live demo: https://codesandbox.io/s/icy-tree-brnsm?file=/src/App.tsx
|
|
|
143
143
|
<details>
|
|
144
144
|
<summary>Show React Native example</summary>
|
|
145
145
|
|
|
146
|
-
This example
|
|
146
|
+
This example uses `expo-cli`, but you can create a bare project with their template or with the `react-native` CLI.
|
|
147
147
|
|
|
148
148
|
```bash
|
|
149
149
|
# Install expo-cli, this will create our app
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export const DiscreteEventPriority = 0b0000000000000000000000000000001;
|
|
2
|
-
export const ContinuousEventPriority = 0b0000000000000000000000000000100;
|
|
3
|
-
export const DefaultEventPriority = 0b0000000000000000000000000010000;
|
|
4
|
-
export const IdleEventPriority = 0b0100000000000000000000000000000;
|
|
5
|
-
export const LegacyRoot = 0;
|
|
6
|
-
export const ConcurrentRoot = 1;
|
|
7
|
-
export const NoEventPriority = 0;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const t=1,o=8,r=32,e=2,i=268435456,n=0,s=0;export{t as ConcurrentRoot,o as ContinuousEventPriority,r as DefaultEventPriority,e as DiscreteEventPriority,i as IdleEventPriority,n as LegacyRoot,s as NoEventPriority};
|