From 018fce474b050668bf8467c7bb152b667d92d786 Mon Sep 17 00:00:00 2001 From: min Date: Fri, 5 Jun 2026 19:00:36 +0300 Subject: [PATCH] =?UTF-8?q?fix(studio):=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B2=D1=8B=D0=B2=D0=B0=D0=BB=D0=B8=D0=B2=D0=B0=D1=8E?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D0=B8=D0=B7=20=D0=BF=D0=B0=D0=BF=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20Play/Stop=20(folderId?= =?UTF-8?q?=20=D0=B2=20serialize)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Корень: serialize примитивов/моделей/userModel НЕ сохранял folderId. При Play→Stop сцена восстанавливалась из снапшота без группировки → все части кита (светофор/шипы/дверь) вываливались из папки в общие «Примитивы». Добавлен folderId в serialize всех 3 менеджеров + восстановление в loadFromArray (model/userModel явно, primitive через opts.folderId). Co-Authored-By: Claude Opus 4.8 --- src/editor/engine/ModelManager.js | 4 ++++ src/editor/engine/PrimitiveManager.js | 3 +++ src/editor/engine/UserModelManager.js | 10 +++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/editor/engine/ModelManager.js b/src/editor/engine/ModelManager.js index d457be9..e52bba2 100644 --- a/src/editor/engine/ModelManager.js +++ b/src/editor/engine/ModelManager.js @@ -526,6 +526,9 @@ export class ModelManager { opacity: typeof data.opacity === 'number' ? data.opacity : 1, tint: data.tint || null, name: data.name || null, + // folderId — принадлежность к папке (иначе модели вываливаются + // из папки после Play/Stop). Баг 2026-06-05. + ...(data.folderId != null ? { folderId: data.folderId } : {}), // Параметры геймплея (HP, скорость врага, лимит спавнера и т.п.) gameplayParams: data.gameplayParams || null, }); @@ -768,6 +771,7 @@ export class ModelManager { if (m.tint) data.tint = m.tint; if (m.name) data.name = m.name; if (m.gameplayParams) data.gameplayParams = m.gameplayParams; + if (m.folderId != null) data.folderId = m.folderId; // восстановить папку if (data.opacity != null || data.tint) this._applyMaterialOverrides(data); } // Гарантируем что _nextInstanceId стоит ПОСЛЕ максимального восстановленного id — diff --git a/src/editor/engine/PrimitiveManager.js b/src/editor/engine/PrimitiveManager.js index 433f51f..8a50c0c 100644 --- a/src/editor/engine/PrimitiveManager.js +++ b/src/editor/engine/PrimitiveManager.js @@ -945,6 +945,9 @@ export class PrimitiveManager { anchored: d.anchored, mass: d.mass, name: d.name || null, + // folderId — принадлежность к папке. БЕЗ него примитивы вываливались + // из папки после Play/Stop (снапшот терял группировку). Баг 2026-06-05. + ...(d.folderId != null ? { folderId: d.folderId } : {}), // locked — защита от выделения/перемещения (Фаза 5.11). ...(d.locked ? { locked: true } : {}), // id пользовательской текстуры (картинка из AssetManager). diff --git a/src/editor/engine/UserModelManager.js b/src/editor/engine/UserModelManager.js index 9e8629a..7af7734 100644 --- a/src/editor/engine/UserModelManager.js +++ b/src/editor/engine/UserModelManager.js @@ -599,6 +599,8 @@ export class UserModelManager { // instanceId — чтобы target-скрипты могли стабильно ссылаться // на конкретный инстанс после перезагрузки. instanceId: inst.instanceId, + // folderId — принадлежность к папке (иначе вываливается после Play/Stop). + ...(inst.folderId != null ? { folderId: inst.folderId } : {}), }); } return arr; @@ -663,7 +665,13 @@ export class UserModelManager { forceInstanceId: item.instanceId, }, ); - if (id != null) loaded++; + if (id != null) { + loaded++; + if (item.folderId != null) { // восстановить папку + const inst = this.instances.get(id); + if (inst) inst.folderId = item.folderId; + } + } } catch (e) { console.warn('[UserModelManager] failed to load instance', item, e); }