UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

147 lines (128 loc) 5.42 kB
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 };