Files
misskey/packages/frontend/src/world/avatarPreviewEngineController.ts
T
syuilo cdbf5c843f wip
2026-05-31 09:26:19 +09:00

49 lines
1.6 KiB
TypeScript

/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/
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;
graphicsQuality: number;
fps: number | null;
resolution: number;
};
// 抽象化レイヤー
export class AvatarPreviewEngineController extends EngineControllerBase<AvatarPreviewEngine> {
constructor(options: AvatarPreviewEngineControllerOptions) {
super({
...options,
antialias: true,
});
}
public async init(canvas: HTMLCanvasElement, profile: PlayerProfile) {
await this._init_(canvas, {
createWorker: (offscreen) => new Promise((resolve) => {
import('misskey-world-engine/src/avatarPreviewEngineWorker?worker').then(({ default: PreviewEngineWorker }) => {
const worker = new PreviewEngineWorker();
worker.postMessage({ type: 'init', canvas: offscreen, options: this.options, profile }, [offscreen]);
resolve(worker);
});
}),
createEngine: () => new Promise((resolve) => {
import('misskey-world-engine/src/avatarPreviewEngineNonWorker.js').then(({ createAvatarPreviewEngine }) => {
const engine = createAvatarPreviewEngine({ canvas, options: this.options, profile });
resolve(engine);
});
}),
});
}
public updateAvatar(avatar: WorldAvatar) {
this.call('updateAvatar', [avatar]);
}
}