diff --git a/packages/frontend/assets/room/objects/aquarium/aquarium.blend b/packages/frontend/assets/room/objects/aquarium/aquarium.blend index 6893075636..6ee357f022 100644 Binary files a/packages/frontend/assets/room/objects/aquarium/aquarium.blend and b/packages/frontend/assets/room/objects/aquarium/aquarium.blend differ diff --git a/packages/frontend/assets/room/objects/aquarium/aquarium.glb b/packages/frontend/assets/room/objects/aquarium/aquarium.glb index 4b7485e724..ef2e0e76bc 100644 Binary files a/packages/frontend/assets/room/objects/aquarium/aquarium.glb and b/packages/frontend/assets/room/objects/aquarium/aquarium.glb differ diff --git a/packages/frontend/assets/room/objects/aroma-read-diffuser/aroma-read-diffuser.blend b/packages/frontend/assets/room/objects/aroma-read-diffuser/aroma-read-diffuser.blend new file mode 100644 index 0000000000..36e49d43e2 Binary files /dev/null and b/packages/frontend/assets/room/objects/aroma-read-diffuser/aroma-read-diffuser.blend differ diff --git a/packages/frontend/assets/room/objects/aroma-read-diffuser/aroma-read-diffuser.glb b/packages/frontend/assets/room/objects/aroma-read-diffuser/aroma-read-diffuser.glb new file mode 100644 index 0000000000..52fd82709d Binary files /dev/null and b/packages/frontend/assets/room/objects/aroma-read-diffuser/aroma-read-diffuser.glb differ diff --git a/packages/frontend/assets/room/objects/aroma-read-diffuser/label.af b/packages/frontend/assets/room/objects/aroma-read-diffuser/label.af new file mode 100644 index 0000000000..fa447d600e Binary files /dev/null and b/packages/frontend/assets/room/objects/aroma-read-diffuser/label.af differ diff --git a/packages/frontend/assets/room/objects/aroma-read-diffuser/textures/label.png b/packages/frontend/assets/room/objects/aroma-read-diffuser/textures/label.png new file mode 100644 index 0000000000..fda934185e Binary files /dev/null and b/packages/frontend/assets/room/objects/aroma-read-diffuser/textures/label.png differ diff --git a/packages/frontend/assets/room/objects/pc/pc.blend b/packages/frontend/assets/room/objects/pc/pc.blend index 9c2e3a4a9e..6bae8fd641 100644 Binary files a/packages/frontend/assets/room/objects/pc/pc.blend and b/packages/frontend/assets/room/objects/pc/pc.blend differ diff --git a/packages/frontend/assets/room/objects/pc/pc.glb b/packages/frontend/assets/room/objects/pc/pc.glb new file mode 100644 index 0000000000..9238f8c515 Binary files /dev/null and b/packages/frontend/assets/room/objects/pc/pc.glb differ diff --git a/packages/frontend/assets/room/objects/pet-bottle/pet-bottle.blend b/packages/frontend/assets/room/objects/pet-bottle/pet-bottle.blend index fc11beb20d..ee609c452d 100644 Binary files a/packages/frontend/assets/room/objects/pet-bottle/pet-bottle.blend and b/packages/frontend/assets/room/objects/pet-bottle/pet-bottle.blend differ diff --git a/packages/frontend/assets/room/objects/pet-bottle/pet-bottle.glb b/packages/frontend/assets/room/objects/pet-bottle/pet-bottle.glb index 34724d7e83..60fee04da0 100644 Binary files a/packages/frontend/assets/room/objects/pet-bottle/pet-bottle.glb and b/packages/frontend/assets/room/objects/pet-bottle/pet-bottle.glb differ diff --git a/packages/frontend/assets/room/objects/trash-can/trash-can.blend b/packages/frontend/assets/room/objects/trash-can/trash-can.blend new file mode 100644 index 0000000000..30e8a271ae Binary files /dev/null and b/packages/frontend/assets/room/objects/trash-can/trash-can.blend differ diff --git a/packages/frontend/src/utility/room/object-defs.ts b/packages/frontend/src/utility/room/object-defs.ts index abaf2ace3f..dc10e59030 100644 --- a/packages/frontend/src/utility/room/object-defs.ts +++ b/packages/frontend/src/utility/room/object-defs.ts @@ -6,6 +6,7 @@ import { a4Case } from './objects/a4Case.js'; import { aircon } from './objects/aircon.js'; import { aquarium } from './objects/aquarium.js'; +import { aromaReadDiffuser } from './objects/aromaReadDiffuser.js'; import { banknote } from './objects/banknote.js'; import { bed } from './objects/bed.js'; import { blind } from './objects/blind.js'; @@ -30,6 +31,7 @@ import { monstera } from './objects/monstera.js'; import { mug } from './objects/mug.js'; import { openedCardboardBox } from './objects/openedCardboardBox.js'; import { pachira } from './objects/pachira.js'; +import { pc } from './objects/pc.js'; import { petBottle } from './objects/petBottle.js'; import { plant } from './objects/plant.js'; import { plant2 } from './objects/plant2.js'; @@ -51,6 +53,7 @@ export const OBJECT_DEFS = [ a4Case, aircon, aquarium, + aromaReadDiffuser, banknote, bed, blind, @@ -75,6 +78,7 @@ export const OBJECT_DEFS = [ mug, openedCardboardBox, pachira, + pc, petBottle, plant, plant2, diff --git a/packages/frontend/src/utility/room/objects/aromaReadDiffuser.ts b/packages/frontend/src/utility/room/objects/aromaReadDiffuser.ts new file mode 100644 index 0000000000..cca61477d5 --- /dev/null +++ b/packages/frontend/src/utility/room/objects/aromaReadDiffuser.ts @@ -0,0 +1,57 @@ +/* + * 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 aromaReadDiffuser = defineObject({ + id: 'aromaReadDiffuser', + name: 'Aroma Read Diffuser', + options: { + schema: { + bottleColor: { + type: 'color', + label: 'Bottle Color', + }, + oilColor: { + type: 'color', + label: 'Oil Color', + }, + }, + default: { + bottleColor: [1, 0.83, 0.48], + oilColor: [1, 0.4, 0], + }, + }, + placement: 'top', + createInstance: ({ options, root }) => { + const bottleMesh = root.getChildMeshes().find(m => m.name.includes('__X_BOTTLE__')) as BABYLON.Mesh; + const bottleMaterial = bottleMesh.material as BABYLON.PBRMaterial; + + const oilMesh = root.getChildMeshes().find(m => m.name.includes('__X_OIL__')) as BABYLON.Mesh; + const oilMaterial = oilMesh.material as BABYLON.PBRMaterial; + + const applyBottleColor = () => { + const [r, g, b] = options.bottleColor; + bottleMaterial.albedoColor = new BABYLON.Color3(r, g, b); + }; + + const applyOilColor = () => { + const [r, g, b] = options.oilColor; + oilMaterial.albedoColor = new BABYLON.Color3(r, g, b); + }; + + applyBottleColor(); + applyOilColor(); + + return { + onOptionsUpdated: ([k, v]) => { + applyBottleColor(); + applyOilColor(); + }, + interactions: {}, + }; + }, +}); diff --git a/packages/frontend/src/utility/room/objects/pc.ts b/packages/frontend/src/utility/room/objects/pc.ts new file mode 100644 index 0000000000..2be88baea0 --- /dev/null +++ b/packages/frontend/src/utility/room/objects/pc.ts @@ -0,0 +1,42 @@ +/* + * 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 pc = defineObject({ + id: 'pc', + name: 'PC', + options: { + schema: { + color: { + type: 'color', + label: 'Color', + }, + }, + default: { + color: [0, 0, 0], + }, + }, + placement: 'top', + createInstance: ({ options, root }) => { + const bodyMesh = root.getChildMeshes().find(m => m.name.includes('__X_BODY__')) as BABYLON.Mesh; + const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial; + + const applyColor = () => { + const [r, g, b] = options.color; + bodyMaterial.albedoColor = new BABYLON.Color3(r, g, b); + }; + + applyColor(); + + return { + onOptionsUpdated: ([k, v]) => { + applyColor(); + }, + interactions: {}, + }; + }, +}); diff --git a/packages/frontend/src/utility/room/objects/petBottle.ts b/packages/frontend/src/utility/room/objects/petBottle.ts index 5b2ca3fbdb..f0845503ec 100644 --- a/packages/frontend/src/utility/room/objects/petBottle.ts +++ b/packages/frontend/src/utility/room/objects/petBottle.ts @@ -15,24 +15,36 @@ export const petBottle = defineObject({ type: 'boolean', label: 'With Cap', }, + empty: { + type: 'boolean', + label: 'Empty', + }, }, default: { withCap: true, + empty: false, }, }, placement: 'top', createInstance: ({ root, options }) => { const capMesh = root.getChildMeshes().find(m => m.name.includes('__X_CAP__')) as BABYLON.Mesh; + const liquidMesh = root.getChildMeshes().find(m => m.name.includes('__X_LIQUID__')) as BABYLON.Mesh; const applyWithCap = () => { capMesh.setEnabled(options.withCap); }; + const applyEmpty = () => { + liquidMesh.setEnabled(!options.empty); + }; + applyWithCap(); + applyEmpty(); return { onOptionsUpdated: ([k, v]) => { applyWithCap(); + applyEmpty(); }, interactions: {}, };