index.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import '@kitware/vtk.js/favicon';
  2. // Load the rendering pieces we want to use (for both WebGL and WebGPU)
  3. import '@kitware/vtk.js/Rendering/Profiles/Geometry';
  4. import '@kitware/vtk.js/Rendering/Profiles/Glyph';
  5. import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
  6. import vtkWidgetManager from '@kitware/vtk.js/Widgets/Core/WidgetManager';
  7. import vtkBoxWidget from './BoxWidget';
  8. import controlPanel from './controlPanel.html';
  9. // ----------------------------------------------------------------------------
  10. // Standard rendering code setup
  11. // ----------------------------------------------------------------------------
  12. const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance({
  13. background: [0, 0, 0],
  14. });
  15. const renderer = fullScreenRenderer.getRenderer();
  16. const renderWindow = fullScreenRenderer.getRenderWindow();
  17. const openGLRenderWindow = fullScreenRenderer.getApiSpecificRenderWindow();
  18. // ----------------------------------------------------------------------------
  19. // 2D overlay rendering
  20. // ----------------------------------------------------------------------------
  21. const overlaySize = 15;
  22. const overlayBorder = 2;
  23. const overlay = document.createElement('div');
  24. overlay.style.position = 'absolute';
  25. overlay.style.width = `${overlaySize}px`;
  26. overlay.style.height = `${overlaySize}px`;
  27. overlay.style.border = `solid ${overlayBorder}px red`;
  28. overlay.style.borderRadius = '50%';
  29. overlay.style.left = '-100px';
  30. overlay.style.pointerEvents = 'none';
  31. document.querySelector('body').appendChild(overlay);
  32. // ----------------------------------------------------------------------------
  33. // Widget manager
  34. // ----------------------------------------------------------------------------
  35. const widgetManager = vtkWidgetManager.newInstance();
  36. widgetManager.setRenderer(renderer);
  37. const widget = vtkBoxWidget.newInstance();
  38. function widgetRegistration(e) {
  39. const action = e ? e.currentTarget.dataset.action : 'addWidget';
  40. const viewWidget = widgetManager[action](widget);
  41. if (viewWidget) {
  42. viewWidget.setScaleInPixels(false);
  43. viewWidget.setDisplayCallback((coords) => {
  44. overlay.style.left = '-100px';
  45. if (coords) {
  46. const [w, h] = openGLRenderWindow.getSize();
  47. overlay.style.left = `${Math.round(
  48. (coords[0][0] / w) * window.innerWidth -
  49. overlaySize * 0.5 -
  50. overlayBorder
  51. )}px`;
  52. overlay.style.top = `${Math.round(
  53. ((h - coords[0][1]) / h) * window.innerHeight -
  54. overlaySize * 0.5 -
  55. overlayBorder
  56. )}px`;
  57. }
  58. });
  59. renderer.resetCamera();
  60. renderer.resetCameraClippingRange();
  61. }
  62. widgetManager.enablePicking();
  63. renderWindow.render();
  64. }
  65. // Initial widget register
  66. widgetRegistration();
  67. // -----------------------------------------------------------
  68. // UI control handling
  69. // -----------------------------------------------------------
  70. fullScreenRenderer.addController(controlPanel);
  71. function updateFlag(e) {
  72. const value = !!e.target.checked;
  73. const name = e.currentTarget.dataset.name;
  74. widget.set({ [name]: value }); // can be called on either viewWidget or parentWidget
  75. widgetManager.enablePicking();
  76. renderWindow.render();
  77. }
  78. const elems = document.querySelectorAll('.flag');
  79. for (let i = 0; i < elems.length; i++) {
  80. elems[i].addEventListener('change', updateFlag);
  81. }
  82. const buttons = document.querySelectorAll('button');
  83. for (let i = 0; i < buttons.length; i++) {
  84. buttons[i].addEventListener('click', widgetRegistration);
  85. }