From a8456a45ab87b1a02b7739827192232277aaaf8b Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Wed, 25 Feb 2026 19:15:26 +0900 Subject: [PATCH] wip --- packages/frontend/src/utility/room/engine.ts | 8 ++++++++ packages/frontend/src/utility/room/objects/a4Case.ts | 4 ++-- .../src/utility/room/objects/aromaReedDiffuser.ts | 6 +++--- packages/frontend/src/utility/room/objects/bed.ts | 4 ++-- packages/frontend/src/utility/room/objects/cactusS.ts | 4 ++-- packages/frontend/src/utility/room/objects/chair.ts | 6 +++--- packages/frontend/src/utility/room/objects/colorBox.ts | 4 ++-- .../frontend/src/utility/room/objects/monitorSpeaker.ts | 4 ++-- packages/frontend/src/utility/room/objects/petBottle.ts | 6 +++--- packages/frontend/src/utility/room/objects/speaker.ts | 6 +++--- packages/frontend/src/utility/room/objects/wallShelf.ts | 4 ++-- 11 files changed, 32 insertions(+), 24 deletions(-) diff --git a/packages/frontend/src/utility/room/engine.ts b/packages/frontend/src/utility/room/engine.ts index aec29e1344..f8886fbeff 100644 --- a/packages/frontend/src/utility/room/engine.ts +++ b/packages/frontend/src/utility/room/engine.ts @@ -110,6 +110,7 @@ type ObjectDef = { options: Readonly>; loaderResult: BABYLON.ISceneLoaderAsyncResult; meshUpdated: () => void; + findMesh: (keyword: string) => BABYLON.Mesh; }) => RoomObjectInstance>; }; @@ -861,6 +862,13 @@ export class RoomEngine { meshUpdated: () => { meshUpdated(this.objectMeshs.get(args.id)!.getChildMeshes() as BABYLON.Mesh[]); }, + findMesh: (keyword) => { + const mesh = root.getChildMeshes().find(m => m.name.includes(keyword)); + if (mesh == null) { + throw new Error(`Mesh with keyword "${keyword}" not found for object ${args.type} (${args.id})`); + } + return mesh as BABYLON.Mesh; + }, }); this.objectInstances.set(args.id, objectInstance); diff --git a/packages/frontend/src/utility/room/objects/a4Case.ts b/packages/frontend/src/utility/room/objects/a4Case.ts index 9ef077ef19..542f916ed4 100644 --- a/packages/frontend/src/utility/room/objects/a4Case.ts +++ b/packages/frontend/src/utility/room/objects/a4Case.ts @@ -21,8 +21,8 @@ export const a4Case = defineObject({ }, }, placement: 'top', - createInstance: ({ options, root }) => { - const bodyMesh = root.getChildMeshes().find(m => m.name.includes('__X_BODY__')) as BABYLON.Mesh; + createInstance: ({ options, findMesh }) => { + const bodyMesh = findMesh('__X_BODY__'); const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial; const applyColor = () => { diff --git a/packages/frontend/src/utility/room/objects/aromaReedDiffuser.ts b/packages/frontend/src/utility/room/objects/aromaReedDiffuser.ts index d55f330e51..c900ff1d0e 100644 --- a/packages/frontend/src/utility/room/objects/aromaReedDiffuser.ts +++ b/packages/frontend/src/utility/room/objects/aromaReedDiffuser.ts @@ -26,11 +26,11 @@ export const aromaReedDiffuser = defineObject({ }, }, placement: 'top', - createInstance: ({ options, root }) => { - const bottleMesh = root.getChildMeshes().find(m => m.name.includes('__X_BOTTLE__')) as BABYLON.Mesh; + createInstance: ({ options, findMesh }) => { + const bottleMesh = findMesh('__X_BOTTLE__'); const bottleMaterial = bottleMesh.material as BABYLON.PBRMaterial; - const oilMesh = root.getChildMeshes().find(m => m.name.includes('__X_OIL__')) as BABYLON.Mesh; + const oilMesh = findMesh('__X_OIL__'); const oilMaterial = oilMesh.material as BABYLON.PBRMaterial; const applyBottleColor = () => { diff --git a/packages/frontend/src/utility/room/objects/bed.ts b/packages/frontend/src/utility/room/objects/bed.ts index 3c24af1fa2..68fe7d669d 100644 --- a/packages/frontend/src/utility/room/objects/bed.ts +++ b/packages/frontend/src/utility/room/objects/bed.ts @@ -21,8 +21,8 @@ export const bed = defineObject({ }, }, placement: 'floor', - createInstance: ({ options, root }) => { - const bodyMesh = root.getChildMeshes().find(m => m.name.includes('__X_BODY__')) as BABYLON.Mesh; + createInstance: ({ options, findMesh }) => { + const bodyMesh = findMesh('__X_BODY__'); const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial; const applyColor = () => { diff --git a/packages/frontend/src/utility/room/objects/cactusS.ts b/packages/frontend/src/utility/room/objects/cactusS.ts index 01cb009639..a065b71708 100644 --- a/packages/frontend/src/utility/room/objects/cactusS.ts +++ b/packages/frontend/src/utility/room/objects/cactusS.ts @@ -21,8 +21,8 @@ export const cactusS = defineObject({ }, }, placement: 'top', - createInstance: ({ options, root }) => { - const potMesh = root.getChildMeshes().find(m => m.name.includes('__X_POT__')) as BABYLON.Mesh; + createInstance: ({ options, findMesh }) => { + const potMesh = findMesh('__X_POT__'); const potMaterial = potMesh.material as BABYLON.PBRMaterial; const applyPotColor = () => { diff --git a/packages/frontend/src/utility/room/objects/chair.ts b/packages/frontend/src/utility/room/objects/chair.ts index f087c1c6a0..c9175ef005 100644 --- a/packages/frontend/src/utility/room/objects/chair.ts +++ b/packages/frontend/src/utility/room/objects/chair.ts @@ -27,11 +27,11 @@ export const chair = defineObject({ }, placement: 'floor', isChair: true, - createInstance: ({ root, options }) => { - const primaryMesh = root.getChildMeshes().find(m => m.name.includes('__X_PRIMARY__')) as BABYLON.Mesh; + createInstance: ({ findMesh, options }) => { + const primaryMesh = findMesh('__X_PRIMARY__'); const primaryMaterial = primaryMesh.material as BABYLON.PBRMaterial; - const secondaryMesh = root.getChildMeshes().find(m => m.name.includes('__X_SECONDARY__')) as BABYLON.Mesh; + const secondaryMesh = findMesh('__X_SECONDARY__'); const secondaryMaterial = secondaryMesh.material as BABYLON.PBRMaterial; const applyPrimaryColor = () => { diff --git a/packages/frontend/src/utility/room/objects/colorBox.ts b/packages/frontend/src/utility/room/objects/colorBox.ts index bca8cb6d01..ba827dd247 100644 --- a/packages/frontend/src/utility/room/objects/colorBox.ts +++ b/packages/frontend/src/utility/room/objects/colorBox.ts @@ -21,8 +21,8 @@ export const colorBox = defineObject({ }, }, placement: 'floor', - createInstance: ({ options, root }) => { - const bodyMesh = root.getChildMeshes().find(m => m.name.includes('__X_BODY__')) as BABYLON.Mesh; + createInstance: ({ options, findMesh }) => { + const bodyMesh = findMesh('__X_BODY__'); const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial; const applyColor = () => { diff --git a/packages/frontend/src/utility/room/objects/monitorSpeaker.ts b/packages/frontend/src/utility/room/objects/monitorSpeaker.ts index 472c86ffd8..3c4b35d028 100644 --- a/packages/frontend/src/utility/room/objects/monitorSpeaker.ts +++ b/packages/frontend/src/utility/room/objects/monitorSpeaker.ts @@ -21,8 +21,8 @@ export const monitorSpeaker = defineObject({ }, }, placement: 'top', - createInstance: ({ options, root }) => { - const bodyMesh = root.getChildMeshes().find(m => m.name.includes('__X_BODY__')) as BABYLON.Mesh; + createInstance: ({ options, findMesh }) => { + const bodyMesh = findMesh('__X_BODY__'); const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial; const applyColor = () => { diff --git a/packages/frontend/src/utility/room/objects/petBottle.ts b/packages/frontend/src/utility/room/objects/petBottle.ts index f0845503ec..0a1f60af00 100644 --- a/packages/frontend/src/utility/room/objects/petBottle.ts +++ b/packages/frontend/src/utility/room/objects/petBottle.ts @@ -26,9 +26,9 @@ export const petBottle = defineObject({ }, }, placement: 'top', - createInstance: ({ root, options }) => { - const capMesh = root.getChildMeshes().find(m => m.name.includes('__X_CAP__')) as BABYLON.Mesh; - const liquidMesh = root.getChildMeshes().find(m => m.name.includes('__X_LIQUID__')) as BABYLON.Mesh; + createInstance: ({ findMesh, options }) => { + const capMesh = findMesh('__X_CAP__'); + const liquidMesh = findMesh('__X_LIQUID__'); const applyWithCap = () => { capMesh.setEnabled(options.withCap); diff --git a/packages/frontend/src/utility/room/objects/speaker.ts b/packages/frontend/src/utility/room/objects/speaker.ts index 403e60b543..3f804ed67e 100644 --- a/packages/frontend/src/utility/room/objects/speaker.ts +++ b/packages/frontend/src/utility/room/objects/speaker.ts @@ -26,11 +26,11 @@ export const speaker = defineObject({ }, }, placement: 'top', - createInstance: ({ options, root }) => { - const outerMesh = root.getChildMeshes().find(m => m.name.includes('__X_COVER__')) as BABYLON.Mesh; + createInstance: ({ options, findMesh }) => { + const outerMesh = findMesh('__X_COVER__'); const outerMaterial = outerMesh.material as BABYLON.PBRMaterial; - const innerMesh = root.getChildMeshes().find(m => m.name.includes('__X_BODY__')) as BABYLON.Mesh; + const innerMesh = findMesh('__X_BODY__'); const innerMaterial = innerMesh.material as BABYLON.PBRMaterial; const applyOuterColor = () => { diff --git a/packages/frontend/src/utility/room/objects/wallShelf.ts b/packages/frontend/src/utility/room/objects/wallShelf.ts index a7ec8df739..ef71183799 100644 --- a/packages/frontend/src/utility/room/objects/wallShelf.ts +++ b/packages/frontend/src/utility/room/objects/wallShelf.ts @@ -33,7 +33,7 @@ export const wallShelf = defineObject({ }, }, placement: 'side', - createInstance: ({ room, options, root }) => { + createInstance: ({ findMesh, options, root }) => { const applyStyle = () => { const aMeshes = root.getChildMeshes().filter(m => m.name.includes('__X_VARIATION_A__')); const bMeshes = root.getChildMeshes().filter(m => m.name.includes('__X_VARIATION_B__')); @@ -56,7 +56,7 @@ export const wallShelf = defineObject({ applyStyle(); - const bodyMesh = root.getChildMeshes().find(m => m.name.includes('__X_BODY__')) as BABYLON.Mesh; + const bodyMesh = findMesh('__X_BODY__'); const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial; const bodyTexture = bodyMaterial.albedoTexture as BABYLON.Texture;