diff --git a/packages/frontend/assets/room/objects/iron-frame-table/iron-frame-table.blend b/packages/frontend/assets/room/objects/iron-frame-table/iron-frame-table.blend new file mode 100644 index 0000000000..ab6340b8e8 Binary files /dev/null and b/packages/frontend/assets/room/objects/iron-frame-table/iron-frame-table.blend differ diff --git a/packages/frontend/assets/room/objects/iron-frame-table/iron-frame-table.glb b/packages/frontend/assets/room/objects/iron-frame-table/iron-frame-table.glb new file mode 100644 index 0000000000..4832129a59 Binary files /dev/null and b/packages/frontend/assets/room/objects/iron-frame-table/iron-frame-table.glb differ diff --git a/packages/frontend/src/utility/room/object-defs.ts b/packages/frontend/src/utility/room/object-defs.ts index 50909d7187..37f738a6c4 100644 --- a/packages/frontend/src/utility/room/object-defs.ts +++ b/packages/frontend/src/utility/room/object-defs.ts @@ -36,6 +36,7 @@ import { facialTissue } from './objects/facialTissue.js'; import { hangingTShirt } from './objects/hangingTShirt.js'; import { icosahedron } from './objects/icosahedron.js'; import { ironFrameShelf5, ironFrameShelf4, ironFrameShelf3 } from './objects/ironFrameShelf.js'; +import { ironFrameTable } from './objects/ironFrameTable.js'; import { keyboard } from './objects/keyboard.js'; import { laptopPc } from './objects/laptopPc.js'; import { lavaLamp } from './objects/lavaLamp.js'; @@ -124,6 +125,7 @@ export const OBJECT_DEFS = [ ironFrameShelf5, ironFrameShelf4, ironFrameShelf3, + ironFrameTable, keyboard, laptopPc, lavaLamp, diff --git a/packages/frontend/src/utility/room/objects/ironFrameTable.ts b/packages/frontend/src/utility/room/objects/ironFrameTable.ts new file mode 100644 index 0000000000..805ffb0057 --- /dev/null +++ b/packages/frontend/src/utility/room/objects/ironFrameTable.ts @@ -0,0 +1,101 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import * as BABYLON from '@babylonjs/core'; +import { defineObject } from '../engine.js'; + +export const ironFrameTable = defineObject({ + id: 'ironFrameTable', + name: 'ironFrameTable', + options: { + schema: { + frameColor: { + type: 'color', + label: 'Frame color', + }, + boardColor: { + type: 'color', + label: 'Board color', + }, + width: { + type: 'range', + label: 'Width', + min: 0, + max: 1, + step: 0.01, + }, + depth: { + type: 'range', + label: 'Depth', + min: 0, + max: 1, + step: 0.01, + }, + height: { + type: 'range', + label: 'Height', + min: 0, + max: 1, + step: 0.01, + }, + }, + default: { + frameColor: [0.8, 0.8, 0.8], + boardColor: [0.8, 0.4, 0.1], + width: 0.25, + depth: 0.2, + height: 0.35, + }, + }, + placement: 'top', + 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(); + + const applySize = () => { + for (const mesh of model.root.getChildMeshes()) { + if (mesh.morphTargetManager != null && mesh.morphTargetManager.getTargetByName('W') != null) { + mesh.morphTargetManager.getTargetByName('W').influence = options.width; + } + if (mesh.morphTargetManager != null && mesh.morphTargetManager.getTargetByName('D') != null) { + mesh.morphTargetManager.getTargetByName('D').influence = options.depth; + } + if (mesh.morphTargetManager != null && mesh.morphTargetManager.getTargetByName('H') != null) { + mesh.morphTargetManager.getTargetByName('H').influence = options.height; + } + } + model.updated(); + }; + + applySize(); + + return { + onOptionsUpdated: ([k, v]) => { + switch (k) { + case 'frameColor': applyFrameColor(); break; + case 'boardColor': applyBoardColor(); break; + case 'width': applySize(); break; + case 'depth': applySize(); break; + case 'height': applySize(); break; + } + }, + interactions: {}, + }; + }, +});