@cornerstonejs/core 3.29.4 → 3.30.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 (34) hide show
  1. package/dist/esm/RenderingEngine/BaseRenderingEngine.d.ts +5 -3
  2. package/dist/esm/RenderingEngine/BaseRenderingEngine.js +18 -10
  3. package/dist/esm/RenderingEngine/BaseVolumeViewport.d.ts +19 -12
  4. package/dist/esm/RenderingEngine/BaseVolumeViewport.js +31 -17
  5. package/dist/esm/RenderingEngine/{SequentialRenderingEngine.d.ts → ContextPoolRenderingEngine.d.ts} +14 -4
  6. package/dist/esm/RenderingEngine/{SequentialRenderingEngine.js → ContextPoolRenderingEngine.js} +130 -59
  7. package/dist/esm/RenderingEngine/RenderingEngine.d.ts +4 -2
  8. package/dist/esm/RenderingEngine/RenderingEngine.js +13 -7
  9. package/dist/esm/RenderingEngine/StackViewport.d.ts +6 -5
  10. package/dist/esm/RenderingEngine/StackViewport.js +30 -17
  11. package/dist/esm/RenderingEngine/{StandardRenderingEngine.d.ts → TiledRenderingEngine.d.ts} +3 -2
  12. package/dist/esm/RenderingEngine/{StandardRenderingEngine.js → TiledRenderingEngine.js} +12 -10
  13. package/dist/esm/RenderingEngine/WebGLContextPool.d.ts +17 -0
  14. package/dist/esm/RenderingEngine/WebGLContextPool.js +45 -0
  15. package/dist/esm/RenderingEngine/helpers/isContextPoolRenderingEngine.d.ts +1 -0
  16. package/dist/esm/RenderingEngine/helpers/isContextPoolRenderingEngine.js +7 -0
  17. package/dist/esm/RenderingEngine/index.d.ts +3 -3
  18. package/dist/esm/RenderingEngine/index.js +3 -3
  19. package/dist/esm/enums/RenderingEngineModeEnum.d.ts +2 -2
  20. package/dist/esm/enums/RenderingEngineModeEnum.js +2 -2
  21. package/dist/esm/index.d.ts +2 -2
  22. package/dist/esm/index.js +2 -2
  23. package/dist/esm/init.js +5 -1
  24. package/dist/esm/types/Cornerstone3DConfig.d.ts +1 -0
  25. package/dist/esm/types/RenderingEngineMode.d.ts +1 -1
  26. package/dist/esm/types/VtkOffscreenMultiRenderWindow.d.ts +37 -0
  27. package/dist/esm/types/VtkOffscreenMultiRenderWindow.js +5 -0
  28. package/dist/esm/types/index.d.ts +2 -1
  29. package/dist/esm/utilities/renderToCanvasGPU.js +2 -2
  30. package/dist/esm/version.d.ts +1 -1
  31. package/dist/esm/version.js +1 -1
  32. package/package.json +2 -2
  33. package/dist/esm/RenderingEngine/helpers/isSequentialRenderingEngine.d.ts +0 -1
  34. package/dist/esm/RenderingEngine/helpers/isSequentialRenderingEngine.js +0 -6
@@ -2,12 +2,13 @@ import type IStackViewport from '../types/IStackViewport';
2
2
  import type IVolumeViewport from '../types/IVolumeViewport';
3
3
  import type * as EventTypes from '../types/EventTypes';
4
4
  import type { PublicViewportInput, InternalViewportInput, NormalizedViewportInput, IViewport } from '../types/IViewport';
5
+ import type { VtkOffscreenMultiRenderWindow } from '../types';
5
6
  export declare const VIEWPORT_MIN_SIZE = 2;
6
7
  declare abstract class BaseRenderingEngine {
7
8
  readonly id: string;
8
9
  hasBeenDestroyed: boolean;
9
- offscreenMultiRenderWindow: any;
10
- readonly offScreenCanvasContainer: HTMLDivElement;
10
+ offscreenMultiRenderWindow: VtkOffscreenMultiRenderWindow;
11
+ offScreenCanvasContainer: HTMLDivElement;
11
12
  protected _viewports: Map<string, IViewport>;
12
13
  protected _needsRender: Set<string>;
13
14
  protected _animationFrameSet: boolean;
@@ -34,6 +35,8 @@ declare abstract class BaseRenderingEngine {
34
35
  private _resizeUsingCustomResizeHandler;
35
36
  private _removeViewport;
36
37
  private addCustomViewport;
38
+ getRenderer(viewportId: any): import("@kitware/vtk.js/Rendering/Core/Renderer").vtkRenderer;
39
+ getOffscreenMultiRenderWindow(viewportId?: string): VtkOffscreenMultiRenderWindow;
37
40
  private setCustomViewports;
38
41
  protected _getViewportsAsArray(): IViewport[];
39
42
  private _setViewportsToBeRenderedNextFrame;
@@ -47,7 +50,6 @@ declare abstract class BaseRenderingEngine {
47
50
  protected abstract addVtkjsDrivenViewport(viewportInputEntry: InternalViewportInput, offscreenCanvasProperties?: unknown): void;
48
51
  protected abstract _renderFlaggedViewports(): void;
49
52
  protected abstract setVtkjsDrivenViewports(viewportInputEntries: NormalizedViewportInput[]): void;
50
- protected abstract renderViewportUsingCustomOrVtkPipeline(viewport: IViewport): EventTypes.ImageRenderedEventDetail;
51
53
  protected abstract _renderViewportFromVtkCanvasToOnscreenCanvas(viewport: IViewport, offScreenCanvas: HTMLCanvasElement): EventTypes.ImageRenderedEventDetail;
52
54
  }
53
55
  export default BaseRenderingEngine;
@@ -3,7 +3,6 @@ import renderingEngineCache from './renderingEngineCache';
3
3
  import eventTarget from '../eventTarget';
4
4
  import uuidv4 from '../utilities/uuidv4';
5
5
  import triggerEvent from '../utilities/triggerEvent';
6
- import { vtkOffscreenMultiRenderWindow } from './vtkClasses';
7
6
  import ViewportType from '../enums/ViewportType';
8
7
  import BaseVolumeViewport from './BaseVolumeViewport';
9
8
  import StackViewport from './StackViewport';
@@ -33,12 +32,6 @@ class BaseRenderingEngine {
33
32
  if (!isCornerstoneInitialized()) {
34
33
  throw new Error('@cornerstonejs/core is not initialized, run init() first');
35
34
  }
36
- if (!this.useCPURendering) {
37
- this.offscreenMultiRenderWindow =
38
- vtkOffscreenMultiRenderWindow.newInstance();
39
- this.offScreenCanvasContainer = document.createElement('div');
40
- this.offscreenMultiRenderWindow.setContainer(this.offScreenCanvasContainer);
41
- }
42
35
  this._viewports = new Map();
43
36
  this.hasBeenDestroyed = false;
44
37
  }
@@ -75,7 +68,9 @@ class BaseRenderingEngine {
75
68
  this._resetViewport(viewport);
76
69
  if (!viewportTypeUsesCustomRenderingPipeline(viewport.type) &&
77
70
  !this.useCPURendering) {
78
- this.offscreenMultiRenderWindow.removeRenderer(viewportId);
71
+ if (this.offscreenMultiRenderWindow) {
72
+ this.offscreenMultiRenderWindow.removeRenderer(viewportId);
73
+ }
79
74
  }
80
75
  this._removeViewport(viewportId);
81
76
  viewport.isDisabled = true;
@@ -177,9 +172,13 @@ class BaseRenderingEngine {
177
172
  if (!this.useCPURendering) {
178
173
  const viewports = this._getViewportsAsArray();
179
174
  viewports.forEach((vp) => {
180
- this.offscreenMultiRenderWindow.removeRenderer(vp.id);
175
+ if (this.offscreenMultiRenderWindow) {
176
+ this.offscreenMultiRenderWindow.removeRenderer(vp.id);
177
+ }
181
178
  });
182
- this.offscreenMultiRenderWindow.delete();
179
+ if (this.offscreenMultiRenderWindow) {
180
+ this.offscreenMultiRenderWindow.delete();
181
+ }
183
182
  delete this.offscreenMultiRenderWindow;
184
183
  }
185
184
  this._reset();
@@ -283,6 +282,15 @@ class BaseRenderingEngine {
283
282
  };
284
283
  triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail);
285
284
  }
285
+ getRenderer(viewportId) {
286
+ return this.offscreenMultiRenderWindow.getRenderer(viewportId);
287
+ }
288
+ getOffscreenMultiRenderWindow(viewportId) {
289
+ if (this.useCPURendering) {
290
+ throw new Error('Offscreen multi render window is not available when using CPU rendering.');
291
+ }
292
+ return this.offscreenMultiRenderWindow;
293
+ }
286
294
  setCustomViewports(viewportInputEntries) {
287
295
  viewportInputEntries.forEach((vpie) => {
288
296
  this.addCustomViewport(vpie);
@@ -5,6 +5,7 @@ import type { VoiModifiedEventDetail } from '../types/EventTypes';
5
5
  import type { ViewportInput } from '../types/IViewport';
6
6
  import type { TransferFunctionNodes } from '../types/ITransferFunctionNode';
7
7
  import Viewport from './Viewport';
8
+ import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';
8
9
  declare abstract class BaseVolumeViewport extends Viewport {
9
10
  useCPURendering: boolean;
10
11
  private _FrameOfReferenceUID;
@@ -68,12 +69,14 @@ declare abstract class BaseVolumeViewport extends Viewport {
68
69
  getSliceIndex(): number;
69
70
  setCamera(cameraInterface: ICamera, storeAsInitialCamera?: boolean): void;
70
71
  private _setVolumeActors;
71
- canvasToWorld: (canvasPos: Point2) => Point3;
72
- canvasToWorldSequential: (canvasPos: Point2) => Point3;
73
- getVtkDisplayCoords: (canvasPos: Point2) => Point3;
74
- getVtkDisplayCoordsSequential: (canvasPos: Point2) => Point3;
75
- worldToCanvas: (worldPos: Point3) => Point2;
76
- worldToCanvasSequential: (worldPos: Point3) => Point2;
72
+ canvasToWorldTiled: (canvasPos: Point2) => Point3;
73
+ canvasToWorldContextPool: (canvasPos: Point2) => Point3;
74
+ getVtkDisplayCoordsTiled: (canvasPos: Point2) => Point3;
75
+ getVtkDisplayCoordsContextPool: (canvasPos: Point2) => Point3;
76
+ worldToCanvasTiled: (worldPos: Point3) => Point2;
77
+ worldToCanvasContextPool: (worldPos: Point3) => Point2;
78
+ getRendererContextPool(): vtkRenderer;
79
+ getRendererTiled(): vtkRenderer;
77
80
  hasImageURI: (imageURI: string) => boolean;
78
81
  protected _getOrientationVectors(orientation: OrientationAxis | OrientationVectors): OrientationVectors;
79
82
  protected _getAcquisitionPlaneOrientation(): OrientationVectors;
@@ -92,16 +95,20 @@ declare abstract class BaseVolumeViewport extends Viewport {
92
95
  private _configureRenderingPipeline;
93
96
  protected renderingPipelineFunctions: {
94
97
  worldToCanvas: {
95
- default: (worldPos: Point3) => Point2;
96
- sequential: (worldPos: Point3) => Point2;
98
+ tiled: (worldPos: Point3) => Point2;
99
+ contextPool: (worldPos: Point3) => Point2;
97
100
  };
98
101
  canvasToWorld: {
99
- default: (canvasPos: Point2) => Point3;
100
- sequential: (canvasPos: Point2) => Point3;
102
+ tiled: (canvasPos: Point2) => Point3;
103
+ contextPool: (canvasPos: Point2) => Point3;
101
104
  };
102
105
  getVtkDisplayCoords: {
103
- default: (canvasPos: Point2) => Point3;
104
- sequential: (canvasPos: Point2) => Point3;
106
+ tiled: (canvasPos: Point2) => Point3;
107
+ contextPool: (canvasPos: Point2) => Point3;
108
+ };
109
+ getRenderer: {
110
+ tiled: () => vtkRenderer;
111
+ contextPool: () => vtkRenderer;
105
112
  };
106
113
  };
107
114
  }
@@ -29,7 +29,7 @@ import imageIdToURI from '../utilities/imageIdToURI';
29
29
  import uuidv4 from '../utilities/uuidv4';
30
30
  import * as metaData from '../metaData';
31
31
  import { getCameraVectors } from './helpers/getCameraVectors';
32
- import { isSequentialRenderingEngine } from './helpers/isSequentialRenderingEngine';
32
+ import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine';
33
33
  class BaseVolumeViewport extends Viewport {
34
34
  constructor(props) {
35
35
  super(props);
@@ -154,18 +154,18 @@ class BaseVolumeViewport extends Viewport {
154
154
  this.getFrameOfReferenceUID = () => {
155
155
  return this._FrameOfReferenceUID;
156
156
  };
157
- this.canvasToWorld = (canvasPos) => {
157
+ this.canvasToWorldTiled = (canvasPos) => {
158
158
  const vtkCamera = this.getVtkActiveCamera();
159
159
  vtkCamera.setIsPerformingCoordinateTransformation?.(true);
160
160
  const renderer = this.getRenderer();
161
- const displayCoords = this.getVtkDisplayCoords(canvasPos);
161
+ const displayCoords = this.getVtkDisplayCoordsTiled(canvasPos);
162
162
  const offscreenMultiRenderWindow = this.getRenderingEngine().offscreenMultiRenderWindow;
163
163
  const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
164
164
  const worldCoord = openGLRenderWindow.displayToWorld(displayCoords[0], displayCoords[1], displayCoords[2], renderer);
165
165
  vtkCamera.setIsPerformingCoordinateTransformation?.(false);
166
166
  return [worldCoord[0], worldCoord[1], worldCoord[2]];
167
167
  };
168
- this.canvasToWorldSequential = (canvasPos) => {
168
+ this.canvasToWorldContextPool = (canvasPos) => {
169
169
  const vtkCamera = this.getVtkActiveCamera();
170
170
  vtkCamera.setIsPerformingCoordinateTransformation?.(true);
171
171
  const renderer = this.getRenderer();
@@ -187,7 +187,7 @@ class BaseVolumeViewport extends Viewport {
187
187
  vtkCamera.setIsPerformingCoordinateTransformation?.(false);
188
188
  return [worldCoord[0], worldCoord[1], worldCoord[2]];
189
189
  };
190
- this.getVtkDisplayCoords = (canvasPos) => {
190
+ this.getVtkDisplayCoordsTiled = (canvasPos) => {
191
191
  const devicePixelRatio = window.devicePixelRatio || 1;
192
192
  const canvasPosWithDPR = [
193
193
  canvasPos[0] * devicePixelRatio,
@@ -203,7 +203,7 @@ class BaseVolumeViewport extends Viewport {
203
203
  displayCoord[1] = size[1] - displayCoord[1];
204
204
  return [displayCoord[0], displayCoord[1], 0];
205
205
  };
206
- this.getVtkDisplayCoordsSequential = (canvasPos) => {
206
+ this.getVtkDisplayCoordsContextPool = (canvasPos) => {
207
207
  const devicePixelRatio = window.devicePixelRatio || 1;
208
208
  const canvasPosWithDPR = [
209
209
  canvasPos[0] * devicePixelRatio,
@@ -213,7 +213,7 @@ class BaseVolumeViewport extends Viewport {
213
213
  const displayCoord = [canvasPosWithDPR[0], height - canvasPosWithDPR[1]];
214
214
  return [displayCoord[0], displayCoord[1], 0];
215
215
  };
216
- this.worldToCanvas = (worldPos) => {
216
+ this.worldToCanvasTiled = (worldPos) => {
217
217
  const vtkCamera = this.getVtkActiveCamera();
218
218
  vtkCamera.setIsPerformingCoordinateTransformation?.(true);
219
219
  const renderer = this.getRenderer();
@@ -234,7 +234,7 @@ class BaseVolumeViewport extends Viewport {
234
234
  vtkCamera.setIsPerformingCoordinateTransformation(false);
235
235
  return canvasCoordWithDPR;
236
236
  };
237
- this.worldToCanvasSequential = (worldPos) => {
237
+ this.worldToCanvasContextPool = (worldPos) => {
238
238
  const vtkCamera = this.getVtkActiveCamera();
239
239
  vtkCamera.setIsPerformingCoordinateTransformation?.(true);
240
240
  const renderer = this.getRenderer();
@@ -278,16 +278,20 @@ class BaseVolumeViewport extends Viewport {
278
278
  };
279
279
  this.renderingPipelineFunctions = {
280
280
  worldToCanvas: {
281
- default: this.worldToCanvas,
282
- sequential: this.worldToCanvasSequential,
281
+ tiled: this.worldToCanvasTiled,
282
+ contextPool: this.worldToCanvasContextPool,
283
283
  },
284
284
  canvasToWorld: {
285
- default: this.canvasToWorld,
286
- sequential: this.canvasToWorldSequential,
285
+ tiled: this.canvasToWorldTiled,
286
+ contextPool: this.canvasToWorldContextPool,
287
287
  },
288
288
  getVtkDisplayCoords: {
289
- default: this.getVtkDisplayCoords,
290
- sequential: this.getVtkDisplayCoordsSequential,
289
+ tiled: this.getVtkDisplayCoordsTiled,
290
+ contextPool: this.getVtkDisplayCoordsContextPool,
291
+ },
292
+ getRenderer: {
293
+ tiled: this.getRendererTiled,
294
+ contextPool: this.getRendererContextPool,
291
295
  },
292
296
  };
293
297
  this.useCPURendering = getShouldUseCPURendering();
@@ -954,6 +958,17 @@ class BaseVolumeViewport extends Viewport {
954
958
  }
955
959
  this.setActors(volumeActorEntries);
956
960
  }
961
+ getRendererContextPool() {
962
+ const renderingEngine = this.getRenderingEngine();
963
+ return renderingEngine.getRenderer(this.id);
964
+ }
965
+ getRendererTiled() {
966
+ const renderingEngine = this.getRenderingEngine();
967
+ if (!renderingEngine || renderingEngine.hasBeenDestroyed) {
968
+ throw new Error('Rendering engine has been destroyed');
969
+ }
970
+ return renderingEngine.offscreenMultiRenderWindow?.getRenderer(this.id);
971
+ }
957
972
  _getOrientationVectors(orientation) {
958
973
  if (typeof orientation === 'object') {
959
974
  if (orientation.viewPlaneNormal && orientation.viewUp) {
@@ -1054,12 +1069,11 @@ class BaseVolumeViewport extends Viewport {
1054
1069
  return Array.from(this.volumeIds);
1055
1070
  }
1056
1071
  _configureRenderingPipeline() {
1057
- const renderingEngine = this.getRenderingEngine();
1058
- const isSequential = isSequentialRenderingEngine(renderingEngine);
1072
+ const isContextPool = isContextPoolRenderingEngine();
1059
1073
  for (const key in this.renderingPipelineFunctions) {
1060
1074
  if (Object.prototype.hasOwnProperty.call(this.renderingPipelineFunctions, key)) {
1061
1075
  const functions = this.renderingPipelineFunctions[key];
1062
- this[key] = isSequential ? functions.sequential : functions.default;
1076
+ this[key] = isContextPool ? functions.contextPool : functions.tiled;
1063
1077
  }
1064
1078
  }
1065
1079
  }
@@ -3,16 +3,26 @@ import type IStackViewport from '../types/IStackViewport';
3
3
  import type IVolumeViewport from '../types/IVolumeViewport';
4
4
  import type * as EventTypes from '../types/EventTypes';
5
5
  import type { InternalViewportInput, NormalizedViewportInput, IViewport } from '../types/IViewport';
6
- declare class SequentialRenderingEngine extends BaseRenderingEngine {
6
+ import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';
7
+ import type { VtkOffscreenMultiRenderWindow } from '../types';
8
+ declare class ContextPoolRenderingEngine extends BaseRenderingEngine {
9
+ private contextPool;
10
+ constructor(id?: string);
7
11
  protected enableVTKjsDrivenViewport(viewportInputEntry: NormalizedViewportInput): void;
8
12
  protected addVtkjsDrivenViewport(viewportInputEntry: InternalViewportInput): void;
9
13
  protected setVtkjsDrivenViewports(viewportInputEntries: NormalizedViewportInput[]): void;
10
14
  protected _resizeVTKViewports(vtkDrivenViewports: (IStackViewport | IVolumeViewport)[], keepCamera?: boolean, immediate?: boolean): void;
11
15
  protected _renderFlaggedViewports: () => void;
12
- protected renderViewportUsingCustomOrVtkPipeline(viewport: IViewport): EventTypes.ImageRenderedEventDetail;
16
+ private renderViewportUsingCustomOrVtkPipeline;
17
+ private _renderViewportWithContext;
13
18
  protected _renderViewportFromVtkCanvasToOnscreenCanvas(viewport: IViewport, offScreenCanvas: HTMLCanvasElement): EventTypes.ImageRenderedEventDetail;
14
- private _resizeOffScreenCanvasForSingleViewport;
19
+ private _resizeOffScreenCanvasForViewport;
20
+ private _copyToOnscreenCanvas;
15
21
  private _resize;
16
22
  private getWidgetRenderers;
23
+ getRenderer(viewportId: string): vtkRenderer | undefined;
24
+ disableElement(viewportId: string): void;
25
+ destroy(): void;
26
+ getOffscreenMultiRenderWindow(viewportId: string): VtkOffscreenMultiRenderWindow;
17
27
  }
18
- export default SequentialRenderingEngine;
28
+ export default ContextPoolRenderingEngine;
@@ -1,41 +1,46 @@
1
1
  import BaseRenderingEngine, { VIEWPORT_MIN_SIZE } from './BaseRenderingEngine';
2
+ import WebGLContextPool from './WebGLContextPool';
3
+ import { getConfiguration } from '../init';
2
4
  import Events from '../enums/Events';
3
5
  import eventTarget from '../eventTarget';
4
6
  import triggerEvent from '../utilities/triggerEvent';
5
7
  import ViewportType from '../enums/ViewportType';
6
8
  import VolumeViewport from './VolumeViewport';
7
9
  import StackViewport from './StackViewport';
10
+ import VolumeViewport3D from './VolumeViewport3D';
8
11
  import viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline';
9
12
  import getOrCreateCanvas from './helpers/getOrCreateCanvas';
10
- import VolumeViewport3D from './VolumeViewport3D';
11
- class SequentialRenderingEngine extends BaseRenderingEngine {
12
- constructor() {
13
- super(...arguments);
13
+ class ContextPoolRenderingEngine extends BaseRenderingEngine {
14
+ constructor(id) {
15
+ super(id);
14
16
  this._renderFlaggedViewports = () => {
15
17
  this._throwIfDestroyed();
16
18
  const viewports = this._getViewportsAsArray();
17
- const eventDetailArray = [];
18
- for (let i = 0; i < viewports.length; i++) {
19
- const viewport = viewports[i];
20
- if (this._needsRender.has(viewport.id)) {
21
- const eventDetail = this.renderViewportUsingCustomOrVtkPipeline(viewport);
22
- eventDetailArray.push(eventDetail);
23
- viewport.setRendered();
24
- this._needsRender.delete(viewport.id);
25
- if (this._needsRender.size === 0) {
26
- break;
27
- }
28
- }
19
+ const viewportsToRender = viewports.filter((vp) => this._needsRender.has(vp.id));
20
+ if (viewportsToRender.length === 0) {
21
+ this._animationFrameSet = false;
22
+ this._animationFrameHandle = null;
23
+ return;
29
24
  }
25
+ const eventDetails = viewportsToRender.map((viewport) => {
26
+ const eventDetail = this.renderViewportUsingCustomOrVtkPipeline(viewport);
27
+ viewport.setRendered();
28
+ this._needsRender.delete(viewport.id);
29
+ return eventDetail;
30
+ });
30
31
  this._animationFrameSet = false;
31
32
  this._animationFrameHandle = null;
32
- eventDetailArray.forEach((eventDetail) => {
33
- if (!eventDetail?.element) {
34
- return;
33
+ eventDetails.forEach((eventDetail) => {
34
+ if (eventDetail?.element) {
35
+ triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail);
35
36
  }
36
- triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail);
37
37
  });
38
38
  };
39
+ const { rendering } = getConfiguration();
40
+ const { webGlContextCount } = rendering;
41
+ if (!this.useCPURendering) {
42
+ this.contextPool = new WebGLContextPool(webGlContextCount);
43
+ }
39
44
  }
40
45
  enableVTKjsDrivenViewport(viewportInputEntry) {
41
46
  const viewports = this._getViewportsAsArray();
@@ -49,7 +54,15 @@ class SequentialRenderingEngine extends BaseRenderingEngine {
49
54
  addVtkjsDrivenViewport(viewportInputEntry) {
50
55
  const { element, canvas, viewportId, type, defaultOptions } = viewportInputEntry;
51
56
  element.tabIndex = -1;
52
- this.offscreenMultiRenderWindow.addRenderer({
57
+ let contextIndex = 0;
58
+ if (type === ViewportType.STACK) {
59
+ const contexts = this.contextPool.getAllContexts();
60
+ contextIndex = this._viewports.size % contexts.length;
61
+ }
62
+ this.contextPool.assignViewportToContext(viewportId, contextIndex);
63
+ const contextData = this.contextPool.getContextByIndex(contextIndex);
64
+ const { context: offscreenMultiRenderWindow } = contextData;
65
+ offscreenMultiRenderWindow.addRenderer({
53
66
  viewport: [0, 0, 1, 1],
54
67
  id: viewportId,
55
68
  background: defaultOptions.background
@@ -149,43 +162,69 @@ class SequentialRenderingEngine extends BaseRenderingEngine {
149
162
  }
150
163
  }
151
164
  renderViewportUsingCustomOrVtkPipeline(viewport) {
152
- let eventDetail;
165
+ if (viewportTypeUsesCustomRenderingPipeline(viewport.type)) {
166
+ const eventDetail = viewport.customRenderViewportToCanvas();
167
+ return eventDetail;
168
+ }
169
+ if (this.useCPURendering) {
170
+ throw new Error('GPU not available, and using a viewport with no custom render pipeline.');
171
+ }
172
+ const assignedContextIndex = this.contextPool.getContextIndexForViewport(viewport.id);
173
+ const contextData = this.contextPool.getContextByIndex(assignedContextIndex);
174
+ const { context, container } = contextData;
175
+ const eventDetail = this._renderViewportWithContext(viewport, context, container);
176
+ return eventDetail;
177
+ }
178
+ _renderViewportWithContext(viewport, offscreenMultiRenderWindow, offScreenCanvasContainer) {
153
179
  if (viewport.sWidth < VIEWPORT_MIN_SIZE ||
154
180
  viewport.sHeight < VIEWPORT_MIN_SIZE) {
155
181
  console.warn('Viewport is too small', viewport.sWidth, viewport.sHeight);
156
182
  return;
157
183
  }
158
- if (viewportTypeUsesCustomRenderingPipeline(viewport.type) === true) {
159
- eventDetail =
160
- viewport.customRenderViewportToCanvas();
184
+ if (viewportTypeUsesCustomRenderingPipeline(viewport.type)) {
185
+ return viewport.customRenderViewportToCanvas();
161
186
  }
162
- else {
163
- if (this.useCPURendering) {
164
- throw new Error('GPU not available, and using a viewport with no custom render pipeline.');
165
- }
166
- const { offscreenMultiRenderWindow } = this;
167
- const renderWindow = offscreenMultiRenderWindow.getRenderWindow();
168
- this._resizeOffScreenCanvasForSingleViewport(viewport.canvas);
169
- const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id);
170
- renderer.setViewport([0, 0, 1, 1]);
171
- const allRenderers = offscreenMultiRenderWindow.getRenderers();
172
- allRenderers.forEach(({ renderer: r, id }) => {
173
- r.setDraw(id === viewport.id);
174
- });
175
- const widgetRenderers = this.getWidgetRenderers();
176
- widgetRenderers.forEach((viewportId, renderer) => {
177
- renderer.setDraw(viewportId === viewport.id);
187
+ if (this.useCPURendering) {
188
+ throw new Error('GPU not available, and using a viewport with no custom render pipeline.');
189
+ }
190
+ if (!offscreenMultiRenderWindow.getRenderer(viewport.id)) {
191
+ offscreenMultiRenderWindow.addRenderer({
192
+ viewport: [0, 0, 1, 1],
193
+ id: viewport.id,
194
+ background: viewport.defaultOptions?.background || [0, 0, 0],
178
195
  });
179
- renderWindow.render();
180
- allRenderers.forEach(({ renderer: r }) => r.setDraw(false));
181
- const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
182
- const context = openGLRenderWindow.get3DContext();
183
- const offScreenCanvas = context.canvas;
184
- eventDetail = this._renderViewportFromVtkCanvasToOnscreenCanvas(viewport, offScreenCanvas);
185
196
  }
197
+ const renderWindow = offscreenMultiRenderWindow.getRenderWindow();
198
+ this._resizeOffScreenCanvasForViewport(viewport.canvas, offScreenCanvasContainer, offscreenMultiRenderWindow);
199
+ const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id);
200
+ renderer.setViewport(0, 0, 1, 1);
201
+ const allRenderers = offscreenMultiRenderWindow.getRenderers();
202
+ allRenderers.forEach(({ renderer: r, id }) => {
203
+ r.setDraw(id === viewport.id);
204
+ });
205
+ const widgetRenderers = this.getWidgetRenderers();
206
+ widgetRenderers.forEach((viewportId, renderer) => {
207
+ renderer.setDraw(viewportId === viewport.id);
208
+ });
209
+ renderWindow.render();
210
+ allRenderers.forEach(({ renderer: r }) => r.setDraw(false));
211
+ const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
212
+ const context = openGLRenderWindow.get3DContext();
213
+ const offScreenCanvas = context.canvas;
214
+ const eventDetail = this._copyToOnscreenCanvas(viewport, offScreenCanvas);
186
215
  return eventDetail;
187
216
  }
188
217
  _renderViewportFromVtkCanvasToOnscreenCanvas(viewport, offScreenCanvas) {
218
+ return this._copyToOnscreenCanvas(viewport, offScreenCanvas);
219
+ }
220
+ _resizeOffScreenCanvasForViewport(viewportCanvas, offScreenCanvasContainer, offscreenMultiRenderWindow) {
221
+ const offScreenCanvasWidth = viewportCanvas.width;
222
+ const offScreenCanvasHeight = viewportCanvas.height;
223
+ offScreenCanvasContainer.width = offScreenCanvasWidth;
224
+ offScreenCanvasContainer.height = offScreenCanvasHeight;
225
+ offscreenMultiRenderWindow.resize();
226
+ }
227
+ _copyToOnscreenCanvas(viewport, offScreenCanvas) {
189
228
  const { element, canvas, id: viewportId, renderingEngineId, suppressEvents, } = viewport;
190
229
  const { width: dWidth, height: dHeight } = canvas;
191
230
  const onScreenContext = canvas.getContext('2d');
@@ -198,23 +237,17 @@ class SequentialRenderingEngine extends BaseRenderingEngine {
198
237
  viewportStatus: viewport.viewportStatus,
199
238
  };
200
239
  }
201
- _resizeOffScreenCanvasForSingleViewport(currentViewport) {
202
- const { offScreenCanvasContainer, offscreenMultiRenderWindow } = this;
203
- const offScreenCanvasWidth = currentViewport.width;
204
- const offScreenCanvasHeight = currentViewport.height;
205
- offScreenCanvasContainer.width = offScreenCanvasWidth;
206
- offScreenCanvasContainer.height = offScreenCanvasHeight;
207
- offscreenMultiRenderWindow.resize();
208
- return { offScreenCanvasWidth, offScreenCanvasHeight };
209
- }
210
240
  _resize(viewportsDrivenByVtkJs) {
211
241
  for (const viewport of viewportsDrivenByVtkJs) {
212
242
  viewport.sx = 0;
213
243
  viewport.sy = 0;
214
244
  viewport.sWidth = viewport.canvas.width;
215
245
  viewport.sHeight = viewport.canvas.height;
216
- const renderer = this.offscreenMultiRenderWindow.getRenderer(viewport.id);
217
- renderer.setViewport([0, 0, 1, 1]);
246
+ const contextIndex = this.contextPool.getContextIndexForViewport(viewport.id);
247
+ const contextData = this.contextPool.getContextByIndex(contextIndex);
248
+ const { context: offscreenMultiRenderWindow } = contextData;
249
+ const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id);
250
+ renderer.setViewport(0, 0, 1, 1);
218
251
  }
219
252
  }
220
253
  getWidgetRenderers() {
@@ -231,5 +264,43 @@ class SequentialRenderingEngine extends BaseRenderingEngine {
231
264
  });
232
265
  return widgetRenderers;
233
266
  }
267
+ getRenderer(viewportId) {
268
+ const contextIndex = this.contextPool?.getContextIndexForViewport(viewportId);
269
+ const contextData = this.contextPool.getContextByIndex(contextIndex);
270
+ const { context: offscreenMultiRenderWindow } = contextData;
271
+ return offscreenMultiRenderWindow.getRenderer(viewportId);
272
+ }
273
+ disableElement(viewportId) {
274
+ const viewport = this.getViewport(viewportId);
275
+ if (!viewport) {
276
+ return;
277
+ }
278
+ super.disableElement(viewportId);
279
+ if (!viewportTypeUsesCustomRenderingPipeline(viewport.type) &&
280
+ !this.useCPURendering) {
281
+ const contextIndex = this.contextPool.getContextIndexForViewport(viewportId);
282
+ if (contextIndex !== undefined) {
283
+ const contextData = this.contextPool.getContextByIndex(contextIndex);
284
+ if (contextData) {
285
+ const { context: offscreenMultiRenderWindow } = contextData;
286
+ offscreenMultiRenderWindow.removeRenderer(viewportId);
287
+ }
288
+ }
289
+ }
290
+ }
291
+ destroy() {
292
+ if (this.contextPool) {
293
+ this.contextPool.destroy();
294
+ }
295
+ super.destroy();
296
+ }
297
+ getOffscreenMultiRenderWindow(viewportId) {
298
+ if (this.useCPURendering) {
299
+ throw new Error('Offscreen multi render window is not available when using CPU rendering.');
300
+ }
301
+ const contextIndex = this.contextPool.getContextIndexForViewport(viewportId);
302
+ const contextData = this.contextPool.getContextByIndex(contextIndex);
303
+ return contextData.context;
304
+ }
234
305
  }
235
- export default SequentialRenderingEngine;
306
+ export default ContextPoolRenderingEngine;
@@ -1,7 +1,7 @@
1
- import type { IStackViewport, IVolumeViewport, IViewport, PublicViewportInput } from '../types';
1
+ import type { IStackViewport, IVolumeViewport, IViewport, PublicViewportInput, VtkOffscreenMultiRenderWindow } from '../types';
2
2
  declare class RenderingEngine {
3
3
  hasBeenDestroyed: boolean;
4
- offscreenMultiRenderWindow: any;
4
+ offscreenMultiRenderWindow: VtkOffscreenMultiRenderWindow;
5
5
  private _implementation?;
6
6
  constructor(id?: string);
7
7
  get id(): string;
@@ -14,10 +14,12 @@ declare class RenderingEngine {
14
14
  getStackViewport(viewportId: string): IStackViewport;
15
15
  getStackViewports(): IStackViewport[];
16
16
  getVolumeViewports(): IVolumeViewport[];
17
+ getRenderer(viewportId: string): import("@kitware/vtk.js/Rendering/Core/Renderer").vtkRenderer;
17
18
  fillCanvasWithBackgroundColor(canvas: HTMLCanvasElement, backgroundColor: [number, number, number]): void;
18
19
  render(): void;
19
20
  renderViewports(viewportIds: string[]): void;
20
21
  renderViewport(viewportId: string): void;
21
22
  destroy(): void;
23
+ getOffscreenMultiRenderWindow(viewportId?: string): VtkOffscreenMultiRenderWindow;
22
24
  }
23
25
  export default RenderingEngine;
@@ -1,21 +1,21 @@
1
1
  import { getConfiguration } from '../init';
2
- import StandardRenderingEngine from './StandardRenderingEngine';
3
- import SequentialRenderingEngine from './SequentialRenderingEngine';
2
+ import TiledRenderingEngine from './TiledRenderingEngine';
3
+ import ContextPoolRenderingEngine from './ContextPoolRenderingEngine';
4
4
  import { RenderingEngineModeEnum } from '../enums';
5
5
  class RenderingEngine {
6
6
  constructor(id) {
7
7
  const config = getConfiguration();
8
8
  const renderingEngineMode = config?.rendering?.renderingEngineMode;
9
9
  switch (renderingEngineMode) {
10
- case RenderingEngineModeEnum.Standard:
11
- this._implementation = new StandardRenderingEngine(id);
10
+ case RenderingEngineModeEnum.Tiled:
11
+ this._implementation = new TiledRenderingEngine(id);
12
12
  break;
13
- case RenderingEngineModeEnum.Next:
14
- this._implementation = new SequentialRenderingEngine(id);
13
+ case RenderingEngineModeEnum.ContextPool:
14
+ this._implementation = new ContextPoolRenderingEngine(id);
15
15
  break;
16
16
  default:
17
17
  console.warn(`RenderingEngine: Unknown rendering engine mode "${renderingEngineMode}". Defaulting to Next rendering engine.`);
18
- this._implementation = new SequentialRenderingEngine(id);
18
+ this._implementation = new ContextPoolRenderingEngine(id);
19
19
  break;
20
20
  }
21
21
  }
@@ -49,6 +49,9 @@ class RenderingEngine {
49
49
  getVolumeViewports() {
50
50
  return this._implementation.getVolumeViewports();
51
51
  }
52
+ getRenderer(viewportId) {
53
+ return this._implementation.getRenderer(viewportId);
54
+ }
52
55
  fillCanvasWithBackgroundColor(canvas, backgroundColor) {
53
56
  return this._implementation.fillCanvasWithBackgroundColor(canvas, backgroundColor);
54
57
  }
@@ -64,5 +67,8 @@ class RenderingEngine {
64
67
  destroy() {
65
68
  return this._implementation.destroy();
66
69
  }
70
+ getOffscreenMultiRenderWindow(viewportId) {
71
+ return this._implementation.getOffscreenMultiRenderWindow(viewportId);
72
+ }
67
73
  }
68
74
  export default RenderingEngine;
@@ -65,7 +65,6 @@ declare class StackViewport extends Viewport {
65
65
  }) => boolean;
66
66
  canvasToWorld: (canvasPos: Point2) => Point3;
67
67
  worldToCanvas: (worldPos: Point3) => Point2;
68
- getRenderer: () => vtkRenderer;
69
68
  getDefaultActor: () => ActorEntry;
70
69
  getActors: () => ActorEntry[];
71
70
  getActor: (actorUID: string) => ActorEntry;
@@ -181,10 +180,12 @@ declare class StackViewport extends Viewport {
181
180
  jumpToWorld(worldPos: Point3): boolean;
182
181
  private canvasToWorldCPU;
183
182
  private worldToCanvasCPU;
184
- private canvasToWorldGPUSequential;
185
- private canvasToWorldGPU;
186
- private worldToCanvasGPUSequential;
187
- private worldToCanvasGPU;
183
+ private canvasToWorldGPUContextPool;
184
+ private canvasToWorldGPUTiled;
185
+ private worldToCanvasGPUContextPool;
186
+ private worldToCanvasGPUTiled;
187
+ getRendererContextPool(): vtkRenderer;
188
+ getRendererTiled(): vtkRenderer;
188
189
  private _getVOIRangeForCurrentImage;
189
190
  private _getValidVOILUTFunction;
190
191
  getCurrentImageIdIndex: () => number;
@@ -43,7 +43,7 @@ import uuidv4 from '../utilities/uuidv4';
43
43
  import getSpacingInNormalDirection from '../utilities/getSpacingInNormalDirection';
44
44
  import getClosestImageId from '../utilities/getClosestImageId';
45
45
  import { adjustInitialViewUp } from '../utilities/adjustInitialViewUp';
46
- import { isSequentialRenderingEngine } from './helpers/isSequentialRenderingEngine';
46
+ import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine';
47
47
  const EPSILON = 1;
48
48
  const log = coreLog.getLogger('RenderingEngine', 'StackViewport');
49
49
  class StackViewport extends Viewport {
@@ -196,7 +196,7 @@ class StackViewport extends Viewport {
196
196
  const canvasPoint = pixelToCanvas(this._cpuFallbackEnabledElement, indexPoint);
197
197
  return canvasPoint;
198
198
  };
199
- this.canvasToWorldGPUSequential = (canvasPos) => {
199
+ this.canvasToWorldGPUContextPool = (canvasPos) => {
200
200
  const renderer = this.getRenderer();
201
201
  const vtkCamera = this.getVtkActiveCamera();
202
202
  const crange = vtkCamera.getClippingRange();
@@ -220,7 +220,7 @@ class StackViewport extends Viewport {
220
220
  vtkCamera.setClippingRange(crange[0], crange[1]);
221
221
  return [worldCoord[0], worldCoord[1], worldCoord[2]];
222
222
  };
223
- this.canvasToWorldGPU = (canvasPos) => {
223
+ this.canvasToWorldGPUTiled = (canvasPos) => {
224
224
  const renderer = this.getRenderer();
225
225
  const vtkCamera = this.getVtkActiveCamera();
226
226
  const crange = vtkCamera.getClippingRange();
@@ -243,7 +243,7 @@ class StackViewport extends Viewport {
243
243
  vtkCamera.setClippingRange(crange[0], crange[1]);
244
244
  return [worldCoord[0], worldCoord[1], worldCoord[2]];
245
245
  };
246
- this.worldToCanvasGPUSequential = (worldPos) => {
246
+ this.worldToCanvasGPUContextPool = (worldPos) => {
247
247
  const renderer = this.getRenderer();
248
248
  const vtkCamera = this.getVtkActiveCamera();
249
249
  const crange = vtkCamera.getClippingRange();
@@ -264,7 +264,7 @@ class StackViewport extends Viewport {
264
264
  ];
265
265
  return canvasCoordWithDPR;
266
266
  };
267
- this.worldToCanvasGPU = (worldPos) => {
267
+ this.worldToCanvasGPUTiled = (worldPos) => {
268
268
  const renderer = this.getRenderer();
269
269
  const vtkCamera = this.getVtkActiveCamera();
270
270
  const crange = vtkCamera.getClippingRange();
@@ -391,20 +391,23 @@ class StackViewport extends Viewport {
391
391
  canvasToWorld: {
392
392
  cpu: this.canvasToWorldCPU,
393
393
  gpu: {
394
- sequential: this.canvasToWorldGPUSequential,
395
- default: this.canvasToWorldGPU,
394
+ tiled: this.canvasToWorldGPUTiled,
395
+ contextPool: this.canvasToWorldGPUContextPool,
396
396
  },
397
397
  },
398
398
  worldToCanvas: {
399
399
  cpu: this.worldToCanvasCPU,
400
400
  gpu: {
401
- sequential: this.worldToCanvasGPUSequential,
402
- default: this.worldToCanvasGPU,
401
+ tiled: this.worldToCanvasGPUTiled,
402
+ contextPool: this.worldToCanvasGPUContextPool,
403
403
  },
404
404
  },
405
405
  getRenderer: {
406
406
  cpu: () => this.getCPUFallbackError('getRenderer'),
407
- gpu: super.getRenderer,
407
+ gpu: {
408
+ tiled: this.getRendererTiled,
409
+ contextPool: this.getRendererContextPool,
410
+ },
408
411
  },
409
412
  getDefaultActor: {
410
413
  cpu: () => this.getCPUFallbackError('getDefaultActor'),
@@ -459,8 +462,7 @@ class StackViewport extends Viewport {
459
462
  return getShouldUseCPURendering();
460
463
  }
461
464
  _configureRenderingPipeline(value) {
462
- const renderingEngine = this.getRenderingEngine();
463
- const isSequential = isSequentialRenderingEngine(renderingEngine);
465
+ const isContextPool = isContextPoolRenderingEngine();
464
466
  this.useCPURendering = value ?? getShouldUseCPURendering();
465
467
  for (const key in this.renderingPipelineFunctions) {
466
468
  if (Object.prototype.hasOwnProperty.call(this.renderingPipelineFunctions, key)) {
@@ -470,11 +472,11 @@ class StackViewport extends Viewport {
470
472
  }
471
473
  else {
472
474
  if (typeof functions.gpu === 'object' &&
473
- functions.gpu.sequential &&
474
- functions.gpu.default) {
475
- this[key] = isSequential
476
- ? functions.gpu.sequential
477
- : functions.gpu.default;
475
+ functions.gpu.tiled &&
476
+ functions.gpu.contextPool) {
477
+ this[key] = isContextPool
478
+ ? functions.gpu.contextPool
479
+ : functions.gpu.tiled;
478
480
  }
479
481
  else {
480
482
  this[key] = functions.gpu;
@@ -1731,6 +1733,17 @@ class StackViewport extends Viewport {
1731
1733
  this.render();
1732
1734
  return true;
1733
1735
  }
1736
+ getRendererContextPool() {
1737
+ const renderingEngine = this.getRenderingEngine();
1738
+ return renderingEngine.getRenderer(this.id);
1739
+ }
1740
+ getRendererTiled() {
1741
+ const renderingEngine = this.getRenderingEngine();
1742
+ if (!renderingEngine || renderingEngine.hasBeenDestroyed) {
1743
+ throw new Error('Rendering engine has been destroyed');
1744
+ }
1745
+ return renderingEngine.offscreenMultiRenderWindow?.getRenderer(this.id);
1746
+ }
1734
1747
  _getVOIRangeForCurrentImage() {
1735
1748
  const { windowCenter, windowWidth, voiLUTFunction } = this.csImage;
1736
1749
  return this._getVOIRangeFromWindowLevel(windowWidth, windowCenter, voiLUTFunction);
@@ -3,7 +3,8 @@ import type IStackViewport from '../types/IStackViewport';
3
3
  import type IVolumeViewport from '../types/IVolumeViewport';
4
4
  import type * as EventTypes from '../types/EventTypes';
5
5
  import type { InternalViewportInput, NormalizedViewportInput, IViewport } from '../types/IViewport';
6
- declare class StandardRenderingEngine extends BaseRenderingEngine {
6
+ declare class TiledRenderingEngine extends BaseRenderingEngine {
7
+ constructor(id?: string);
7
8
  protected enableVTKjsDrivenViewport(viewportInputEntry: NormalizedViewportInput): void;
8
9
  protected addVtkjsDrivenViewport(viewportInputEntry: InternalViewportInput, offscreenCanvasProperties?: {
9
10
  offScreenCanvasWidth: number;
@@ -20,4 +21,4 @@ declare class StandardRenderingEngine extends BaseRenderingEngine {
20
21
  private _resize;
21
22
  private _getViewportCoordsOnOffScreenCanvas;
22
23
  }
23
- export default StandardRenderingEngine;
24
+ export default TiledRenderingEngine;
@@ -8,9 +8,10 @@ import StackViewport from './StackViewport';
8
8
  import viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline';
9
9
  import getOrCreateCanvas from './helpers/getOrCreateCanvas';
10
10
  import VolumeViewport3D from './VolumeViewport3D';
11
- class StandardRenderingEngine extends BaseRenderingEngine {
12
- constructor() {
13
- super(...arguments);
11
+ import { vtkOffscreenMultiRenderWindow } from './vtkClasses';
12
+ class TiledRenderingEngine extends BaseRenderingEngine {
13
+ constructor(id) {
14
+ super(id);
14
15
  this._renderFlaggedViewports = () => {
15
16
  this._throwIfDestroyed();
16
17
  if (!this.useCPURendering) {
@@ -39,6 +40,12 @@ class StandardRenderingEngine extends BaseRenderingEngine {
39
40
  triggerEvent(eventDetail.element, Events.IMAGE_RENDERED, eventDetail);
40
41
  });
41
42
  };
43
+ if (!this.useCPURendering) {
44
+ this.offscreenMultiRenderWindow =
45
+ vtkOffscreenMultiRenderWindow.newInstance();
46
+ this.offScreenCanvasContainer = document.createElement('div');
47
+ this.offscreenMultiRenderWindow.setContainer(this.offScreenCanvasContainer);
48
+ }
42
49
  }
43
50
  enableVTKjsDrivenViewport(viewportInputEntry) {
44
51
  const viewports = this._getViewportsAsArray();
@@ -252,12 +259,7 @@ class StandardRenderingEngine extends BaseRenderingEngine {
252
259
  viewport.sWidth = sWidth;
253
260
  viewport.sHeight = sHeight;
254
261
  const renderer = this.offscreenMultiRenderWindow.getRenderer(viewport.id);
255
- renderer.setViewport([
256
- sxStartDisplayCoords,
257
- syStartDisplayCoords,
258
- sxEndDisplayCoords,
259
- syEndDisplayCoords,
260
- ]);
262
+ renderer.setViewport(sxStartDisplayCoords, syStartDisplayCoords, sxEndDisplayCoords, syEndDisplayCoords);
261
263
  }
262
264
  return _xOffset;
263
265
  }
@@ -282,4 +284,4 @@ class StandardRenderingEngine extends BaseRenderingEngine {
282
284
  };
283
285
  }
284
286
  }
285
- export default StandardRenderingEngine;
287
+ export default TiledRenderingEngine;
@@ -0,0 +1,17 @@
1
+ import type { VtkOffscreenMultiRenderWindow } from '../types';
2
+ declare class WebGLContextPool {
3
+ private contexts;
4
+ private offScreenCanvasContainers;
5
+ private viewportToContext;
6
+ constructor(count: number);
7
+ getContextByIndex(index: number): {
8
+ context: VtkOffscreenMultiRenderWindow;
9
+ container: HTMLDivElement;
10
+ } | null;
11
+ assignViewportToContext(viewportId: string, contextIndex: number): void;
12
+ getContextIndexForViewport(viewportId: string): number | undefined;
13
+ getAllContexts(): VtkOffscreenMultiRenderWindow[];
14
+ getContextCount(): number;
15
+ destroy(): void;
16
+ }
17
+ export default WebGLContextPool;
@@ -0,0 +1,45 @@
1
+ import { vtkOffscreenMultiRenderWindow } from './vtkClasses';
2
+ class WebGLContextPool {
3
+ constructor(count) {
4
+ this.contexts = [];
5
+ this.offScreenCanvasContainers = [];
6
+ this.viewportToContext = new Map();
7
+ for (let i = 0; i < count; i++) {
8
+ const offscreenMultiRenderWindow = vtkOffscreenMultiRenderWindow.newInstance();
9
+ const container = document.createElement('div');
10
+ offscreenMultiRenderWindow.setContainer(container);
11
+ this.contexts.push(offscreenMultiRenderWindow);
12
+ this.offScreenCanvasContainers.push(container);
13
+ }
14
+ }
15
+ getContextByIndex(index) {
16
+ if (index >= 0 && index < this.contexts.length) {
17
+ return {
18
+ context: this.contexts[index],
19
+ container: this.offScreenCanvasContainers[index],
20
+ };
21
+ }
22
+ return null;
23
+ }
24
+ assignViewportToContext(viewportId, contextIndex) {
25
+ this.viewportToContext.set(viewportId, contextIndex);
26
+ }
27
+ getContextIndexForViewport(viewportId) {
28
+ return this.viewportToContext.get(viewportId);
29
+ }
30
+ getAllContexts() {
31
+ return this.contexts;
32
+ }
33
+ getContextCount() {
34
+ return this.contexts.length;
35
+ }
36
+ destroy() {
37
+ this.contexts.forEach((context) => {
38
+ context.delete();
39
+ });
40
+ this.contexts = [];
41
+ this.offScreenCanvasContainers = [];
42
+ this.viewportToContext.clear();
43
+ }
44
+ }
45
+ export default WebGLContextPool;
@@ -0,0 +1 @@
1
+ export declare function isContextPoolRenderingEngine(): boolean;
@@ -0,0 +1,7 @@
1
+ import { getConfiguration } from '../../init';
2
+ import { RenderingEngineModeEnum } from '../../enums';
3
+ export function isContextPoolRenderingEngine() {
4
+ const config = getConfiguration();
5
+ return (config?.rendering?.renderingEngineMode ===
6
+ RenderingEngineModeEnum.ContextPool);
7
+ }
@@ -1,11 +1,11 @@
1
1
  import RenderingEngine from './RenderingEngine';
2
2
  import BaseRenderingEngine from './BaseRenderingEngine';
3
- import StandardRenderingEngine from './StandardRenderingEngine';
4
- import SequentialRenderingEngine from './SequentialRenderingEngine';
3
+ import TiledRenderingEngine from './TiledRenderingEngine';
4
+ import ContextPoolRenderingEngine from './ContextPoolRenderingEngine';
5
5
  import getRenderingEngine from './getRenderingEngine';
6
6
  import VolumeViewport from './VolumeViewport';
7
7
  import StackViewport from './StackViewport';
8
8
  import VolumeViewport3D from './VolumeViewport3D';
9
9
  export * from './helpers';
10
- export { getRenderingEngine, RenderingEngine, BaseRenderingEngine, StandardRenderingEngine, SequentialRenderingEngine, VolumeViewport, VolumeViewport3D, StackViewport, };
10
+ export { getRenderingEngine, RenderingEngine, BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine, VolumeViewport, VolumeViewport3D, StackViewport, };
11
11
  export default RenderingEngine;
@@ -1,11 +1,11 @@
1
1
  import RenderingEngine from './RenderingEngine';
2
2
  import BaseRenderingEngine from './BaseRenderingEngine';
3
- import StandardRenderingEngine from './StandardRenderingEngine';
4
- import SequentialRenderingEngine from './SequentialRenderingEngine';
3
+ import TiledRenderingEngine from './TiledRenderingEngine';
4
+ import ContextPoolRenderingEngine from './ContextPoolRenderingEngine';
5
5
  import getRenderingEngine from './getRenderingEngine';
6
6
  import VolumeViewport from './VolumeViewport';
7
7
  import StackViewport from './StackViewport';
8
8
  import VolumeViewport3D from './VolumeViewport3D';
9
9
  export * from './helpers';
10
- export { getRenderingEngine, RenderingEngine, BaseRenderingEngine, StandardRenderingEngine, SequentialRenderingEngine, VolumeViewport, VolumeViewport3D, StackViewport, };
10
+ export { getRenderingEngine, RenderingEngine, BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine, VolumeViewport, VolumeViewport3D, StackViewport, };
11
11
  export default RenderingEngine;
@@ -1,5 +1,5 @@
1
1
  declare enum RenderingEngineModeEnum {
2
- Standard = "standard",
3
- Next = "next"
2
+ Tiled = "tiled",
3
+ ContextPool = "contextPool"
4
4
  }
5
5
  export default RenderingEngineModeEnum;
@@ -1,6 +1,6 @@
1
1
  var RenderingEngineModeEnum;
2
2
  (function (RenderingEngineModeEnum) {
3
- RenderingEngineModeEnum["Standard"] = "standard";
4
- RenderingEngineModeEnum["Next"] = "next";
3
+ RenderingEngineModeEnum["Tiled"] = "tiled";
4
+ RenderingEngineModeEnum["ContextPool"] = "contextPool";
5
5
  })(RenderingEngineModeEnum || (RenderingEngineModeEnum = {}));
6
6
  export default RenderingEngineModeEnum;
@@ -1,7 +1,7 @@
1
1
  import * as Enums from './enums';
2
2
  import * as CONSTANTS from './constants';
3
3
  import { Events } from './enums';
4
- import RenderingEngine, { BaseRenderingEngine, StandardRenderingEngine, SequentialRenderingEngine } from './RenderingEngine';
4
+ import RenderingEngine, { BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine } from './RenderingEngine';
5
5
  import createVolumeActor from './RenderingEngine/helpers/createVolumeActor';
6
6
  import createVolumeMapper, { convertMapperToNotSharedMapper } from './RenderingEngine/helpers/createVolumeMapper';
7
7
  export * from './RenderingEngine/helpers/getOrCreateCanvas';
@@ -37,4 +37,4 @@ import { cornerstoneStreamingDynamicImageVolumeLoader } from './loaders/cornerst
37
37
  import { cornerstoneMeshLoader } from './loaders/cornerstoneMeshLoader';
38
38
  import { setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports } from './RenderingEngine/helpers';
39
39
  export type { Types, IRetrieveConfiguration, RetrieveOptions, RetrieveStage, ImageLoadListener, IImagesLoader, };
40
- export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, BaseRenderingEngine, StandardRenderingEngine, SequentialRenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, version, };
40
+ export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, version, };
package/dist/esm/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as Enums from './enums';
2
2
  import * as CONSTANTS from './constants';
3
3
  import { Events } from './enums';
4
- import RenderingEngine, { BaseRenderingEngine, StandardRenderingEngine, SequentialRenderingEngine, } from './RenderingEngine';
4
+ import RenderingEngine, { BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine, } from './RenderingEngine';
5
5
  import createVolumeActor from './RenderingEngine/helpers/createVolumeActor';
6
6
  import createVolumeMapper, { convertMapperToNotSharedMapper, } from './RenderingEngine/helpers/createVolumeMapper';
7
7
  export * from './RenderingEngine/helpers/getOrCreateCanvas';
@@ -34,4 +34,4 @@ import { cornerstoneStreamingImageVolumeLoader } from './loaders/cornerstoneStre
34
34
  import { cornerstoneStreamingDynamicImageVolumeLoader } from './loaders/cornerstoneStreamingDynamicImageVolumeLoader';
35
35
  import { cornerstoneMeshLoader } from './loaders/cornerstoneMeshLoader';
36
36
  import { setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, } from './RenderingEngine/helpers';
37
- export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, BaseRenderingEngine, StandardRenderingEngine, SequentialRenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, version, };
37
+ export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, version, };
package/dist/esm/init.js CHANGED
@@ -11,7 +11,8 @@ const defaultConfig = {
11
11
  useCPURendering: false,
12
12
  preferSizeOverAccuracy: false,
13
13
  strictZSpacingForVolumeViewport: true,
14
- renderingEngineMode: RenderingEngineModeEnum.Next,
14
+ renderingEngineMode: RenderingEngineModeEnum.ContextPool,
15
+ webGlContextCount: 7,
15
16
  },
16
17
  peerImport: (moduleId) => null,
17
18
  };
@@ -52,6 +53,9 @@ function init(configuration = config) {
52
53
  }
53
54
  canUseNorm16Texture = _hasNorm16TextureSupport();
54
55
  config = deepMerge(defaultConfig, configuration);
56
+ if (config.isMobile) {
57
+ config.rendering.webGlContextCount = 1;
58
+ }
55
59
  if (isIOS()) {
56
60
  if (configuration.rendering?.preferSizeOverAccuracy) {
57
61
  config.rendering.preferSizeOverAccuracy = true;
@@ -9,6 +9,7 @@ interface Cornerstone3DConfig {
9
9
  useCPURendering?: boolean;
10
10
  strictZSpacingForVolumeViewport?: boolean;
11
11
  renderingEngineMode?: RenderingEngineModeType;
12
+ webGlContextCount?: number;
12
13
  };
13
14
  peerImport?: (moduleId: string) => Promise<any>;
14
15
  }
@@ -1,2 +1,2 @@
1
- type RenderingEngineModeType = 'standard' | 'next';
1
+ type RenderingEngineModeType = 'tiled' | 'contextPool';
2
2
  export type { RenderingEngineModeType };
@@ -0,0 +1,37 @@
1
+ import type { vtkObject } from '@kitware/vtk.js/interfaces';
2
+ import type vtkStreamingOpenGLRenderWindow from '../RenderingEngine/vtkClasses/vtkStreamingOpenGLRenderWindow';
3
+ import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';
4
+ import type vtkRenderWindow from '@kitware/vtk.js/Rendering/Core/RenderWindow';
5
+ import type vtkRenderWindowInteractor from '@kitware/vtk.js/Rendering/Core/RenderWindowInteractor';
6
+ import '@kitware/vtk.js/Common/Core/Points';
7
+ import '@kitware/vtk.js/Common/Core/DataArray';
8
+ import '@kitware/vtk.js/Common/DataModel/PolyData';
9
+ import '@kitware/vtk.js/Rendering/Core/Actor';
10
+ import '@kitware/vtk.js/Rendering/Core/Mapper';
11
+ type Viewport = [number, number, number, number];
12
+ interface RendererConfig {
13
+ id: string;
14
+ viewport: Viewport;
15
+ background?: [number, number, number];
16
+ }
17
+ export interface VtkOffscreenMultiRenderWindow extends vtkObject {
18
+ renderWindow: vtkRenderWindow;
19
+ getRenderWindow: () => vtkRenderWindow;
20
+ openGLRenderWindow: ReturnType<typeof vtkStreamingOpenGLRenderWindow.newInstance>;
21
+ getOpenGLRenderWindow: () => ReturnType<typeof vtkStreamingOpenGLRenderWindow.newInstance>;
22
+ interactor: vtkRenderWindowInteractor;
23
+ getInteractor: () => vtkRenderWindowInteractor;
24
+ container: HTMLDivElement | null;
25
+ getContainer: () => HTMLDivElement | null;
26
+ addRenderer: (config: RendererConfig) => void;
27
+ removeRenderer: (id: string) => void;
28
+ getRenderer: (id: string) => vtkRenderer;
29
+ getRenderers: () => Array<{
30
+ id: string;
31
+ renderer: vtkRenderer;
32
+ }>;
33
+ resize: () => void;
34
+ setContainer: (el: HTMLDivElement) => void;
35
+ destroy: () => void;
36
+ }
37
+ export {};
@@ -0,0 +1,5 @@
1
+ import '@kitware/vtk.js/Common/Core/Points';
2
+ import '@kitware/vtk.js/Common/Core/DataArray';
3
+ import '@kitware/vtk.js/Common/DataModel/PolyData';
4
+ import '@kitware/vtk.js/Rendering/Core/Actor';
5
+ import '@kitware/vtk.js/Rendering/Core/Mapper';
@@ -102,4 +102,5 @@ import type ScrollOptions from './ScrollOptions';
102
102
  import type JumpToSliceOptions from './JumpToSliceOptions';
103
103
  import type GeometryLoaderFn from './GeometryLoaderFn';
104
104
  import type { RenderingEngineModeType } from './RenderingEngineMode';
105
- export type { Cornerstone3DConfig, ICamera, IStackViewport, IVideoViewport, IWSIViewport, IVolumeViewport, IEnabledElement, ICache, IVolume, IViewportId, IImageVolume, ImageVolumeProps, IDynamicImageVolume, IRenderingEngine, ScalingParameters, PTScaling, IPointsManager, PolyDataPointConfiguration, Scaling, IStreamingImageVolume, IImage, IImageData, IImageCalibration, CPUIImageData, CPUImageData, EventTypes, ImageLoaderFn, VolumeLoaderFn, IRegisterImageLoader, IStreamingVolumeProperties, IViewport, ViewReference, DataSetOptions as ImageSetOptions, ViewPresentation, ViewPresentationSelector, ReferenceCompatibleOptions, ViewReferenceSpecifier, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, ImageActor, ICanvasActor, IImageLoadObject, IVolumeLoadObject, IVolumeInput, VolumeInputCallback, IStackInput, StackInputCallback, ViewportPreset, Metadata, OrientationVectors, AABB2, AABB3, Point2, Point3, PointsXYZ, Point4, Mat3, Plane, ViewportInputOptions, VideoViewportProperties, WSIViewportProperties, VOIRange, VOI, DisplayArea, FlipDirection, ICachedImage, ICachedVolume, CPUFallbackEnabledElement, CPUFallbackViewport, CPUFallbackTransform, CPUFallbackColormapData, CPUFallbackViewportDisplayedArea, CPUFallbackColormapsData, CPUFallbackColormap, TransformMatrix2D, CPUFallbackLookupTable, CPUFallbackLUT, CPUFallbackRenderingTools, CustomEventType, ActorSliceRange, ImageSliceData, IGeometry, IGeometryLoadObject, ICachedGeometry, PublicContourSetData, ContourSetData, ContourData, IContourSet, IContour, PublicSurfaceData, SurfaceData, ISurface, PublicMeshData, MeshData, IMesh, RGB, ColormapPublic, ColormapRegistration, PixelDataTypedArray, PixelDataTypedArrayString, ImagePixelModule, ImagePlaneModule, AffineMatrix, ImageLoadListener, InternalVideoCamera, VideoViewportInput, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, DicomDateObject, DicomTimeObject, GeneralSeriesModuleMetadata, ImagePlaneModuleMetadata, SopCommonModuleMetadata, ImagePixelModuleMetadata, PatientStudyModuleMetadata, TransferSyntaxMetadata, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, RenderingEngineModeType, };
105
+ import type { VtkOffscreenMultiRenderWindow } from './VtkOffscreenMultiRenderWindow';
106
+ export type { Cornerstone3DConfig, ICamera, IStackViewport, IVideoViewport, IWSIViewport, IVolumeViewport, IEnabledElement, ICache, IVolume, IViewportId, IImageVolume, ImageVolumeProps, IDynamicImageVolume, IRenderingEngine, ScalingParameters, PTScaling, IPointsManager, PolyDataPointConfiguration, Scaling, IStreamingImageVolume, IImage, IImageData, IImageCalibration, CPUIImageData, CPUImageData, EventTypes, ImageLoaderFn, VolumeLoaderFn, IRegisterImageLoader, IStreamingVolumeProperties, IViewport, ViewReference, DataSetOptions as ImageSetOptions, ViewPresentation, ViewPresentationSelector, ReferenceCompatibleOptions, ViewReferenceSpecifier, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, ImageActor, ICanvasActor, IImageLoadObject, IVolumeLoadObject, IVolumeInput, VolumeInputCallback, IStackInput, StackInputCallback, ViewportPreset, Metadata, OrientationVectors, AABB2, AABB3, Point2, Point3, PointsXYZ, Point4, Mat3, Plane, ViewportInputOptions, VideoViewportProperties, WSIViewportProperties, VOIRange, VOI, DisplayArea, FlipDirection, ICachedImage, ICachedVolume, CPUFallbackEnabledElement, CPUFallbackViewport, CPUFallbackTransform, CPUFallbackColormapData, CPUFallbackViewportDisplayedArea, CPUFallbackColormapsData, CPUFallbackColormap, TransformMatrix2D, CPUFallbackLookupTable, CPUFallbackLUT, CPUFallbackRenderingTools, CustomEventType, ActorSliceRange, ImageSliceData, IGeometry, IGeometryLoadObject, ICachedGeometry, PublicContourSetData, ContourSetData, ContourData, IContourSet, IContour, PublicSurfaceData, SurfaceData, ISurface, PublicMeshData, MeshData, IMesh, RGB, ColormapPublic, ColormapRegistration, PixelDataTypedArray, PixelDataTypedArrayString, ImagePixelModule, ImagePlaneModule, AffineMatrix, ImageLoadListener, InternalVideoCamera, VideoViewportInput, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, DicomDateObject, DicomTimeObject, GeneralSeriesModuleMetadata, ImagePlaneModuleMetadata, SopCommonModuleMetadata, ImagePixelModuleMetadata, PatientStudyModuleMetadata, TransferSyntaxMetadata, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, RenderingEngineModeType, VtkOffscreenMultiRenderWindow, };
@@ -2,7 +2,7 @@ import { vec3 } from 'gl-matrix';
2
2
  import getOrCreateCanvas, { EPSILON, } from '../RenderingEngine/helpers/getOrCreateCanvas';
3
3
  import { ViewportType, Events } from '../enums';
4
4
  import { getRenderingEngine } from '../RenderingEngine/getRenderingEngine';
5
- import RenderingEngine from '../RenderingEngine';
5
+ import TiledRenderingEngine from '../RenderingEngine/TiledRenderingEngine';
6
6
  import isPTPrescaledWithSUV from './isPTPrescaledWithSUV';
7
7
  export default function renderToCanvasGPU(canvas, imageOrVolume, modality = undefined, renderingEngineId = '_thumbnails', viewportOptions = {
8
8
  displayArea: { imageArea: [1, 1] },
@@ -31,7 +31,7 @@ export default function renderToCanvasGPU(canvas, imageOrVolume, modality = unde
31
31
  element.setAttribute('viewport-id-for-remove', uniqueId);
32
32
  const temporaryCanvas = getOrCreateCanvas(element);
33
33
  const renderingEngine = getRenderingEngine(renderingEngineId) ||
34
- new RenderingEngine(renderingEngineId);
34
+ new TiledRenderingEngine(renderingEngineId);
35
35
  let viewport = renderingEngine.getViewport(viewportId);
36
36
  if (!viewport) {
37
37
  const viewportInput = {
@@ -1 +1 @@
1
- export declare const version = "3.29.4";
1
+ export declare const version = "3.30.0";
@@ -1 +1 @@
1
- export const version = '3.29.4';
1
+ export const version = '3.30.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "3.29.4",
3
+ "version": "3.30.0",
4
4
  "description": "Cornerstone3D Core",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/esm/index.d.ts",
@@ -97,5 +97,5 @@
97
97
  "type": "individual",
98
98
  "url": "https://ohif.org/donate"
99
99
  },
100
- "gitHead": "64e6d79c48a562bef369da783441c5152730f8b4"
100
+ "gitHead": "f1bc10daabe26e00c716747b29365ed040e402cd"
101
101
  }
@@ -1 +0,0 @@
1
- export declare function isSequentialRenderingEngine(renderingEngine: any): boolean;
@@ -1,6 +0,0 @@
1
- import { getConfiguration } from '../../init';
2
- import { RenderingEngineModeEnum } from '../../enums';
3
- export function isSequentialRenderingEngine(renderingEngine) {
4
- const config = getConfiguration();
5
- return (config?.rendering?.renderingEngineMode === RenderingEngineModeEnum.Next);
6
- }