@kitware/vtk.js 27.4.6 → 28.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/BREAKING_CHANGES.md +4 -0
  2. package/Common/DataModel/Line.d.ts +24 -2
  3. package/Common/DataModel/Line.js +17 -1
  4. package/Common/DataModel/PolyLine.d.ts +36 -2
  5. package/Common/DataModel/PolyLine.js +80 -10
  6. package/Common/Transform/Transform.d.ts +177 -0
  7. package/Common/Transform/Transform.js +81 -3
  8. package/Proxy/Core/View2DProxy.js +22 -12
  9. package/Rendering/Core/AbstractMapper3D.d.ts +1 -3
  10. package/Rendering/Core/AbstractMapper3D.js +21 -45
  11. package/Rendering/Core/ImageCPRMapper.d.ts +380 -0
  12. package/Rendering/Core/ImageCPRMapper.js +361 -0
  13. package/Rendering/OpenGL/ImageCPRMapper.js +919 -0
  14. package/Rendering/OpenGL/Profiles/All.js +1 -0
  15. package/Rendering/OpenGL/Profiles/Volume.js +1 -0
  16. package/Rendering/OpenGL/RenderWindow/Constants.js +3 -2
  17. package/Rendering/OpenGL/RenderWindow.js +38 -45
  18. package/Rendering/Profiles/All.js +1 -0
  19. package/Rendering/Profiles/Volume.js +1 -0
  20. package/Widgets/Core/WidgetManager.js +1 -1
  21. package/Widgets/Manipulators/AbstractManipulator.d.ts +2 -2
  22. package/Widgets/Manipulators/CPRManipulator.js +138 -0
  23. package/Widgets/Manipulators/LineManipulator.js +3 -1
  24. package/Widgets/Manipulators/PlaneManipulator.js +3 -1
  25. package/Widgets/Manipulators/TrackballManipulator.js +3 -1
  26. package/Widgets/Widgets3D/AngleWidget/behavior.js +5 -2
  27. package/Widgets/Widgets3D/DistanceWidget/behavior.js +5 -2
  28. package/Widgets/Widgets3D/ImageCroppingWidget/behavior.js +3 -3
  29. package/Widgets/Widgets3D/ImplicitPlaneWidget.js +3 -1
  30. package/Widgets/Widgets3D/LabelWidget/behavior.js +5 -2
  31. package/Widgets/Widgets3D/LineWidget/behavior.js +4 -2
  32. package/Widgets/Widgets3D/PaintWidget/behavior.js +2 -1
  33. package/Widgets/Widgets3D/PolyLineWidget/behavior.js +2 -1
  34. package/Widgets/Widgets3D/ResliceCursorWidget/Constants.js +2 -1
  35. package/Widgets/Widgets3D/ResliceCursorWidget/behavior.js +72 -34
  36. package/Widgets/Widgets3D/ResliceCursorWidget/cprBehavior.js +92 -0
  37. package/Widgets/Widgets3D/ResliceCursorWidget/helpers.js +64 -18
  38. package/Widgets/Widgets3D/ResliceCursorWidget/state.js +30 -16
  39. package/Widgets/Widgets3D/ResliceCursorWidget.js +43 -20
  40. package/Widgets/Widgets3D/ShapeWidget/behavior.js +4 -2
  41. package/Widgets/Widgets3D/SphereWidget/behavior.js +1 -1
  42. package/Widgets/Widgets3D/SplineWidget/behavior.js +3 -1
  43. package/index.d.ts +2 -0
  44. package/package.json +3 -2
@@ -11,6 +11,7 @@ import '../Texture.js';
11
11
  import '../Glyph3DMapper.js';
12
12
  import '../ImageResliceMapper.js';
13
13
  import '../ImageMapper.js';
14
+ import '../ImageCPRMapper.js';
14
15
  import '../ImageSlice.js';
15
16
  import '../Volume.js';
16
17
  import '../VolumeMapper.js';
@@ -2,6 +2,7 @@ import '../Camera.js';
2
2
  import '../Renderer.js';
3
3
  import '../ImageResliceMapper.js';
4
4
  import '../ImageMapper.js';
5
+ import '../ImageCPRMapper.js';
5
6
  import '../ImageSlice.js';
6
7
  import '../Volume.js';
7
8
  import '../VolumeMapper.js';
@@ -3,8 +3,9 @@ var XrSessionTypes = {
3
3
  // Head-mounted display (HMD), two-camera virtual reality session
4
4
  MobileAR: 1,
5
5
  // Mobile device, single-camera augmented reality session
6
- LookingGlassVR: 2 // Looking Glass hologram display, N-camera virtual reality session
7
-
6
+ LookingGlassVR: 2,
7
+ // Looking Glass hologram display, N-camera virtual reality session
8
+ HmdAR: 3
8
9
  };
9
10
  var Constants = {
10
11
  XrSessionTypes: XrSessionTypes
@@ -26,17 +26,10 @@ var SCREENSHOT_PLACEHOLDER = {
26
26
  height: '100%'
27
27
  };
28
28
  var DEFAULT_RESET_FACTORS = {
29
- vr: {
30
- rescaleFactor: 1.0,
31
- translateZ: -0.7 // 0.7 m forward from the camera
29
+ rescaleFactor: 0.25,
30
+ // isotropic scale factor reduces apparent size of objects
31
+ translateZ: -1.5 // default translation initializes object in front of camera
32
32
 
33
- },
34
- ar: {
35
- rescaleFactor: 0.25,
36
- // scale down AR for viewing comfort by default
37
- translateZ: -0.5 // 0.5 m forward from the camera
38
-
39
- }
40
33
  };
41
34
 
42
35
  function checkRenderTargetSupport(gl, format, type) {
@@ -274,11 +267,11 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
274
267
  }
275
268
 
276
269
  model.xrSessionType = xrSessionType !== undefined ? xrSessionType : XrSessionTypes.HmdVR;
277
- var isAR = xrSessionType === XrSessionTypes.MobileAR;
278
- var sessionType = isAR ? 'immersive-ar' : 'immersive-vr';
270
+ var isXrSessionAR = [XrSessionTypes.HmdAR, XrSessionTypes.MobileAR].includes(model.xrSessionType);
271
+ var sessionType = isXrSessionAR ? 'immersive-ar' : 'immersive-vr';
279
272
 
280
273
  if (!navigator.xr.isSessionSupported(sessionType)) {
281
- if (isAR) {
274
+ if (isXrSessionAR) {
282
275
  throw new Error('Device does not support AR session');
283
276
  } else {
284
277
  throw new Error('VR display is not available');
@@ -298,7 +291,7 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
298
291
 
299
292
  publicAPI.enterXR = /*#__PURE__*/function () {
300
293
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(xrSession) {
301
- var gl, glLayer;
294
+ var gl, glLayer, isXrSessionAR, ren;
302
295
  return _regeneratorRuntime.wrap(function _callee$(_context) {
303
296
  while (1) {
304
297
  switch (_context.prev = _context.next) {
@@ -307,7 +300,7 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
307
300
  model.oldCanvasSize = model.size.slice();
308
301
 
309
302
  if (!(model.xrSession !== null)) {
310
- _context.next = 15;
303
+ _context.next = 17;
311
304
  break;
312
305
  }
313
306
 
@@ -324,17 +317,26 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
324
317
  });
325
318
  model.xrSession.requestReferenceSpace('local').then(function (refSpace) {
326
319
  model.xrReferenceSpace = refSpace;
327
- });
320
+ }); // Initialize transparent background for augmented reality session
321
+
322
+ isXrSessionAR = [XrSessionTypes.HmdAR, XrSessionTypes.MobileAR].includes(model.xrSessionType);
323
+
324
+ if (isXrSessionAR) {
325
+ ren = model.renderable.getRenderers()[0];
326
+ model.preXrSessionBackground = ren.getBackground();
327
+ ren.setBackground([0, 0, 0, 0]);
328
+ }
329
+
328
330
  publicAPI.resetXRScene();
329
331
  model.renderable.getInteractor().switchToXRAnimation();
330
332
  model.xrSceneFrame = model.xrSession.requestAnimationFrame(publicAPI.xrRender);
331
- _context.next = 16;
333
+ _context.next = 18;
332
334
  break;
333
335
 
334
- case 15:
335
- throw new Error('Failed to enter VR with a null xrSession.');
336
+ case 17:
337
+ throw new Error('Failed to enter XR with a null xrSession.');
336
338
 
337
- case 16:
339
+ case 18:
338
340
  case "end":
339
341
  return _context.stop();
340
342
  }
@@ -348,32 +350,17 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
348
350
  }();
349
351
 
350
352
  publicAPI.resetXRScene = function () {
351
- var inputRescaleFactor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_RESET_FACTORS.vr.rescaleFactor;
352
- var inputTranslateZ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_RESET_FACTORS.vr.translateZ;
353
+ var rescaleFactor = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_RESET_FACTORS.rescaleFactor;
354
+ var translateZ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_RESET_FACTORS.translateZ;
353
355
  // Adjust world-to-physical parameters for different modalities
354
- // Default parameter values are for HMD VR
355
- var rescaleFactor = inputRescaleFactor;
356
- var translateZ = inputTranslateZ;
357
- var isXrSessionAR = model.xrSessionType === XrSessionTypes.MobileAR;
358
-
359
- if (isXrSessionAR && rescaleFactor === DEFAULT_RESET_FACTORS.vr.rescaleFactor) {
360
- // Scale down by default in AR
361
- rescaleFactor = DEFAULT_RESET_FACTORS.ar.rescaleFactor;
362
- }
363
-
364
- if (isXrSessionAR && translateZ === DEFAULT_RESET_FACTORS.vr.translateZ) {
365
- // Default closer to the camera in AR
366
- translateZ = DEFAULT_RESET_FACTORS.ar.translateZ;
367
- }
368
-
369
356
  var ren = model.renderable.getRenderers()[0];
370
357
  ren.resetCamera();
371
358
  var camera = ren.getActiveCamera();
372
359
  var physicalScale = camera.getPhysicalScale();
373
360
  var physicalTranslation = camera.getPhysicalTranslation();
361
+ var rescaledTranslateZ = translateZ * physicalScale;
374
362
  physicalScale /= rescaleFactor;
375
- translateZ *= physicalScale;
376
- physicalTranslation[2] += translateZ;
363
+ physicalTranslation[2] += rescaledTranslateZ;
377
364
  camera.setPhysicalScale(physicalScale);
378
365
  camera.setPhysicalTranslation(physicalTranslation); // Clip at 0.1m, 100.0m in physical space by default
379
366
 
@@ -420,12 +407,18 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
420
407
 
421
408
 
422
409
  ren = model.renderable.getRenderers()[0];
410
+
411
+ if (model.preXrSessionBackground != null) {
412
+ ren.setBackground(model.preXrSessionBackground);
413
+ model.preXrSessionBackground = null;
414
+ }
415
+
423
416
  ren.getActiveCamera().setProjectionMatrix(null);
424
417
  ren.resetCamera();
425
418
  ren.setViewport(0.0, 0, 1.0, 1.0);
426
419
  publicAPI.traverseAllPasses();
427
420
 
428
- case 16:
421
+ case 17:
429
422
  case "end":
430
423
  return _context2.stop();
431
424
  }
@@ -435,12 +428,13 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
435
428
 
436
429
  publicAPI.xrRender = /*#__PURE__*/function () {
437
430
  var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(t, frame) {
438
- var xrSession, xrPose, gl, glLayer, ren;
431
+ var xrSession, isXrSessionHMD, xrPose, gl, glLayer, ren;
439
432
  return _regeneratorRuntime.wrap(function _callee3$(_context3) {
440
433
  while (1) {
441
434
  switch (_context3.prev = _context3.next) {
442
435
  case 0:
443
436
  xrSession = frame.session;
437
+ isXrSessionHMD = [XrSessionTypes.HmdVR, XrSessionTypes.HmdAR].includes(model.xrSessionType);
444
438
  model.renderable.getInteractor().updateXRGamepads(xrSession, frame, model.xrReferenceSpace);
445
439
  model.xrSceneFrame = model.xrSession.requestAnimationFrame(publicAPI.xrRender);
446
440
  xrPose = frame.getViewerPose(model.xrReferenceSpace);
@@ -462,10 +456,9 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
462
456
  ren = model.renderable.getRenderers()[0]; // Do a render pass for each eye
463
457
 
464
458
  xrPose.views.forEach(function (view, index) {
465
- var viewport = glLayer.getViewport(view); // TODO: Appropriate handling for AR passthrough on HMDs
466
- // with two eyes will require further investigation.
459
+ var viewport = glLayer.getViewport(view);
467
460
 
468
- if (model.xrSessionType === XrSessionTypes.HmdVR) {
461
+ if (isXrSessionHMD) {
469
462
  if (view.eye === 'left') {
470
463
  ren.setViewport(0, 0, 0.5, 1.0);
471
464
  } else if (view.eye === 'right') {
@@ -494,7 +487,7 @@ function vtkOpenGLRenderWindow(publicAPI, model) {
494
487
  gl.disable(gl.SCISSOR_TEST);
495
488
  }
496
489
 
497
- case 5:
490
+ case 6:
498
491
  case "end":
499
492
  return _context3.stop();
500
493
  }
@@ -11,6 +11,7 @@ import '../OpenGL/Texture.js';
11
11
  import '../OpenGL/Glyph3DMapper.js';
12
12
  import '../OpenGL/ImageResliceMapper.js';
13
13
  import '../OpenGL/ImageMapper.js';
14
+ import '../OpenGL/ImageCPRMapper.js';
14
15
  import '../OpenGL/ImageSlice.js';
15
16
  import '../OpenGL/Volume.js';
16
17
  import '../OpenGL/VolumeMapper.js';
@@ -2,6 +2,7 @@ import '../OpenGL/Camera.js';
2
2
  import '../OpenGL/Renderer.js';
3
3
  import '../OpenGL/ImageResliceMapper.js';
4
4
  import '../OpenGL/ImageMapper.js';
5
+ import '../OpenGL/ImageCPRMapper.js';
5
6
  import '../OpenGL/ImageSlice.js';
6
7
  import '../OpenGL/Volume.js';
7
8
  import '../OpenGL/VolumeMapper.js';
@@ -237,7 +237,7 @@ function vtkWidgetManager(publicAPI, model) {
237
237
  case 0:
238
238
  fromTouchEvent = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
239
239
 
240
- if (!(!model.isAnimating && model.pickingEnabled)) {
240
+ if (!(!model.isAnimating && model.pickingEnabled && callData.pokedRenderer === model._renderer)) {
241
241
  _context.next = 6;
242
242
  break;
243
243
  }
@@ -1,6 +1,6 @@
1
1
  import { vtkObject } from './../../interfaces';
2
2
  import { vtkOpenGLRenderWindow } from './../../Rendering/OpenGL/RenderWindow'
3
- import { Vector3 } from './../../types';
3
+ import { Matrix3x3, Nullable, Vector3 } from './../../types';
4
4
 
5
5
  /**
6
6
  *
@@ -53,7 +53,7 @@ export interface vtkAbstractManipulator extends vtkObject {
53
53
  * @param callData
54
54
  * @param glRenderWindow
55
55
  */
56
- handleEvent(callData: any, glRenderWindow: vtkOpenGLRenderWindow): Vector3;
56
+ handleEvent(callData: any, glRenderWindow: vtkOpenGLRenderWindow): { worldCoords: Nullable<Vector3>, worldDirection?: Matrix3x3 };
57
57
 
58
58
  /* ------------------------------------------------------------------- */
59
59
 
@@ -0,0 +1,138 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
3
+ import macro from '../../macros.js';
4
+ import vtkPlane from '../../Common/DataModel/Plane.js';
5
+ import vtkAbstractManipulator from './AbstractManipulator.js';
6
+ import { mat4, vec3, mat3 } from 'gl-matrix';
7
+
8
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
9
+
10
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
11
+ function intersectDisplayWithPlane(x, y, planeOrigin, planeNormal, renderer, glRenderWindow) {
12
+ var near = glRenderWindow.displayToWorld(x, y, 0, renderer);
13
+ var far = glRenderWindow.displayToWorld(x, y, 1, renderer);
14
+ return vtkPlane.intersectWithLine(near, far, planeOrigin, planeNormal).x;
15
+ } // ----------------------------------------------------------------------------
16
+ // vtkCPRManipulator methods
17
+ // ----------------------------------------------------------------------------
18
+
19
+ function vtkCPRManipulator(publicAPI, model) {
20
+ // Set our className
21
+ model.classHierarchy.push('vtkCPRManipulator');
22
+
23
+ publicAPI.handleEvent = function (callData, glRenderWindow) {
24
+ var _model$cprActor;
25
+
26
+ var mapper = (_model$cprActor = model.cprActor) === null || _model$cprActor === void 0 ? void 0 : _model$cprActor.getMapper();
27
+
28
+ if (!mapper) {
29
+ return {
30
+ worldCoords: null
31
+ };
32
+ } // Get normal and origin of the picking plane from the actor matrix
33
+
34
+
35
+ var cprActorMatrix = [];
36
+ mat4.transpose(cprActorMatrix, model.cprActor.getMatrix());
37
+ var worldPlaneNormal = cprActorMatrix.slice(8, 11); // 3rd column
38
+
39
+ var worldPlaneOrigin = cprActorMatrix.slice(12, 15); // 4th column
40
+ // Convert world plane position to 2D position in the plane
41
+
42
+ var inversecprActorMatrix = [];
43
+ mat4.invert(inversecprActorMatrix, cprActorMatrix);
44
+ var worldPlanePicking = intersectDisplayWithPlane(callData.position.x, callData.position.y, worldPlaneOrigin, worldPlaneNormal, callData.pokedRenderer, glRenderWindow);
45
+ var modelPlanePicking = []; // (x, height - distance, 0)
46
+
47
+ vec3.transformMat4(modelPlanePicking, worldPlanePicking, inversecprActorMatrix);
48
+ var height = mapper.getHeight();
49
+ var distance = height - modelPlanePicking[1];
50
+ return publicAPI.distanceEvent(distance);
51
+ };
52
+
53
+ publicAPI.distanceEvent = function (distance) {
54
+ var _model$cprActor2;
55
+
56
+ var mapper = (_model$cprActor2 = model.cprActor) === null || _model$cprActor2 === void 0 ? void 0 : _model$cprActor2.getMapper();
57
+
58
+ if (!mapper) {
59
+ return {
60
+ worldCoords: null
61
+ };
62
+ }
63
+
64
+ var height = mapper.getHeight();
65
+ var clampedDistance = Math.max(0, Math.min(height, distance));
66
+
67
+ var _mapper$getCenterline = mapper.getCenterlinePositionAndOrientation(clampedDistance),
68
+ position = _mapper$getCenterline.position,
69
+ orientation = _mapper$getCenterline.orientation;
70
+
71
+ var worldDirection;
72
+
73
+ if (orientation) {
74
+ var modelDirections = mat3.fromQuat([], orientation);
75
+ var baseDirections = mapper.getDirectionMatrix();
76
+ worldDirection = mat3.mul([], modelDirections, baseDirections);
77
+ }
78
+
79
+ model.currentDistance = clampedDistance;
80
+ return {
81
+ worldCoords: position,
82
+ worldDirection: worldDirection
83
+ };
84
+ };
85
+
86
+ publicAPI.handleScroll = function (nbSteps) {
87
+ var distance = model.currentDistance + publicAPI.getDistanceStep() * nbSteps;
88
+ return publicAPI.distanceEvent(distance);
89
+ };
90
+
91
+ publicAPI.getDistanceStep = function () {
92
+ // Find default distanceStep from image spacing
93
+ // This only works if the mapper in the actor already has an ImageData
94
+ if (!model.distanceStep) {
95
+ var _model$cprActor3, _model$cprActor3$getM, _model$cprActor3$getM2, _model$cprActor3$getM3;
96
+
97
+ var imageSpacing = (_model$cprActor3 = model.cprActor) === null || _model$cprActor3 === void 0 ? void 0 : (_model$cprActor3$getM = _model$cprActor3.getMapper()) === null || _model$cprActor3$getM === void 0 ? void 0 : (_model$cprActor3$getM2 = _model$cprActor3$getM.getInputData(0)) === null || _model$cprActor3$getM2 === void 0 ? void 0 : (_model$cprActor3$getM3 = _model$cprActor3$getM2.getSpacing) === null || _model$cprActor3$getM3 === void 0 ? void 0 : _model$cprActor3$getM3.call(_model$cprActor3$getM2);
98
+
99
+ if (imageSpacing) {
100
+ return Math.min.apply(Math, _toConsumableArray(imageSpacing));
101
+ }
102
+ }
103
+
104
+ return model.distanceStep;
105
+ };
106
+ } // ----------------------------------------------------------------------------
107
+ // Object factory
108
+ // ----------------------------------------------------------------------------
109
+ // currentDistance is the distance from the first point of the centerline
110
+ // cprActor.getMapper() should be a vtkImageCPRMapper
111
+
112
+
113
+ function defaultValues(initialValues) {
114
+ return _objectSpread({
115
+ distanceStep: 0,
116
+ currentDistance: 0,
117
+ cprActor: null
118
+ }, initialValues);
119
+ } // ----------------------------------------------------------------------------
120
+
121
+
122
+ function extend(publicAPI, model) {
123
+ var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
124
+ vtkAbstractManipulator.extend(publicAPI, model, defaultValues(initialValues));
125
+ macro.setGet(publicAPI, model, ['distance', 'currentDistance', 'cprActor']);
126
+ macro.set(publicAPI, model, ['distanceStep']);
127
+ vtkCPRManipulator(publicAPI, model);
128
+ } // ----------------------------------------------------------------------------
129
+
130
+ var newInstance = macro.newInstance(extend, 'vtkCPRManipulator'); // ----------------------------------------------------------------------------
131
+
132
+ var index = {
133
+ intersectDisplayWithPlane: intersectDisplayWithPlane,
134
+ extend: extend,
135
+ newInstance: newInstance
136
+ };
137
+
138
+ export { index as default, extend, intersectDisplayWithPlane, newInstance };
@@ -29,7 +29,9 @@ function vtkLineManipulator(publicAPI, model) {
29
29
  model.classHierarchy.push('vtkLineManipulator');
30
30
 
31
31
  publicAPI.handleEvent = function (callData, glRenderWindow) {
32
- return projectDisplayToLine(callData.position.x, callData.position.y, publicAPI.getOrigin(callData), publicAPI.getNormal(callData), callData.pokedRenderer, glRenderWindow);
32
+ return {
33
+ worldCoords: projectDisplayToLine(callData.position.x, callData.position.y, publicAPI.getOrigin(callData), publicAPI.getNormal(callData), callData.pokedRenderer, glRenderWindow)
34
+ };
33
35
  };
34
36
  } // ----------------------------------------------------------------------------
35
37
  // Object factory
@@ -19,7 +19,9 @@ function vtkPlaneManipulator(publicAPI, model) {
19
19
  model.classHierarchy.push('vtkPlaneManipulator');
20
20
 
21
21
  publicAPI.handleEvent = function (callData, glRenderWindow) {
22
- return intersectDisplayWithPlane(callData.position.x, callData.position.y, publicAPI.getOrigin(callData), publicAPI.getNormal(callData), callData.pokedRenderer, glRenderWindow);
22
+ return {
23
+ worldCoords: intersectDisplayWithPlane(callData.position.x, callData.position.y, publicAPI.getOrigin(callData), publicAPI.getNormal(callData), callData.pokedRenderer, glRenderWindow)
24
+ };
23
25
  };
24
26
  } // ----------------------------------------------------------------------------
25
27
  // Object factory
@@ -39,7 +39,9 @@ function vtkTrackballManipulator(publicAPI, model) {
39
39
  var newDirection = trackballRotate(prevX, prevY, callData.position.x, callData.position.y, publicAPI.getOrigin(callData), publicAPI.getNormal(callData), callData.pokedRenderer);
40
40
  prevX = callData.position.x;
41
41
  prevY = callData.position.y;
42
- return newDirection;
42
+ return {
43
+ worldCoords: newDirection
44
+ };
43
45
  };
44
46
 
45
47
  publicAPI.reset = function (callData) {
@@ -37,7 +37,9 @@ function widgetBehavior(publicAPI, model) {
37
37
  var manipulator = (_model$activeState$ge = (_model$activeState = model.activeState) === null || _model$activeState === void 0 ? void 0 : (_model$activeState$ge2 = _model$activeState.getManipulator) === null || _model$activeState$ge2 === void 0 ? void 0 : _model$activeState$ge2.call(_model$activeState)) !== null && _model$activeState$ge !== void 0 ? _model$activeState$ge : model.manipulator;
38
38
 
39
39
  if (model.activeState === model.widgetState.getMoveHandle() && model.widgetState.getHandleList().length < MAX_POINTS && manipulator) {
40
- var worldCoords = manipulator.handleEvent(e, model._apiSpecificRenderWindow); // Commit handle to location
40
+ var _manipulator$handleEv = manipulator.handleEvent(e, model._apiSpecificRenderWindow),
41
+ worldCoords = _manipulator$handleEv.worldCoords; // Commit handle to location
42
+
41
43
 
42
44
  var moveHandle = model.widgetState.getMoveHandle();
43
45
  moveHandle.setOrigin.apply(moveHandle, _toConsumableArray(worldCoords));
@@ -67,7 +69,8 @@ function widgetBehavior(publicAPI, model) {
67
69
  var manipulator = (_model$activeState$ge3 = (_model$activeState2 = model.activeState) === null || _model$activeState2 === void 0 ? void 0 : (_model$activeState2$g = _model$activeState2.getManipulator) === null || _model$activeState2$g === void 0 ? void 0 : _model$activeState2$g.call(_model$activeState2)) !== null && _model$activeState$ge3 !== void 0 ? _model$activeState$ge3 : model.manipulator;
68
70
 
69
71
  if (manipulator && model.pickable && model.dragable && model.activeState && model.activeState.getActive() && !ignoreKey(callData)) {
70
- var worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow);
72
+ var _manipulator$handleEv2 = manipulator.handleEvent(callData, model._apiSpecificRenderWindow),
73
+ worldCoords = _manipulator$handleEv2.worldCoords;
71
74
 
72
75
  if (worldCoords.length && (model.activeState === model.widgetState.getMoveHandle() || model._isDragging) && model.activeState.setOrigin // e.g. the line is pickable but not draggable
73
76
  ) {
@@ -32,7 +32,9 @@ function widgetBehavior(publicAPI, model) {
32
32
  var manipulator = (_model$activeState$ge = (_model$activeState = model.activeState) === null || _model$activeState === void 0 ? void 0 : (_model$activeState$ge2 = _model$activeState.getManipulator) === null || _model$activeState$ge2 === void 0 ? void 0 : _model$activeState$ge2.call(_model$activeState)) !== null && _model$activeState$ge !== void 0 ? _model$activeState$ge : model.manipulator;
33
33
 
34
34
  if (model.activeState === model.widgetState.getMoveHandle() && model.widgetState.getHandleList().length < MAX_POINTS && manipulator) {
35
- var worldCoords = manipulator.handleEvent(e, model._apiSpecificRenderWindow); // Commit handle to location
35
+ var _manipulator$handleEv = manipulator.handleEvent(e, model._apiSpecificRenderWindow),
36
+ worldCoords = _manipulator$handleEv.worldCoords; // Commit handle to location
37
+
36
38
 
37
39
  var moveHandle = model.widgetState.getMoveHandle();
38
40
  moveHandle.setOrigin.apply(moveHandle, _toConsumableArray(worldCoords));
@@ -62,7 +64,8 @@ function widgetBehavior(publicAPI, model) {
62
64
  var manipulator = (_model$activeState$ge3 = (_model$activeState2 = model.activeState) === null || _model$activeState2 === void 0 ? void 0 : (_model$activeState2$g = _model$activeState2.getManipulator) === null || _model$activeState2$g === void 0 ? void 0 : _model$activeState2$g.call(_model$activeState2)) !== null && _model$activeState$ge3 !== void 0 ? _model$activeState$ge3 : model.manipulator;
63
65
 
64
66
  if (manipulator && model.pickable && model.dragable && model.activeState && model.activeState.getActive() && !ignoreKey(callData)) {
65
- var worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow);
67
+ var _manipulator$handleEv2 = manipulator.handleEvent(callData, model._apiSpecificRenderWindow),
68
+ worldCoords = _manipulator$handleEv2.worldCoords;
66
69
 
67
70
  if (worldCoords.length && (model.activeState === model.widgetState.getMoveHandle() || model._isDragging) && model.activeState.setOrigin // e.g. the line is pickable but not draggable
68
71
  ) {
@@ -65,7 +65,7 @@ function widgetBehavior(publicAPI, model) {
65
65
 
66
66
  if (type === 'corners') {
67
67
  // manipulator should be a plane manipulator
68
- worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow);
68
+ worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow).worldCoords;
69
69
  }
70
70
 
71
71
  if (type === 'faces') {
@@ -78,7 +78,7 @@ function widgetBehavior(publicAPI, model) {
78
78
 
79
79
  manipulator.setHandleOrigin(transformVec3(center, indexToWorldT));
80
80
  manipulator.setHandleNormal(rotateVec3(constraintAxis, indexToWorldT));
81
- worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow);
81
+ worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow).worldCoords;
82
82
  }
83
83
 
84
84
  if (type === 'edges') {
@@ -87,7 +87,7 @@ function widgetBehavior(publicAPI, model) {
87
87
  return a === 1 ? a : 0;
88
88
  });
89
89
  manipulator.setHandleNormal(rotateVec3(edgeAxis, indexToWorldT));
90
- worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow);
90
+ worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow).worldCoords;
91
91
  }
92
92
 
93
93
  if (worldCoords.length) {
@@ -106,7 +106,9 @@ function widgetBehavior(publicAPI, model) {
106
106
 
107
107
  publicAPI.updateFromOrigin = function (callData) {
108
108
  model.planeManipulator.setWidgetNormal(model.widgetState.getNormal());
109
- var worldCoords = model.planeManipulator.handleEvent(callData, model._apiSpecificRenderWindow);
109
+
110
+ var _model$planeManipulat = model.planeManipulator.handleEvent(callData, model._apiSpecificRenderWindow),
111
+ worldCoords = _model$planeManipulat.worldCoords;
110
112
 
111
113
  if (model.widgetState.containsPoint(worldCoords)) {
112
114
  model.activeState.setOrigin(worldCoords);
@@ -43,7 +43,9 @@ function widgetBehavior(publicAPI, model) {
43
43
  var manipulator = (_model$activeState$ge = (_model$activeState = model.activeState) === null || _model$activeState === void 0 ? void 0 : (_model$activeState$ge2 = _model$activeState.getManipulator) === null || _model$activeState$ge2 === void 0 ? void 0 : _model$activeState$ge2.call(_model$activeState)) !== null && _model$activeState$ge !== void 0 ? _model$activeState$ge : model.manipulator;
44
44
 
45
45
  if (model.activeState === model.widgetState.getMoveHandle() && manipulator) {
46
- var worldCoords = manipulator.handleEvent(e, model._apiSpecificRenderWindow); // Commit handle to location
46
+ var _manipulator$handleEv = manipulator.handleEvent(e, model._apiSpecificRenderWindow),
47
+ worldCoords = _manipulator$handleEv.worldCoords; // Commit handle to location
48
+
47
49
 
48
50
  var moveHandle = model.widgetState.getMoveHandle();
49
51
  moveHandle.setOrigin(worldCoords);
@@ -100,7 +102,8 @@ function widgetBehavior(publicAPI, model) {
100
102
  var manipulator = (_model$activeState$ge3 = (_model$activeState2 = model.activeState) === null || _model$activeState2 === void 0 ? void 0 : (_model$activeState2$g = _model$activeState2.getManipulator) === null || _model$activeState2$g === void 0 ? void 0 : _model$activeState2$g.call(_model$activeState2)) !== null && _model$activeState$ge3 !== void 0 ? _model$activeState$ge3 : model.manipulator;
101
103
 
102
104
  if (manipulator && model.pickable && model.dragable && model.activeState && model.activeState.getActive() && !ignoreKey(callData)) {
103
- var worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow);
105
+ var _manipulator$handleEv2 = manipulator.handleEvent(callData, model._apiSpecificRenderWindow),
106
+ worldCoords = _manipulator$handleEv2.worldCoords;
104
107
 
105
108
  if (worldCoords.length && (model.activeState === model.widgetState.getMoveHandle() || model._isDragging)) {
106
109
  model.activeState.setOrigin(worldCoords);
@@ -57,7 +57,7 @@ function widgetBehavior(publicAPI, model) {
57
57
 
58
58
  model._isDragging = true;
59
59
  var manipulator = (_model$activeState$ge = (_model$activeState = model.activeState) === null || _model$activeState === void 0 ? void 0 : (_model$activeState$ge2 = _model$activeState.getManipulator) === null || _model$activeState$ge2 === void 0 ? void 0 : _model$activeState$ge2.call(_model$activeState)) !== null && _model$activeState$ge !== void 0 ? _model$activeState$ge : model.manipulator;
60
- model.previousPosition = _toConsumableArray(manipulator.handleEvent(callData, model._apiSpecificRenderWindow));
60
+ model.previousPosition = manipulator.handleEvent(callData, model._apiSpecificRenderWindow).worldCoords;
61
61
 
62
62
  model._apiSpecificRenderWindow.setCursor('grabbing');
63
63
 
@@ -203,7 +203,9 @@ function widgetBehavior(publicAPI, model) {
203
203
  var manipulator = (_model$activeState$ge3 = (_model$activeState2 = model.activeState) === null || _model$activeState2 === void 0 ? void 0 : (_model$activeState2$g = _model$activeState2.getManipulator) === null || _model$activeState2$g === void 0 ? void 0 : _model$activeState2$g.call(_model$activeState2)) !== null && _model$activeState$ge3 !== void 0 ? _model$activeState$ge3 : model.manipulator;
204
204
 
205
205
  if (manipulator && model.pickable && model.dragable && model.activeState && model.activeState.getActive() && !ignoreKey(callData)) {
206
- var worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow);
206
+ var _manipulator$handleEv = manipulator.handleEvent(callData, model._apiSpecificRenderWindow),
207
+ worldCoords = _manipulator$handleEv.worldCoords;
208
+
207
209
  var translation = model.previousPosition ? subtract(worldCoords, model.previousPosition, []) : [0, 0, 0];
208
210
  model.previousPosition = worldCoords;
209
211
 
@@ -52,7 +52,8 @@ function widgetBehavior(publicAPI, model) {
52
52
 
53
53
  (_model$activeState4 = model.activeState).setDirection.apply(_model$activeState4, _toConsumableArray(normal));
54
54
 
55
- var worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow);
55
+ var _manipulator$handleEv = manipulator.handleEvent(callData, model._apiSpecificRenderWindow),
56
+ worldCoords = _manipulator$handleEv.worldCoords;
56
57
 
57
58
  if (worldCoords.length) {
58
59
  var _model$widgetState, _model$activeState5;
@@ -26,7 +26,8 @@ function widgetBehavior(publicAPI, model) {
26
26
  return macro.VOID;
27
27
  }
28
28
 
29
- var worldCoords = manipulator.handleEvent(callData, model._apiSpecificRenderWindow);
29
+ var _manipulator$handleEv = manipulator.handleEvent(callData, model._apiSpecificRenderWindow),
30
+ worldCoords = _manipulator$handleEv.worldCoords;
30
31
 
31
32
  if (worldCoords.length && (model.activeState === model.widgetState.getMoveHandle() || model._isDragging) && model.activeState.setOrigin // e.g. the line is pickable but not draggable
32
33
  ) {
@@ -12,7 +12,8 @@ var ScrollingMethods = {
12
12
  var InteractionMethodsName = {
13
13
  TranslateAxis: 'translateAxis',
14
14
  RotateLine: 'rotateLine',
15
- TranslateCenter: 'translateCenter'
15
+ TranslateCenter: 'translateCenter',
16
+ TranslateCenterAndUpdatePlanes: 'translateCenterAndUpdatePlanes'
16
17
  };
17
18
  var defaultViewUpFromViewType = (_defaultViewUpFromVie = {}, _defineProperty(_defaultViewUpFromVie, ViewTypes.YZ_PLANE, [0, 0, 1]), _defineProperty(_defaultViewUpFromVie, ViewTypes.XZ_PLANE, [0, 0, 1]), _defineProperty(_defaultViewUpFromVie, ViewTypes.XY_PLANE, [0, -1, 0]), _defaultViewUpFromVie);
18
19
  var xyzToViewType = [ViewTypes.YZ_PLANE, ViewTypes.XZ_PLANE, ViewTypes.XY_PLANE];