diff --git a/packages/frontend/assets/room/objects/radiometer/radiometer.blend b/packages/frontend/assets/room/objects/radiometer/radiometer.blend new file mode 100644 index 0000000000..b913110558 Binary files /dev/null and b/packages/frontend/assets/room/objects/radiometer/radiometer.blend differ diff --git a/packages/frontend/assets/room/objects/radiometer/radiometer.glb b/packages/frontend/assets/room/objects/radiometer/radiometer.glb new file mode 100644 index 0000000000..2750938210 Binary files /dev/null and b/packages/frontend/assets/room/objects/radiometer/radiometer.glb differ diff --git a/packages/frontend/src/utility/room/object-defs.ts b/packages/frontend/src/utility/room/object-defs.ts index b7809f9af0..abf241416c 100644 --- a/packages/frontend/src/utility/room/object-defs.ts +++ b/packages/frontend/src/utility/room/object-defs.ts @@ -51,6 +51,7 @@ import { plant } from './objects/plant.js'; import { plant2 } from './objects/plant2.js'; import { poster } from './objects/poster.js'; import { powerStrip } from './objects/powerStrip.js'; +import { radiometer } from './objects/radiometer.js'; import { rolledUpPoster } from './objects/rolledUpPoster.js'; import { roundRug } from './objects/roundRug.js'; import { router } from './objects/router.js'; @@ -118,6 +119,7 @@ export const OBJECT_DEFS = [ plant2, poster, powerStrip, + radiometer, rolledUpPoster, roundRug, router, diff --git a/packages/frontend/src/utility/room/objects/radiometer.ts b/packages/frontend/src/utility/room/objects/radiometer.ts new file mode 100644 index 0000000000..875be5f1d6 --- /dev/null +++ b/packages/frontend/src/utility/room/objects/radiometer.ts @@ -0,0 +1,35 @@ +/* + * 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 radiometer = defineObject({ + id: 'radiometer', + name: 'radiometer', + options: { + schema: {}, + default: {}, + }, + placement: 'top', + createInstance: ({ scene, model }) => { + const vanes = model.findTransformNode('__X_VANES__'); + model.bakeExcludeMeshes = [...vanes.getChildMeshes()]; + + return { + onInited: () => { + vanes.rotation = vanes.rotationQuaternion != null ? vanes.rotationQuaternion.toEulerAngles() : vanes.rotation; + const anim = new BABYLON.Animation('', 'rotation.y', 60, BABYLON.Animation.ANIMATIONTYPE_FLOAT, BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE); + anim.setKeys([ + { frame: 0, value: 0 }, + { frame: 240, value: Math.PI * 2 }, + ]); + vanes.animations = [anim]; + scene.beginAnimation(vanes, 0, 240, true); + }, + interactions: {}, + }; + }, +});