diff --git a/packages/frontend/assets/room/envs/museum/museum.blend b/packages/frontend/assets/room/envs/museum/museum.blend index e27065e40e..2afe632dce 100644 Binary files a/packages/frontend/assets/room/envs/museum/museum.blend and b/packages/frontend/assets/room/envs/museum/museum.blend differ diff --git a/packages/frontend/assets/room/envs/museum/museum.glb b/packages/frontend/assets/room/envs/museum/museum.glb index 0d4e3ccb0a..f46e3f516e 100644 Binary files a/packages/frontend/assets/room/envs/museum/museum.glb and b/packages/frontend/assets/room/envs/museum/museum.glb differ diff --git a/packages/frontend/assets/room/objects/description-plate/description-plate.blend b/packages/frontend/assets/room/objects/description-plate/description-plate.blend new file mode 100644 index 0000000000..c884f621d9 Binary files /dev/null and b/packages/frontend/assets/room/objects/description-plate/description-plate.blend differ diff --git a/packages/frontend/assets/room/objects/description-plate/description-plate.glb b/packages/frontend/assets/room/objects/description-plate/description-plate.glb new file mode 100644 index 0000000000..1307a9a5b1 Binary files /dev/null and b/packages/frontend/assets/room/objects/description-plate/description-plate.glb differ diff --git a/packages/frontend/assets/room/objects/description-plate/texture.af b/packages/frontend/assets/room/objects/description-plate/texture.af new file mode 100644 index 0000000000..955f7fd792 Binary files /dev/null and b/packages/frontend/assets/room/objects/description-plate/texture.af differ diff --git a/packages/frontend/assets/room/objects/description-plate/texture.png b/packages/frontend/assets/room/objects/description-plate/texture.png new file mode 100644 index 0000000000..ef97054c0e Binary files /dev/null and b/packages/frontend/assets/room/objects/description-plate/texture.png differ diff --git a/packages/frontend/assets/room/objects/low-partition-bar/low-partition-bar.blend b/packages/frontend/assets/room/objects/low-partition-bar/low-partition-bar.blend new file mode 100644 index 0000000000..a36ad33072 Binary files /dev/null and b/packages/frontend/assets/room/objects/low-partition-bar/low-partition-bar.blend differ diff --git a/packages/frontend/assets/room/objects/low-partition-bar/low-partition-bar.glb b/packages/frontend/assets/room/objects/low-partition-bar/low-partition-bar.glb new file mode 100644 index 0000000000..f20e6cba13 Binary files /dev/null and b/packages/frontend/assets/room/objects/low-partition-bar/low-partition-bar.glb differ diff --git a/packages/frontend/src/world/room/env.ts b/packages/frontend/src/world/room/env.ts index dbb72a13f9..8e5e64797f 100644 --- a/packages/frontend/src/world/room/env.ts +++ b/packages/frontend/src/world/room/env.ts @@ -716,7 +716,7 @@ export class MuseumEnvManager extends EnvManager { this.shadowGenerators.push(shadowGeneratorForRoomLight); } - for (const node of this.loaderResult.transformNodes.filter(node => node.name.includes('__LIGHT__'))) { + for (const node of this.meshes.filter(mesh => mesh.name.includes('__LIGHT__'))) { const light = new BABYLON.SpotLight('museumEnv:SubRoomLight', node.position, new BABYLON.Vector3(0, -1, 0), 16, 8, this.engine.scene, true); light.diffuse = new BABYLON.Color3(...this.engine.roomState.roomLightColor); light.range = cm(500); diff --git a/packages/frontend/src/world/room/object-defs.ts b/packages/frontend/src/world/room/object-defs.ts index cde1554b12..e963b5a71f 100644 --- a/packages/frontend/src/world/room/object-defs.ts +++ b/packages/frontend/src/world/room/object-defs.ts @@ -25,6 +25,7 @@ import { cuboid } from './objects/cuboid.js'; import { cupNoodle } from './objects/cupNoodle.js'; import { custardPudding } from './objects/custardPudding.js'; import { debugHipoly } from './objects/debugHipoly.js'; +import { descriptionPlate } from './objects/descriptionPlate.js'; import { desk } from './objects/desk.js'; import { desktopPc } from './objects/desktopPc.js'; import { djMixer } from './objects/djMixer.js'; @@ -48,6 +49,7 @@ import { laptopPc } from './objects/laptopPc.js'; import { largeMousepad } from './objects/largeMousepad.js'; import { lavaLamp } from './objects/lavaLamp.js'; import { letterCase } from './objects/letterCase.js'; +import { lowPartitionBar } from './objects/lowPartitionBar.js'; import { miObjet } from './objects/mi-objet.js'; import { milk } from './objects/milk.js'; import { miPlate } from './objects/miPlate.js'; @@ -209,6 +211,8 @@ export const OBJECT_DEFS = [ woodSoundAbsorbingPanel, hangingDuctRail, spotLight, + lowPartitionBar, + descriptionPlate, ]; export function getObjectDef(type: string): typeof OBJECT_DEFS[number] { diff --git a/packages/frontend/src/world/room/objects/descriptionPlate.ts b/packages/frontend/src/world/room/objects/descriptionPlate.ts new file mode 100644 index 0000000000..8b3830ccbb --- /dev/null +++ b/packages/frontend/src/world/room/objects/descriptionPlate.ts @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { defineObject } from '../object.js'; + +export const descriptionPlate = defineObject({ + id: 'descriptionPlate', + name: 'descriptionPlate', + options: { + schema: {}, + default: {}, + }, + placement: 'side', + hasCollisions: false, + hasTexture: true, + createInstance: () => { + return { + interactions: {}, + }; + }, +}); diff --git a/packages/frontend/src/world/room/objects/lowPartitionBar.ts b/packages/frontend/src/world/room/objects/lowPartitionBar.ts new file mode 100644 index 0000000000..d6f65f6bb3 --- /dev/null +++ b/packages/frontend/src/world/room/objects/lowPartitionBar.ts @@ -0,0 +1,64 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import * as BABYLON from '@babylonjs/core'; +import { defineObject } from '../object.js'; + +export const lowPartitionBar = defineObject({ + id: 'lowPartitionBar', + name: 'lowPartitionBar', + options: { + schema: { + bodyColor: { + type: 'color', + label: 'Body color', + }, + width: { + type: 'range', + label: 'Width', + min: 0, + max: 1, + step: 0.01, + }, + }, + default: { + bodyColor: [0.8, 0.8, 0.8], + width: 0.5, + }, + }, + placement: 'top', + //hasCollisions: true, + createInstance: ({ options, model }) => { + const bodyMaterial = model.findMaterial('__X_BODY__'); + + const applyBodyColor = () => { + const [r, g, b] = options.bodyColor; + bodyMaterial.albedoColor = new BABYLON.Color3(r, g, b); + }; + + applyBodyColor(); + + 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; + } + } + model.updated(); + }; + + applySize(); + + return { + onOptionsUpdated: ([k, v]) => { + switch (k) { + case 'bodyColor': applyBodyColor(); break; + case 'width': applySize(); break; + } + }, + interactions: {}, + }; + }, +});