diff --git a/playground/src/components/DebugUI.vue b/playground/src/components/DebugUI.vue
index ce354c93a..7d6eb3bb3 100644
--- a/playground/src/components/DebugUI.vue
+++ b/playground/src/components/DebugUI.vue
@@ -1,6 +1,7 @@
-
-
+
+
+
diff --git a/src/core/nodeOps.ts b/src/core/nodeOps.ts
index 1d0f64410..32db5d4ba 100644
--- a/src/core/nodeOps.ts
+++ b/src/core/nodeOps.ts
@@ -3,7 +3,7 @@ import { BufferAttribute } from 'three'
import { isFunction } from '@alvarosabu/utils'
import { useLogger } from '../composables'
import { catalogue } from './catalogue'
-import { isHTMLTag, kebabToCamel } from '../utils'
+import { deepArrayEqual, isHTMLTag, kebabToCamel } from '../utils'
import type { Object3D, Camera } from 'three'
import type { TresObject, TresObject3D, TresScene } from '../types'
@@ -184,6 +184,15 @@ export const nodeOps: RendererOptions = {
let finalKey = kebabToCamel(key)
let target = root?.[finalKey]
+ if (key === 'args' && !deepArrayEqual(_prevValue, nextValue)) {
+ const prevNode = node as TresObject3D
+
+ if (node.type && nextValue.length > 0) {
+ root = Object.assign(prevNode, new catalogue.value[node.type](...nextValue))
+ }
+ return
+ }
+
if (root.type === 'BufferGeometry') {
if (key === 'args') return
root.setAttribute(
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 325556726..1e6330e8e 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -73,4 +73,41 @@ export const set = (obj: any, path: string | string[], value: any): void => {
if (i === pathArray.length - 1) acc[key] = value;
return acc[key];
}, obj);
-};
\ No newline at end of file
+};
+
+
+export function deepEqual(a: any, b: any): boolean {
+ // If both are primitives, return true if they are equal
+ if (a === b) return true;
+
+ // If either of them is null or not an object, return false
+ if (a === null || typeof a !== "object" || b === null || typeof b !== "object") return false;
+
+ // Get the keys of both objects
+ const keysA = Object.keys(a), keysB = Object.keys(b);
+
+ // If they have different number of keys, they are not equal
+ if (keysA.length !== keysB.length) return false;
+
+ // Check each key in A to see if it exists in B and its value is the same in both
+ for (const key of keysA) {
+ if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;
+ }
+
+ return true;
+}
+
+export function deepArrayEqual(arr1: any[], arr2: any[]): boolean {
+ // If they're not both arrays, return false
+ if (!Array.isArray(arr1) || !Array.isArray(arr2)) return false;
+
+ // If they don't have the same length, they're not equal
+ if (arr1.length !== arr2.length) return false;
+
+ // Check each element of arr1 against the corresponding element of arr2
+ for (let i = 0; i < arr1.length; i++) {
+ if (!deepEqual(arr1[i], arr2[i])) return false;
+ }
+
+ return true;
+}
\ No newline at end of file