@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
60 lines (59 loc) • 2.24 kB
JavaScript
;
import { BaseSopOperation } from "./_Base";
import { InputCloneMode } from "../../../engine/poly/InputCloneMode";
import { CoreMask } from "../../../core/geometry/Mask";
import { SopType } from "../../poly/registers/nodes/types/Sop";
import { ThreejsPrimitiveTriangle, triangleArea } from "../../../core/geometry/modules/three/ThreejsPrimitiveTriangle";
import { CoreAttribute } from "../../../core/geometry/Attribute";
import {
primitivesFromObject,
primitivesFromObjectFromGroup
} from "../../../core/geometry/entities/primitive/CorePrimitiveUtils";
const _primitives = [];
export class MeasureSopOperation extends BaseSopOperation {
static type() {
return SopType.MEASURE;
}
cook(inputCoreGroups, params) {
const coreGroup = inputCoreGroups[0];
const selectedObjects = CoreMask.filterObjects(coreGroup, params);
for (const inputObject of selectedObjects) {
const mesh = inputObject;
if (mesh.geometry != null && mesh.geometry.index != null) {
this._measure(mesh, params);
}
}
coreGroup.resetBoundingBox();
return coreGroup;
}
_measure(object, params) {
const primitiveClass = ThreejsPrimitiveTriangle;
const trianglesCount = primitiveClass.entitiesCount(object);
const values = new Array(trianglesCount).fill(-1);
for (let i = 0; i < trianglesCount; i++) {
const triangle = new primitiveClass(object, i);
const area = triangleArea(triangle);
values[i] = area;
}
const attribName = CoreAttribute.remapName(params.attribName);
let attribute = primitiveClass.attribute(object, attribName);
if (!attribute) {
attribute = { array: values, itemSize: 1, isString: false };
primitiveClass.addAttribute(object, attribName, attribute);
}
if (params.group) {
primitivesFromObjectFromGroup(object, params.group, _primitives);
} else {
primitivesFromObject(object, _primitives);
}
for (const primitive of _primitives) {
const value = values[primitive.index()];
primitive.setAttribValue(attribName, value);
}
}
}
MeasureSopOperation.DEFAULT_PARAMS = {
group: "",
attribName: "area"
};
MeasureSopOperation.INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;