diff --git a/packages/frontend/assets/room/objects/desktop-pc/desktop-pc.blend b/packages/frontend/assets/room/objects/desktop-pc/desktop-pc.blend new file mode 100644 index 0000000000..7f928c8827 Binary files /dev/null and b/packages/frontend/assets/room/objects/desktop-pc/desktop-pc.blend differ diff --git a/packages/frontend/assets/room/objects/desktop-pc/desktop-pc.glb b/packages/frontend/assets/room/objects/desktop-pc/desktop-pc.glb new file mode 100644 index 0000000000..8f359171b6 Binary files /dev/null and b/packages/frontend/assets/room/objects/desktop-pc/desktop-pc.glb differ diff --git a/packages/frontend/src/utility/room/object-defs.ts b/packages/frontend/src/utility/room/object-defs.ts index 9fadfa0258..ccbbe459d7 100644 --- a/packages/frontend/src/utility/room/object-defs.ts +++ b/packages/frontend/src/utility/room/object-defs.ts @@ -22,6 +22,7 @@ import { colorBox } from './objects/colorBox.js'; import { cupNoodle } from './objects/cupNoodle.js'; import { debugHipoly } from './objects/debugHipoly.js'; import { desk } from './objects/desk.js'; +import { desktopPc } from './objects/desktopPc.js'; import { ductTape } from './objects/ductTape.js'; import { emptyBento } from './objects/emptyBento.js'; import { energyDrink } from './objects/energyDrink.js'; @@ -83,6 +84,7 @@ export const OBJECT_DEFS = [ colorBox, cupNoodle, desk, + desktopPc, ductTape, emptyBento, energyDrink, diff --git a/packages/frontend/src/utility/room/objects/desktopPc.ts b/packages/frontend/src/utility/room/objects/desktopPc.ts new file mode 100644 index 0000000000..d7174813a2 --- /dev/null +++ b/packages/frontend/src/utility/room/objects/desktopPc.ts @@ -0,0 +1,85 @@ +/* + * 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 desktopPc = defineObject({ + id: 'desktopPc', + name: 'Desktop PC', + options: { + schema: { + bodyColor: { + type: 'color', + label: 'Body color', + }, + coverColor: { + type: 'color', + label: 'Cover color', + }, + innerColor: { + type: 'color', + label: 'Inner color', + }, + ledColor: { + type: 'color', + label: 'LED color', + }, + }, + default: { + bodyColor: [0.05, 0.05, 0.05], + coverColor: [0.5, 0.9, 0], + innerColor: [1, 1, 1], + ledColor: [0.5, 0.9, 0], + }, + }, + placement: 'top', + createInstance: ({ options, model }) => { + const bodyMaterial = model.findMaterial('__X_BODY__'); + const coverMaterial = model.findMaterial('__X_COVER__'); + const innerMaterial = model.findMaterial('__X_INNER__'); + const ledMaterial = model.findMaterial('__X_LED__'); + + ledMaterial.emissiveIntensity = 10; + + const applyBodyColor = () => { + const [r, g, b] = options.bodyColor; + bodyMaterial.albedoColor = new BABYLON.Color3(r, g, b); + }; + + applyBodyColor(); + + const applyCoverColor = () => { + const [r, g, b] = options.coverColor; + coverMaterial.albedoColor = new BABYLON.Color3(r, g, b); + }; + + applyCoverColor(); + + const applyInnerColor = () => { + const [r, g, b] = options.innerColor; + innerMaterial.albedoColor = new BABYLON.Color3(r, g, b); + }; + + applyInnerColor(); + + const applyLedColor = () => { + const [r, g, b] = options.ledColor; + ledMaterial.emissiveColor = new BABYLON.Color3(r, g, b); + }; + + applyLedColor(); + + return { + onOptionsUpdated: ([k, v]) => { + applyBodyColor(); + applyCoverColor(); + applyInnerColor(); + applyLedColor(); + }, + interactions: {}, + }; + }, +});