UNPKG

@polygonjs/polygonjs

Version:

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

76 lines (75 loc) 2.67 kB
"use strict"; import { BaseSopOperation } from "./_Base"; import { InputCloneMode } from "../../../engine/poly/InputCloneMode"; import { MarchingCubes } from "../../../modules/core/objects/MarchingCubes"; import { Vector3 } from "three"; import { isNumber } from "../../../core/Type"; import { isBooleanTrue } from "../../../core/BooleanValue"; import { BufferGeometry } from "three"; const pos = new Vector3(); const _points = []; export class MetaballSopOperation extends BaseSopOperation { static type() { return "metaball"; } cook(inputContents, params) { var _a; const inputCoreGroup = inputContents[0]; try { const geometry = this._createMetaballsGeometry(inputCoreGroup, params); return this.createCoreGroupFromGeometry(geometry); } catch (err) { (_a = this.states) == null ? void 0 : _a.error.set(`failed to create metaballs, possibly a memory issue`); console.error("metaballs failed"); return this.createCoreGroupFromObjects([]); } } _createMetaballsGeometry(inputCoreGroup, params) { const metaballs = new MarchingCubes( params.resolution, // CoreConstant.MATERIALS[ObjectType.MESH], params.enableUVs, params.enableColors ); metaballs.isolation = params.isolation; inputCoreGroup.points(_points); for (const point of _points) { point.position(pos); pos.multiplyScalar(0.5).addScalar(0.5); let metaStrength = params.metaStrength; if (isBooleanTrue(params.useMetaStrengthAttrib)) { let metaStrengthAttrib = point.attribValue("metaStrength"); if (isNumber(metaStrengthAttrib)) { metaStrength *= metaStrengthAttrib; } } let metaSubtract = params.metaSubtract; if (isBooleanTrue(params.useMetaSubtractAttrib)) { let metaSubtractAttrib = point.attribValue("metaSubtract"); if (isNumber(metaSubtractAttrib)) { metaSubtract *= metaSubtractAttrib; } } metaballs.addBall(pos.x, pos.y, pos.z, metaStrength, metaSubtract, void 0); } metaballs.createPolygons(); const geometry = new BufferGeometry(); const attribNames = Object.keys(metaballs.attributes); for (let attribName of attribNames) { const attrib = metaballs.attributes[attribName]; geometry.setAttribute(attribName, attrib); } return geometry; } } MetaballSopOperation.DEFAULT_PARAMS = { resolution: 40, isolation: 30, useMetaStrengthAttrib: false, metaStrength: 0.1, useMetaSubtractAttrib: false, metaSubtract: 1, enableUVs: false, enableColors: false }; MetaballSopOperation.INPUT_CLONED_STATE = InputCloneMode.NEVER;