@gnsx/react-three-fiber 10.0.2 → 10.0.4

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.mjs CHANGED
@@ -3432,7 +3432,7 @@ function advance(timestamp) {
3432
3432
  getScheduler().step(timestamp);
3433
3433
  }
3434
3434
 
3435
- const version = "10.0.1";
3435
+ const version = "10.0.4";
3436
3436
  const packageData = {
3437
3437
  version: version};
3438
3438
 
@@ -15189,6 +15189,7 @@ function createRoot(canvas) {
15189
15189
  let pending = null;
15190
15190
  return {
15191
15191
  async configure(props = {}) {
15192
+ if (pending) await pending;
15192
15193
  let resolve;
15193
15194
  pending = new Promise((_resolve) => resolve = _resolve);
15194
15195
  const {
@@ -15485,8 +15486,10 @@ function createRoot(canvas) {
15485
15486
  const unregisterCanvasTarget = scheduler.register(
15486
15487
  () => {
15487
15488
  const state2 = store.getState();
15489
+ if (!state2.internal.active) return;
15488
15490
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15489
15491
  const renderer2 = state2.internal.actualRenderer;
15492
+ if (!renderer2) return;
15490
15493
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15491
15494
  }
15492
15495
  },
@@ -15539,7 +15542,9 @@ function createRoot(canvas) {
15539
15542
  const unregisterRender = scheduler.register(
15540
15543
  () => {
15541
15544
  const state2 = store.getState();
15545
+ if (!state2.internal.active) return;
15542
15546
  const renderer2 = state2.internal.actualRenderer;
15547
+ if (!renderer2) return;
15543
15548
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15544
15549
  if (userHandlesRender || state2.internal.priority) return;
15545
15550
  try {
@@ -15614,23 +15619,62 @@ function Provider({
15614
15619
  }, []);
15615
15620
  return /* @__PURE__ */ jsx(context.Provider, { value: store, children });
15616
15621
  }
15622
+ function releaseSceneR3fLinks(scene, options) {
15623
+ if (!scene) return null;
15624
+ scene.traverse((obj) => {
15625
+ delete obj.__r3f;
15626
+ });
15627
+ delete scene.__r3f;
15628
+ {
15629
+ scene.clear();
15630
+ }
15631
+ return scene;
15632
+ }
15633
+ function releaseRendererRefsFromRootState(state) {
15634
+ const { internal } = state;
15635
+ const renderer = internal.actualRenderer ?? null;
15636
+ internal.actualRenderer = null;
15637
+ internal.canvasTarget = null;
15638
+ internal.pointerMap?.clear();
15639
+ internal.pointerDirty?.clear();
15640
+ return renderer;
15641
+ }
15642
+ function detachRootSceneFromRootState(state) {
15643
+ const scene = releaseSceneR3fLinks(state.scene);
15644
+ state.set((prev) => ({
15645
+ scene: null,
15646
+ rootScene: null,
15647
+ internal: { ...prev.internal, container: null }
15648
+ }));
15649
+ return scene;
15650
+ }
15617
15651
  function unmountComponentAtNode(canvas, callback) {
15618
15652
  const root = _roots.get(canvas);
15619
15653
  const fiber = root?.fiber;
15620
15654
  if (fiber) {
15621
15655
  const state = root?.store.getState();
15622
- if (state) state.internal.active = false;
15656
+ let rendererForCleanup = null;
15657
+ let canvasTargetForCleanup;
15658
+ let sceneForCleanup = null;
15659
+ if (state) {
15660
+ state.internal.active = false;
15661
+ canvasTargetForCleanup = state.internal.canvasTarget;
15662
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15663
+ const unregisterRoot = state.internal.unregisterRoot;
15664
+ if (unregisterRoot) {
15665
+ unregisterRoot();
15666
+ state.internal.unregisterRoot = void 0;
15667
+ }
15668
+ }
15623
15669
  reconciler.updateContainer(null, fiber, null, () => {
15624
15670
  if (state) {
15671
+ sceneForCleanup = detachRootSceneFromRootState(state);
15625
15672
  setTimeout(() => {
15626
15673
  try {
15627
- const renderer = state.internal.actualRenderer;
15628
- const unregisterRoot = state.internal.unregisterRoot;
15629
- if (unregisterRoot) unregisterRoot();
15674
+ const renderer = rendererForCleanup;
15630
15675
  const unregisterPrimary = state.internal.unregisterPrimary;
15631
15676
  if (unregisterPrimary) unregisterPrimary();
15632
- const canvasTarget = state.internal.canvasTarget;
15633
- if (canvasTarget?.dispose) canvasTarget.dispose();
15677
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15634
15678
  state.events.disconnect?.();
15635
15679
  cleanupHelperGroup(root.store);
15636
15680
  if (state.isLegacy && renderer) {
@@ -15641,7 +15685,7 @@ function unmountComponentAtNode(canvas, callback) {
15641
15685
  if (!state.internal.isSecondary) {
15642
15686
  if (renderer?.xr) state.xr.disconnect();
15643
15687
  }
15644
- dispose(state.scene);
15688
+ if (sceneForCleanup) dispose(sceneForCleanup);
15645
15689
  _roots.delete(canvas);
15646
15690
  if (callback) callback(canvas);
15647
15691
  } catch {
package/dist/legacy.cjs CHANGED
@@ -3460,7 +3460,7 @@ function advance(timestamp) {
3460
3460
  getScheduler().step(timestamp);
3461
3461
  }
3462
3462
 
3463
- const version = "10.0.1";
3463
+ const version = "10.0.4";
3464
3464
  const packageData = {
3465
3465
  version: version};
3466
3466
 
@@ -15217,6 +15217,7 @@ function createRoot(canvas) {
15217
15217
  let pending = null;
15218
15218
  return {
15219
15219
  async configure(props = {}) {
15220
+ if (pending) await pending;
15220
15221
  let resolve;
15221
15222
  pending = new Promise((_resolve) => resolve = _resolve);
15222
15223
  const {
@@ -15466,8 +15467,10 @@ function createRoot(canvas) {
15466
15467
  const unregisterCanvasTarget = scheduler.register(
15467
15468
  () => {
15468
15469
  const state2 = store.getState();
15470
+ if (!state2.internal.active) return;
15469
15471
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15470
15472
  const renderer2 = state2.internal.actualRenderer;
15473
+ if (!renderer2) return;
15471
15474
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15472
15475
  }
15473
15476
  },
@@ -15520,7 +15523,9 @@ function createRoot(canvas) {
15520
15523
  const unregisterRender = scheduler.register(
15521
15524
  () => {
15522
15525
  const state2 = store.getState();
15526
+ if (!state2.internal.active) return;
15523
15527
  const renderer2 = state2.internal.actualRenderer;
15528
+ if (!renderer2) return;
15524
15529
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15525
15530
  if (userHandlesRender || state2.internal.priority) return;
15526
15531
  try {
@@ -15595,23 +15600,62 @@ function Provider({
15595
15600
  }, []);
15596
15601
  return /* @__PURE__ */ jsxRuntime.jsx(context.Provider, { value: store, children });
15597
15602
  }
15603
+ function releaseSceneR3fLinks(scene, options) {
15604
+ if (!scene) return null;
15605
+ scene.traverse((obj) => {
15606
+ delete obj.__r3f;
15607
+ });
15608
+ delete scene.__r3f;
15609
+ {
15610
+ scene.clear();
15611
+ }
15612
+ return scene;
15613
+ }
15614
+ function releaseRendererRefsFromRootState(state) {
15615
+ const { internal } = state;
15616
+ const renderer = internal.actualRenderer ?? null;
15617
+ internal.actualRenderer = null;
15618
+ internal.canvasTarget = null;
15619
+ internal.pointerMap?.clear();
15620
+ internal.pointerDirty?.clear();
15621
+ return renderer;
15622
+ }
15623
+ function detachRootSceneFromRootState(state) {
15624
+ const scene = releaseSceneR3fLinks(state.scene);
15625
+ state.set((prev) => ({
15626
+ scene: null,
15627
+ rootScene: null,
15628
+ internal: { ...prev.internal, container: null }
15629
+ }));
15630
+ return scene;
15631
+ }
15598
15632
  function unmountComponentAtNode(canvas, callback) {
15599
15633
  const root = _roots.get(canvas);
15600
15634
  const fiber = root?.fiber;
15601
15635
  if (fiber) {
15602
15636
  const state = root?.store.getState();
15603
- if (state) state.internal.active = false;
15637
+ let rendererForCleanup = null;
15638
+ let canvasTargetForCleanup;
15639
+ let sceneForCleanup = null;
15640
+ if (state) {
15641
+ state.internal.active = false;
15642
+ canvasTargetForCleanup = state.internal.canvasTarget;
15643
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15644
+ const unregisterRoot = state.internal.unregisterRoot;
15645
+ if (unregisterRoot) {
15646
+ unregisterRoot();
15647
+ state.internal.unregisterRoot = void 0;
15648
+ }
15649
+ }
15604
15650
  reconciler.updateContainer(null, fiber, null, () => {
15605
15651
  if (state) {
15652
+ sceneForCleanup = detachRootSceneFromRootState(state);
15606
15653
  setTimeout(() => {
15607
15654
  try {
15608
- const renderer = state.internal.actualRenderer;
15609
- const unregisterRoot = state.internal.unregisterRoot;
15610
- if (unregisterRoot) unregisterRoot();
15655
+ const renderer = rendererForCleanup;
15611
15656
  const unregisterPrimary = state.internal.unregisterPrimary;
15612
15657
  if (unregisterPrimary) unregisterPrimary();
15613
- const canvasTarget = state.internal.canvasTarget;
15614
- if (canvasTarget?.dispose) canvasTarget.dispose();
15658
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15615
15659
  state.events.disconnect?.();
15616
15660
  cleanupHelperGroup(root.store);
15617
15661
  if (state.isLegacy && renderer) {
@@ -15622,7 +15666,7 @@ function unmountComponentAtNode(canvas, callback) {
15622
15666
  if (!state.internal.isSecondary) {
15623
15667
  if (renderer?.xr) state.xr.disconnect();
15624
15668
  }
15625
- dispose(state.scene);
15669
+ if (sceneForCleanup) dispose(sceneForCleanup);
15626
15670
  _roots.delete(canvas);
15627
15671
  if (callback) callback(canvas);
15628
15672
  } catch {