diff --git a/packages/frontend/assets/room/objects/mixer/body.af b/packages/frontend/assets/room/objects/mixer/body.af new file mode 100644 index 0000000000..787bd92be5 Binary files /dev/null and b/packages/frontend/assets/room/objects/mixer/body.af differ diff --git a/packages/frontend/assets/room/objects/mixer/mixer.blend b/packages/frontend/assets/room/objects/mixer/mixer.blend new file mode 100644 index 0000000000..327f7cdcaf Binary files /dev/null and b/packages/frontend/assets/room/objects/mixer/mixer.blend differ diff --git a/packages/frontend/assets/room/objects/mixer/mixer.glb b/packages/frontend/assets/room/objects/mixer/mixer.glb new file mode 100644 index 0000000000..0df428a29c Binary files /dev/null and b/packages/frontend/assets/room/objects/mixer/mixer.glb differ diff --git a/packages/frontend/assets/room/objects/mixer/textures/body.png b/packages/frontend/assets/room/objects/mixer/textures/body.png new file mode 100644 index 0000000000..3c969b7e38 Binary files /dev/null and b/packages/frontend/assets/room/objects/mixer/textures/body.png differ diff --git a/packages/frontend/assets/room/objects/mixer/uv.png b/packages/frontend/assets/room/objects/mixer/uv.png new file mode 100644 index 0000000000..5aaf2e85a8 Binary files /dev/null and b/packages/frontend/assets/room/objects/mixer/uv.png differ diff --git a/packages/frontend/src/utility/room/engine.ts b/packages/frontend/src/utility/room/engine.ts index 59e959d80b..4d431054cc 100644 --- a/packages/frontend/src/utility/room/engine.ts +++ b/packages/frontend/src/utility/room/engine.ts @@ -1102,19 +1102,29 @@ export class RoomEngine { } } - private createGhost(mesh: BABYLON.Mesh) { + private createGhost(mesh: BABYLON.Mesh): BABYLON.Mesh { const ghost = mesh.clone('ghost', null, false)!; ghost.metadata = { isGhost: true }; + + const materials = new WeakMap(); + for (const m of ghost.getChildMeshes()) { m.metadata = { isGhost: true }; - if (m.material) { - const mat = m.material.clone(`${m.material.name}_ghost`); - mat.alpha = 0.3; - mat.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND; - m.material = mat; - } m.checkCollisions = false; + + if (m.material) { + if (materials.has(m.material)) { + m.material = materials.get(m.material)!; + } else { + const mat = m.material.clone(`${m.material.name}_ghost`); + mat.alpha = 0.3; + mat.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND; + materials.set(m.material, mat); + m.material = mat; + } + } } + return ghost; } diff --git a/packages/frontend/src/utility/room/object-defs.ts b/packages/frontend/src/utility/room/object-defs.ts index b09d81681d..5326e4a819 100644 --- a/packages/frontend/src/utility/room/object-defs.ts +++ b/packages/frontend/src/utility/room/object-defs.ts @@ -23,6 +23,7 @@ import { keyboard } from './objects/keyboard.js'; import { lavaLamp } from './objects/lavaLamp.js'; import { letterCase } from './objects/letterCase.js'; import { milk } from './objects/milk.js'; +import { mixer } from './objects/mixer.js'; import { monitor } from './objects/monitor.js'; import { monstera } from './objects/monstera.js'; import { mug } from './objects/mug.js'; @@ -64,6 +65,7 @@ export const OBJECT_DEFS = [ lavaLamp, letterCase, milk, + mixer, monitor, monstera, mug, diff --git a/packages/frontend/src/utility/room/objects/mixer.ts b/packages/frontend/src/utility/room/objects/mixer.ts new file mode 100644 index 0000000000..6511a580b2 --- /dev/null +++ b/packages/frontend/src/utility/room/objects/mixer.ts @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { defineObject } from '../engine.js'; + +export const mixer = defineObject({ + id: 'mixer', + name: 'Mixer', + options: { + schema: {}, + default: {}, + }, + placement: 'top', + createInstance: () => { + return { + interactions: {}, + }; + }, +});