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