UNPKG

polygonjs-engine

Version:

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

74 lines (73 loc) 2.42 kB
import {TypedSopNode} from "./_Base"; import {CoreGeometry} from "../../../core/geometry/Geometry"; import {Vector3 as Vector32} from "three/src/math/Vector3"; import {NodeParamsConfig, ParamConfig} from "../utils/params/ParamsConfig"; import {InputCloneMode as InputCloneMode2} from "../../poly/InputCloneMode"; import {objectTypeFromConstructor} from "../../../core/geometry/Constant"; class FuseSopParamsConfig extends NodeParamsConfig { constructor() { super(...arguments); this.dist = ParamConfig.FLOAT(0.1, { range: [0, 1], rangeLocked: [true, false] }); } } const ParamsConfig2 = new FuseSopParamsConfig(); export class FuseSopNode extends TypedSopNode { constructor() { super(...arguments); this.params_config = ParamsConfig2; } static type() { return "fuse"; } static displayedInputNames() { return ["points to fuse together"]; } initializeNode() { this.io.inputs.setCount(1); this.io.inputs.initInputsClonedState(InputCloneMode2.FROM_NODE); } cook(input_contents) { const core_group = input_contents[0]; const new_objects = []; let new_object; for (let core_object of core_group.coreObjects()) { new_object = this._fuse_core_object(core_object); if (new_object) { new_objects.push(new_object); } } this.setObjects(new_objects); } _fuse_core_object(core_object) { const object = core_object.object(); if (!object) { return; } const points = core_object.points(); const precision = this.pv.dist; const points_by_position = {}; for (let point of points) { const position = point.position(); const rounded_position = new Vector32(Math.round(position.x / precision), Math.round(position.y / precision), Math.round(position.z / precision)); const key = rounded_position.toArray().join("-"); points_by_position[key] = points_by_position[key] || []; points_by_position[key].push(point); } const kept_points = []; Object.keys(points_by_position).forEach((key) => { kept_points.push(points_by_position[key][0]); }); object.geometry.dispose(); if (kept_points.length > 0) { const geometry = CoreGeometry.geometryFromPoints(kept_points, objectTypeFromConstructor(object.constructor)); if (geometry) { object.geometry = geometry; } return object; } else { } } }