UNPKG

@react-three/drei

Version:

useful add-ons for react-three-fiber

77 lines (74 loc) 2.38 kB
import _extends from '@babel/runtime/helpers/esm/extends'; import * as React from 'react'; import { useThree, useFrame } from '@react-three/fiber'; import { useFBO } from './Fbo.js'; const isFunction = node => typeof node === 'function'; const OrthographicCamera = /* @__PURE__ */React.forwardRef(({ envMap, resolution = 256, frames = Infinity, children, makeDefault, ...props }, ref) => { const set = useThree(({ set }) => set); const camera = useThree(({ camera }) => camera); const size = useThree(({ size }) => size); const cameraRef = React.useRef(null); React.useImperativeHandle(ref, () => cameraRef.current, []); const groupRef = React.useRef(null); const fbo = useFBO(resolution); React.useLayoutEffect(() => { if (!props.manual) { cameraRef.current.updateProjectionMatrix(); } }, [size, props]); React.useLayoutEffect(() => { cameraRef.current.updateProjectionMatrix(); }); React.useLayoutEffect(() => { if (makeDefault) { const oldCam = camera; set(() => ({ camera: cameraRef.current })); return () => set(() => ({ camera: oldCam })); } // The camera should not be part of the dependency list because this components camera is a stable reference // that must exchange the default, and clean up after itself on unmount. }, [cameraRef, makeDefault, set]); let count = 0; let oldEnvMap = null; const functional = isFunction(children); useFrame(state => { if (functional && (frames === Infinity || count < frames)) { groupRef.current.visible = false; state.gl.setRenderTarget(fbo); oldEnvMap = state.scene.background; if (envMap) state.scene.background = envMap; state.gl.render(state.scene, cameraRef.current); state.scene.background = oldEnvMap; state.gl.setRenderTarget(null); groupRef.current.visible = true; count++; } }); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("orthographicCamera", _extends({ left: size.width / -2, right: size.width / 2, top: size.height / 2, bottom: size.height / -2, ref: cameraRef }, props), !functional && children), /*#__PURE__*/React.createElement("group", { ref: groupRef }, functional && children(fbo.texture))); }); export { OrthographicCamera };