@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/legacy.mjs CHANGED
@@ -3439,7 +3439,7 @@ function advance(timestamp) {
3439
3439
  getScheduler().step(timestamp);
3440
3440
  }
3441
3441
 
3442
- const version = "10.0.1";
3442
+ const version = "10.0.4";
3443
3443
  const packageData = {
3444
3444
  version: version};
3445
3445
 
@@ -15196,6 +15196,7 @@ function createRoot(canvas) {
15196
15196
  let pending = null;
15197
15197
  return {
15198
15198
  async configure(props = {}) {
15199
+ if (pending) await pending;
15199
15200
  let resolve;
15200
15201
  pending = new Promise((_resolve) => resolve = _resolve);
15201
15202
  const {
@@ -15445,8 +15446,10 @@ function createRoot(canvas) {
15445
15446
  const unregisterCanvasTarget = scheduler.register(
15446
15447
  () => {
15447
15448
  const state2 = store.getState();
15449
+ if (!state2.internal.active) return;
15448
15450
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15449
15451
  const renderer2 = state2.internal.actualRenderer;
15452
+ if (!renderer2) return;
15450
15453
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15451
15454
  }
15452
15455
  },
@@ -15499,7 +15502,9 @@ function createRoot(canvas) {
15499
15502
  const unregisterRender = scheduler.register(
15500
15503
  () => {
15501
15504
  const state2 = store.getState();
15505
+ if (!state2.internal.active) return;
15502
15506
  const renderer2 = state2.internal.actualRenderer;
15507
+ if (!renderer2) return;
15503
15508
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15504
15509
  if (userHandlesRender || state2.internal.priority) return;
15505
15510
  try {
@@ -15574,23 +15579,62 @@ function Provider({
15574
15579
  }, []);
15575
15580
  return /* @__PURE__ */ jsx(context.Provider, { value: store, children });
15576
15581
  }
15582
+ function releaseSceneR3fLinks(scene, options) {
15583
+ if (!scene) return null;
15584
+ scene.traverse((obj) => {
15585
+ delete obj.__r3f;
15586
+ });
15587
+ delete scene.__r3f;
15588
+ {
15589
+ scene.clear();
15590
+ }
15591
+ return scene;
15592
+ }
15593
+ function releaseRendererRefsFromRootState(state) {
15594
+ const { internal } = state;
15595
+ const renderer = internal.actualRenderer ?? null;
15596
+ internal.actualRenderer = null;
15597
+ internal.canvasTarget = null;
15598
+ internal.pointerMap?.clear();
15599
+ internal.pointerDirty?.clear();
15600
+ return renderer;
15601
+ }
15602
+ function detachRootSceneFromRootState(state) {
15603
+ const scene = releaseSceneR3fLinks(state.scene);
15604
+ state.set((prev) => ({
15605
+ scene: null,
15606
+ rootScene: null,
15607
+ internal: { ...prev.internal, container: null }
15608
+ }));
15609
+ return scene;
15610
+ }
15577
15611
  function unmountComponentAtNode(canvas, callback) {
15578
15612
  const root = _roots.get(canvas);
15579
15613
  const fiber = root?.fiber;
15580
15614
  if (fiber) {
15581
15615
  const state = root?.store.getState();
15582
- if (state) state.internal.active = false;
15616
+ let rendererForCleanup = null;
15617
+ let canvasTargetForCleanup;
15618
+ let sceneForCleanup = null;
15619
+ if (state) {
15620
+ state.internal.active = false;
15621
+ canvasTargetForCleanup = state.internal.canvasTarget;
15622
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15623
+ const unregisterRoot = state.internal.unregisterRoot;
15624
+ if (unregisterRoot) {
15625
+ unregisterRoot();
15626
+ state.internal.unregisterRoot = void 0;
15627
+ }
15628
+ }
15583
15629
  reconciler.updateContainer(null, fiber, null, () => {
15584
15630
  if (state) {
15631
+ sceneForCleanup = detachRootSceneFromRootState(state);
15585
15632
  setTimeout(() => {
15586
15633
  try {
15587
- const renderer = state.internal.actualRenderer;
15588
- const unregisterRoot = state.internal.unregisterRoot;
15589
- if (unregisterRoot) unregisterRoot();
15634
+ const renderer = rendererForCleanup;
15590
15635
  const unregisterPrimary = state.internal.unregisterPrimary;
15591
15636
  if (unregisterPrimary) unregisterPrimary();
15592
- const canvasTarget = state.internal.canvasTarget;
15593
- if (canvasTarget?.dispose) canvasTarget.dispose();
15637
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15594
15638
  state.events.disconnect?.();
15595
15639
  cleanupHelperGroup(root.store);
15596
15640
  if (state.isLegacy && renderer) {
@@ -15601,7 +15645,7 @@ function unmountComponentAtNode(canvas, callback) {
15601
15645
  if (!state.internal.isSecondary) {
15602
15646
  if (renderer?.xr) state.xr.disconnect();
15603
15647
  }
15604
- dispose(state.scene);
15648
+ if (sceneForCleanup) dispose(sceneForCleanup);
15605
15649
  _roots.delete(canvas);
15606
15650
  if (callback) callback(canvas);
15607
15651
  } catch {
@@ -3461,7 +3461,7 @@ function advance(timestamp) {
3461
3461
  getScheduler().step(timestamp);
3462
3462
  }
3463
3463
 
3464
- const version = "10.0.1";
3464
+ const version = "10.0.4";
3465
3465
  const packageData = {
3466
3466
  version: version};
3467
3467
 
@@ -15218,6 +15218,7 @@ function createRoot(canvas) {
15218
15218
  let pending = null;
15219
15219
  return {
15220
15220
  async configure(props = {}) {
15221
+ if (pending) await pending;
15221
15222
  let resolve;
15222
15223
  pending = new Promise((_resolve) => resolve = _resolve);
15223
15224
  const {
@@ -15496,8 +15497,10 @@ function createRoot(canvas) {
15496
15497
  const unregisterCanvasTarget = scheduler.register(
15497
15498
  () => {
15498
15499
  const state2 = store.getState();
15500
+ if (!state2.internal.active) return;
15499
15501
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15500
15502
  const renderer2 = state2.internal.actualRenderer;
15503
+ if (!renderer2) return;
15501
15504
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15502
15505
  }
15503
15506
  },
@@ -15550,7 +15553,9 @@ function createRoot(canvas) {
15550
15553
  const unregisterRender = scheduler.register(
15551
15554
  () => {
15552
15555
  const state2 = store.getState();
15556
+ if (!state2.internal.active) return;
15553
15557
  const renderer2 = state2.internal.actualRenderer;
15558
+ if (!renderer2) return;
15554
15559
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15555
15560
  if (userHandlesRender || state2.internal.priority) return;
15556
15561
  try {
@@ -15625,23 +15630,62 @@ function Provider({
15625
15630
  }, []);
15626
15631
  return /* @__PURE__ */ jsxRuntime.jsx(context.Provider, { value: store, children });
15627
15632
  }
15633
+ function releaseSceneR3fLinks(scene, options) {
15634
+ if (!scene) return null;
15635
+ scene.traverse((obj) => {
15636
+ delete obj.__r3f;
15637
+ });
15638
+ delete scene.__r3f;
15639
+ {
15640
+ scene.clear();
15641
+ }
15642
+ return scene;
15643
+ }
15644
+ function releaseRendererRefsFromRootState(state) {
15645
+ const { internal } = state;
15646
+ const renderer = internal.actualRenderer ?? null;
15647
+ internal.actualRenderer = null;
15648
+ internal.canvasTarget = null;
15649
+ internal.pointerMap?.clear();
15650
+ internal.pointerDirty?.clear();
15651
+ return renderer;
15652
+ }
15653
+ function detachRootSceneFromRootState(state) {
15654
+ const scene = releaseSceneR3fLinks(state.scene);
15655
+ state.set((prev) => ({
15656
+ scene: null,
15657
+ rootScene: null,
15658
+ internal: { ...prev.internal, container: null }
15659
+ }));
15660
+ return scene;
15661
+ }
15628
15662
  function unmountComponentAtNode(canvas, callback) {
15629
15663
  const root = _roots.get(canvas);
15630
15664
  const fiber = root?.fiber;
15631
15665
  if (fiber) {
15632
15666
  const state = root?.store.getState();
15633
- if (state) state.internal.active = false;
15667
+ let rendererForCleanup = null;
15668
+ let canvasTargetForCleanup;
15669
+ let sceneForCleanup = null;
15670
+ if (state) {
15671
+ state.internal.active = false;
15672
+ canvasTargetForCleanup = state.internal.canvasTarget;
15673
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15674
+ const unregisterRoot = state.internal.unregisterRoot;
15675
+ if (unregisterRoot) {
15676
+ unregisterRoot();
15677
+ state.internal.unregisterRoot = void 0;
15678
+ }
15679
+ }
15634
15680
  reconciler.updateContainer(null, fiber, null, () => {
15635
15681
  if (state) {
15682
+ sceneForCleanup = detachRootSceneFromRootState(state);
15636
15683
  setTimeout(() => {
15637
15684
  try {
15638
- const renderer = state.internal.actualRenderer;
15639
- const unregisterRoot = state.internal.unregisterRoot;
15640
- if (unregisterRoot) unregisterRoot();
15685
+ const renderer = rendererForCleanup;
15641
15686
  const unregisterPrimary = state.internal.unregisterPrimary;
15642
15687
  if (unregisterPrimary) unregisterPrimary();
15643
- const canvasTarget = state.internal.canvasTarget;
15644
- if (canvasTarget?.dispose) canvasTarget.dispose();
15688
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15645
15689
  state.events.disconnect?.();
15646
15690
  cleanupHelperGroup(root.store);
15647
15691
  if (state.isLegacy && renderer) {
@@ -15652,7 +15696,7 @@ function unmountComponentAtNode(canvas, callback) {
15652
15696
  if (!state.internal.isSecondary) {
15653
15697
  if (renderer?.xr) state.xr.disconnect();
15654
15698
  }
15655
- dispose(state.scene);
15699
+ if (sceneForCleanup) dispose(sceneForCleanup);
15656
15700
  _roots.delete(canvas);
15657
15701
  if (callback) callback(canvas);
15658
15702
  } catch {