import { Canvas } from "@react-three/fiber"; import { useGLTF } from "@react-three/drei"; import { Suspense, useMemo } from "react"; import * as THREE from "three"; import { clone as cloneSkeleton } from "three/examples/jsm/utils/SkeletonUtils.js"; import { BOSS_DEFINITIONS } from "../game/bossCatalog"; import { ALTERNATE_BOSS_CONFIG, bossVisualUrl } from "../game/bossVisuals"; import type { BossId } from "../game/types"; function PortraitModel({ bossId }: { bossId: BossId }) { const gltf = useGLTF(bossVisualUrl(bossId), false, true); const model = useMemo(() => { const clone = cloneSkeleton(gltf.scene); clone.updateMatrixWorld(true); const bounds = new THREE.Box3().setFromObject(clone); const center = bounds.getCenter(new THREE.Vector3()); const size = bounds.getSize(new THREE.Vector3()); const scale = 2.35 / Math.max(size.x, size.y, size.z, 0.001); clone.traverse((object) => { if (object instanceof THREE.Mesh) { object.castShadow = false; object.receiveShadow = false; } }); return { clone, center, scale }; }, [gltf.scene]); return ( ); } export function BossTrophyPortrait({ bossId }: { bossId: BossId }) { const boss = BOSS_DEFINITIONS[bossId]; return (
); }