Files
healer-man/src/avatar/avatarPreloader.ts
T
2026-09-05 11:40:50 -04:00

30 lines
1.1 KiB
TypeScript

import { useGLTF } from "@react-three/drei";
import { resolveContentUrl } from "../content/contentManager";
import type { AvatarIdentity } from "./CharacterModel";
import {
availableAvatarManifestUrls,
getAvatarEntry,
loadAvatarManifest,
} from "./characterManifest";
const requestedModels = new Set<string>();
/**
* Starts GLTF parsing before the 3D game scene mounts. Drei shares this cache
* with CharacterModel, so matchmaking can present the real WoW rigs on the
* first frame instead of briefly showing procedural loading substitutes.
*/
export async function preloadAvatarModels(
identities: readonly (AvatarIdentity | null | undefined)[],
): Promise<void> {
if (!availableAvatarManifestUrls().length) return;
const manifest = await loadAvatarManifest();
for (const identity of identities) {
if (!identity) continue;
const entry = getAvatarEntry(manifest, identity.raceId, identity.gender);
if (!entry || requestedModels.has(entry.model)) continue;
requestedModels.add(entry.model);
useGLTF.preload(resolveContentUrl(entry.model));
}
}