@acransac/vtk.js
Version:
Visualization Toolkit for the Web
170 lines (140 loc) • 4.98 kB
JavaScript
import macro from 'vtk.js/Sources/macro';
import vtkInteractorObserver from 'vtk.js/Sources/Rendering/Core/InteractorObserver';
import vtkProp from 'vtk.js/Sources/Rendering/Core/Prop';
const { vtkErrorMacro } = macro;
// ----------------------------------------------------------------------------
// vtkWidgetRepresentation methods
// ----------------------------------------------------------------------------
function vtkWidgetRepresentation(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkWidgetRepresentation');
publicAPI.getPickedActor = (x, y, z, picker) => {
picker.pick(x, y, z, model.renderer);
return picker.getActors[0];
};
publicAPI.adjustBounds = (bounds, newBounds, center) => {
if (bounds.length !== 6) {
vtkErrorMacro(
"vtkWidgetRepresentation::adjustBounds Can't process bounds, not enough values..."
);
return;
}
center[0] = (bounds[0] + bounds[1]) / 2.0;
center[1] = (bounds[2] + bounds[3]) / 2.0;
center[2] = (bounds[4] + bounds[5]) / 2.0;
newBounds[0] = center[0] + model.placeFactor * (bounds[0] - center[0]);
newBounds[1] = center[0] + model.placeFactor * (bounds[1] - center[0]);
newBounds[2] = center[1] + model.placeFactor * (bounds[2] - center[1]);
newBounds[3] = center[1] + model.placeFactor * (bounds[3] - center[1]);
newBounds[4] = center[2] + model.placeFactor * (bounds[4] - center[2]);
newBounds[5] = center[2] + model.placeFactor * (bounds[5] - center[2]);
};
publicAPI.sizeHandlesInPixels = (factor, pos) => {
const renderer = model.renderer;
if (!model.validPick || !renderer || !renderer.getActiveCamera()) {
return model.handleSize * factor * model.initialLength;
}
const focalPoint = vtkInteractorObserver.computeWorldToDisplay(
renderer,
pos[0],
pos[1],
pos[2]
);
const z = focalPoint[2];
let x = focalPoint[0] - model.handleSize / 2.0;
let y = focalPoint[1] - model.handleSize / 2.0;
const lowerLeft = vtkInteractorObserver.computeDisplayToWorld(
renderer,
x,
y,
z
);
x = focalPoint[0] + model.handleSize / 2.0;
y = focalPoint[1] + model.handleSize / 2.0;
const upperRight = vtkInteractorObserver.computeDisplayToWorld(
renderer,
x,
y,
z
);
let radius = 0.0;
for (let i = 0; i < 3; i++) {
radius += (upperRight[i] - lowerLeft[i]) * (upperRight[i] - lowerLeft[i]);
}
return factor * (Math.sqrt(radius) / 2.0);
};
publicAPI.sizeHandlesRelativeToViewport = (factor, pos) => {
const renderer = model.renderer;
if (!model.validPick || !renderer || !renderer.getActiveCamera()) {
return model.handleSize * factor * model.initialLength;
}
const viewport = renderer.getViewport();
const view = renderer.getRenderWindow().getViews()[0];
const winSize = view.getViewportSize(renderer);
const focalPoint = vtkInteractorObserver.computeWorldToDisplay(
renderer,
pos[0],
pos[1],
pos[2]
);
const z = focalPoint[2];
let x = winSize[0] * viewport[0];
let y = winSize[1] * viewport[1];
const windowLowerLeft = vtkInteractorObserver.computeDisplayToWorld(
renderer,
x,
y,
z
);
x = winSize[0] * viewport[2];
y = winSize[1] * viewport[3];
const windowUpperRight = vtkInteractorObserver.computeDisplayToWorld(
renderer,
x,
y,
z
);
let radius = 0.0;
for (let i = 0; i < 3; i++) {
radius +=
(windowUpperRight[i] - windowLowerLeft[i]) *
(windowUpperRight[i] - windowLowerLeft[i]);
}
return factor * (Math.sqrt(radius) / 2.0);
};
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
renderer: null,
interactionState: 0,
startEventPosition: [0.0, 0.0, 0.0],
lastEventPosition: [0.0, 0.0, 0.0],
placeFactor: 0.5,
placed: 0,
handleSize: 0.05,
validPick: 0,
initialBounds: [0.0, 1.0, 0.0, 1.0, 0.0, 1.0],
initialLength: 0.0,
needToRender: 0,
};
// ----------------------------------------------------------------------------
export function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Inheritance
vtkProp.extend(publicAPI, model, initialValues);
macro.setGet(publicAPI, model, [
'renderer',
'handleSize',
'placeFactor',
'needToRender',
'interactionState',
]);
// Object methods
vtkWidgetRepresentation(publicAPI, model);
}
// ----------------------------------------------------------------------------
export const newInstance = macro.newInstance(extend, 'vtkWidgetRepresentation');
// ----------------------------------------------------------------------------
export default { newInstance, extend };