import * as React from 'react' import * as THREE from 'three' import { createPortal } from '@react-three/fiber' import { Flow } from 'three-stdlib' import { ForwardRefComponent } from '../helpers/ts-utils' export interface CurveModifierProps { children: React.ReactElement curve?: THREE.Curve } export type CurveModifierRef = Pick export const CurveModifier: ForwardRefComponent = /* @__PURE__ */ React.forwardRef(({ children, curve }: CurveModifierProps, ref) => { const [scene] = React.useState(() => new THREE.Scene()) const [obj, set] = React.useState() const modifier = React.useRef() React.useEffect(() => { modifier.current = new Flow( scene.children[0] as THREE.Mesh ) set(modifier.current.object3D) }, [children]) React.useEffect(() => { if (curve) modifier.current?.updateCurve(0, curve) }, [curve]) React.useImperativeHandle(ref, () => ({ moveAlongCurve: (val: number) => { modifier.current?.moveAlongCurve(val) }, })) return ( <> {createPortal(children, scene)} {obj && } ) })