UNPKG

@react-three/drei

Version:

useful add-ons for react-three-fiber

63 lines (60 loc) 2.74 kB
import _extends from '@babel/runtime/helpers/esm/extends'; import { useLoader } from '@react-three/fiber'; import * as React from 'react'; import { forwardRef, useMemo, useEffect, Fragment } from 'react'; import { DoubleSide } from 'three'; import { SVGLoader } from 'three-stdlib'; const Svg = /* @__PURE__ */forwardRef(function R3FSvg({ src, skipFill, skipStrokes, fillMaterial, strokeMaterial, fillMeshProps, strokeMeshProps, ...props }, ref) { const svg = useLoader(SVGLoader, !src.startsWith('<svg') ? src : `data:image/svg+xml;utf8,${src}`); const strokeGeometries = useMemo(() => skipStrokes ? [] : svg.paths.map(path => { var _path$userData; return ((_path$userData = path.userData) == null ? void 0 : _path$userData.style.stroke) === undefined || path.userData.style.stroke === 'none' ? null : path.subPaths.map(subPath => SVGLoader.pointsToStroke(subPath.getPoints(), path.userData.style)); }), [svg, skipStrokes]); useEffect(() => { return () => strokeGeometries.forEach(group => group && group.map(g => g.dispose())); }, [strokeGeometries]); let renderOrder = 0; return /*#__PURE__*/React.createElement("object3D", _extends({ ref: ref }, props), /*#__PURE__*/React.createElement("object3D", { scale: [1, -1, 1] }, svg.paths.map((path, p) => { var _path$userData2, _path$userData3; return /*#__PURE__*/React.createElement(Fragment, { key: p }, !skipFill && ((_path$userData2 = path.userData) == null ? void 0 : _path$userData2.style.fill) !== undefined && path.userData.style.fill !== 'none' && SVGLoader.createShapes(path).map((shape, s) => /*#__PURE__*/React.createElement("mesh", _extends({ key: s }, fillMeshProps, { renderOrder: renderOrder++ }), /*#__PURE__*/React.createElement("shapeGeometry", { args: [shape] }), /*#__PURE__*/React.createElement("meshBasicMaterial", _extends({ color: path.userData.style.fill, opacity: path.userData.style.fillOpacity, transparent: true, side: DoubleSide, depthWrite: false }, fillMaterial)))), !skipStrokes && ((_path$userData3 = path.userData) == null ? void 0 : _path$userData3.style.stroke) !== undefined && path.userData.style.stroke !== 'none' && path.subPaths.map((_subPath, s) => /*#__PURE__*/React.createElement("mesh", _extends({ key: s, geometry: strokeGeometries[p][s] }, strokeMeshProps, { renderOrder: renderOrder++ }), /*#__PURE__*/React.createElement("meshBasicMaterial", _extends({ color: path.userData.style.stroke, opacity: path.userData.style.strokeOpacity, transparent: true, side: DoubleSide, depthWrite: false }, strokeMaterial))))); }))); }); export { Svg };