From c6d0855a2e4efa1df45e6f1abcce5942afb44fe4 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Thu, 28 May 2026 10:15:02 +0900 Subject: [PATCH] wip --- .../src/PlayerContainer.ts | 3 +++ .../src/avatarPreviewEngine.ts | 20 ++++++++++--------- .../pages/rooms/edit-world-avatar-dialog.vue | 15 +++++++++++--- .../world/avatarPreviewEngineController.ts | 5 +++-- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/packages/frontend-misskey-world-engine/src/PlayerContainer.ts b/packages/frontend-misskey-world-engine/src/PlayerContainer.ts index 903822e067..41e708dd95 100644 --- a/packages/frontend-misskey-world-engine/src/PlayerContainer.ts +++ b/packages/frontend-misskey-world-engine/src/PlayerContainer.ts @@ -75,6 +75,9 @@ export class PlayerContainer { mat.backFaceCulling = false; mesh.material = mat; } + if (mesh.name.includes('__BODY__')) { + mesh.material.albedoColor = new BABYLON.Color3(this.profile.worldAvatar.body.color[0], this.profile.worldAvatar.body.color[1], this.profile.worldAvatar.body.color[2]); + } } this.registerMeshes(this.subRoot.getChildMeshes()); diff --git a/packages/frontend-misskey-world-engine/src/avatarPreviewEngine.ts b/packages/frontend-misskey-world-engine/src/avatarPreviewEngine.ts index 412ad7893e..49a348d68a 100644 --- a/packages/frontend-misskey-world-engine/src/avatarPreviewEngine.ts +++ b/packages/frontend-misskey-world-engine/src/avatarPreviewEngine.ts @@ -178,19 +178,21 @@ export class AvatarPreviewEngine extends EngineBase<{ // PlayerPreviewEngine恫 this.pipeline.addCamera(this.camera); this.sr.enableSnapshotRendering(); - - return { - options: this.avatarOptions, - }; } - public updateObjectOption(key: string, value: any) { - if (this.avatarOptions == null) return; - this.avatarOptions[key] = value; - + public clearPlayer() { + this.sr.disableSnapshotRendering(); if (this.playerContainer != null) { - this.playerContainer.updateAvatarOption(this.avatarOptions); + this.playerContainer.destroy(); + this.playerContainer = null; } + this.sr.enableSnapshotRendering(); + } + + public async updateAvatar(value: WorldAvatar) { + this.profile.worldAvatar = value; + this.clearPlayer(); + await this.load(); } public cameraRotate(vector: { x: number; y: number; }) { diff --git a/packages/frontend/src/pages/rooms/edit-world-avatar-dialog.vue b/packages/frontend/src/pages/rooms/edit-world-avatar-dialog.vue index 144025e5ac..30572a6845 100644 --- a/packages/frontend/src/pages/rooms/edit-world-avatar-dialog.vue +++ b/packages/frontend/src/pages/rooms/edit-world-avatar-dialog.vue @@ -35,6 +35,9 @@ SPDX-License-Identifier: AGPL-3.0-only :leaveToClass="prefer.s.animation ? $style.transition_options_leaveTo : ''" >
+ + +
@@ -47,6 +50,8 @@ SPDX-License-Identifier: AGPL-3.0-only import { ref, useTemplateRef, watch, onMounted, onUnmounted, reactive, nextTick, shallowRef, computed, triggerRef, markRaw } from 'vue'; import * as Misskey from 'misskey-js'; import { OBJECT_SCHEMA_DEFS } from 'misskey-world/src/room/object-schema-defs.js'; +import { getHex, getRgb } from 'misskey-world/src/utility.js'; +import type { Ref } from 'vue'; import type { RawOptions } from 'misskey-world/src/room/object.js'; import type { RoomAttachments } from 'misskey-world/src/room/type.js'; import type { WorldAvatar } from 'misskey-world/src/types.js'; @@ -82,7 +87,7 @@ const dialog = useTemplateRef('dialog'); const canvas = useTemplateRef('canvas'); const showObjectOptions = ref(false); -const avatar: WorldAvatar = props.avatar != null ? deepClone(props.avatar) : { +const avatar: Ref = ref(props.avatar != null ? deepClone(props.avatar) : { type: 'default', body: { color: [0.8, 0.8, 0.8], @@ -98,7 +103,7 @@ const avatar: WorldAvatar = props.avatar != null ? deepClone(props.avatar) : { color: [0, 0, 0], }, accessories: [], -}; +}); const avatarPreviewEngineControllerOptions = computed(() => ({ graphicsQuality: props.graphicsQuality, @@ -109,13 +114,17 @@ const avatarPreviewEngineControllerOptions = computed { + controller.updateAvatar(avatar.value); +}, { deep: true }); + onMounted(async () => { try { await controller.init(canvas.value!, { name: $i.name, username: $i.username, avatarUrl: $i.avatarUrl, - worldAvatar: avatar, + worldAvatar: avatar.value, }); } catch (err) { console.error(err); diff --git a/packages/frontend/src/world/avatarPreviewEngineController.ts b/packages/frontend/src/world/avatarPreviewEngineController.ts index fc127ad015..9e1a164162 100644 --- a/packages/frontend/src/world/avatarPreviewEngineController.ts +++ b/packages/frontend/src/world/avatarPreviewEngineController.ts @@ -6,6 +6,7 @@ import { EngineControllerBase } from './engineControllerBase.js'; import type { PlayerProfile } from 'misskey-world-engine/src/PlayerContainer.js'; import type { AvatarPreviewEngine } from 'misskey-world-engine/src/avatarPreviewEngine.js'; +import type { WorldAvatar } from 'misskey-world/src/types.js'; export type AvatarPreviewEngineControllerOptions = { workerMode?: boolean; @@ -41,7 +42,7 @@ export class AvatarPreviewEngineController extends EngineControllerBase