@thewtex/vtk.js-esm
Version:
Visualization Toolkit for the Web
130 lines (101 loc) • 4.23 kB
JavaScript
import vtk from '../../vtk.js';
import macro from '../../macro.js';
import vtkPoints from '../../Common/Core/Points.js';
var vtkDebugMacro = macro.vtkDebugMacro,
vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------
// vtkWarpScalar methods
// ----------------------------------------------------------------------------
function vtkWarpScalar(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkWarpScalar');
publicAPI.requestData = function (inData, outData) {
// implement requestData
var input = inData[0];
if (!input) {
vtkErrorMacro('Invalid or missing input');
return 1;
} // First, copy the input to the output as a starting point
// output->CopyStructure( input );
var inPts = input.getPoints();
var pd = input.getPointData();
var inNormals = pd.getNormals();
var inScalars = publicAPI.getInputArrayToProcess(0);
if (!inPts || !inScalars) {
vtkDebugMacro('No data to warp', !!inPts, !!inScalars);
outData[0] = inData[0];
return 1;
}
var numPts = inPts.getNumberOfPoints();
var pointNormal = null;
var normal = [0, 0, 1];
if (inNormals && !model.useNormal) {
pointNormal = function pointNormal(id, array) {
return [array.getData()[id * 3], array.getData()[id * 3 + 1], array.getData()[id * 3 + 2]];
};
vtkDebugMacro('Using data normals');
} else if (publicAPI.getXyPlane()) {
pointNormal = function pointNormal(id, array) {
return normal;
};
vtkDebugMacro('Using x-y plane normal');
} else {
pointNormal = function pointNormal(id, array) {
return model.normal;
};
vtkDebugMacro('Using Normal instance variable');
}
var newPtsData = new Float32Array(numPts * 3);
var inPoints = inPts.getData();
var ptOffset = 0;
var n = [0, 0, 1];
var s = 1; // Loop over all points, adjusting locations
var scalarDataArray = inScalars.getData();
var nc = inScalars.getNumberOfComponents();
for (var ptId = 0; ptId < numPts; ++ptId) {
ptOffset = ptId * 3;
n = pointNormal(ptId, inNormals);
if (model.xyPlane) {
s = inPoints[ptOffset + 2];
} else {
// Use component 0 of array if there are multiple components
s = scalarDataArray[ptId * nc];
}
newPtsData[ptOffset] = inPoints[ptOffset] + model.scaleFactor * s * n[0];
newPtsData[ptOffset + 1] = inPoints[ptOffset + 1] + model.scaleFactor * s * n[1];
newPtsData[ptOffset + 2] = inPoints[ptOffset + 2] + model.scaleFactor * s * n[2];
}
var newDataSet = vtk({
vtkClass: input.getClassName()
});
newDataSet.shallowCopy(input);
var points = vtkPoints.newInstance();
points.setData(newPtsData, 3);
newDataSet.setPoints(points);
outData[0] = newDataSet;
return 1;
};
} // ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
var DEFAULT_VALUES = {
scaleFactor: 1,
useNormal: false,
normal: [0, 0, 1],
xyPlane: false
}; // ----------------------------------------------------------------------------
function extend(publicAPI, model) {
var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
Object.assign(model, DEFAULT_VALUES, initialValues); // 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); // Generate macros for properties
macro.setGet(publicAPI, model, ['scaleFactor', 'useNormal', 'xyPlane']);
macro.setGetArray(publicAPI, model, ['normal'], 3); // Object specific methods
vtkWarpScalar(publicAPI, model);
} // ----------------------------------------------------------------------------
var newInstance = macro.newInstance(extend, 'vtkWarpScalar'); // ----------------------------------------------------------------------------
var vtkWarpScalar$1 = {
newInstance: newInstance,
extend: extend
};
export default vtkWarpScalar$1;
export { extend, newInstance };