@kitware/vtk.js
Version:
Visualization Toolkit for the Web
119 lines (100 loc) • 4.11 kB
JavaScript
import { m as macro } from '../../macros2.js';
import vtkPolygon from '../../Common/DataModel/Polygon.js';
import vtkPolyData from '../../Common/DataModel/PolyData.js';
const {
vtkWarningMacro
} = macro;
// ----------------------------------------------------------------------------
// vtkTriangleFilter methods
// ----------------------------------------------------------------------------
function vtkTriangleFilter(publicAPI, model) {
// Set our classname
model.classHierarchy.push('vtkTriangleFilter');
// requestData only supports polys for now.
publicAPI.requestData = (inData, outData) => {
const input = inData[0];
const points = input.getPoints().getData();
const polys = input.getPolys().getData();
const cellsDataType = input.getPolys().getDataType();
const pointsDataType = input.getPoints().getDataType();
// Todo: instantiate TypedArray of the final size
const newCells = [];
const newPoints = [];
model.errorCount = 0;
if (polys) {
let npts = 0;
let isLastPointDuplicated = false;
for (let c = 0; c < polys.length; c += npts + 1) {
npts = polys[c];
// If the first point is duplicated at the end of the cell, ignore it
isLastPointDuplicated = polys[c + 1] === polys[c + npts];
if (isLastPointDuplicated) {
--npts;
}
// We can't use cell.map here, it doesn't seems to work properly with Uint32Arrays ...
const cellPoints = [];
cellPoints.length = npts;
for (let i = 0; i < npts; i++) {
const pointId = polys[c + i + 1];
cellPoints[i] = [points[3 * pointId], points[3 * pointId + 1], points[3 * pointId + 2]];
}
if (npts === 3) {
const newIdStart = newPoints.length / 3;
newCells.push(3, newIdStart, newIdStart + 1, newIdStart + 2);
newPoints.push(...cellPoints[0], ...cellPoints[1], ...cellPoints[2]);
} else if (npts > 3) {
const polygon = vtkPolygon.newInstance();
polygon.setPoints(cellPoints);
if (!polygon.triangulate()) {
vtkWarningMacro(`Triangulation failed at cellOffset ${c}`);
++model.errorCount;
}
const newCellPoints = polygon.getPointArray();
const numSimplices = Math.floor(newCellPoints.length / 9);
const triPts = [];
triPts.length = 9;
for (let i = 0; i < numSimplices; i++) {
for (let j = 0; j < 9; j++) {
triPts[j] = newCellPoints[9 * i + j];
}
const newIdStart = newPoints.length / 3;
newCells.push(3, newIdStart, newIdStart + 1, newIdStart + 2);
newPoints.push(...triPts);
}
}
if (isLastPointDuplicated) {
++npts;
}
}
}
const dataset = outData[0]?.initialize() || vtkPolyData.newInstance();
dataset.getPoints().setData(macro.newTypedArrayFrom(pointsDataType, newPoints));
dataset.getPolys().setData(macro.newTypedArrayFrom(cellsDataType, newCells));
outData[0] = dataset;
};
}
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
errorCount: 0
};
// ----------------------------------------------------------------------------
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Build VTK API
macro.setGet(publicAPI, model, []);
macro.get(publicAPI, model, ['errorCount']);
// Make this a VTK object
macro.obj(publicAPI, model);
// Also make it an algorithm with one input and one output
macro.algo(publicAPI, model, 1, 1);
// Object specific methods
vtkTriangleFilter(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkTriangleFilter');
// ----------------------------------------------------------------------------
var vtkTriangleFilter$1 = {
newInstance,
extend
};
export { vtkTriangleFilter$1 as default, extend, newInstance };