UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

49 lines (46 loc) 1.54 kB
import {Shape, Path, BufferGeometry} from 'three'; import {CoreLoaderFont} from '../../loader/font/CoreFontLoader'; import {SVGLoader} from 'three/examples/jsm/loaders/SVGLoader'; import {mergeGeometries} from 'three/examples/jsm/utils/BufferGeometryUtils'; interface TextStrokesParams { shapes?: Array<Array<Shape | Path>>; strokeWidth: number; } interface TextStrokeParams { shapes?: Array<Shape | Path>; strokeWidth: number; loader: typeof SVGLoader; } export async function createGeometriesFromTypeStroke(params: TextStrokesParams) { const loader = await CoreLoaderFont.loadSVGLoader(); if (!loader) { return; } return params.shapes?.map((shape) => createGeometryFromTypeStroke({ loader, shapes: shape, strokeWidth: params.strokeWidth, }) ); } function createGeometryFromTypeStroke(params: TextStrokeParams) { if (!params.shapes) { return; } // TODO: typescript: correct definition for last 3 optional args var style = params.loader.getStrokeStyle(params.strokeWidth, 'white', 'miter', 'butt', 4); const geometries: BufferGeometry[] = []; for (let i = 0; i < params.shapes.length; i++) { const shape = params.shapes[i]; const points = shape.getPoints(); //.map((point) => new Vector3(point.x, point.y, 0)); const arcDivisions = 12; const minDistance = 0.001; const geometry = params.loader.pointsToStroke(points, style, arcDivisions, minDistance); geometries.push(geometry); } if (geometries.length > 0) { const mergedGeometry = mergeGeometries(geometries); return mergedGeometry; } }