1
0
Эх сурвалжийг харах

fix: alternative that doesnt break the tests

alvarosabu 1 жил өмнө
parent
commit
37a9a1a97a

+ 2 - 2
playground/src/pages/advanced/cientos/ContactShadowsLocal.vue

@@ -330,10 +330,10 @@ onBeforeRender(() => {
     </TresMesh>
     <primitive :object="blurPlane" />
 
-    <!--  <TresCameraHelper
+    <TresCameraHelper
       v-if="shadowCamera && helper"
       :args="[shadowCamera]"
-    /> -->
+    />
     <TresOrthographicCamera
       ref="shadowCamera"
       :position="[0, 0, 0]"

+ 12 - 0
src/core/nodeOps.test.ts

@@ -383,6 +383,18 @@ describe('nodeOps', () => {
         nodeOps.patchProp(geometry, 'args', args0, args1)
         expect(geometry.uuid).not.toBe(uuid)
       })
+      it('handles read-only properties', () => {
+        const camera1 = new THREE.OrthographicCamera()
+        camera1.position.set(1, 2, 3)
+        const camera2 = new THREE.OrthographicCamera()
+        camera2.position.set(4, 5, 6)
+        const args0 = [camera1]
+        const args1 = [camera2]
+        const cameraHelper = nodeOps.createElement('TresCameraHelper', undefined, undefined, { args: args0 })
+
+        nodeOps.patchProp(cameraHelper, 'args', args0, args1)
+        expect(cameraHelper.camera).toBe(args1[0])
+      })
     })
 
     describe('if property has a `set` method', () => {

+ 8 - 11
src/core/nodeOps.ts

@@ -1,5 +1,5 @@
 import type { RendererOptions } from 'vue'
-import { BufferAttribute } from 'three'
+import { BufferAttribute, Color, Euler, Object3D, Vector3 } from 'three'
 import { isFunction } from '@alvarosabu/utils'
 import type { Camera } from 'three'
 import type { TresContext } from '../composables'
@@ -244,17 +244,14 @@ export const nodeOps: () => RendererOptions<TresObject, TresObject | null> = ()
           && !deepArrayEqual(prevArgs, args)
         ) {
           const newInstance = new catalogue.value[instanceName](...nextValue)
-
-          // Manually copy properties that are not read-only
-          for (const key in prevNode) {
-            if (Object.prototype.hasOwnProperty.call(prevNode, key) && !isReadOnly(prevNode, key)) {
-              newInstance[key] = prevNode[key]
+          Object.keys(newInstance).forEach((key) => {
+            if (!isReadOnly(prevNode, key)) {
+              prevNode[key] = newInstance[key]
+            }
+            else if (prevNode[key] && prevNode[key].set) {
+              prevNode[key].set(newInstance[key])
             }
-          }
-          newInstance.position.copy(prevNode.position)
-          newInstance.rotation.copy(prevNode.rotation)
-          newInstance.scale.copy(prevNode.scale)
-          root = newInstance
+          })
         }
         return
       }