@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.
@@ -3440,7 +3440,7 @@ function advance(timestamp) {
3440
3440
  getScheduler().step(timestamp);
3441
3441
  }
3442
3442
 
3443
- const version = "10.0.1";
3443
+ const version = "10.0.4";
3444
3444
  const packageData = {
3445
3445
  version: version};
3446
3446
 
@@ -15197,6 +15197,7 @@ function createRoot(canvas) {
15197
15197
  let pending = null;
15198
15198
  return {
15199
15199
  async configure(props = {}) {
15200
+ if (pending) await pending;
15200
15201
  let resolve;
15201
15202
  pending = new Promise((_resolve) => resolve = _resolve);
15202
15203
  const {
@@ -15475,8 +15476,10 @@ function createRoot(canvas) {
15475
15476
  const unregisterCanvasTarget = scheduler.register(
15476
15477
  () => {
15477
15478
  const state2 = store.getState();
15479
+ if (!state2.internal.active) return;
15478
15480
  if (state2.internal.isMultiCanvas && state2.internal.canvasTarget) {
15479
15481
  const renderer2 = state2.internal.actualRenderer;
15482
+ if (!renderer2) return;
15480
15483
  renderer2.setCanvasTarget(state2.internal.canvasTarget);
15481
15484
  }
15482
15485
  },
@@ -15529,7 +15532,9 @@ function createRoot(canvas) {
15529
15532
  const unregisterRender = scheduler.register(
15530
15533
  () => {
15531
15534
  const state2 = store.getState();
15535
+ if (!state2.internal.active) return;
15532
15536
  const renderer2 = state2.internal.actualRenderer;
15537
+ if (!renderer2) return;
15533
15538
  const userHandlesRender = scheduler.hasUserJobsInPhase("render", newRootId);
15534
15539
  if (userHandlesRender || state2.internal.priority) return;
15535
15540
  try {
@@ -15604,23 +15609,62 @@ function Provider({
15604
15609
  }, []);
15605
15610
  return /* @__PURE__ */ jsx(context.Provider, { value: store, children });
15606
15611
  }
15612
+ function releaseSceneR3fLinks(scene, options) {
15613
+ if (!scene) return null;
15614
+ scene.traverse((obj) => {
15615
+ delete obj.__r3f;
15616
+ });
15617
+ delete scene.__r3f;
15618
+ {
15619
+ scene.clear();
15620
+ }
15621
+ return scene;
15622
+ }
15623
+ function releaseRendererRefsFromRootState(state) {
15624
+ const { internal } = state;
15625
+ const renderer = internal.actualRenderer ?? null;
15626
+ internal.actualRenderer = null;
15627
+ internal.canvasTarget = null;
15628
+ internal.pointerMap?.clear();
15629
+ internal.pointerDirty?.clear();
15630
+ return renderer;
15631
+ }
15632
+ function detachRootSceneFromRootState(state) {
15633
+ const scene = releaseSceneR3fLinks(state.scene);
15634
+ state.set((prev) => ({
15635
+ scene: null,
15636
+ rootScene: null,
15637
+ internal: { ...prev.internal, container: null }
15638
+ }));
15639
+ return scene;
15640
+ }
15607
15641
  function unmountComponentAtNode(canvas, callback) {
15608
15642
  const root = _roots.get(canvas);
15609
15643
  const fiber = root?.fiber;
15610
15644
  if (fiber) {
15611
15645
  const state = root?.store.getState();
15612
- if (state) state.internal.active = false;
15646
+ let rendererForCleanup = null;
15647
+ let canvasTargetForCleanup;
15648
+ let sceneForCleanup = null;
15649
+ if (state) {
15650
+ state.internal.active = false;
15651
+ canvasTargetForCleanup = state.internal.canvasTarget;
15652
+ rendererForCleanup = releaseRendererRefsFromRootState(state);
15653
+ const unregisterRoot = state.internal.unregisterRoot;
15654
+ if (unregisterRoot) {
15655
+ unregisterRoot();
15656
+ state.internal.unregisterRoot = void 0;
15657
+ }
15658
+ }
15613
15659
  reconciler.updateContainer(null, fiber, null, () => {
15614
15660
  if (state) {
15661
+ sceneForCleanup = detachRootSceneFromRootState(state);
15615
15662
  setTimeout(() => {
15616
15663
  try {
15617
- const renderer = state.internal.actualRenderer;
15618
- const unregisterRoot = state.internal.unregisterRoot;
15619
- if (unregisterRoot) unregisterRoot();
15664
+ const renderer = rendererForCleanup;
15620
15665
  const unregisterPrimary = state.internal.unregisterPrimary;
15621
15666
  if (unregisterPrimary) unregisterPrimary();
15622
- const canvasTarget = state.internal.canvasTarget;
15623
- if (canvasTarget?.dispose) canvasTarget.dispose();
15667
+ if (canvasTargetForCleanup?.dispose) canvasTargetForCleanup.dispose();
15624
15668
  state.events.disconnect?.();
15625
15669
  cleanupHelperGroup(root.store);
15626
15670
  if (state.isLegacy && renderer) {
@@ -15631,7 +15675,7 @@ function unmountComponentAtNode(canvas, callback) {
15631
15675
  if (!state.internal.isSecondary) {
15632
15676
  if (renderer?.xr) state.xr.disconnect();
15633
15677
  }
15634
- dispose(state.scene);
15678
+ if (sceneForCleanup) dispose(sceneForCleanup);
15635
15679
  _roots.delete(canvas);
15636
15680
  if (callback) callback(canvas);
15637
15681
  } catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gnsx/react-three-fiber",
3
- "version": "10.0.2",
3
+ "version": "10.0.4",
4
4
  "description": "A React renderer for Threejs",
5
5
  "keywords": [
6
6
  "react",
@@ -1,7 +1,7 @@
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
+ 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;