From 8d3a5a650398a2ea4d54a6bb2c3cbfd117822fc1 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Thu, 23 Apr 2026 13:45:50 +0900 Subject: [PATCH] morph --- .../src/world/room/objects/randomBooks.ts | 4 ++-- packages/frontend/src/world/room/utility.ts | 21 ++++++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/frontend/src/world/room/objects/randomBooks.ts b/packages/frontend/src/world/room/objects/randomBooks.ts index 761a504bdd..8802ab7eb3 100644 --- a/packages/frontend/src/world/room/objects/randomBooks.ts +++ b/packages/frontend/src/world/room/objects/randomBooks.ts @@ -50,6 +50,7 @@ export const randomBooks = defineObject({ placement: 'top', hasCollisions: false, hasTexture: true, + canPreMeshesMerging: false, createInstance: ({ options, model, scene, id }) => { const bodyMesh = model.findMesh('__X_BODY__'); const tex = new BABYLON.Texture('/client-assets/room/objects/random-books/texture.png', scene, { @@ -57,6 +58,7 @@ export const randomBooks = defineObject({ samplingMode: BABYLON.Texture.NEAREST_SAMPLINGMODE, }); bodyMesh.material.albedoTexture = tex; + bodyMesh.isVisible = false; const TEXTURE_DIVISION = 8; let bookMeshes: BABYLON.Mesh[] = []; @@ -127,8 +129,6 @@ export const randomBooks = defineObject({ } } - bodyMesh.isVisible = false; - model.updated(); }; diff --git a/packages/frontend/src/world/room/utility.ts b/packages/frontend/src/world/room/utility.ts index a1e1b49e4f..5d0d5c6497 100644 --- a/packages/frontend/src/world/room/utility.ts +++ b/packages/frontend/src/world/room/utility.ts @@ -269,11 +269,18 @@ export class ModelManager { _toMerge.push(fixedMesh); } + let hasMorphTarget = false; + const toMerge = [] as BABYLON.Mesh[]; for (const mesh of _toMerge) { const newMesh = mesh.name.endsWith('_realized') ? mesh : mesh.clone(mesh.name + '_bakeMerged', null, true); newMesh.makeGeometryUnique(); - applyMorphTargetsToMesh(newMesh); + if (newMesh.morphTargetManager != null && newMesh.morphTargetManager.numTargets > 0) { + hasMorphTarget = true; + applyMorphTargetsToMesh(newMesh); + newMesh.morphTargetManager?.dispose(); + newMesh.morphTargetManager = null; + } if (newMesh.parent === this.root) { newMesh.parent = null; } else { @@ -306,11 +313,15 @@ export class ModelManager { const merged = BABYLON.Mesh.MergeMeshes(toMerge, true, false, undefined, false, true); merged.parent = this.root; + merged.morphTargetManager?.dispose(); + merged.morphTargetManager = null; - merged.material.freeze(); - if (merged.material instanceof BABYLON.MultiMaterial) { - for (const subMat of merged.material.subMaterials) { - (subMat as BABYLON.PBRMaterial).freeze(); + if (!hasMorphTarget) { // https://forum.babylonjs.com/t/is-it-intentional-that-morph-targets-do-not-work-on-meshes-with-frozen-materials/63252 + merged.material.freeze(); + if (merged.material instanceof BABYLON.MultiMaterial) { + for (const subMat of merged.material.subMaterials) { + (subMat as BABYLON.PBRMaterial).freeze(); + } } }