From 205d2c33432271626ae000c697a8ec6aab88b13b Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 13 Apr 2026 21:42:12 +0900 Subject: [PATCH] wip --- packages/frontend/src/utility/room/engine.ts | 27 ++++++++++++++++--- .../utility/room/objects/ironFrameTable.ts | 10 ++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/frontend/src/utility/room/engine.ts b/packages/frontend/src/utility/room/engine.ts index 22b5712b48..294fba6bed 100644 --- a/packages/frontend/src/utility/room/engine.ts +++ b/packages/frontend/src/utility/room/engine.ts @@ -324,6 +324,7 @@ type ObjectDef = { options: Readonly>; model: ModelManager; id: string; + stickyMarkerMeshUpdated?: (mesh: BABYLON.Mesh) => void; }) => RoomObjectInstance> | Promise>>; // TODO: createInstanceをasyncにするのではなく、別にreadyみたいなものを返させる }; @@ -1227,9 +1228,7 @@ export class RoomEngine { this.highlightMeshes(meshes); } - for (const m of meshes) { - const mesh = m; - + for (const mesh of meshes) { // シェイプキー(morph)を考慮してbounding boxを更新するために必要 mesh.refreshBoundingInfo({ applyMorph: true }); @@ -1278,6 +1277,28 @@ export class RoomEngine { options: args.options, model, id: args.id, + stickyMarkerMeshUpdated: (mesh: BABYLON.Mesh) => { + // TODO + //// stickyな子の位置を更新 + //if (mesh.name.includes('__TOP__')) { + // mesh.unfreezeWorldMatrix(); + // mesh.computeWorldMatrix(true); + // const updateChildStickyObjectPosition = (objectId: string) => { + // const stickyObjectIds = Array.from(this.roomState.installedObjects.filter(o => o.sticky === objectId)).map(o => o.id); + // for (const soid of stickyObjectIds) { + // const soMesh = this.objectEntities.get(soid)!.rootMesh; + // soMesh.unfreezeWorldMatrix(); + // for (const m of soMesh.getChildMeshes()) { + // m.unfreezeWorldMatrix(); + // } + // console.log(mesh.getAbsolutePosition().y); + // soMesh.position.y = mesh.getAbsolutePosition().y; + // updateChildStickyObjectPosition(soid); + // } + // }; + // updateChildStickyObjectPosition(args.id); + //} + }, }); objectInstance.onInited?.(); diff --git a/packages/frontend/src/utility/room/objects/ironFrameTable.ts b/packages/frontend/src/utility/room/objects/ironFrameTable.ts index 35b6678015..55b661f9ee 100644 --- a/packages/frontend/src/utility/room/objects/ironFrameTable.ts +++ b/packages/frontend/src/utility/room/objects/ironFrameTable.ts @@ -50,7 +50,7 @@ export const ironFrameTable = defineObject({ }, }, placement: 'top', - createInstance: ({ options, model }) => { + createInstance: ({ options, model, stickyMarkerMeshUpdated }) => { const frameMaterial = model.findMaterial('__X_FRAME__'); const boardMaterial = model.findMaterial('__X_BOARD__'); @@ -68,6 +68,8 @@ export const ironFrameTable = defineObject({ applyBoardColor(); + const topMesh = model.findMesh('__TOP__'); + const applySize = () => { for (const mesh of model.root.getChildMeshes()) { if (mesh.morphTargetManager != null && mesh.morphTargetManager.getTargetByName('W') != null) { @@ -90,9 +92,9 @@ export const ironFrameTable = defineObject({ switch (k) { case 'frameColor': applyFrameColor(); break; case 'boardColor': applyBoardColor(); break; - case 'width': applySize(); break; - case 'depth': applySize(); break; - case 'height': applySize(); break; + case 'width': applySize(); stickyMarkerMeshUpdated?.(topMesh); break; + case 'depth': applySize(); stickyMarkerMeshUpdated?.(topMesh); break; + case 'height': applySize(); stickyMarkerMeshUpdated?.(topMesh); break; } }, interactions: {},