Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | import macro from 'vtk.js/Sources/macros'; import { vec3 } from 'gl-matrix'; export default function widgetBehavior(publicAPI, model) { model.painting = model._factory.getPainting(); publicAPI.handleLeftButtonPress = (callData) => { const manipulator = model.activeState?.getManipulator?.() ?? model.manipulator; if (!(manipulator && model.activeState && model.activeState.getActive())) { model.painting = false; return macro.VOID; } const { worldCoords } = manipulator.handleEvent( callData, model._apiSpecificRenderWindow ); if (!worldCoords?.length) { model.painting = false; return macro.VOID; } model.painting = true; const trailCircle = model.widgetState.addTrail(); trailCircle.set( model.activeState.get('origin', 'up', 'right', 'direction', 'scale1') ); publicAPI.invokeStartInteractionEvent(); return macro.EVENT_ABORT; }; publicAPI.handleMouseMove = (callData) => publicAPI.handleEvent(callData); publicAPI.handleLeftButtonRelease = () => { if (model.painting) { publicAPI.invokeEndInteractionEvent(); model.widgetState.clearTrailList(); } model.painting = false; return macro.VOID; }; publicAPI.handleEvent = (callData) => { const manipulator = model.activeState?.getManipulator?.() ?? model.manipulator; if (!(manipulator && model.activeState && model.activeState.getActive())) { model.painting = false; return macro.VOID; } const normal = model._camera.getDirectionOfProjection(); const up = model._camera.getViewUp(); const right = []; vec3.cross(right, up, normal); model.activeState.setUp(...up); model.activeState.setRight(...right); model.activeState.setDirection(...normal); const { worldCoords } = manipulator.handleEvent( callData, model._apiSpecificRenderWindow ); if (!worldCoords?.length) { return macro.VOID; } model.widgetState.setTrueOrigin(...worldCoords); model.activeState.setOrigin(...worldCoords); if (model.painting) { const trailCircle = model.widgetState.addTrail(); trailCircle.set( model.activeState.get('origin', 'up', 'right', 'direction', 'scale1') ); } else { return macro.VOID; } publicAPI.invokeInteractionEvent(); return macro.EVENT_ABORT; }; publicAPI.grabFocus = () => { if (!model.hasFocus) { model.activeState = model.widgetState.getHandle(); model.activeState.activate(); model._interactor.requestAnimation(publicAPI); const canvas = model._apiSpecificRenderWindow.getCanvas(); canvas.onmouseenter = () => { if ( model.hasFocus && model.activeState === model.widgetState.getHandle() ) { model.activeState.setVisible(true); } }; canvas.onmouseleave = () => { if ( model.hasFocus && model.activeState === model.widgetState.getHandle() ) { model.activeState.setVisible(false); } }; } model.hasFocus = true; }; publicAPI.loseFocus = () => { if (model.hasFocus) { model._interactor.cancelAnimation(publicAPI); } model.widgetState.deactivate(); model.widgetState.getHandle().deactivate(); model.activeState = null; model.hasFocus = false; }; macro.get(publicAPI, model, ['painting']); } |