@react-three/drei
Version:
useful add-ons for react-three-fiber
79 lines (75 loc) • 2.83 kB
JavaScript
import _extends from '@babel/runtime/helpers/esm/extends';
import * as THREE from 'three';
import * as React from 'react';
import { MarchingCubes as MarchingCubes$1 } from 'three-stdlib';
import { useFrame } from '@react-three/fiber';
const globalContext = /* @__PURE__ */React.createContext(null);
const MarchingCubes = /* @__PURE__ */React.forwardRef(({
resolution = 28,
maxPolyCount = 10000,
enableUvs = false,
enableColors = false,
children,
...props
}, ref) => {
const marchingCubesRef = React.useRef(null);
React.useImperativeHandle(ref, () => marchingCubesRef.current, []);
const marchingCubes = React.useMemo(() => new MarchingCubes$1(resolution, null, enableUvs, enableColors, maxPolyCount), [resolution, maxPolyCount, enableUvs, enableColors]);
const api = React.useMemo(() => ({
getParent: () => marchingCubesRef
}), []);
useFrame(() => {
marchingCubes.update();
marchingCubes.reset();
}, -1); // To make sure the reset runs before the balls or planes are added
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("primitive", _extends({
object: marchingCubes,
ref: marchingCubesRef
}, props), /*#__PURE__*/React.createElement(globalContext.Provider, {
value: api
}, children)));
});
const MarchingCube = /* @__PURE__ */React.forwardRef(({
strength = 0.5,
subtract = 12,
color,
...props
}, ref) => {
const {
getParent
} = React.useContext(globalContext);
const parentRef = React.useMemo(() => getParent(), [getParent]);
const cubeRef = React.useRef(null);
React.useImperativeHandle(ref, () => cubeRef.current, []);
const vec = new THREE.Vector3();
useFrame(state => {
if (!parentRef.current || !cubeRef.current) return;
cubeRef.current.getWorldPosition(vec);
parentRef.current.addBall(0.5 + vec.x * 0.5, 0.5 + vec.y * 0.5, 0.5 + vec.z * 0.5, strength, subtract, color);
});
return /*#__PURE__*/React.createElement("group", _extends({
ref: cubeRef
}, props));
});
const MarchingPlane = /* @__PURE__ */React.forwardRef(({
planeType: _planeType = 'x',
strength = 0.5,
subtract = 12,
...props
}, ref) => {
const {
getParent
} = React.useContext(globalContext);
const parentRef = React.useMemo(() => getParent(), [getParent]);
const wallRef = React.useRef(null);
React.useImperativeHandle(ref, () => wallRef.current, []);
const planeType = React.useMemo(() => _planeType === 'x' ? 'addPlaneX' : _planeType === 'y' ? 'addPlaneY' : 'addPlaneZ', [_planeType]);
useFrame(() => {
if (!parentRef.current || !wallRef.current) return;
parentRef.current[planeType](strength, subtract);
});
return /*#__PURE__*/React.createElement("group", _extends({
ref: wallRef
}, props));
});
export { MarchingCube, MarchingCubes, MarchingPlane };