UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

236 lines (184 loc) 7.34 kB
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray'; import _slicedToArray from '@babel/runtime/helpers/slicedToArray'; import registerWebworker from 'webworker-promise/lib/register'; import { SlicingMode } from '../../../Rendering/Core/ImageMapper/Constants.js'; import { vec3 } from 'gl-matrix'; var globals = { // single-component labelmap buffer: null, dimensions: [0, 0, 0], prevPoint: null, slicingMode: null // 2D or 3D painting }; // -------------------------------------------------------------------------- function handlePaintRectangle(_ref) { var point1 = _ref.point1, point2 = _ref.point2; var _point = _slicedToArray(point1, 3), x1 = _point[0], y1 = _point[1], z1 = _point[2]; var _point2 = _slicedToArray(point2, 3), x2 = _point2[0], y2 = _point2[1], z2 = _point2[2]; var xstart = Math.max(Math.min(x1, x2), 0); var xend = Math.min(Math.max(x1, x2), globals.dimensions[0] - 1); if (xstart <= xend) { var ystart = Math.max(Math.min(y1, y2), 0); var yend = Math.min(Math.max(y1, y2), globals.dimensions[1] - 1); var zstart = Math.max(Math.min(z1, z2), 0); var zend = Math.min(Math.max(z1, z2), globals.dimensions[2] - 1); var jStride = globals.dimensions[0]; var kStride = globals.dimensions[0] * globals.dimensions[1]; for (var k = zstart; k <= zend; k++) { for (var j = ystart; j <= yend; j++) { var index = j * jStride + k * kStride; globals.buffer.fill(1, index + xstart, index + xend + 1); } } } } // -------------------------------------------------------------------------- // center and scale3 are in IJK coordinates function handlePaintEllipse(_ref2) { var center = _ref2.center, scale3 = _ref2.scale3; var radius3 = _toConsumableArray(scale3); var indexCenter = center.map(function (val) { return Math.round(val); }); var sliceAxis = -1; if (globals.slicingMode != null && globals.slicingMode !== SlicingMode.NONE) { sliceAxis = globals.slicingMode % 3; } var yStride = globals.dimensions[0]; var zStride = globals.dimensions[0] * globals.dimensions[1]; var _indexCenter = _slicedToArray(indexCenter, 3), xmin = _indexCenter[0], ymin = _indexCenter[1], zmin = _indexCenter[2]; var _indexCenter2 = _slicedToArray(indexCenter, 3), xmax = _indexCenter2[0], ymax = _indexCenter2[1], zmax = _indexCenter2[2]; if (sliceAxis !== 2) { zmin = Math.round(Math.max(indexCenter[2] - radius3[2], 0)); zmax = Math.round(Math.min(indexCenter[2] + radius3[2], globals.dimensions[2] - 1)); } for (var z = zmin; z <= zmax; z++) { var dz = 0; if (sliceAxis !== 2) { dz = (indexCenter[2] - z) / radius3[2]; } var dzSquared = dz * dz; if (dzSquared <= 1) { var ay = radius3[1] * Math.sqrt(1 - dzSquared); if (sliceAxis !== 1) { ymin = Math.round(Math.max(indexCenter[1] - ay, 0)); ymax = Math.round(Math.min(indexCenter[1] + ay, globals.dimensions[1] - 1)); } for (var y = ymin; y <= ymax; y++) { var dy = 0; if (sliceAxis !== 1) { dy = (indexCenter[1] - y) / radius3[1]; } var dySquared = dy * dy; if (dySquared + dzSquared <= 1) { if (sliceAxis !== 0) { var ax = radius3[0] * Math.sqrt(1 - dySquared - dzSquared); xmin = Math.round(Math.max(indexCenter[0] - ax, 0)); xmax = Math.round(Math.min(indexCenter[0] + ax, globals.dimensions[0] - 1)); } if (xmin <= xmax) { var index = y * yStride + z * zStride; globals.buffer.fill(1, index + xmin, index + xmax + 1); } } } } } } // -------------------------------------------------------------------------- function handlePaint(_ref3) { var point = _ref3.point, radius = _ref3.radius; if (!globals.prevPoint) { globals.prevPoint = point; } // DDA params var delta = [point[0] - globals.prevPoint[0], point[1] - globals.prevPoint[1], point[2] - globals.prevPoint[2]]; var inc = [1, 1, 1]; for (var i = 0; i < 3; i++) { if (delta[i] < 0) { delta[i] = -delta[i]; inc[i] = -1; } } var step = Math.max.apply(Math, delta); // DDA var thresh = [step, step, step]; var pt = _toConsumableArray(globals.prevPoint); for (var s = 0; s <= step; s++) { handlePaintEllipse({ center: pt, scale3: radius }); for (var ii = 0; ii < 3; ii++) { thresh[ii] -= delta[ii]; if (thresh[ii] <= 0) { thresh[ii] += step; pt[ii] += inc[ii]; } } } globals.prevPoint = point; } // -------------------------------------------------------------------------- function handlePaintTriangles(_ref4) { var triangleList = _ref4.triangleList; // debugger; var triangleCount = Math.floor(triangleList.length / 9); for (var i = 0; i < triangleCount; i++) { var point0 = triangleList.subarray(9 * i + 0, 9 * i + 3); var point1 = triangleList.subarray(9 * i + 3, 9 * i + 6); var point2 = triangleList.subarray(9 * i + 6, 9 * i + 9); var v1 = [0, 0, 0]; var v2 = [0, 0, 0]; vec3.subtract(v1, point1, point0); vec3.subtract(v2, point2, point0); var step1 = [0, 0, 0]; var numStep1 = 2 * Math.max(Math.abs(v1[0]), Math.abs(v1[1]), Math.abs(v1[2])); vec3.scale(step1, v1, 1 / numStep1); var step2 = [0, 0, 0]; var numStep2 = 2 * Math.max(Math.abs(v2[0]), Math.abs(v2[1]), Math.abs(v2[2])); vec3.scale(step2, v2, 1 / numStep2); var jStride = globals.dimensions[0]; var kStride = globals.dimensions[0] * globals.dimensions[1]; for (var u = 0; u <= numStep1 + 1; u++) { var maxV = numStep2 - u * (numStep2 / numStep1); for (var v = 0; v <= maxV + 1; v++) { var point = _toConsumableArray(point0); vec3.scaleAndAdd(point, point, step1, u); vec3.scaleAndAdd(point, point, step2, v); point[0] = Math.round(point[0]); point[1] = Math.round(point[1]); point[2] = Math.round(point[2]); if (point[0] >= 0 && point[0] < globals.dimensions[0] && point[1] >= 0 && point[1] < globals.dimensions[1] && point[2] >= 0 && point[2] < globals.dimensions[2]) { globals.buffer[point[0] + jStride * point[1] + kStride * point[2]] = 1; } } } } } // -------------------------------------------------------------------------- registerWebworker().operation('start', function (_ref5) { var bufferType = _ref5.bufferType, dimensions = _ref5.dimensions, slicingMode = _ref5.slicingMode; if (!globals.buffer) { var bufferSize = dimensions[0] * dimensions[1] * dimensions[2]; /* eslint-disable-next-line */ globals.buffer = new self[bufferType](bufferSize); globals.dimensions = dimensions; globals.prevPoint = null; globals.slicingMode = slicingMode; } }).operation('paint', handlePaint).operation('paintRectangle', handlePaintRectangle).operation('paintEllipse', handlePaintEllipse).operation('paintTriangles', handlePaintTriangles).operation('end', function () { var response = new registerWebworker.TransferableResponse(globals.buffer.buffer, [globals.buffer.buffer]); globals.buffer = null; return response; });