import { useEffect, useMemo } from 'react' import { Canvas } from '@react-three/fiber' import { OrbitControls } from '@react-three/drei' import * as THREE from 'three' import type { MeshData } from './mesh/types' function MeshObject({ mesh }: { mesh: MeshData }) { const geometry = useMemo(() => { const g = new THREE.BufferGeometry() g.setAttribute('position', new THREE.Float32BufferAttribute(mesh.positions, 3)) g.setIndex(mesh.indices) if (mesh.normals) { g.setAttribute('normal', new THREE.Float32BufferAttribute(mesh.normals, 3)) } else { g.computeVertexNormals() } if (mesh.colors) { g.setAttribute('color', new THREE.Float32BufferAttribute(mesh.colors, 3)) } // Center and scale to a consistent size so the fixed camera always frames it g.center() g.computeBoundingSphere() return g }, [mesh]) useEffect(() => () => geometry.dispose(), [geometry]) const scale = 1.6 / (geometry.boundingSphere?.radius || 1) return ( ) } export function MeshView({ mesh }: { mesh: MeshData }) { return ( ) }