From ff617031e7a03487e0a23aba9c2f0a57a4d42bd0 Mon Sep 17 00:00:00 2001 From: goynov Date: Sat, 4 Apr 2026 17:56:28 +0300 Subject: [PATCH] allow sub-interactive objects management --- src/components/GameDesigner/GameDesigner.vue | 26 +++++++++++++++----- src/lib/GameManager.js | 16 ++++++++++-- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/components/GameDesigner/GameDesigner.vue b/src/components/GameDesigner/GameDesigner.vue index 596fa40..77584cf 100644 --- a/src/components/GameDesigner/GameDesigner.vue +++ b/src/components/GameDesigner/GameDesigner.vue @@ -58,14 +58,17 @@ - - + + + @@ -88,7 +91,9 @@ export default { scenes: [], currentScene: null, sceneObjects: {}, + flatObjects: [], currentObject: null, + selectedObject: [], objectAnimations: [], mode: 'translate', pointerDownTime: 0, @@ -115,6 +120,12 @@ export default { sceneObjects[data.id].__o = markRaw(object3d); sceneObjects[data.id].__animations = markRaw(source.animations || []); sceneObjects[data.id].__title = data.title; + sceneObjects[data.id].__type = data.type; + sceneObjects[data.id].__level = data.level || 0; + object3d.__pn_id = this.flatObjects.length; + this.flatObjects.push({ + key: data.id, value: sceneObjects[data.id] + }); } }); this.scenes = manager.scenarioData.scenes.map(s=>({ @@ -172,6 +183,7 @@ export default { methods:{ async loadScene(sceneId){ + this.flatObjects = []; await manager.loadScene(sceneId) this.currentScene = manager.scenarioData.scenes.find(sc=>sc.data.id == sceneId); this.sceneObjects = this.modelValue.scenes?.[sceneId]?.objects @@ -201,7 +213,9 @@ export default { }, selectObject(oid){ - this.currentObject = this.sceneObjects[oid]; + console.log('Selecting object', oid) + this.currentObject = this.flatObjects[oid]?.value; + this.selectedObject = [oid]; engine.transformControls.attach(this.currentObject.__o); engine.gizmo.target = this.currentObject.position; engine.camera.updateProjectionMatrix(); diff --git a/src/lib/GameManager.js b/src/lib/GameManager.js index 718c0b4..84540b9 100644 --- a/src/lib/GameManager.js +++ b/src/lib/GameManager.js @@ -180,11 +180,23 @@ class GameManager extends EventManager{ console.log('autoscaling', data.id, autoScaleFactor); this.engine.meshUtils.autoScale(object3d, autoScaleFactor); } - sceneObjects[data.id] = sceneObjects[data.id] || {}; + sceneObjects[data.id] ??= {}; if (this.opts.onObjectLoad){ this.opts.onObjectLoad(sceneObjects, data, object3d, source) } - object3d.__pn_id = data.id; + if (object3d.hasIndividualChildren){ + sceneObjects[data.id].children ??= {}; + object3d.traverse(c=>{ + if (c.isIndividual){ + this.setObjectAttributes(sceneObjects[data.id].children, { + id: c.name, + title: `${data.title}: ${c.name}`, + type: data.type, + level: (data.level || 0) + 1 + }, c, c, null); + } + }) + } } }