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 : ''"
>
+ { const c = getRgb(v); if (c != null) avatar.body.color = c; }">
+ {{ i18n.ts.color }}
+
@@ -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