diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 6d363a306c..2b3c5d41dc 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -3969,6 +3969,8 @@ _miRoom: wallClock: "壁掛け時計" _wallClock: frameMat: "フレームの素材" + faceMat: "文字盤の素材" + handsMat: "針の素材" wallGlassPictureFrame: "ガラスの壁掛けフォトフレーム" _wallGlassPictureFrame: height: "高さ" diff --git a/packages/frontend-misskey-world-engine/src/room/furnitures/wallClock.ts b/packages/frontend-misskey-world-engine/src/room/furnitures/wallClock.ts index 4718feac53..81f4062bfe 100644 --- a/packages/frontend-misskey-world-engine/src/room/furnitures/wallClock.ts +++ b/packages/frontend-misskey-world-engine/src/room/furnitures/wallClock.ts @@ -4,13 +4,13 @@ */ import * as BABYLON from '@babylonjs/core/pure'; -import { defineFuniture } from '../furniture.js'; import { wallClock_schema } from 'misskey-world/src/room/furnitures/wallClock.schema.js'; +import { defineFuniture } from '../furniture.js'; export const wallClock = defineFuniture(wallClock_schema, { createInstance: ({ sr, timer, options, model }) => { - const hourHand = model.findMesh('HandH'); - const minuteHand = model.findMesh('HandM'); + const hourHand = model.findMesh('__X_HAND_H__'); + const minuteHand = model.findMesh('__X_HAND_M__'); const frameMaterial = model.findMaterial('__X_FRAME__'); @@ -22,24 +22,46 @@ export const wallClock = defineFuniture(wallClock_schema, { applyFrameMat(); + const faceMaterial = model.findMaterial('__X_FACE__'); + + const applyFaceMat = () => { + faceMaterial.albedoColor = new BABYLON.Color3(options.faceMat.color[0], options.faceMat.color[1], options.faceMat.color[2]); + faceMaterial.roughness = options.faceMat.roughness; + faceMaterial.metallic = options.faceMat.metallic; + }; + + applyFaceMat(); + + const handsMaterial = model.findMaterial('__X_HAND__'); + + const applyHandsMat = () => { + handsMaterial.albedoColor = new BABYLON.Color3(options.handsMat.color[0], options.handsMat.color[1], options.handsMat.color[2]); + handsMaterial.roughness = options.handsMat.roughness; + handsMaterial.metallic = options.handsMat.metallic; + }; + + applyHandsMat(); + model.bakeExcludeMeshes = [hourHand, minuteHand]; + timer.setInterval(() => { + const now = new Date(); + const hours = now.getHours() % 12; + const minutes = now.getMinutes(); + const hAngle = -(hours / 12) * Math.PI * 2 - (minutes / 60) * (Math.PI * 2 / 12); + const mAngle = -(minutes / 60) * Math.PI * 2; + hourHand.rotation = new BABYLON.Vector3(0, 0, hAngle); + minuteHand.rotation = new BABYLON.Vector3(0, 0, mAngle); + sr.updateMesh([hourHand, minuteHand], false); + }, 1000); + return { - onInited: () => { - // TODO: 家具が撤去された後も呼ばれ続けるのをどうにかする - timer.setInterval(() => { - const now = new Date(); - const hours = now.getHours() % 12; - const minutes = now.getMinutes(); - const hAngle = -(hours / 12) * Math.PI * 2 - (minutes / 60) * (Math.PI * 2 / 12); - const mAngle = -(minutes / 60) * Math.PI * 2; - hourHand.rotation = new BABYLON.Vector3(0, 0, hAngle); - minuteHand.rotation = new BABYLON.Vector3(0, 0, mAngle); - sr.updateMesh([hourHand, minuteHand], false); - }, 1000); - }, onOptionsUpdated: ([k, v]) => { - applyFrameMat(); + switch (k) { + case 'frameMat': applyFrameMat(); break; + case 'faceMat': applyFaceMat(); break; + case 'handsMat': applyHandsMat(); break; + } }, interactions: {}, dispose: () => {}, diff --git a/packages/frontend/assets/world/objects/wall-clock/wall-clock.blend b/packages/frontend/assets/world/objects/wall-clock/wall-clock.blend index e9bfa353ac..44c3347f25 100644 Binary files a/packages/frontend/assets/world/objects/wall-clock/wall-clock.blend and b/packages/frontend/assets/world/objects/wall-clock/wall-clock.blend differ diff --git a/packages/frontend/assets/world/objects/wall-clock/wall-clock.glb b/packages/frontend/assets/world/objects/wall-clock/wall-clock.glb index 86cde47778..aba0969ff7 100644 Binary files a/packages/frontend/assets/world/objects/wall-clock/wall-clock.glb and b/packages/frontend/assets/world/objects/wall-clock/wall-clock.glb differ diff --git a/packages/frontend/src/world/room/furnitures/wallClock.ui.ts b/packages/frontend/src/world/room/furnitures/wallClock.ui.ts index 7430ffef47..87a1b26fd6 100644 --- a/packages/frontend/src/world/room/furnitures/wallClock.ui.ts +++ b/packages/frontend/src/world/room/furnitures/wallClock.ui.ts @@ -13,5 +13,11 @@ export const wallClock_ui = defineFurnitureUi({ frameMat: { label: i18n.ts._miRoom._furnitures._wallClock.frameMat, }, + faceMat: { + label: i18n.ts._miRoom._furnitures._wallClock.faceMat, + }, + handsMat: { + label: i18n.ts._miRoom._furnitures._wallClock.handsMat, + }, }, }); diff --git a/packages/i18n/src/autogen/locale.ts b/packages/i18n/src/autogen/locale.ts index 10655bb1a9..4ab5fbcf98 100644 --- a/packages/i18n/src/autogen/locale.ts +++ b/packages/i18n/src/autogen/locale.ts @@ -14766,6 +14766,14 @@ export interface Locale extends ILocale { * フレームの素材 */ "frameMat": string; + /** + * 文字盤の素材 + */ + "faceMat": string; + /** + * 針の素材 + */ + "handsMat": string; }; /** * ガラスの壁掛けフォトフレーム diff --git a/packages/misskey-world/src/room/furnitures/wallClock.schema.ts b/packages/misskey-world/src/room/furnitures/wallClock.schema.ts index de2d2ad223..4a5fdb0590 100644 --- a/packages/misskey-world/src/room/furnitures/wallClock.schema.ts +++ b/packages/misskey-world/src/room/furnitures/wallClock.schema.ts @@ -11,9 +11,17 @@ export const wallClock_schema = defineFurnitureSchema({ frameMat: { type: 'material', }, + faceMat: { + type: 'material', + }, + handsMat: { + type: 'material', + }, }, default: { frameMat: { color: [0.71, 0.58, 0.39], roughness: 0.75, metallic: 0 }, + faceMat: { color: [0.8, 0.8, 0.8], roughness: 0.5, metallic: 0 }, + handsMat: { color: [0.033, 0.033, 0.033], roughness: 0.75, metallic: 0 }, }, }, placement: 'side',