diff --git a/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-3.glb b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-3.glb new file mode 100644 index 0000000000..6b20dea7a9 Binary files /dev/null and b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-3.glb differ diff --git a/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-4.glb b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-4.glb new file mode 100644 index 0000000000..2d609862bb Binary files /dev/null and b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-4.glb differ diff --git a/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-5.glb b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-5.glb new file mode 100644 index 0000000000..4c9fd8007e Binary files /dev/null and b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-5.glb differ diff --git a/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-h.glb b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-h.glb deleted file mode 100644 index d03cd1e3f1..0000000000 Binary files a/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-h.glb and /dev/null differ diff --git a/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-v.glb b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-v.glb deleted file mode 100644 index 43a7c8c860..0000000000 Binary files a/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf-v.glb and /dev/null differ diff --git a/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf.blend b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf.blend index eb2fe34731..083a68bec0 100644 Binary files a/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf.blend and b/packages/frontend/assets/room/objects/iron-frame-shelf/iron-frame-shelf.blend differ diff --git a/packages/frontend/src/utility/room/engine.ts b/packages/frontend/src/utility/room/engine.ts index 7ace83144f..7f741ab740 100644 --- a/packages/frontend/src/utility/room/engine.ts +++ b/packages/frontend/src/utility/room/engine.ts @@ -331,6 +331,14 @@ export function defineObject(def: ObjectDef(baseDef: Partial>): { + extend: (childDef: Partial>) => ObjectDef; +} { + return { + extend: (childDef) => ({ ...baseDef, ...childDef }) as ObjectDef, + }; +} + // この実装方法だとマイナスの座標をうまく処理できず結果がおかしくなるので応急処置で全体を+10000cmオフセットしてから計算している function getMeshesBoundingBox(meshes: BABYLON.Mesh[]): BABYLON.BoundingBox { let min = new BABYLON.Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE); diff --git a/packages/frontend/src/utility/room/object-defs.ts b/packages/frontend/src/utility/room/object-defs.ts index 22136fda13..f3c64e1fe1 100644 --- a/packages/frontend/src/utility/room/object-defs.ts +++ b/packages/frontend/src/utility/room/object-defs.ts @@ -35,7 +35,7 @@ import { envelope } from './objects/envelope.js'; import { facialTissue } from './objects/facialTissue.js'; import { hangingTShirt } from './objects/hangingTShirt.js'; import { icosahedron } from './objects/icosahedron.js'; -import { ironFrameShelfH, ironFrameShelfV } from './objects/ironFrameShelf.js'; +import { ironFrameShelf5, ironFrameShelf4, ironFrameShelf3 } from './objects/ironFrameShelf.js'; import { keyboard } from './objects/keyboard.js'; import { laptopPc } from './objects/laptopPc.js'; import { lavaLamp } from './objects/lavaLamp.js'; @@ -117,8 +117,9 @@ export const OBJECT_DEFS = [ facialTissue, hangingTShirt, icosahedron, - ironFrameShelfH, - ironFrameShelfV, + ironFrameShelf5, + ironFrameShelf4, + ironFrameShelf3, keyboard, laptopPc, lavaLamp, diff --git a/packages/frontend/src/utility/room/objects/ironFrameShelf.ts b/packages/frontend/src/utility/room/objects/ironFrameShelf.ts index 326f18c079..321895dfa9 100644 --- a/packages/frontend/src/utility/room/objects/ironFrameShelf.ts +++ b/packages/frontend/src/utility/room/objects/ironFrameShelf.ts @@ -4,12 +4,9 @@ */ import * as BABYLON from '@babylonjs/core'; -import { defineObject } from '../engine.js'; +import { defineObject, defineObjectClass } from '../engine.js'; -export const ironFrameShelfH = defineObject({ - id: 'ironFrameShelfH', - name: 'ironFrameShelf H', - path: 'iron-frame-shelf/iron-frame-shelf-h', +const base = defineObjectClass({ options: { schema: { frameColor: { @@ -20,10 +17,18 @@ export const ironFrameShelfH = defineObject({ type: 'color', label: 'Board color', }, + width: { + type: 'range', + label: 'Width', + min: 0, + max: 1, + step: 0.01, + }, }, default: { frameColor: [0.2, 0.2, 0.2], boardColor: [0.8, 0.4, 0.1], + width: 0.2, }, }, placement: 'floor', @@ -45,61 +50,44 @@ export const ironFrameShelfH = defineObject({ applyBoardColor(); + const applySize = () => { + for (const mesh of model.root.getChildMeshes()) { + if (mesh.morphTargetManager != null && mesh.morphTargetManager.getTargetByName('Width') != null) { + mesh.morphTargetManager.getTargetByName('Width').influence = options.width; + } + } + model.updated(); + }; + + applySize(); + return { onOptionsUpdated: ([k, v]) => { - applyFrameColor(); - applyBoardColor(); + switch (k) { + case 'frameColor': applyFrameColor(); break; + case 'boardColor': applyBoardColor(); break; + case 'width': applySize(); break; + } }, interactions: {}, }; }, }); -export const ironFrameShelfV = defineObject({ - id: 'ironFrameShelfV', - name: 'ironFrameShelf V', - path: 'iron-frame-shelf/iron-frame-shelf-v', - options: { - schema: { - frameColor: { - type: 'color', - label: 'Frame color', - }, - boardColor: { - type: 'color', - label: 'Board color', - }, - }, - default: { - frameColor: [0.2, 0.2, 0.2], - boardColor: [0.8, 0.4, 0.1], - }, - }, - placement: 'floor', - createInstance: ({ options, model }) => { - const frameMaterial = model.findMaterial('__X_FRAME__'); - const boardMaterial = model.findMaterial('__X_BOARD__'); - - const applyFrameColor = () => { - const [r, g, b] = options.frameColor; - frameMaterial.albedoColor = new BABYLON.Color3(r, g, b); - }; - - applyFrameColor(); - - const applyBoardColor = () => { - const [r, g, b] = options.boardColor; - boardMaterial.albedoColor = new BABYLON.Color3(r, g, b); - }; - - applyBoardColor(); - - return { - onOptionsUpdated: ([k, v]) => { - applyFrameColor(); - applyBoardColor(); - }, - interactions: {}, - }; - }, +export const ironFrameShelf5 = base.extend({ + id: 'ironFrameShelf5', + name: 'ironFrameShelf 5', + path: 'iron-frame-shelf/iron-frame-shelf-5', +}); + +export const ironFrameShelf4 = base.extend({ + id: 'ironFrameShelf4', + name: 'ironFrameShelf 4', + path: 'iron-frame-shelf/iron-frame-shelf-4', +}); + +export const ironFrameShelf3 = base.extend({ + id: 'ironFrameShelf3', + name: 'ironFrameShelf 3', + path: 'iron-frame-shelf/iron-frame-shelf-3', });