import { useEffect, useState } from 'react' import { EngineCommandManagerEvents } from '@src/lang/std/engineConnection' import { engineCommandManager, sceneInfra } from '@src/lib/singletons' import { reportRejection } from '@src/lib/trap' import { isReducedMotion, throttle } from '@src/lib/utils' const updateDollyZoom = throttle( (newFov: number) => sceneInfra.camControls.dollyZoom(newFov), 1000 / 15 ) export const CamToggle = () => { const [isPerspective, setIsPerspective] = useState(true) const [fov, setFov] = useState(40) const [enableRotate, setEnableRotate] = useState(true) useEffect(() => { engineCommandManager.addEventListener( EngineCommandManagerEvents.SceneReady, () => { sceneInfra.camControls.dollyZoom(fov).catch(reportRejection) } ) }, []) const toggleCamera = () => { if (isPerspective) { isReducedMotion() ? sceneInfra.camControls.useOrthographicCamera() : sceneInfra.camControls.animateToOrthographic().catch(reportRejection) } else { isReducedMotion() ? sceneInfra.camControls.usePerspectiveCamera().catch(reportRejection) : sceneInfra.camControls.animateToPerspective().catch(reportRejection) } setIsPerspective(!isPerspective) } const handleFovChange = (newFov: number) => { setFov(newFov) updateDollyZoom(newFov) } return (