@kitware/vtk.js
Version:
Visualization Toolkit for the Web
147 lines (128 loc) • 5.42 kB
JavaScript
import { mat3 } from 'gl-matrix';
import { m as macro } from '../../macros2.js';
import vtkAbstractWidgetFactory from '../Core/AbstractWidgetFactory.js';
import vtkTranslateTransformHandleRepresentation from '../Representations/TranslateTransformHandleRepresentation.js';
import vtkScaleTransformHandleRepresentation from '../Representations/ScaleTransformHandleRepresentation.js';
import vtkRotateTransformHandleRepresentation from '../Representations/RotateTransformHandleRepresentation.js';
import { TransformMode, TRANSLATE_HANDLE_RADIUS, SCALE_HANDLE_RADIUS, SCALE_HANDLE_CUBE_SIDE_LENGTH, SCALE_HANDLE_PIXEL_SCALE } from './TransformControlsWidget/constants.js';
import widgetBehavior from './TransformControlsWidget/behavior.js';
import stateGenerator from './TransformControlsWidget/state.js';
function updateHandleTransforms(widgetState) {
const transformState = widgetState.getTransform();
const sx = widgetState.getScaleHandleX();
const sy = widgetState.getScaleHandleY();
const sz = widgetState.getScaleHandleZ();
const hx = widgetState.getRotateHandleX();
const hy = widgetState.getRotateHandleY();
const hz = widgetState.getRotateHandleZ();
// translation
widgetState.getStatesWithLabel('handles').forEach(state => {
state.setOrigin(transformState.getTranslation());
});
// rotation
const m3 = mat3.create();
mat3.fromQuat(m3, transformState.getRotation());
[sx, hx].forEach(state => {
state.setDirection(m3.slice(0, 3));
state.setUp(m3.slice(3, 6).map(c => -c));
state.setRight(m3.slice(6, 9));
});
[sy, hy].forEach(state => {
state.setDirection(m3.slice(3, 6));
state.setUp(m3.slice(6, 9));
state.setRight(m3.slice(0, 3));
});
[sz, hz].forEach(state => {
state.setDirection(m3.slice(6, 9));
state.setUp(m3.slice(3, 6));
state.setRight(m3.slice(0, 3));
});
}
// ----------------------------------------------------------------------------
// Factory
// ----------------------------------------------------------------------------
function vtkTransformControlsWidget(publicAPI, model) {
model.classHierarchy.push('vtkTransformControlsWidget');
// --- Widget Requirement ---------------------------------------------------
model.behavior = widgetBehavior;
model.widgetState = stateGenerator();
model.methodsToLink = ['scaleInPixels', 'activeScaleFactor', 'useActiveColor', 'activeColor'];
publicAPI.getRepresentationsForViewType = viewType => {
switch (viewType) {
default:
return [{
builder: vtkTranslateTransformHandleRepresentation,
labels: ['translateHandles'],
initialValues: {
radius: TRANSLATE_HANDLE_RADIUS,
glyphResolution: 12,
coneSource: {
radius: 8,
height: 0.05,
direction: [0, 1, 0]
}
}
}, {
builder: vtkScaleTransformHandleRepresentation,
labels: ['scaleHandles'],
initialValues: {
radius: SCALE_HANDLE_RADIUS,
glyphResolution: 12,
cubeSource: {
xLength: SCALE_HANDLE_CUBE_SIDE_LENGTH,
yLength: SCALE_HANDLE_CUBE_SIDE_LENGTH / SCALE_HANDLE_PIXEL_SCALE,
zLength: SCALE_HANDLE_CUBE_SIDE_LENGTH
}
}
}, {
builder: vtkRotateTransformHandleRepresentation,
labels: ['rotateHandles']
}];
}
};
publicAPI.updateHandleVisibility = () => {
model.widgetState.getStatesWithLabel('translateHandles').forEach(state => {
state.setVisible(model.mode === 'translate');
});
model.widgetState.getStatesWithLabel('scaleHandles').forEach(state => {
state.setVisible(model.mode === 'scale');
});
model.widgetState.getStatesWithLabel('rotateHandles').forEach(state => {
state.setVisible(model.mode === 'rotate');
});
};
model._onModeChanged = () => {
publicAPI.updateHandleVisibility();
};
// --- Widget Requirement ---------------------------------------------------
// sync translation/scale/rotation states to the handle states
const transformSubscription = model.widgetState.getTransform().onModified(state => {
updateHandleTransforms(model.widgetState);
});
publicAPI.delete = macro.chain(publicAPI.delete, () => {
transformSubscription.unsubscribe();
});
updateHandleTransforms(model.widgetState);
publicAPI.updateHandleVisibility();
}
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
mode: TransformMode.TRANSLATE
};
// ----------------------------------------------------------------------------
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
vtkAbstractWidgetFactory.extend(publicAPI, model, initialValues);
macro.setGet(publicAPI, model, ['mode']);
macro.get(publicAPI, model, ['lineManipulator', 'rotateManipulator']);
vtkTransformControlsWidget(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkTransformControlsWidget');
// ----------------------------------------------------------------------------
var vtkTransformControlsWidget$1 = {
newInstance,
extend,
TransformMode
};
export { vtkTransformControlsWidget$1 as default, extend, newInstance };