import * as React from 'react' import { EventManager, Object3DNode, useFrame, useThree } from '@react-three/fiber' import { FirstPersonControls as FirstPersonControlImpl } from 'three-stdlib' import { ForwardRefComponent } from '../helpers/ts-utils' export type FirstPersonControlsProps = Object3DNode & { domElement?: HTMLElement makeDefault?: boolean } export const FirstPersonControls: ForwardRefComponent = /* @__PURE__ */ React.forwardRef( ({ domElement, makeDefault, ...props }, ref) => { const camera = useThree((state) => state.camera) const gl = useThree((state) => state.gl) const events = useThree((state) => state.events) as EventManager const get = useThree((state) => state.get) const set = useThree((state) => state.set) const explDomElement = (domElement || events.connected || gl.domElement) as HTMLElement const [controls] = React.useState(() => new FirstPersonControlImpl(camera, explDomElement)) React.useEffect(() => { if (makeDefault) { const old = get().controls set({ controls }) return () => set({ controls: old }) } }, [makeDefault, controls]) useFrame((_, delta) => { controls.update(delta) }, -1) return controls ? : null } )