@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
68 lines (67 loc) • 2.11 kB
JavaScript
;
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;