UNPKG

@polygonjs/polygonjs

Version:

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

68 lines (67 loc) 2.11 kB
"use strict"; import { BaseSopOperation } from "./_Base"; import { InputCloneMode } from "../../../engine/poly/InputCloneMode"; import { Mesh, Group } from "three"; import { ThreeMeshBVHHelper } from "../../../core/geometry/bvh/ThreeMeshBVHHelper"; import { CENTER, AVERAGE, SAH, StaticGeometryGenerator, MeshBVH } from "../../../core/geometry/bvh/three-mesh-bvh"; const nameByStragery = { [CENTER]: "center", [AVERAGE]: "average", [SAH]: "sah" }; export const STRAGERY_MENU_ENTRIES = [CENTER, AVERAGE, SAH].map((value) => { return { name: nameByStragery[value], value }; }); export class BVHSopOperation extends BaseSopOperation { static type() { return "BVH"; } cook(inputCoreGroups, params) { const inputCoreGroup = inputCoreGroups[0]; if (params.compact == true) { const objects = inputCoreGroup.threejsObjects(); const group = new Group(); for (const object of objects) { group.add(object); object.updateMatrixWorld(true); } const staticGenerator = new StaticGeometryGenerator(group); staticGenerator.attributes = ["position"]; const mergedGeometry = staticGenerator.generate(); mergedGeometry.boundsTree = new MeshBVH(mergedGeometry); const mergedMesh = new Mesh(mergedGeometry); return this.createCoreGroupFromObjects([mergedMesh]); } else { const objects = inputCoreGroup.threejsObjects(); for (let object of objects) { object.traverse((child) => { const mesh = child; if (mesh.isMesh) { const bvh = ThreeMeshBVHHelper.createBVH(mesh, { strategy: params.strategy, maxLeafTris: params.maxLeafTris, maxDepth: params.maxDepth, verbose: params.verbose }); ThreeMeshBVHHelper.assignBVH(mesh, bvh); } }); } } return inputCoreGroup; } } BVHSopOperation.DEFAULT_PARAMS = { strategy: CENTER, maxLeafTris: 10, maxDepth: 40, verbose: false, compact: false }; BVHSopOperation.INPUT_CLONED_STATE = InputCloneMode.ALWAYS;