Explorar el Código

Merge pull request #170 from Tresjs/bugfix/state-outdated-orbitcontrols-between-two-scenes

fix: state outdated orbit-controls between two scenes
Alvaro Saburido hace 2 años
padre
commit
b47fec8bae
Se han modificado 2 ficheros con 26 adiciones y 12 borrados
  1. 21 10
      src/components/TresCanvas.ts
  2. 5 2
      src/composables/useTres/index.ts

+ 21 - 10
src/components/TresCanvas.ts

@@ -1,12 +1,12 @@
-import { defineComponent, h, ref, watch } from 'vue'
+import { App, defineComponent, h, onUnmounted, ref, watch } from 'vue'
 import * as THREE from 'three'
 import * as THREE from 'three'
 import { ShadowMapType, TextureEncoding, ToneMapping } from 'three'
 import { ShadowMapType, TextureEncoding, ToneMapping } from 'three'
 import { createTres } from '/@/core/renderer'
 import { createTres } from '/@/core/renderer'
 import { useLogger } from '/@/composables'
 import { useLogger } from '/@/composables'
 import { useCamera, useRenderer, useRenderLoop, useRaycaster, useTres } from '/@/composables'
 import { useCamera, useRenderer, useRenderLoop, useRaycaster, useTres } from '/@/composables'
+import { extend } from '/@/core/catalogue'
+import { RendererPresetsType } from '/@/composables/useRenderer/const'
 import { TresObject } from '../types'
 import { TresObject } from '../types'
-import { extend } from '../core/catalogue'
-import { RendererPresetsType } from '../composables/useRenderer/const'
 
 
 export interface TresCanvasProps {
 export interface TresCanvasProps {
   shadows?: boolean
   shadows?: boolean
@@ -53,11 +53,14 @@ export const TresCanvas = defineComponent<TresCanvasProps>({
     const container = ref<HTMLElement>()
     const container = ref<HTMLElement>()
     const canvas = ref<HTMLCanvasElement>()
     const canvas = ref<HTMLCanvasElement>()
     const scene = new THREE.Scene()
     const scene = new THREE.Scene()
-
     const { setState } = useTres()
     const { setState } = useTres()
 
 
     setState('scene', scene)
     setState('scene', scene)
 
 
+    onUnmounted(() => {
+      setState('renderer', null)
+    })
+    
     function initRenderer() {
     function initRenderer() {
       const { renderer } = useRenderer(canvas, container, props)
       const { renderer } = useRenderer(canvas, container, props)
 
 
@@ -73,11 +76,13 @@ export const TresCanvas = defineComponent<TresCanvasProps>({
         raycaster.value.setFromCamera(pointer.value, activeCamera.value)
         raycaster.value.setFromCamera(pointer.value, activeCamera.value)
         renderer.value?.render(scene, activeCamera.value)
         renderer.value?.render(scene, activeCamera.value)
       })
       })
+
+     
     }
     }
 
 
     watch(canvas, initRenderer)
     watch(canvas, initRenderer)
 
 
-    let app
+    let app: App
 
 
     function mountApp() {
     function mountApp() {
       app = createTres(slots)
       app = createTres(slots)
@@ -91,19 +96,24 @@ export const TresCanvas = defineComponent<TresCanvasProps>({
       scene,
       scene,
     })
     })
 
 
+    function dispose() {
+      scene.children = []
+      app.unmount()
+      mountApp()
+    }
+
     if (import.meta.hot) {
     if (import.meta.hot) {
-      import.meta.hot.on('vite:afterUpdate', () => {
-        scene.children = []
-        app.unmount()
-        mountApp()
-      })
+      import.meta.hot.on('vite:afterUpdate',dispose)
     }
     }
+
     return () => {
     return () => {
       return h(
       return h(
         h(
         h(
           'div',
           'div',
           {
           {
             ref: container,
             ref: container,
+            'data-scene': scene.uuid,
+            key:  scene.uuid,
             style: {
             style: {
               position: 'relative',
               position: 'relative',
               width: '100%',
               width: '100%',
@@ -124,6 +134,7 @@ export const TresCanvas = defineComponent<TresCanvasProps>({
               [
               [
                 h('canvas', {
                 h('canvas', {
                   ref: canvas,
                   ref: canvas,
+                  'data-scene': scene.uuid,
                   style: {
                   style: {
                     display: 'block',
                     display: 'block',
                     width: '100%',
                     width: '100%',

+ 5 - 2
src/composables/useTres/index.ts

@@ -90,11 +90,14 @@ export interface TresState {
   [key: string]: any
   [key: string]: any
 }
 }
 
 
-const state: TresState = shallowReactive({
+const INIT_STATE = {
   camera: undefined,
   camera: undefined,
   cameras: [],
   cameras: [],
+  scene: undefined,
+  renderer: undefined,
   aspectRatio: computed(() => window.innerWidth / window.innerHeight),
   aspectRatio: computed(() => window.innerWidth / window.innerHeight),
-})
+}
+const state: TresState = shallowReactive(INIT_STATE)
 
 
 /**
 /**
  * The Tres state.
  * The Tres state.