import { Html } from '@react-three/drei'; import { useViewerStore } from '../../store/viewerStore'; import type { Vec3, ViewerPart } from '../../types/viewer'; export interface PartAnnotationsProps { parts?: ViewerPart[]; } export function PartAnnotations({ parts: explicitParts }: PartAnnotationsProps) { const parts = useViewerStore((state) => explicitParts ?? state.parts); const partSettings = useViewerStore((state) => state.partSettings); const display = useViewerStore((state) => state.display); const selectPart = useViewerStore((state) => state.selectPart); if (!display.annotations) { return null; } return ( <> {parts.map((part) => { if (!part.annotationPosition) { return null; } const settings = partSettings[part.id] ?? { visible: true, opacity: 1 }; if (!settings.visible || settings.opacity < 0.12) { return null; } const position = getExplodedAnnotationPosition( part.annotationPosition, part.explodeDirection, display.exploded.enabled ? display.exploded.distance : 0 ); return ( ); })} ); } function getExplodedAnnotationPosition( base: Vec3, direction: Vec3 | undefined, distance: number ): [number, number, number] { if (!direction || distance <= 0) { return [base[0], base[1], base[2]]; } const length = Math.hypot(direction[0], direction[1], direction[2]) || 1; const scale = distance / length; return [ base[0] + direction[0] * scale, base[1] + direction[1] * scale, base[2] + direction[2] * scale ]; }