polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
55 lines (47 loc) • 1.56 kB
text/typescript
import {BaseSopOperation} from './_Base';
import {DefaultOperationParams} from '../_Base';
import {CoreGroup} from '../../geometry/Group';
import {Mesh} from 'three/src/objects/Mesh';
import {BufferGeometry} from 'three/src/core/BufferGeometry';
import {Object3D} from 'three/src/core/Object3D';
import {ASSETS_ROOT} from '../../../../tests/helpers/AssetsUtils';
import {CoreSVGLoader} from '../../loader/SVG';
interface SvgSopParams extends DefaultOperationParams {
url: string;
// fill
drawFillShapes: boolean;
fillShapesWireframe: boolean;
// strokes
drawStrokes: boolean;
strokesWireframe: boolean;
}
const DEFAULT_URL = `${ASSETS_ROOT}/models/svg/tiger.svg`;
export class SvgSopOperation extends BaseSopOperation {
static readonly DEFAULT_PARAMS: SvgSopParams = {
url: DEFAULT_URL,
drawFillShapes: true,
fillShapesWireframe: false,
drawStrokes: true,
strokesWireframe: false,
};
static type(): Readonly<'svg'> {
return 'svg';
}
cook(input_contents: CoreGroup[], params: SvgSopParams): Promise<CoreGroup> {
const loader = new CoreSVGLoader(params.url, this.scene);
return new Promise(async (resolve) => {
const group = await loader.load(params);
for (let child of group.children) {
this._ensure_geometry_has_index(child);
}
resolve(this.create_core_group_from_objects(group.children));
});
}
private _ensure_geometry_has_index(object: Object3D) {
const mesh = object as Mesh;
const geometry = mesh.geometry;
if (geometry) {
this.create_index_if_none(geometry as BufferGeometry);
}
}
}