UNPKG

@polygonjs/polygonjs

Version:

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

60 lines (59 loc) 2.24 kB
"use strict"; 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;