@ohif/app 3.13.0-beta.63 → 3.13.0-beta.65

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 (33) hide show
  1. package/dist/{2851.bundle.82a96cdcc6fc18c73030.js → 2851.bundle.ffc5656f20a4159d591d.js} +12 -5
  2. package/dist/{7166.bundle.775a8ac234701c028acf.js → 7166.bundle.bd50b3917b5ee6166971.js} +134 -7
  3. package/dist/{7537.bundle.1726a7f7a4c378296085.js → 7537.bundle.889ba5f2707418c6fd88.js} +1 -1
  4. package/dist/{9039.bundle.7afa93b103c3b26d4855.js → 9039.bundle.f72736f47fedeff521e2.js} +123 -47
  5. package/dist/{9205.bundle.315c3b56464a7590235a.js → 9205.bundle.ed7bce8436a7a431955e.js} +122 -47
  6. package/dist/{9567.bundle.be350438bed4e656f278.js → 9567.bundle.ff782480a4c66e306027.js} +438 -85
  7. package/dist/{app.bundle.ea477c22ff095b97d6a0.js → app.bundle.9e45525b479dad4d8113.js} +8 -3
  8. package/dist/{compute.bundle.a41ec0ba4f935200ab93.js → compute.bundle.b7c2ea55f1a69f4a736b.js} +1 -1
  9. package/dist/index.html +1 -1
  10. package/dist/{polySeg.bundle.be57af5b834dd833a418.js → polySeg.bundle.e1f6f05d81ea1352bef3.js} +1 -1
  11. package/dist/sw.js +1 -1
  12. package/package.json +21 -21
  13. /package/dist/{1459.bundle.b6eb8878f677bf92be9f.js → 1459.bundle.b76252d4cbc3588eba65.js} +0 -0
  14. /package/dist/{1933.bundle.727252ef4ef9ee3200b7.js → 1933.bundle.10e823bd588169da5894.js} +0 -0
  15. /package/dist/{2018.bundle.ecd9564ec338f828ceed.js → 2018.bundle.a2960b28da742a90207e.js} +0 -0
  16. /package/dist/{213.bundle.4eef2eee1a2d128ae809.js → 213.bundle.33ca5d29734d9e99a676.js} +0 -0
  17. /package/dist/{2424.bundle.2fd7e2572807b314ea54.js → 2424.bundle.31d8e6bdf23d51886680.js} +0 -0
  18. /package/dist/{3138.bundle.e58b8a8dc3733e27fcb5.js → 3138.bundle.2fd53c9e63b1aea321ac.js} +0 -0
  19. /package/dist/{3461.bundle.c9f965b0ecc3e76030a1.js → 3461.bundle.b50d8125ecc168f22da3.js} +0 -0
  20. /package/dist/{4507.bundle.b3e80ce6bbb20bdf43d5.js → 4507.bundle.061dfcf4609ef7aa8ede.js} +0 -0
  21. /package/dist/{4819.bundle.9e663daa60622566dc01.js → 4819.bundle.ac518de1987ad93304c8.js} +0 -0
  22. /package/dist/{5015.bundle.45c90a114408bed47e06.js → 5015.bundle.46f8b754a318286c18ad.js} +0 -0
  23. /package/dist/{5028.bundle.03fefb86628d2b93d535.js → 5028.bundle.608de6dde0d0af9e2b3e.js} +0 -0
  24. /package/dist/{5457.bundle.4e46bd724396818ecbf8.js → 5457.bundle.449b35dfd1134c977985.js} +0 -0
  25. /package/dist/{5485.bundle.274b8b176f3763a5f3b4.js → 5485.bundle.c59e61ecef95882924d1.js} +0 -0
  26. /package/dist/{6027.bundle.b6d8247b432dde4707ab.js → 6027.bundle.ea6f6e5bbb336cdb2796.js} +0 -0
  27. /package/dist/{7639.bundle.a71fb464ab990cae6fa8.js → 7639.bundle.04596df767fc6b0003a3.js} +0 -0
  28. /package/dist/{8305.bundle.063949071f42e6c9e286.js → 8305.bundle.a9764cd29cfa5bc6fd79.js} +0 -0
  29. /package/dist/{8499.bundle.eb055feb83a541941371.js → 8499.bundle.4a7f127900cf03af4e49.js} +0 -0
  30. /package/dist/{85.bundle.c41b0b4c4ed19791ce23.js → 85.bundle.e122f01517ddea1e3af0.js} +0 -0
  31. /package/dist/{8558.bundle.e212dfb2a24db4516420.js → 8558.bundle.522dbc153f443298deaa.js} +0 -0
  32. /package/dist/{8583.bundle.1fbf8dfd991f207857af.js → 8583.bundle.bd1d92122c5ebfb867fc.js} +0 -0
  33. /package/dist/{9927.bundle.827f6df9ac73bb635517.js → 9927.bundle.21cdba4cf5309feb8b7d.js} +0 -0
@@ -2571,6 +2571,35 @@ function getVOIMultipliers(viewport, volumeId, options) {
2571
2571
 
2572
2572
 
2573
2573
 
2574
+ /***/ },
2575
+
2576
+ /***/ 51970
2577
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2578
+
2579
+ "use strict";
2580
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2581
+ /* harmony export */ Js: () => (/* binding */ beginOwnedDrag),
2582
+ /* harmony export */ Xt: () => (/* binding */ endOwnedDrag),
2583
+ /* harmony export */ lq: () => (/* binding */ isDragOwnedBy)
2584
+ /* harmony export */ });
2585
+ const dragOwnerByViewportId = new Map();
2586
+ function beginOwnedDrag(viewportId, owner) {
2587
+ if (dragOwnerByViewportId.has(viewportId)) {
2588
+ return false;
2589
+ }
2590
+ dragOwnerByViewportId.set(viewportId, owner);
2591
+ return true;
2592
+ }
2593
+ function endOwnedDrag(viewportId, owner) {
2594
+ if (dragOwnerByViewportId.get(viewportId) === owner) {
2595
+ dragOwnerByViewportId.delete(viewportId);
2596
+ }
2597
+ }
2598
+ function isDragOwnedBy(viewportId, owner) {
2599
+ return dragOwnerByViewportId.get(viewportId) === owner;
2600
+ }
2601
+
2602
+
2574
2603
  /***/ },
2575
2604
 
2576
2605
  /***/ 38776
@@ -5674,22 +5703,26 @@ var vtkCellPicker$1 = {
5674
5703
 
5675
5704
  // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Rendering/Core/Actor.js
5676
5705
  var Actor = __webpack_require__(44404);
5706
+ // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/Core/CellArray.js
5707
+ var CellArray = __webpack_require__(32461);
5708
+ // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Rendering/Core/Mapper.js + 1 modules
5709
+ var Mapper = __webpack_require__(81418);
5710
+ // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/Core/Points.js
5711
+ var Points = __webpack_require__(74973);
5712
+ // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/DataModel/PolyData.js + 7 modules
5713
+ var PolyData = __webpack_require__(27480);
5714
+ // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Rendering/Core/Renderer.js + 2 modules
5715
+ var Renderer = __webpack_require__(55524);
5677
5716
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 1 modules
5678
5717
  var dist_esm = __webpack_require__(15327);
5679
5718
  // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/macros.js
5680
5719
  var macros = __webpack_require__(28241);
5681
- // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Rendering/Core/Mapper.js + 1 modules
5682
- var Mapper = __webpack_require__(81418);
5683
5720
  // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/Core/DataArray.js
5684
5721
  var DataArray = __webpack_require__(445);
5685
5722
  // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Rendering/Core/Texture.js
5686
5723
  var Texture = __webpack_require__(41090);
5687
5724
  // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/Core/ImageHelper.js
5688
5725
  var ImageHelper = __webpack_require__(74821);
5689
- // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/Core/CellArray.js
5690
- var CellArray = __webpack_require__(32461);
5691
- // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/DataModel/PolyData.js + 7 modules
5692
- var PolyData = __webpack_require__(27480);
5693
5726
  ;// ../../../node_modules/@cornerstonejs/tools/dist/esm/utilities/vtkjs/RhombicuboctahedronSource/index.js
5694
5727
 
5695
5728
 
@@ -5708,6 +5741,7 @@ const EDGE_FACES = [
5708
5741
  11, 4, 5, 6, 22, 21, 4, 6, 7, 15, 14, 4, 7, 4, 17, 18, 4, 8, 11, 17, 16, 4, 9,
5709
5742
  20, 21, 10, 4, 13, 23, 22, 14, 4, 12, 19, 18, 15,
5710
5743
  ];
5744
+ const FACE_HALF_SIZE = 0.792;
5711
5745
  function vtkRhombicuboctahedronSource(publicAPI, model) {
5712
5746
  model.classHierarchy.push('vtkRhombicuboctahedronSource');
5713
5747
  publicAPI.requestData = (inData, outData) => {
@@ -5723,32 +5757,31 @@ function vtkRhombicuboctahedronSource(publicAPI, model) {
5723
5757
  }
5724
5758
  }
5725
5759
  const phi = 1.4;
5726
- const faceSize = 0.88;
5727
5760
  const vertices = [];
5728
- vertices.push(-faceSize, -faceSize, -phi);
5729
- vertices.push(faceSize, -faceSize, -phi);
5730
- vertices.push(faceSize, faceSize, -phi);
5731
- vertices.push(-faceSize, faceSize, -phi);
5732
- vertices.push(-faceSize, -faceSize, phi);
5733
- vertices.push(faceSize, -faceSize, phi);
5734
- vertices.push(faceSize, faceSize, phi);
5735
- vertices.push(-faceSize, faceSize, phi);
5736
- vertices.push(-faceSize, -phi, -faceSize);
5737
- vertices.push(faceSize, -phi, -faceSize);
5738
- vertices.push(faceSize, -phi, faceSize);
5739
- vertices.push(-faceSize, -phi, faceSize);
5740
- vertices.push(-faceSize, phi, -faceSize);
5741
- vertices.push(faceSize, phi, -faceSize);
5742
- vertices.push(faceSize, phi, faceSize);
5743
- vertices.push(-faceSize, phi, faceSize);
5744
- vertices.push(-phi, -faceSize, -faceSize);
5745
- vertices.push(-phi, -faceSize, faceSize);
5746
- vertices.push(-phi, faceSize, faceSize);
5747
- vertices.push(-phi, faceSize, -faceSize);
5748
- vertices.push(phi, -faceSize, -faceSize);
5749
- vertices.push(phi, -faceSize, faceSize);
5750
- vertices.push(phi, faceSize, faceSize);
5751
- vertices.push(phi, faceSize, -faceSize);
5761
+ vertices.push(-FACE_HALF_SIZE, -FACE_HALF_SIZE, -phi);
5762
+ vertices.push(FACE_HALF_SIZE, -FACE_HALF_SIZE, -phi);
5763
+ vertices.push(FACE_HALF_SIZE, FACE_HALF_SIZE, -phi);
5764
+ vertices.push(-FACE_HALF_SIZE, FACE_HALF_SIZE, -phi);
5765
+ vertices.push(-FACE_HALF_SIZE, -FACE_HALF_SIZE, phi);
5766
+ vertices.push(FACE_HALF_SIZE, -FACE_HALF_SIZE, phi);
5767
+ vertices.push(FACE_HALF_SIZE, FACE_HALF_SIZE, phi);
5768
+ vertices.push(-FACE_HALF_SIZE, FACE_HALF_SIZE, phi);
5769
+ vertices.push(-FACE_HALF_SIZE, -phi, -FACE_HALF_SIZE);
5770
+ vertices.push(FACE_HALF_SIZE, -phi, -FACE_HALF_SIZE);
5771
+ vertices.push(FACE_HALF_SIZE, -phi, FACE_HALF_SIZE);
5772
+ vertices.push(-FACE_HALF_SIZE, -phi, FACE_HALF_SIZE);
5773
+ vertices.push(-FACE_HALF_SIZE, phi, -FACE_HALF_SIZE);
5774
+ vertices.push(FACE_HALF_SIZE, phi, -FACE_HALF_SIZE);
5775
+ vertices.push(FACE_HALF_SIZE, phi, FACE_HALF_SIZE);
5776
+ vertices.push(-FACE_HALF_SIZE, phi, FACE_HALF_SIZE);
5777
+ vertices.push(-phi, -FACE_HALF_SIZE, -FACE_HALF_SIZE);
5778
+ vertices.push(-phi, -FACE_HALF_SIZE, FACE_HALF_SIZE);
5779
+ vertices.push(-phi, FACE_HALF_SIZE, FACE_HALF_SIZE);
5780
+ vertices.push(-phi, FACE_HALF_SIZE, -FACE_HALF_SIZE);
5781
+ vertices.push(phi, -FACE_HALF_SIZE, -FACE_HALF_SIZE);
5782
+ vertices.push(phi, -FACE_HALF_SIZE, FACE_HALF_SIZE);
5783
+ vertices.push(phi, FACE_HALF_SIZE, FACE_HALF_SIZE);
5784
+ vertices.push(phi, FACE_HALF_SIZE, -FACE_HALF_SIZE);
5752
5785
  let textureCoords = null;
5753
5786
  if (model.generate3DTextureCoordinates) {
5754
5787
  textureCoords = new Float64Array(24 * 3);
@@ -6081,7 +6114,7 @@ function vtkAnnotatedRhombicuboctahedronActor(publicAPI, model) {
6081
6114
  }
6082
6115
  }
6083
6116
  if (model.showEdgeFaces !== false) {
6084
- const edgeColor = [200, 200, 200];
6117
+ const edgeColor = model.edgeColor ?? [200, 200, 200];
6085
6118
  const edgeData = createEdgeFacesMesh(sourceScale, edgeColor);
6086
6119
  if (edgeData) {
6087
6120
  const edgeFacesActor = Actor/* default.newInstance */.Ay.newInstance();
@@ -6102,7 +6135,7 @@ function vtkAnnotatedRhombicuboctahedronActor(publicAPI, model) {
6102
6135
  }
6103
6136
  }
6104
6137
  if (model.showCornerFaces !== false) {
6105
- const cornerColor = [150, 150, 150];
6138
+ const cornerColor = model.cornerColor ?? [150, 150, 150];
6106
6139
  const cornerData = createCornerFacesMesh(sourceScale, cornerColor);
6107
6140
  if (cornerData) {
6108
6141
  const cornerFacesActor = Actor/* default.newInstance */.Ay.newInstance();
@@ -6229,17 +6262,30 @@ function AnnotatedRhombicuboctahedronActor_extend(publicAPI, model, initialValue
6229
6262
  const AnnotatedRhombicuboctahedronActor_newInstance = macros/* default.newInstance */.Ay.newInstance(AnnotatedRhombicuboctahedronActor_extend, 'vtkAnnotatedRhombicuboctahedronActor');
6230
6263
  /* harmony default export */ const AnnotatedRhombicuboctahedronActor = ({ newInstance: AnnotatedRhombicuboctahedronActor_newInstance, extend: AnnotatedRhombicuboctahedronActor_extend });
6231
6264
 
6265
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/utilities/interactionDragCoordinator.js
6266
+ var interactionDragCoordinator = __webpack_require__(51970);
6232
6267
  ;// ../../../node_modules/@cornerstonejs/tools/dist/esm/utilities/vtkjs/OrientationControllerWidget/index.js
6233
6268
 
6234
6269
 
6235
6270
 
6236
6271
 
6272
+
6273
+
6274
+
6275
+
6276
+
6277
+
6237
6278
  class vtkOrientationControllerWidget {
6238
6279
  constructor() {
6239
6280
  this.actors = new Map();
6240
6281
  this.pickers = new Map();
6282
+ this.overlayRenderers = new Map();
6283
+ this.renderWindows = new Map();
6241
6284
  this.highlightedFace = null;
6242
6285
  this.mouseHandlers = new Map();
6286
+ this._highlightColor = [255, 255, 255];
6287
+ this._restingAmbient = 1.0;
6288
+ this._hoverAmbient = 1.0;
6243
6289
  }
6244
6290
  createActors(config) {
6245
6291
  const rgbToHex = (rgb) => {
@@ -6253,7 +6299,10 @@ class vtkOrientationControllerWidget {
6253
6299
  const rgbToHexColor = (rgb) => {
6254
6300
  return `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`;
6255
6301
  };
6256
- const actorFactory = AnnotatedRhombicuboctahedronActor.newInstance();
6302
+ const actorFactory = AnnotatedRhombicuboctahedronActor.newInstance({
6303
+ edgeColor: config.edgeColor ?? [200, 200, 200],
6304
+ cornerColor: config.cornerColor ?? [150, 150, 150],
6305
+ });
6257
6306
  const defaultStyle = {
6258
6307
  fontStyle: 'bold',
6259
6308
  fontFamily: 'Arial',
@@ -6303,9 +6352,13 @@ class vtkOrientationControllerWidget {
6303
6352
  actorFactory.setShowEdgeFaces(config.showEdgeFaces);
6304
6353
  actorFactory.setShowCornerFaces(config.showCornerFaces);
6305
6354
  const actors = actorFactory.getActors();
6355
+ this._highlightColor = config.highlightColor ?? [255, 255, 255];
6356
+ this._restingAmbient = config.restingAmbient ?? 1.0;
6357
+ this._hoverAmbient = config.hoverAmbient ?? 1.0;
6306
6358
  actors.forEach((actor) => {
6307
6359
  const property = actor.getProperty();
6308
6360
  property.setOpacity(config.opacity);
6361
+ property.setAmbient(this._restingAmbient);
6309
6362
  actor.setVisibility(true);
6310
6363
  });
6311
6364
  return actors;
@@ -6315,19 +6368,48 @@ class vtkOrientationControllerWidget {
6315
6368
  if (existingActors) {
6316
6369
  this.removeActorsFromViewport(viewportId, viewport);
6317
6370
  }
6318
- actors.forEach((actor, index) => {
6319
- const uid = `orientation-controller-${viewportId}-${index}`;
6320
- viewport.addActor({ actor, uid });
6371
+ const renderWindow = viewport
6372
+ .getRenderingEngine()
6373
+ .getOffscreenMultiRenderWindow(viewport.id)
6374
+ .getRenderWindow();
6375
+ const mainRenderer = viewport
6376
+ .getRenderingEngine()
6377
+ ?.getRenderer(viewportId) ?? viewport.getRenderer();
6378
+ const vtkMainRenderer = mainRenderer;
6379
+ const overlayRenderer = Renderer/* default.newInstance */.Ay.newInstance();
6380
+ overlayRenderer.setLayer(1);
6381
+ overlayRenderer.setInteractive(false);
6382
+ overlayRenderer.setPreserveColorBuffer(true);
6383
+ overlayRenderer.setActiveCamera(vtkMainRenderer.getActiveCamera());
6384
+ const vp = vtkMainRenderer.getViewport();
6385
+ overlayRenderer.setViewport(...vp);
6386
+ if (renderWindow.getNumberOfLayers() < 2) {
6387
+ renderWindow.setNumberOfLayers(2);
6388
+ }
6389
+ renderWindow.addRenderer(overlayRenderer);
6390
+ actors.forEach((actor) => {
6391
+ overlayRenderer.addActor(actor);
6321
6392
  });
6322
6393
  this.actors.set(viewportId, actors);
6394
+ this.overlayRenderers.set(viewportId, overlayRenderer);
6395
+ this.renderWindows.set(viewportId, renderWindow);
6323
6396
  }
6324
- removeActorsFromViewport(viewportId, viewport) {
6397
+ removeActorsFromViewport(viewportId, _viewport) {
6325
6398
  const actors = this.actors.get(viewportId);
6326
- if (actors) {
6327
- const uids = actors.map((_, index) => `orientation-controller-${viewportId}-${index}`);
6328
- viewport.removeActors(uids);
6329
- this.actors.delete(viewportId);
6399
+ const overlayRenderer = this.overlayRenderers.get(viewportId);
6400
+ const renderWindow = this.renderWindows.get(viewportId);
6401
+ if (actors && overlayRenderer) {
6402
+ actors.forEach((actor) => {
6403
+ overlayRenderer.removeActor(actor);
6404
+ });
6405
+ if (renderWindow) {
6406
+ renderWindow.removeRenderer(overlayRenderer);
6407
+ }
6408
+ overlayRenderer.delete();
6330
6409
  }
6410
+ this.actors.delete(viewportId);
6411
+ this.overlayRenderers.delete(viewportId);
6412
+ this.renderWindows.delete(viewportId);
6331
6413
  }
6332
6414
  setupPicker(viewportId, actors) {
6333
6415
  const picker = vtkCellPicker$1.newInstance({ opacityThreshold: 0.0001 });
@@ -6345,10 +6427,11 @@ class vtkOrientationControllerWidget {
6345
6427
  if (!picker) {
6346
6428
  return null;
6347
6429
  }
6348
- const mainRenderer = viewport
6349
- .getRenderingEngine()
6350
- ?.getRenderer(viewportId) ?? viewport.getRenderer();
6351
- const renderer = mainRenderer;
6430
+ const renderer = this.overlayRenderers.get(viewportId) ??
6431
+ viewport
6432
+ .getRenderingEngine()
6433
+ ?.getRenderer(viewportId) ??
6434
+ viewport.getRenderer();
6352
6435
  if (!renderer) {
6353
6436
  return null;
6354
6437
  }
@@ -6383,7 +6466,7 @@ class vtkOrientationControllerWidget {
6383
6466
  }
6384
6467
  return null;
6385
6468
  }
6386
- calculateMarkerPosition(viewport, position) {
6469
+ calculateMarkerPosition(viewport, position, screenSizePixels) {
6387
6470
  const canvas = viewport.canvas;
6388
6471
  if (!canvas) {
6389
6472
  return null;
@@ -6391,25 +6474,30 @@ class vtkOrientationControllerWidget {
6391
6474
  const devicePixelRatio = window.devicePixelRatio || 1;
6392
6475
  const canvasWidth = canvas.clientWidth || canvas.width / devicePixelRatio;
6393
6476
  const canvasHeight = canvas.clientHeight || canvas.height / devicePixelRatio;
6394
- const cornerOffset = viewport.type === dist_esm.Enums.ViewportType.VOLUME_3D ? 55 : 35;
6477
+ const marginRatio = viewport.type === dist_esm.Enums.ViewportType.VOLUME_3D ? 1.3 : 1.1;
6478
+ const marginPxRaw = marginRatio * screenSizePixels;
6479
+ const halfPx = screenSizePixels * 0.5;
6480
+ const maxMarginX = Math.max(0, (canvasWidth - screenSizePixels) / 2);
6481
+ const maxMarginY = Math.max(0, (canvasHeight - screenSizePixels) / 2);
6482
+ const marginPx = Math.min(marginPxRaw, maxMarginX, maxMarginY);
6395
6483
  let canvasX;
6396
6484
  let canvasY;
6397
6485
  switch (position) {
6398
6486
  case 'top-left':
6399
- canvasX = cornerOffset;
6400
- canvasY = cornerOffset;
6487
+ canvasX = marginPx + halfPx;
6488
+ canvasY = marginPx + halfPx;
6401
6489
  break;
6402
6490
  case 'top-right':
6403
- canvasX = canvasWidth - cornerOffset;
6404
- canvasY = cornerOffset;
6491
+ canvasX = canvasWidth - marginPx - halfPx;
6492
+ canvasY = marginPx + halfPx;
6405
6493
  break;
6406
6494
  case 'bottom-left':
6407
- canvasX = cornerOffset;
6408
- canvasY = canvasHeight - cornerOffset;
6495
+ canvasX = marginPx + halfPx;
6496
+ canvasY = canvasHeight - marginPx - halfPx;
6409
6497
  break;
6410
6498
  default:
6411
- canvasX = canvasWidth - cornerOffset;
6412
- canvasY = canvasHeight - cornerOffset;
6499
+ canvasX = canvasWidth - marginPx - halfPx;
6500
+ canvasY = canvasHeight - marginPx - halfPx;
6413
6501
  }
6414
6502
  const canvasPos = [canvasX, canvasY];
6415
6503
  const worldPos = viewport.canvasToWorld(canvasPos);
@@ -6439,7 +6527,7 @@ class vtkOrientationControllerWidget {
6439
6527
  const markerSize = screenSizePixels * worldUnitsPerPixel;
6440
6528
  actors.forEach((actor) => {
6441
6529
  actor.setScale(markerSize, markerSize, markerSize);
6442
- const worldPos = this.calculateMarkerPosition(viewport, config.position);
6530
+ const worldPos = this.calculateMarkerPosition(viewport, config.position, screenSizePixels);
6443
6531
  if (!worldPos) {
6444
6532
  console.warn('OrientationControllerWidget: Could not get world position');
6445
6533
  return;
@@ -6458,6 +6546,172 @@ class vtkOrientationControllerWidget {
6458
6546
  }
6459
6547
  this.clearHighlight();
6460
6548
  if (isMainFace) {
6549
+ const textureCollection = actor.getTextures?.();
6550
+ const textureCandidate = Array.isArray(textureCollection)
6551
+ ? textureCollection[0]
6552
+ : textureCollection?.getItem?.(0);
6553
+ const texture = textureCandidate;
6554
+ const imageData = texture?.getInputData?.();
6555
+ const scalars = imageData?.getPointData().getScalars();
6556
+ const pixels = scalars?.getData();
6557
+ const dims = imageData?.getDimensions();
6558
+ if (!imageData ||
6559
+ !scalars ||
6560
+ !pixels ||
6561
+ !dims ||
6562
+ cellId < 0 ||
6563
+ cellId > 5) {
6564
+ const mapper = actor.getMapper();
6565
+ const polyData = mapper.getInputData();
6566
+ if (!polyData?.getCellPoints) {
6567
+ return;
6568
+ }
6569
+ const { cellPointIds } = polyData.getCellPoints(cellId);
6570
+ if (!cellPointIds || cellPointIds.length < 3) {
6571
+ return;
6572
+ }
6573
+ const src = polyData.getPoints().getData();
6574
+ const coords = [];
6575
+ Array.from(cellPointIds).forEach((pid) => {
6576
+ const o = pid * 3;
6577
+ coords.push(src[o], src[o + 1], src[o + 2]);
6578
+ });
6579
+ const points = Points/* default.newInstance */.Ay.newInstance();
6580
+ points.setData(new Float32Array(coords), 3);
6581
+ const polys = CellArray/* default.newInstance */.Ay.newInstance({
6582
+ values: new Uint32Array([
6583
+ cellPointIds.length,
6584
+ ...Array.from(cellPointIds, (_, i) => i),
6585
+ ]),
6586
+ });
6587
+ const poly = PolyData/* default.newInstance */.Ay.newInstance();
6588
+ poly.setPoints(points);
6589
+ poly.setPolys(polys);
6590
+ const faceMapper = Mapper/* default.newInstance */.Ay.newInstance();
6591
+ faceMapper.setInputData(poly);
6592
+ const faceActor = Actor/* default.newInstance */.Ay.newInstance();
6593
+ faceActor.setMapper(faceMapper);
6594
+ const [sx, sy, sz] = actor.getScale();
6595
+ const [px, py, pz] = actor.getPosition();
6596
+ const [ox, oy, oz] = actor.getOrientation();
6597
+ faceActor.setScale(sx, sy, sz);
6598
+ faceActor.setPosition(px, py, pz);
6599
+ faceActor.setOrientation(ox, oy, oz);
6600
+ faceActor.setPickable(false);
6601
+ const p = faceActor.getProperty();
6602
+ p.setLighting(false);
6603
+ p.setAmbient(1);
6604
+ p.setDiffuse(0);
6605
+ p.setColor(1, 1, 1);
6606
+ p.setOpacity(0.58);
6607
+ this.overlayRenderers.get(viewport.id)?.addActor(faceActor);
6608
+ this.highlightedFace = {
6609
+ actor,
6610
+ cellId,
6611
+ originalColor: [0, 0, 0, 0],
6612
+ viewport,
6613
+ isMainFace: true,
6614
+ mainFaceHighlightActor: faceActor,
6615
+ };
6616
+ viewport.render();
6617
+ return;
6618
+ }
6619
+ const [imageWidth, imageHeight] = dims;
6620
+ const tileWidth = Math.floor(imageWidth / 3);
6621
+ const tileHeight = Math.floor(imageHeight / 2);
6622
+ const tileCol = cellId % 3;
6623
+ const tileRow = Math.floor(cellId / 3);
6624
+ const x0 = tileCol * tileWidth;
6625
+ const y0 = tileRow * tileHeight;
6626
+ const tileBackup = new Uint8Array(tileWidth * tileHeight * 4);
6627
+ let b = 0;
6628
+ for (let y = 0; y < tileHeight; y++) {
6629
+ for (let x = 0; x < tileWidth; x++) {
6630
+ const srcIndex = ((y0 + y) * imageWidth + (x0 + x)) * 4;
6631
+ tileBackup[b++] = pixels[srcIndex];
6632
+ tileBackup[b++] = pixels[srcIndex + 1];
6633
+ tileBackup[b++] = pixels[srcIndex + 2];
6634
+ tileBackup[b++] = pixels[srcIndex + 3];
6635
+ }
6636
+ }
6637
+ const bgSampleIndices = [
6638
+ ((y0 + 8) * imageWidth + (x0 + 8)) * 4,
6639
+ ((y0 + 8) * imageWidth + (x0 + tileWidth - 9)) * 4,
6640
+ ((y0 + tileHeight - 9) * imageWidth + (x0 + 8)) * 4,
6641
+ ((y0 + tileHeight - 9) * imageWidth + (x0 + tileWidth - 9)) * 4,
6642
+ ];
6643
+ const bgColor = [0, 0, 0];
6644
+ bgSampleIndices.forEach((idx) => {
6645
+ bgColor[0] += pixels[idx];
6646
+ bgColor[1] += pixels[idx + 1];
6647
+ bgColor[2] += pixels[idx + 2];
6648
+ });
6649
+ bgColor[0] /= bgSampleIndices.length;
6650
+ bgColor[1] /= bgSampleIndices.length;
6651
+ bgColor[2] /= bgSampleIndices.length;
6652
+ const glyphThreshold = 42;
6653
+ const faceBrighten = 72;
6654
+ const isGlyphPixel = (x, y) => {
6655
+ if (x < 0 || x >= tileWidth || y < 0 || y >= tileHeight) {
6656
+ return false;
6657
+ }
6658
+ const idx = ((y0 + y) * imageWidth + (x0 + x)) * 4;
6659
+ const dr = pixels[idx] - bgColor[0];
6660
+ const dg = pixels[idx + 1] - bgColor[1];
6661
+ const db = pixels[idx + 2] - bgColor[2];
6662
+ return Math.sqrt(dr * dr + dg * dg + db * db) >= glyphThreshold;
6663
+ };
6664
+ const borderWidth = Math.max(4, Math.floor(tileWidth * 0.035));
6665
+ for (let y = 0; y < tileHeight; y++) {
6666
+ for (let x = 0; x < tileWidth; x++) {
6667
+ const onBorder = x < borderWidth ||
6668
+ x >= tileWidth - borderWidth ||
6669
+ y < borderWidth ||
6670
+ y >= tileHeight - borderWidth;
6671
+ if (onBorder || isGlyphPixel(x, y)) {
6672
+ continue;
6673
+ }
6674
+ const idx = ((y0 + y) * imageWidth + (x0 + x)) * 4;
6675
+ pixels[idx] = Math.min(255, pixels[idx] + faceBrighten);
6676
+ pixels[idx + 1] = Math.min(255, pixels[idx + 1] + faceBrighten);
6677
+ pixels[idx + 2] = Math.min(255, pixels[idx + 2] + faceBrighten);
6678
+ }
6679
+ }
6680
+ for (let y = 0; y < tileHeight; y++) {
6681
+ for (let x = 0; x < tileWidth; x++) {
6682
+ const onBorder = x < borderWidth ||
6683
+ x >= tileWidth - borderWidth ||
6684
+ y < borderWidth ||
6685
+ y >= tileHeight - borderWidth;
6686
+ if (!onBorder) {
6687
+ continue;
6688
+ }
6689
+ const idx = ((y0 + y) * imageWidth + (x0 + x)) * 4;
6690
+ pixels[idx] = 0;
6691
+ pixels[idx + 1] = 0;
6692
+ pixels[idx + 2] = 0;
6693
+ }
6694
+ }
6695
+ scalars.modified();
6696
+ imageData.modified();
6697
+ texture.modified?.();
6698
+ actor.modified?.();
6699
+ this.highlightedFace = {
6700
+ actor,
6701
+ cellId,
6702
+ originalColor: [0, 0, 0, 0],
6703
+ viewport,
6704
+ isMainFace: true,
6705
+ mainFaceTextureData: tileBackup,
6706
+ mainFaceTile: {
6707
+ x0,
6708
+ y0,
6709
+ width: tileWidth,
6710
+ height: tileHeight,
6711
+ imageWidth,
6712
+ },
6713
+ };
6714
+ viewport.render();
6461
6715
  return;
6462
6716
  }
6463
6717
  const mapper = actor.getMapper();
@@ -6485,9 +6739,10 @@ class vtkOrientationControllerWidget {
6485
6739
  viewport,
6486
6740
  isMainFace: false,
6487
6741
  };
6488
- colorArray[offset] = 255;
6489
- colorArray[offset + 1] = 255;
6490
- colorArray[offset + 2] = 255;
6742
+ const hc = this._highlightColor;
6743
+ colorArray[offset] = hc[0];
6744
+ colorArray[offset + 1] = hc[1];
6745
+ colorArray[offset + 2] = hc[2];
6491
6746
  colorArray[offset + 3] = 255;
6492
6747
  colors.modified();
6493
6748
  inputData.modified();
@@ -6498,9 +6753,35 @@ class vtkOrientationControllerWidget {
6498
6753
  return;
6499
6754
  }
6500
6755
  const { actor, cellId, originalColor, viewport, isMainFace } = this.highlightedFace;
6501
- if (isMainFace && this.highlightedFace.originalScale) {
6502
- const scale = this.highlightedFace.originalScale;
6503
- actor.setScale(scale[0], scale[1], scale[2]);
6756
+ if (isMainFace) {
6757
+ const backup = this.highlightedFace.mainFaceTextureData;
6758
+ const tile = this.highlightedFace.mainFaceTile;
6759
+ const textures = actor.getTextures?.();
6760
+ const texture = textures?.[0];
6761
+ const imageData = texture?.getInputData?.();
6762
+ const scalars = imageData?.getPointData().getScalars();
6763
+ const pixels = scalars?.getData();
6764
+ if (backup && tile && scalars && imageData && pixels) {
6765
+ let b = 0;
6766
+ for (let y = 0; y < tile.height; y++) {
6767
+ for (let x = 0; x < tile.width; x++) {
6768
+ const dstIndex = ((tile.y0 + y) * tile.imageWidth + (tile.x0 + x)) * 4;
6769
+ pixels[dstIndex] = backup[b++];
6770
+ pixels[dstIndex + 1] = backup[b++];
6771
+ pixels[dstIndex + 2] = backup[b++];
6772
+ pixels[dstIndex + 3] = backup[b++];
6773
+ }
6774
+ }
6775
+ scalars.modified();
6776
+ imageData.modified();
6777
+ texture.modified?.();
6778
+ actor.modified?.();
6779
+ }
6780
+ else if (this.highlightedFace.mainFaceHighlightActor) {
6781
+ const overlayRenderer = this.overlayRenderers.get(viewport.id);
6782
+ overlayRenderer?.removeActor(this.highlightedFace.mainFaceHighlightActor);
6783
+ this.highlightedFace.mainFaceHighlightActor.delete();
6784
+ }
6504
6785
  viewport.render();
6505
6786
  this.highlightedFace = null;
6506
6787
  return;
@@ -6530,21 +6811,46 @@ class vtkOrientationControllerWidget {
6530
6811
  }
6531
6812
  setupMouseHandlers(viewportId, element, viewport, actors, callbacks) {
6532
6813
  let isMouseDown = false;
6814
+ let isCubeHovered = false;
6815
+ const setAmbient = (full) => {
6816
+ actors.forEach((actor) => {
6817
+ const property = actor.getProperty();
6818
+ property.setAmbient(full ? this._hoverAmbient : this._restingAmbient);
6819
+ });
6820
+ viewport.render();
6821
+ };
6822
+ let didDrag = false;
6823
+ let pendingPickResult = null;
6824
+ let mouseDownCanvas = null;
6825
+ const clickTolerancePx = 3;
6533
6826
  const hoverHandler = (evt) => {
6534
6827
  if (isMouseDown) {
6828
+ if (mouseDownCanvas) {
6829
+ const dx = evt.clientX - mouseDownCanvas.x;
6830
+ const dy = evt.clientY - mouseDownCanvas.y;
6831
+ if (dx * dx + dy * dy > clickTolerancePx * clickTolerancePx) {
6832
+ didDrag = true;
6833
+ }
6834
+ }
6535
6835
  return;
6536
6836
  }
6537
6837
  const pickResult = this.pickAtPosition(evt, viewportId, viewport, element, actors);
6538
6838
  if (pickResult) {
6539
- const { pickedActor, cellId, actorIndex } = pickResult;
6540
- if (actorIndex !== 0) {
6541
- this.highlightFace(pickedActor, cellId, viewport, false);
6839
+ if (!isCubeHovered) {
6840
+ isCubeHovered = true;
6841
+ setAmbient(true);
6542
6842
  }
6843
+ const { pickedActor, cellId, actorIndex } = pickResult;
6844
+ this.highlightFace(pickedActor, cellId, viewport, actorIndex === 0);
6543
6845
  if (callbacks.onFaceHover) {
6544
6846
  callbacks.onFaceHover(pickResult);
6545
6847
  }
6546
6848
  }
6547
6849
  else {
6850
+ if (isCubeHovered) {
6851
+ isCubeHovered = false;
6852
+ setAmbient(false);
6853
+ }
6548
6854
  this.clearHighlight();
6549
6855
  if (callbacks.onFaceHover) {
6550
6856
  callbacks.onFaceHover(null);
@@ -6560,22 +6866,37 @@ class vtkOrientationControllerWidget {
6560
6866
  return;
6561
6867
  }
6562
6868
  isMouseDown = true;
6563
- let globalCellId = pickResult.cellId;
6564
- if (pickResult.actorIndex === 1) {
6565
- globalCellId = pickResult.cellId + 6;
6566
- }
6567
- else if (pickResult.actorIndex === 2) {
6568
- globalCellId = pickResult.cellId + 18;
6569
- }
6570
- callbacks.onFacePicked({
6571
- ...pickResult,
6572
- cellId: globalCellId,
6573
- });
6574
- evt.preventDefault();
6575
- evt.stopPropagation();
6869
+ didDrag = false;
6870
+ pendingPickResult = pickResult;
6871
+ mouseDownCanvas = { x: evt.clientX, y: evt.clientY };
6872
+ (0,interactionDragCoordinator/* beginOwnedDrag */.Js)(viewportId, 'orientation-controller');
6576
6873
  };
6577
- const mouseUpHandler = () => {
6874
+ const mouseUpHandler = (evt) => {
6875
+ if (isMouseDown && !didDrag && pendingPickResult) {
6876
+ let globalCellId = pendingPickResult.cellId;
6877
+ if (pendingPickResult.actorIndex === 1) {
6878
+ globalCellId = pendingPickResult.cellId + 6;
6879
+ }
6880
+ else if (pendingPickResult.actorIndex === 2) {
6881
+ globalCellId = pendingPickResult.cellId + 18;
6882
+ }
6883
+ callbacks.onFacePicked({
6884
+ ...pendingPickResult,
6885
+ cellId: globalCellId,
6886
+ });
6887
+ evt.preventDefault();
6888
+ evt.stopImmediatePropagation();
6889
+ evt.stopPropagation();
6890
+ }
6578
6891
  isMouseDown = false;
6892
+ if (isCubeHovered) {
6893
+ isCubeHovered = false;
6894
+ setAmbient(false);
6895
+ }
6896
+ didDrag = false;
6897
+ pendingPickResult = null;
6898
+ mouseDownCanvas = null;
6899
+ (0,interactionDragCoordinator/* endOwnedDrag */.Xt)(viewportId, 'orientation-controller');
6579
6900
  this.clearHighlight();
6580
6901
  };
6581
6902
  const dblclickHandler = (evt) => {
@@ -6585,17 +6906,18 @@ class vtkOrientationControllerWidget {
6585
6906
  evt.stopImmediatePropagation();
6586
6907
  }
6587
6908
  };
6588
- element.addEventListener('mousemove', hoverHandler);
6589
- element.addEventListener('mousedown', clickHandler);
6909
+ element.addEventListener('mousemove', hoverHandler, true);
6910
+ element.addEventListener('mousedown', clickHandler, true);
6590
6911
  element.addEventListener('mouseup', mouseUpHandler);
6591
6912
  element.addEventListener('mouseleave', mouseUpHandler);
6592
6913
  element.addEventListener('dblclick', dblclickHandler, true);
6593
6914
  const cleanup = () => {
6594
- element.removeEventListener('mousemove', hoverHandler);
6595
- element.removeEventListener('mousedown', clickHandler);
6915
+ element.removeEventListener('mousemove', hoverHandler, true);
6916
+ element.removeEventListener('mousedown', clickHandler, true);
6596
6917
  element.removeEventListener('mouseup', mouseUpHandler);
6597
6918
  element.removeEventListener('mouseleave', mouseUpHandler);
6598
6919
  element.removeEventListener('dblclick', dblclickHandler, true);
6920
+ (0,interactionDragCoordinator/* endOwnedDrag */.Xt)(viewportId, 'orientation-controller');
6599
6921
  };
6600
6922
  this.mouseHandlers.set(viewportId, { cleanup });
6601
6923
  return { cleanup };
@@ -6603,7 +6925,19 @@ class vtkOrientationControllerWidget {
6603
6925
  getActors(viewportId) {
6604
6926
  return this.actors.get(viewportId);
6605
6927
  }
6606
- syncOverlayViewport(_viewportId, _viewport) {
6928
+ syncOverlayViewport(viewportId, viewport) {
6929
+ const overlayRenderer = this.overlayRenderers.get(viewportId);
6930
+ if (!overlayRenderer) {
6931
+ return;
6932
+ }
6933
+ const mainRenderer = viewport
6934
+ .getRenderingEngine()
6935
+ ?.getRenderer(viewportId) ?? viewport.getRenderer();
6936
+ if (!mainRenderer) {
6937
+ return;
6938
+ }
6939
+ const mainVp = mainRenderer.getViewport();
6940
+ overlayRenderer.setViewport(...mainVp);
6607
6941
  }
6608
6942
  getOrientationForFace(cellId) {
6609
6943
  const orientations = new Map();
@@ -6704,12 +7038,31 @@ class vtkOrientationControllerWidget {
6704
7038
  handler.cleanup();
6705
7039
  this.mouseHandlers.delete(viewportId);
6706
7040
  }
7041
+ const overlayRenderer = this.overlayRenderers.get(viewportId);
7042
+ const renderWindow = this.renderWindows.get(viewportId);
7043
+ if (overlayRenderer) {
7044
+ if (renderWindow) {
7045
+ renderWindow.removeRenderer(overlayRenderer);
7046
+ }
7047
+ overlayRenderer.delete();
7048
+ }
6707
7049
  this.actors.delete(viewportId);
6708
7050
  this.pickers.delete(viewportId);
7051
+ this.overlayRenderers.delete(viewportId);
7052
+ this.renderWindows.delete(viewportId);
6709
7053
  }
6710
7054
  else {
6711
7055
  this.mouseHandlers.forEach((handler) => handler.cleanup());
6712
7056
  this.mouseHandlers.clear();
7057
+ this.overlayRenderers.forEach((overlayRenderer, vpId) => {
7058
+ const renderWindow = this.renderWindows.get(vpId);
7059
+ if (renderWindow) {
7060
+ renderWindow.removeRenderer(overlayRenderer);
7061
+ }
7062
+ overlayRenderer.delete();
7063
+ });
7064
+ this.overlayRenderers.clear();
7065
+ this.renderWindows.clear();
6713
7066
  this.actors.clear();
6714
7067
  this.pickers.clear();
6715
7068
  }