@react-three/drei
Version:
useful add-ons for react-three-fiber
54 lines (51 loc) • 1.71 kB
JavaScript
import * as React from 'react';
import * as THREE from 'three';
import { useThree } from '@react-three/fiber';
// 👇 uncomment when TS version supports function overloads
// export function useFBO(settings?: FBOSettings)
function useFBO(/** Width in pixels, or settings (will render fullscreen by default) */
width, /** Height in pixels */
height, /**Settings */
settings) {
const size = useThree(state => state.size);
const viewport = useThree(state => state.viewport);
const _width = typeof width === 'number' ? width : size.width * viewport.dpr;
const _height = typeof height === 'number' ? height : size.height * viewport.dpr;
const _settings = (typeof width === 'number' ? settings : width) || {};
const {
samples = 0,
depth,
...targetSettings
} = _settings;
const target = React.useMemo(() => {
const target = new THREE.WebGLRenderTarget(_width, _height, {
minFilter: THREE.LinearFilter,
magFilter: THREE.LinearFilter,
type: THREE.HalfFloatType,
...targetSettings
});
if (depth) {
target.depthTexture = new THREE.DepthTexture(_width, _height, THREE.FloatType);
}
target.samples = samples;
return target;
}, []);
React.useLayoutEffect(() => {
target.setSize(_width, _height);
if (samples) target.samples = samples;
}, [samples, target, _width, _height]);
React.useEffect(() => {
return () => target.dispose();
}, []);
return target;
}
const Fbo = ({
children,
width,
height,
...settings
}) => {
const target = useFBO(width, height, settings);
return /*#__PURE__*/React.createElement(React.Fragment, null, children == null ? void 0 : children(target));
};
export { Fbo, useFBO };