@cornerstonejs/core 4.0.0-beta.2 → 4.0.0-beta.4

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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/dist/esm/RenderingEngine/BaseRenderingEngine.d.ts +55 -0
  3. package/dist/esm/RenderingEngine/BaseRenderingEngine.js +355 -0
  4. package/dist/esm/RenderingEngine/BaseVolumeViewport.d.ts +34 -5
  5. package/dist/esm/RenderingEngine/BaseVolumeViewport.js +179 -17
  6. package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.d.ts +28 -0
  7. package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.js +313 -0
  8. package/dist/esm/RenderingEngine/RenderingEngine.d.ts +7 -39
  9. package/dist/esm/RenderingEngine/RenderingEngine.js +42 -613
  10. package/dist/esm/RenderingEngine/StackViewport.d.ts +6 -3
  11. package/dist/esm/RenderingEngine/StackViewport.js +92 -8
  12. package/dist/esm/RenderingEngine/TiledRenderingEngine.d.ts +24 -0
  13. package/dist/esm/RenderingEngine/TiledRenderingEngine.js +287 -0
  14. package/dist/esm/RenderingEngine/VideoViewport.js +1 -1
  15. package/dist/esm/RenderingEngine/Viewport.d.ts +2 -1
  16. package/dist/esm/RenderingEngine/Viewport.js +38 -1
  17. package/dist/esm/RenderingEngine/VolumeViewport3D.d.ts +1 -0
  18. package/dist/esm/RenderingEngine/VolumeViewport3D.js +24 -1
  19. package/dist/esm/RenderingEngine/WSIViewport.js +4 -7
  20. package/dist/esm/RenderingEngine/WebGLContextPool.d.ts +17 -0
  21. package/dist/esm/RenderingEngine/WebGLContextPool.js +45 -0
  22. package/dist/esm/RenderingEngine/helpers/createVolumeMapper.js +3 -1
  23. package/dist/esm/RenderingEngine/helpers/isContextPoolRenderingEngine.d.ts +1 -0
  24. package/dist/esm/RenderingEngine/helpers/isContextPoolRenderingEngine.js +7 -0
  25. package/dist/esm/RenderingEngine/helpers/stats/StatsOverlay.d.ts +28 -0
  26. package/dist/esm/RenderingEngine/helpers/stats/StatsOverlay.js +137 -0
  27. package/dist/esm/RenderingEngine/helpers/stats/StatsPanel.d.ts +24 -0
  28. package/dist/esm/RenderingEngine/helpers/stats/StatsPanel.js +101 -0
  29. package/dist/esm/RenderingEngine/helpers/stats/constants.d.ts +44 -0
  30. package/dist/esm/RenderingEngine/helpers/stats/constants.js +36 -0
  31. package/dist/esm/RenderingEngine/helpers/stats/enums.d.ts +6 -0
  32. package/dist/esm/RenderingEngine/helpers/stats/enums.js +7 -0
  33. package/dist/esm/RenderingEngine/helpers/stats/index.d.ts +2 -0
  34. package/dist/esm/RenderingEngine/helpers/stats/index.js +2 -0
  35. package/dist/esm/RenderingEngine/helpers/stats/types.d.ts +22 -0
  36. package/dist/esm/RenderingEngine/helpers/stats/types.js +0 -0
  37. package/dist/esm/RenderingEngine/index.d.ts +4 -1
  38. package/dist/esm/RenderingEngine/index.js +4 -1
  39. package/dist/esm/cache/cache.js +0 -1
  40. package/dist/esm/cache/classes/BaseStreamingImageVolume.d.ts +2 -0
  41. package/dist/esm/cache/classes/BaseStreamingImageVolume.js +8 -0
  42. package/dist/esm/cache/classes/StreamingDynamicImageVolume.d.ts +1 -0
  43. package/dist/esm/enums/RenderingEngineModeEnum.d.ts +5 -0
  44. package/dist/esm/enums/RenderingEngineModeEnum.js +6 -0
  45. package/dist/esm/enums/index.d.ts +2 -1
  46. package/dist/esm/enums/index.js +2 -1
  47. package/dist/esm/index.d.ts +2 -2
  48. package/dist/esm/index.js +2 -2
  49. package/dist/esm/init.js +12 -0
  50. package/dist/esm/loaders/volumeLoader.js +2 -2
  51. package/dist/esm/types/Cornerstone3DConfig.d.ts +16 -7
  52. package/dist/esm/types/IRenderingEngine.d.ts +1 -1
  53. package/dist/esm/types/IViewport.d.ts +9 -2
  54. package/dist/esm/types/OrientationVectors.d.ts +1 -1
  55. package/dist/esm/types/RenderingEngineMode.d.ts +2 -0
  56. package/dist/esm/types/RenderingEngineMode.js +0 -0
  57. package/dist/esm/types/ViewportProperties.d.ts +1 -0
  58. package/dist/esm/types/VtkOffscreenMultiRenderWindow.d.ts +37 -0
  59. package/dist/esm/types/VtkOffscreenMultiRenderWindow.js +5 -0
  60. package/dist/esm/types/index.d.ts +3 -1
  61. package/dist/esm/utilities/asArray.d.ts +1 -0
  62. package/dist/esm/utilities/asArray.js +6 -0
  63. package/dist/esm/utilities/colormap.js +4 -2
  64. package/dist/esm/utilities/getPixelSpacingInformation.js +4 -1
  65. package/dist/esm/utilities/historyMemo/index.d.ts +10 -1
  66. package/dist/esm/utilities/historyMemo/index.js +62 -20
  67. package/dist/esm/utilities/index.d.ts +3 -1
  68. package/dist/esm/utilities/index.js +3 -1
  69. package/dist/esm/utilities/isEqual.d.ts +5 -5
  70. package/dist/esm/utilities/isEqual.js +5 -5
  71. package/dist/esm/utilities/renderToCanvasGPU.js +2 -2
  72. package/dist/esm/utilities/updatePlaneRestriction.d.ts +2 -0
  73. package/dist/esm/utilities/updatePlaneRestriction.js +41 -0
  74. package/dist/esm/version.d.ts +1 -1
  75. package/dist/esm/version.js +1 -1
  76. package/package.json +4 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Open Health Imaging Foundation
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,55 @@
1
+ import type IStackViewport from '../types/IStackViewport';
2
+ import type IVolumeViewport from '../types/IVolumeViewport';
3
+ import type * as EventTypes from '../types/EventTypes';
4
+ import type { PublicViewportInput, InternalViewportInput, NormalizedViewportInput, IViewport } from '../types/IViewport';
5
+ import type { VtkOffscreenMultiRenderWindow } from '../types';
6
+ export declare const VIEWPORT_MIN_SIZE = 2;
7
+ declare abstract class BaseRenderingEngine {
8
+ readonly id: string;
9
+ hasBeenDestroyed: boolean;
10
+ offscreenMultiRenderWindow: VtkOffscreenMultiRenderWindow;
11
+ offScreenCanvasContainer: HTMLDivElement;
12
+ protected _viewports: Map<string, IViewport>;
13
+ protected _needsRender: Set<string>;
14
+ protected _animationFrameSet: boolean;
15
+ protected _animationFrameHandle: number | null;
16
+ protected useCPURendering: boolean;
17
+ constructor(id?: string);
18
+ enableElement(viewportInputEntry: PublicViewportInput): void;
19
+ disableElement(viewportId: string): void;
20
+ setViewports(publicViewportInputEntries: PublicViewportInput[]): void;
21
+ resize(immediate?: boolean, keepCamera?: boolean): void;
22
+ getViewport(viewportId: string): IViewport;
23
+ getViewports(): IViewport[];
24
+ getStackViewport(viewportId: string): IStackViewport;
25
+ getStackViewports(): IStackViewport[];
26
+ getVolumeViewports(): IVolumeViewport[];
27
+ render(): void;
28
+ renderFrameOfReference: (FrameOfReferenceUID: string) => void;
29
+ renderViewports(viewportIds: string[]): void;
30
+ renderViewport(viewportId: string): void;
31
+ destroy(): void;
32
+ fillCanvasWithBackgroundColor(canvas: HTMLCanvasElement, backgroundColor: [number, number, number]): void;
33
+ private _normalizeViewportInputEntry;
34
+ private _normalizeViewportInputEntries;
35
+ private _resizeUsingCustomResizeHandler;
36
+ private _removeViewport;
37
+ private addCustomViewport;
38
+ getRenderer(viewportId: any): import("@kitware/vtk.js/Rendering/Core/Renderer").vtkRenderer;
39
+ getOffscreenMultiRenderWindow(viewportId?: string): VtkOffscreenMultiRenderWindow;
40
+ private setCustomViewports;
41
+ protected _getViewportsAsArray(): IViewport[];
42
+ private _setViewportsToBeRenderedNextFrame;
43
+ private _render;
44
+ private _resetViewport;
45
+ private _clearAnimationFrame;
46
+ private _reset;
47
+ protected _throwIfDestroyed(): void;
48
+ protected abstract _resizeVTKViewports(vtkDrivenViewports: (IStackViewport | IVolumeViewport)[], keepCamera: boolean, immediate: boolean): void;
49
+ protected abstract enableVTKjsDrivenViewport(viewportInputEntry: NormalizedViewportInput): void;
50
+ protected abstract addVtkjsDrivenViewport(viewportInputEntry: InternalViewportInput, offscreenCanvasProperties?: unknown): void;
51
+ protected abstract _renderFlaggedViewports(): void;
52
+ protected abstract setVtkjsDrivenViewports(viewportInputEntries: NormalizedViewportInput[]): void;
53
+ protected abstract _renderViewportFromVtkCanvasToOnscreenCanvas(viewport: IViewport, offScreenCanvas: HTMLCanvasElement): EventTypes.ImageRenderedEventDetail;
54
+ }
55
+ export default BaseRenderingEngine;
@@ -0,0 +1,355 @@
1
+ import Events from '../enums/Events';
2
+ import renderingEngineCache from './renderingEngineCache';
3
+ import eventTarget from '../eventTarget';
4
+ import uuidv4 from '../utilities/uuidv4';
5
+ import triggerEvent from '../utilities/triggerEvent';
6
+ import ViewportType from '../enums/ViewportType';
7
+ import BaseVolumeViewport from './BaseVolumeViewport';
8
+ import StackViewport from './StackViewport';
9
+ import viewportTypeUsesCustomRenderingPipeline from './helpers/viewportTypeUsesCustomRenderingPipeline';
10
+ import getOrCreateCanvas from './helpers/getOrCreateCanvas';
11
+ import { getShouldUseCPURendering, isCornerstoneInitialized, getConfiguration, } from '../init';
12
+ import viewportTypeToViewportClass from './helpers/viewportTypeToViewportClass';
13
+ import { OrientationAxis } from '../enums';
14
+ import { StatsOverlay } from './helpers/stats';
15
+ export const VIEWPORT_MIN_SIZE = 2;
16
+ class BaseRenderingEngine {
17
+ constructor(id) {
18
+ this._needsRender = new Set();
19
+ this._animationFrameSet = false;
20
+ this._animationFrameHandle = null;
21
+ this.renderFrameOfReference = (FrameOfReferenceUID) => {
22
+ const viewports = this._getViewportsAsArray();
23
+ const viewportIdsWithSameFrameOfReferenceUID = viewports.map((vp) => {
24
+ if (vp.getFrameOfReferenceUID() === FrameOfReferenceUID) {
25
+ return vp.id;
26
+ }
27
+ });
28
+ this.renderViewports(viewportIdsWithSameFrameOfReferenceUID);
29
+ };
30
+ this.id = id ? id : uuidv4();
31
+ this.useCPURendering = getShouldUseCPURendering();
32
+ renderingEngineCache.set(this);
33
+ if (!isCornerstoneInitialized()) {
34
+ throw new Error('@cornerstonejs/core is not initialized, run init() first');
35
+ }
36
+ this._viewports = new Map();
37
+ this.hasBeenDestroyed = false;
38
+ const config = getConfiguration();
39
+ if (config?.debug?.statsOverlay) {
40
+ StatsOverlay.setup();
41
+ }
42
+ }
43
+ enableElement(viewportInputEntry) {
44
+ const viewportInput = this._normalizeViewportInputEntry(viewportInputEntry);
45
+ this._throwIfDestroyed();
46
+ const { element, viewportId } = viewportInput;
47
+ if (!element) {
48
+ throw new Error('No element provided');
49
+ }
50
+ const viewport = this.getViewport(viewportId);
51
+ if (viewport) {
52
+ this.disableElement(viewportId);
53
+ }
54
+ const { type } = viewportInput;
55
+ const viewportUsesCustomRenderingPipeline = viewportTypeUsesCustomRenderingPipeline(type);
56
+ if (!this.useCPURendering && !viewportUsesCustomRenderingPipeline) {
57
+ this.enableVTKjsDrivenViewport(viewportInput);
58
+ }
59
+ else {
60
+ this.addCustomViewport(viewportInput);
61
+ }
62
+ const canvas = getOrCreateCanvas(element);
63
+ const { background } = viewportInput.defaultOptions;
64
+ this.fillCanvasWithBackgroundColor(canvas, background);
65
+ }
66
+ disableElement(viewportId) {
67
+ this._throwIfDestroyed();
68
+ const viewport = this.getViewport(viewportId);
69
+ if (!viewport) {
70
+ console.warn(`viewport ${viewportId} does not exist`);
71
+ return;
72
+ }
73
+ this._resetViewport(viewport);
74
+ if (!viewportTypeUsesCustomRenderingPipeline(viewport.type) &&
75
+ !this.useCPURendering) {
76
+ if (this.offscreenMultiRenderWindow) {
77
+ this.offscreenMultiRenderWindow.removeRenderer(viewportId);
78
+ }
79
+ }
80
+ this._removeViewport(viewportId);
81
+ viewport.isDisabled = true;
82
+ this._needsRender.delete(viewportId);
83
+ const viewports = this.getViewports();
84
+ if (!viewports.length) {
85
+ this._clearAnimationFrame();
86
+ }
87
+ }
88
+ setViewports(publicViewportInputEntries) {
89
+ const viewportInputEntries = this._normalizeViewportInputEntries(publicViewportInputEntries);
90
+ this._throwIfDestroyed();
91
+ this._reset();
92
+ const vtkDrivenViewportInputEntries = [];
93
+ const customRenderingViewportInputEntries = [];
94
+ viewportInputEntries.forEach((vpie) => {
95
+ if (!this.useCPURendering &&
96
+ !viewportTypeUsesCustomRenderingPipeline(vpie.type)) {
97
+ vtkDrivenViewportInputEntries.push(vpie);
98
+ }
99
+ else {
100
+ customRenderingViewportInputEntries.push(vpie);
101
+ }
102
+ });
103
+ this.setVtkjsDrivenViewports(vtkDrivenViewportInputEntries);
104
+ this.setCustomViewports(customRenderingViewportInputEntries);
105
+ viewportInputEntries.forEach((vp) => {
106
+ const canvas = getOrCreateCanvas(vp.element);
107
+ const { background } = vp.defaultOptions;
108
+ this.fillCanvasWithBackgroundColor(canvas, background);
109
+ });
110
+ }
111
+ resize(immediate = true, keepCamera = true) {
112
+ this._throwIfDestroyed();
113
+ const viewports = this._getViewportsAsArray();
114
+ const vtkDrivenViewports = [];
115
+ const customRenderingViewports = [];
116
+ viewports.forEach((vpie) => {
117
+ if (!viewportTypeUsesCustomRenderingPipeline(vpie.type)) {
118
+ vtkDrivenViewports.push(vpie);
119
+ }
120
+ else {
121
+ customRenderingViewports.push(vpie);
122
+ }
123
+ });
124
+ if (vtkDrivenViewports.length) {
125
+ this._resizeVTKViewports(vtkDrivenViewports, keepCamera, immediate);
126
+ }
127
+ if (customRenderingViewports.length) {
128
+ this._resizeUsingCustomResizeHandler(customRenderingViewports, keepCamera, immediate);
129
+ }
130
+ }
131
+ getViewport(viewportId) {
132
+ return this._viewports?.get(viewportId);
133
+ }
134
+ getViewports() {
135
+ this._throwIfDestroyed();
136
+ return this._getViewportsAsArray();
137
+ }
138
+ getStackViewport(viewportId) {
139
+ this._throwIfDestroyed();
140
+ const viewport = this.getViewport(viewportId);
141
+ if (!viewport) {
142
+ throw new Error(`Viewport with Id ${viewportId} does not exist`);
143
+ }
144
+ if (!(viewport instanceof StackViewport)) {
145
+ throw new Error(`Viewport with Id ${viewportId} is not a StackViewport.`);
146
+ }
147
+ return viewport;
148
+ }
149
+ getStackViewports() {
150
+ this._throwIfDestroyed();
151
+ const viewports = this.getViewports();
152
+ return viewports.filter((vp) => vp instanceof StackViewport);
153
+ }
154
+ getVolumeViewports() {
155
+ this._throwIfDestroyed();
156
+ const viewports = this.getViewports();
157
+ const isVolumeViewport = (viewport) => {
158
+ return viewport instanceof BaseVolumeViewport;
159
+ };
160
+ return viewports.filter(isVolumeViewport);
161
+ }
162
+ render() {
163
+ const viewports = this.getViewports();
164
+ const viewportIds = viewports.map((vp) => vp.id);
165
+ this._setViewportsToBeRenderedNextFrame(viewportIds);
166
+ }
167
+ renderViewports(viewportIds) {
168
+ this._setViewportsToBeRenderedNextFrame(viewportIds);
169
+ }
170
+ renderViewport(viewportId) {
171
+ this._setViewportsToBeRenderedNextFrame([viewportId]);
172
+ }
173
+ destroy() {
174
+ if (this.hasBeenDestroyed) {
175
+ return;
176
+ }
177
+ StatsOverlay.cleanup();
178
+ if (!this.useCPURendering) {
179
+ const viewports = this._getViewportsAsArray();
180
+ viewports.forEach((vp) => {
181
+ if (this.offscreenMultiRenderWindow) {
182
+ this.offscreenMultiRenderWindow.removeRenderer(vp.id);
183
+ }
184
+ });
185
+ if (this.offscreenMultiRenderWindow) {
186
+ this.offscreenMultiRenderWindow.delete();
187
+ }
188
+ delete this.offscreenMultiRenderWindow;
189
+ }
190
+ this._reset();
191
+ renderingEngineCache.delete(this.id);
192
+ this.hasBeenDestroyed = true;
193
+ }
194
+ fillCanvasWithBackgroundColor(canvas, backgroundColor) {
195
+ const ctx = canvas.getContext('2d');
196
+ let fillStyle;
197
+ if (backgroundColor) {
198
+ const rgb = backgroundColor.map((f) => Math.floor(255 * f));
199
+ fillStyle = `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`;
200
+ }
201
+ else {
202
+ fillStyle = 'black';
203
+ }
204
+ ctx.fillStyle = fillStyle;
205
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
206
+ }
207
+ _normalizeViewportInputEntry(viewportInputEntry) {
208
+ const { type, defaultOptions } = viewportInputEntry;
209
+ let options = defaultOptions;
210
+ if (!options || Object.keys(options).length === 0) {
211
+ options = {
212
+ background: [0, 0, 0],
213
+ orientation: null,
214
+ displayArea: null,
215
+ };
216
+ if (type === ViewportType.ORTHOGRAPHIC) {
217
+ options = {
218
+ ...options,
219
+ orientation: OrientationAxis.AXIAL,
220
+ };
221
+ }
222
+ }
223
+ return {
224
+ ...viewportInputEntry,
225
+ defaultOptions: options,
226
+ };
227
+ }
228
+ _normalizeViewportInputEntries(viewportInputEntries) {
229
+ const normalizedViewportInputs = [];
230
+ viewportInputEntries.forEach((viewportInput) => {
231
+ normalizedViewportInputs.push(this._normalizeViewportInputEntry(viewportInput));
232
+ });
233
+ return normalizedViewportInputs;
234
+ }
235
+ _resizeUsingCustomResizeHandler(customRenderingViewports, keepCamera = true, immediate = true) {
236
+ customRenderingViewports.forEach((vp) => {
237
+ if (typeof vp.resize === 'function') {
238
+ vp.resize();
239
+ }
240
+ });
241
+ customRenderingViewports.forEach((vp) => {
242
+ const prevCamera = vp.getCamera();
243
+ vp.resetCamera();
244
+ if (keepCamera) {
245
+ vp.setCamera(prevCamera);
246
+ }
247
+ });
248
+ if (immediate) {
249
+ this.render();
250
+ }
251
+ }
252
+ _removeViewport(viewportId) {
253
+ const viewport = this.getViewport(viewportId);
254
+ if (!viewport) {
255
+ console.warn(`viewport ${viewportId} does not exist`);
256
+ return;
257
+ }
258
+ this._viewports.delete(viewportId);
259
+ }
260
+ addCustomViewport(viewportInputEntry) {
261
+ const { element, viewportId, type, defaultOptions } = viewportInputEntry;
262
+ element.tabIndex = -1;
263
+ const canvas = getOrCreateCanvas(element);
264
+ const { clientWidth, clientHeight } = canvas;
265
+ if (canvas.width !== clientWidth || canvas.height !== clientHeight) {
266
+ canvas.width = clientWidth;
267
+ canvas.height = clientHeight;
268
+ }
269
+ const viewportInput = {
270
+ id: viewportId,
271
+ renderingEngineId: this.id,
272
+ element,
273
+ type,
274
+ canvas,
275
+ sx: 0,
276
+ sy: 0,
277
+ sWidth: clientWidth,
278
+ sHeight: clientHeight,
279
+ defaultOptions: defaultOptions || {},
280
+ };
281
+ const ViewportType = viewportTypeToViewportClass[type];
282
+ const viewport = new ViewportType(viewportInput);
283
+ this._viewports.set(viewportId, viewport);
284
+ const eventDetail = {
285
+ element,
286
+ viewportId,
287
+ renderingEngineId: this.id,
288
+ };
289
+ triggerEvent(eventTarget, Events.ELEMENT_ENABLED, eventDetail);
290
+ }
291
+ getRenderer(viewportId) {
292
+ return this.offscreenMultiRenderWindow.getRenderer(viewportId);
293
+ }
294
+ getOffscreenMultiRenderWindow(viewportId) {
295
+ if (this.useCPURendering) {
296
+ throw new Error('Offscreen multi render window is not available when using CPU rendering.');
297
+ }
298
+ return this.offscreenMultiRenderWindow;
299
+ }
300
+ setCustomViewports(viewportInputEntries) {
301
+ viewportInputEntries.forEach((vpie) => {
302
+ this.addCustomViewport(vpie);
303
+ });
304
+ }
305
+ _getViewportsAsArray() {
306
+ return Array.from(this._viewports.values());
307
+ }
308
+ _setViewportsToBeRenderedNextFrame(viewportIds) {
309
+ viewportIds.forEach((viewportId) => {
310
+ this._needsRender.add(viewportId);
311
+ });
312
+ this._render();
313
+ }
314
+ _render() {
315
+ if (this._needsRender.size > 0 && !this._animationFrameSet) {
316
+ this._animationFrameHandle = window.requestAnimationFrame(this._renderFlaggedViewports);
317
+ this._animationFrameSet = true;
318
+ }
319
+ }
320
+ _resetViewport(viewport) {
321
+ const renderingEngineId = this.id;
322
+ const { element, canvas, id: viewportId } = viewport;
323
+ const eventDetail = {
324
+ element,
325
+ viewportId,
326
+ renderingEngineId,
327
+ };
328
+ viewport.removeWidgets();
329
+ triggerEvent(eventTarget, Events.ELEMENT_DISABLED, eventDetail);
330
+ element.removeAttribute('data-viewport-uid');
331
+ element.removeAttribute('data-rendering-engine-uid');
332
+ const context = canvas.getContext('2d');
333
+ context.clearRect(0, 0, canvas.width, canvas.height);
334
+ }
335
+ _clearAnimationFrame() {
336
+ window.cancelAnimationFrame(this._animationFrameHandle);
337
+ this._needsRender.clear();
338
+ this._animationFrameSet = false;
339
+ this._animationFrameHandle = null;
340
+ }
341
+ _reset() {
342
+ const viewports = this._getViewportsAsArray();
343
+ viewports.forEach((viewport) => {
344
+ this._resetViewport(viewport);
345
+ });
346
+ this._clearAnimationFrame();
347
+ this._viewports = new Map();
348
+ }
349
+ _throwIfDestroyed() {
350
+ if (this.hasBeenDestroyed) {
351
+ throw new Error('this.destroy() has been manually called to free up memory, can not longer use this instance. Instead make a new one.');
352
+ }
353
+ }
354
+ }
355
+ export default BaseRenderingEngine;
@@ -2,9 +2,10 @@ import type { mat4 } from 'gl-matrix';
2
2
  import type { BlendModes, InterpolationType, OrientationAxis } from '../enums';
3
3
  import type { FlipDirection, IImageData, IVolumeInput, OrientationVectors, Point2, Point3, VolumeViewportProperties, ViewReferenceSpecifier, ReferenceCompatibleOptions, ViewReference, ICamera } from '../types';
4
4
  import type { VoiModifiedEventDetail } from '../types/EventTypes';
5
- import type { ViewportInput } from '../types/IViewport';
5
+ import type { PlaneRestriction, 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;
@@ -42,11 +43,14 @@ declare abstract class BaseVolumeViewport extends Viewport {
42
43
  isReferenceViewable(viewRef: ViewReference, options?: ReferenceCompatibleOptions): boolean;
43
44
  scroll(delta?: number): void;
44
45
  abstract isInAcquisitionPlane(): boolean;
46
+ setBestOrentation(inPlaneVector1: any, inPlaneVector2: any): void;
47
+ setViewPlane(planeRestriction: PlaneRestriction): void;
45
48
  setViewReference(viewRef: ViewReference): void;
46
49
  private setThreshold;
47
- setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, }?: VolumeViewportProperties, volumeId?: string, suppressEvents?: boolean): void;
50
+ setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, }?: VolumeViewportProperties, volumeId?: string, suppressEvents?: boolean): void;
48
51
  resetToDefaultProperties(volumeId: string): void;
49
52
  private setPreset;
53
+ setSampleDistanceMultiplier(multiplier: number): void;
50
54
  getDefaultProperties: (volumeId?: string) => VolumeViewportProperties;
51
55
  getProperties: (volumeId?: string) => VolumeViewportProperties;
52
56
  private getColormap;
@@ -68,10 +72,16 @@ declare abstract class BaseVolumeViewport extends Viewport {
68
72
  getSliceIndex(): number;
69
73
  setCamera(cameraInterface: ICamera, storeAsInitialCamera?: boolean): void;
70
74
  private _setVolumeActors;
71
- canvasToWorld: (canvasPos: Point2) => Point3;
72
- getVtkDisplayCoords: (canvasPos: Point2) => Point3;
73
- worldToCanvas: (worldPos: Point3) => Point2;
75
+ canvasToWorldTiled: (canvasPos: Point2) => Point3;
76
+ canvasToWorldContextPool: (canvasPos: Point2) => Point3;
77
+ getVtkDisplayCoordsTiled: (canvasPos: Point2) => Point3;
78
+ getVtkDisplayCoordsContextPool: (canvasPos: Point2) => Point3;
79
+ worldToCanvasTiled: (worldPos: Point3) => Point2;
80
+ worldToCanvasContextPool: (worldPos: Point3) => Point2;
81
+ getRendererContextPool(): vtkRenderer;
82
+ getRendererTiled(): vtkRenderer;
74
83
  hasImageURI: (imageURI: string) => boolean;
84
+ protected _getViewUp(viewPlaneNormal: any): Point3;
75
85
  protected _getOrientationVectors(orientation: OrientationAxis | OrientationVectors): OrientationVectors;
76
86
  protected _getAcquisitionPlaneOrientation(): OrientationVectors;
77
87
  getSlabThickness(): number;
@@ -86,5 +96,24 @@ declare abstract class BaseVolumeViewport extends Viewport {
86
96
  abstract resetSlabThickness(): void;
87
97
  abstract resetProperties(volumeId?: string): void;
88
98
  getAllVolumeIds(): string[];
99
+ private _configureRenderingPipeline;
100
+ protected renderingPipelineFunctions: {
101
+ worldToCanvas: {
102
+ tiled: (worldPos: Point3) => Point2;
103
+ contextPool: (worldPos: Point3) => Point2;
104
+ };
105
+ canvasToWorld: {
106
+ tiled: (canvasPos: Point2) => Point3;
107
+ contextPool: (canvasPos: Point2) => Point3;
108
+ };
109
+ getVtkDisplayCoords: {
110
+ tiled: (canvasPos: Point2) => Point3;
111
+ contextPool: (canvasPos: Point2) => Point3;
112
+ };
113
+ getRenderer: {
114
+ tiled: () => vtkRenderer;
115
+ contextPool: () => vtkRenderer;
116
+ };
117
+ };
89
118
  }
90
119
  export default BaseVolumeViewport;