@react-three/fiber 10.0.0-canary.07c4f9d → 10.0.0-canary.0ea97c0

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.
@@ -612,7 +612,12 @@ function diffProps(instance, newProps) {
612
612
  const changedProps = {};
613
613
  for (const prop in newProps) {
614
614
  if (RESERVED_PROPS.includes(prop)) continue;
615
- if (is.equ(newProps[prop], instance.props[prop])) continue;
615
+ if (is.equ(newProps[prop], instance.props[prop])) {
616
+ const value = newProps[prop];
617
+ if (!isCopyable(value)) continue;
618
+ const { target } = resolve(instance.object, prop);
619
+ if (!isCopyable(target) || target.constructor !== value.constructor) continue;
620
+ }
616
621
  changedProps[prop] = newProps[prop];
617
622
  for (const other in newProps) {
618
623
  if (other.startsWith(`${prop}-`)) changedProps[other] = newProps[other];
@@ -1058,7 +1063,8 @@ const createStore = (invalidate, advance) => {
1058
1063
  const resizeTarget = canvasTarget ?? actualRenderer;
1059
1064
  if (viewport.dpr > 0) resizeTarget.setPixelRatio(viewport.dpr);
1060
1065
  resizeTarget.setSize(size.width, size.height, false);
1061
- internal.canvasTargetSizeDirty = true;
1066
+ const activeTarget = actualRenderer.getCanvasTarget?.();
1067
+ if (!canvasTarget || activeTarget !== canvasTarget) internal.canvasTargetSizeDirty = true;
1062
1068
  }
1063
1069
  if (camera !== oldCamera) {
1064
1070
  oldCamera = camera;
@@ -14220,9 +14226,8 @@ function createRoot(canvas) {
14220
14226
  if (!renderer.hasInitialized?.()) {
14221
14227
  const size2 = computeInitialSize(canvas, propsSize);
14222
14228
  if (size2.width > 0 && size2.height > 0) {
14223
- const pixelRatio = calculateDpr(dpr);
14224
- canvas.width = size2.width * pixelRatio;
14225
- canvas.height = size2.height * pixelRatio;
14229
+ renderer.setPixelRatio(calculateDpr(dpr));
14230
+ renderer.setSize(size2.width, size2.height, false);
14226
14231
  }
14227
14232
  await renderer.init();
14228
14233
  }
@@ -14231,7 +14236,7 @@ function createRoot(canvas) {
14231
14236
  state.internal.actualRenderer = renderer;
14232
14237
  state.set({ webGPUSupported: isWebGPUBackend, renderer, primaryStore: store });
14233
14238
  if (canvasId && !state.internal.isSecondary) {
14234
- const canvasTarget = new CanvasTarget(canvas);
14239
+ const canvasTarget = renderer.getCanvasTarget?.();
14235
14240
  const unregisterPrimary = registerPrimary(canvasId, renderer, store);
14236
14241
  state.set((prev) => ({
14237
14242
  internal: {
@@ -14444,9 +14449,10 @@ function createRoot(canvas) {
14444
14449
  const unregisterCanvasTarget = scheduler.register(
14445
14450
  () => {
14446
14451
  const state2 = store.getState();
14447
- if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
14452
+ const canvasTarget = state2.internal.canvasTarget;
14453
+ if (canvasTarget) {
14448
14454
  const renderer2 = state2.internal.actualRenderer;
14449
- renderer2.setCanvasTarget(state2.internal.canvasTarget);
14455
+ if (renderer2.getCanvasTarget() !== canvasTarget) renderer2.setCanvasTarget(canvasTarget);
14450
14456
  if (state2.internal.canvasTargetSizeDirty) {
14451
14457
  state2.internal.canvasTargetSizeDirty = false;
14452
14458
  renderer2.backend?.updateSize?.();
@@ -14610,7 +14616,7 @@ function unmountComponentAtNode(canvas, callback) {
14610
14616
  const unregisterPrimary = state.internal.unregisterPrimary;
14611
14617
  if (unregisterPrimary) unregisterPrimary();
14612
14618
  const canvasTarget = state.internal.canvasTarget;
14613
- if (canvasTarget?.dispose) canvasTarget.dispose();
14619
+ if (state.internal.isSecondary && canvasTarget?.dispose) canvasTarget.dispose();
14614
14620
  state.events.disconnect?.();
14615
14621
  cleanupHelperGroup(root.store);
14616
14622
  if (state.isLegacy && renderer) {
@@ -15151,9 +15157,9 @@ function CanvasImpl({
15151
15157
  React.useMemo(() => extend(THREE), []);
15152
15158
  const Bridge = useBridge();
15153
15159
  const backgroundProps = React.useMemo(() => parseBackground(background), [background]);
15154
- const hasInitialSizeRef = React.useRef(false);
15160
+ const [hasInitialSize, setHasInitialSize] = React.useState(false);
15155
15161
  const measureConfig = React.useMemo(() => {
15156
- if (!hasInitialSizeRef.current) {
15162
+ if (!hasInitialSize) {
15157
15163
  return {
15158
15164
  ...resize,
15159
15165
  scroll: resize?.scroll ?? true,
@@ -15165,7 +15171,7 @@ function CanvasImpl({
15165
15171
  debounce: { scroll: 50, resize: 0 },
15166
15172
  ...resize
15167
15173
  };
15168
- }, [resize, hasInitialSizeRef.current]);
15174
+ }, [hasInitialSize, resize]);
15169
15175
  const [containerRef, containerRect] = useMeasure(measureConfig);
15170
15176
  const effectiveSize = React.useMemo(() => {
15171
15177
  let w = width ?? containerRect.width;
@@ -15181,9 +15187,7 @@ function CanvasImpl({
15181
15187
  left: containerRect.left
15182
15188
  };
15183
15189
  }, [width, height, containerRect, forceEven]);
15184
- if (!hasInitialSizeRef.current && effectiveSize.width > 0 && effectiveSize.height > 0) {
15185
- hasInitialSizeRef.current = true;
15186
- }
15190
+ if (!hasInitialSize && effectiveSize.width > 0 && effectiveSize.height > 0) setHasInitialSize(true);
15187
15191
  const canvasRef = React.useRef(null);
15188
15192
  const divRef = React.useRef(null);
15189
15193
  React.useImperativeHandle(ref, () => canvasRef.current);
@@ -16042,7 +16046,7 @@ function useRenderPipeline(mainCB, setupCB) {
16042
16046
  renderPipeline: null,
16043
16047
  passes: {}
16044
16048
  });
16045
- scenePassCacheRef.current?.scenePass?.dispose?.();
16049
+ scenePassCacheRef.current?.scenePass.dispose();
16046
16050
  callbacksRanRef.current = false;
16047
16051
  scenePassCacheRef.current = null;
16048
16052
  forceScenePassRebuildRef.current = false;
@@ -16057,6 +16061,9 @@ function useRenderPipeline(mainCB, setupCB) {
16057
16061
  throw new Error("useRenderPipeline is only available with WebGPU renderer. Set renderer prop on Canvas.");
16058
16062
  }
16059
16063
  if (!renderer || !scene || !camera) return;
16064
+ if (!("isWebGPURenderer" in renderer)) {
16065
+ throw new Error("useRenderPipeline: renderer is not a WebGPURenderer but isLegacy is false.");
16066
+ }
16060
16067
  const state = store.getState();
16061
16068
  const set = store.setState;
16062
16069
  try {
@@ -16090,7 +16097,9 @@ function useRenderPipeline(mainCB, setupCB) {
16090
16097
  if (setupCBRef.current) {
16091
16098
  const freshState = Object.assign({}, store.getState(), {
16092
16099
  renderPipeline: pipeline,
16093
- passes: currentPasses
16100
+ passes: { ...currentPasses, scenePass },
16101
+ renderer,
16102
+ isLegacy: false
16094
16103
  });
16095
16104
  const setupResult = setupCBRef.current(freshState);
16096
16105
  if (setupResult && typeof setupResult === "object") {
@@ -16101,7 +16110,9 @@ function useRenderPipeline(mainCB, setupCB) {
16101
16110
  if (mainCBRef.current) {
16102
16111
  const freshState = Object.assign({}, store.getState(), {
16103
16112
  renderPipeline: pipeline,
16104
- passes: currentPasses
16113
+ passes: { ...currentPasses, scenePass },
16114
+ renderer,
16115
+ isLegacy: false
16105
16116
  });
16106
16117
  const mainResult = mainCBRef.current(freshState);
16107
16118
  if (mainResult && typeof mainResult === "object") {
@@ -16113,22 +16124,16 @@ function useRenderPipeline(mainCB, setupCB) {
16113
16124
  callbacksRanRef.current = true;
16114
16125
  }
16115
16126
  if (outputNodeChanged) pipeline.needsUpdate = true;
16116
- if (outgoingScenePass && outgoingScenePass !== scenePass) outgoingScenePass.dispose?.();
16127
+ if (outgoingScenePass && outgoingScenePass !== scenePass) outgoingScenePass.dispose();
16117
16128
  } catch (error) {
16118
16129
  console.warn("[useRenderPipeline] Setup failed; the render pipeline was not configured:", error);
16119
16130
  }
16120
16131
  }, [store, renderer, scene, camera, isLegacy, rebuildVersion]);
16121
16132
  const passes = useThree$1((s) => s.passes);
16122
16133
  const renderPipeline = useThree$1((s) => s.renderPipeline);
16123
- return {
16124
- passes,
16125
- renderPipeline,
16126
- clearPasses,
16127
- reset,
16128
- rebuild,
16129
- // isReady indicates if RenderPipeline is configured and ready for rendering
16130
- isReady: renderPipeline !== null
16131
- };
16134
+ const actions = { passes, clearPasses, reset, rebuild };
16135
+ if (renderPipeline) return { ...actions, isReady: true, renderPipeline };
16136
+ return { ...actions, isReady: false, renderPipeline: null };
16132
16137
  }
16133
16138
 
16134
16139
  extend(THREE);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/fiber",
3
- "version": "10.0.0-canary.07c4f9d",
3
+ "version": "10.0.0-canary.0ea97c0",
4
4
  "description": "A React renderer for Threejs",
5
5
  "keywords": [
6
6
  "react",