@cornerstonejs/core 3.29.5 → 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.
- package/dist/esm/RenderingEngine/BaseRenderingEngine.d.ts +5 -3
- package/dist/esm/RenderingEngine/BaseRenderingEngine.js +18 -10
- package/dist/esm/RenderingEngine/BaseVolumeViewport.d.ts +19 -12
- package/dist/esm/RenderingEngine/BaseVolumeViewport.js +31 -17
- package/dist/esm/RenderingEngine/{SequentialRenderingEngine.d.ts → ContextPoolRenderingEngine.d.ts} +14 -4
- package/dist/esm/RenderingEngine/{SequentialRenderingEngine.js → ContextPoolRenderingEngine.js} +130 -59
- package/dist/esm/RenderingEngine/RenderingEngine.d.ts +4 -2
- package/dist/esm/RenderingEngine/RenderingEngine.js +13 -7
- package/dist/esm/RenderingEngine/StackViewport.d.ts +6 -5
- package/dist/esm/RenderingEngine/StackViewport.js +30 -17
- package/dist/esm/RenderingEngine/{StandardRenderingEngine.d.ts → TiledRenderingEngine.d.ts} +3 -2
- package/dist/esm/RenderingEngine/{StandardRenderingEngine.js → TiledRenderingEngine.js} +12 -10
- package/dist/esm/RenderingEngine/WebGLContextPool.d.ts +17 -0
- package/dist/esm/RenderingEngine/WebGLContextPool.js +45 -0
- package/dist/esm/RenderingEngine/helpers/isContextPoolRenderingEngine.d.ts +1 -0
- package/dist/esm/RenderingEngine/helpers/isContextPoolRenderingEngine.js +7 -0
- package/dist/esm/RenderingEngine/index.d.ts +3 -3
- package/dist/esm/RenderingEngine/index.js +3 -3
- package/dist/esm/enums/RenderingEngineModeEnum.d.ts +2 -2
- package/dist/esm/enums/RenderingEngineModeEnum.js +2 -2
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +2 -2
- package/dist/esm/init.js +5 -1
- package/dist/esm/types/Cornerstone3DConfig.d.ts +1 -0
- package/dist/esm/types/RenderingEngineMode.d.ts +1 -1
- package/dist/esm/types/VtkOffscreenMultiRenderWindow.d.ts +37 -0
- package/dist/esm/types/VtkOffscreenMultiRenderWindow.js +5 -0
- package/dist/esm/types/index.d.ts +2 -1
- package/dist/esm/utilities/renderToCanvasGPU.js +2 -2
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +2 -2
- package/dist/esm/RenderingEngine/helpers/isSequentialRenderingEngine.d.ts +0 -1
- 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:
|
|
10
|
-
|
|
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
|
|
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
|
|
175
|
+
if (this.offscreenMultiRenderWindow) {
|
|
176
|
+
this.offscreenMultiRenderWindow.removeRenderer(vp.id);
|
|
177
|
+
}
|
|
181
178
|
});
|
|
182
|
-
this.offscreenMultiRenderWindow
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
96
|
-
|
|
98
|
+
tiled: (worldPos: Point3) => Point2;
|
|
99
|
+
contextPool: (worldPos: Point3) => Point2;
|
|
97
100
|
};
|
|
98
101
|
canvasToWorld: {
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
tiled: (canvasPos: Point2) => Point3;
|
|
103
|
+
contextPool: (canvasPos: Point2) => Point3;
|
|
101
104
|
};
|
|
102
105
|
getVtkDisplayCoords: {
|
|
103
|
-
|
|
104
|
-
|
|
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 {
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
282
|
-
|
|
281
|
+
tiled: this.worldToCanvasTiled,
|
|
282
|
+
contextPool: this.worldToCanvasContextPool,
|
|
283
283
|
},
|
|
284
284
|
canvasToWorld: {
|
|
285
|
-
|
|
286
|
-
|
|
285
|
+
tiled: this.canvasToWorldTiled,
|
|
286
|
+
contextPool: this.canvasToWorldContextPool,
|
|
287
287
|
},
|
|
288
288
|
getVtkDisplayCoords: {
|
|
289
|
-
|
|
290
|
-
|
|
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
|
|
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] =
|
|
1076
|
+
this[key] = isContextPool ? functions.contextPool : functions.tiled;
|
|
1063
1077
|
}
|
|
1064
1078
|
}
|
|
1065
1079
|
}
|
package/dist/esm/RenderingEngine/{SequentialRenderingEngine.d.ts → ContextPoolRenderingEngine.d.ts}
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
16
|
+
private renderViewportUsingCustomOrVtkPipeline;
|
|
17
|
+
private _renderViewportWithContext;
|
|
13
18
|
protected _renderViewportFromVtkCanvasToOnscreenCanvas(viewport: IViewport, offScreenCanvas: HTMLCanvasElement): EventTypes.ImageRenderedEventDetail;
|
|
14
|
-
private
|
|
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
|
|
28
|
+
export default ContextPoolRenderingEngine;
|
package/dist/esm/RenderingEngine/{SequentialRenderingEngine.js → ContextPoolRenderingEngine.js}
RENAMED
|
@@ -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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
33
|
-
if (
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
159
|
-
|
|
160
|
-
viewport.customRenderViewportToCanvas();
|
|
184
|
+
if (viewportTypeUsesCustomRenderingPipeline(viewport.type)) {
|
|
185
|
+
return viewport.customRenderViewportToCanvas();
|
|
161
186
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
|
217
|
-
|
|
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
|
|
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:
|
|
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
|
|
3
|
-
import
|
|
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.
|
|
11
|
-
this._implementation = new
|
|
10
|
+
case RenderingEngineModeEnum.Tiled:
|
|
11
|
+
this._implementation = new TiledRenderingEngine(id);
|
|
12
12
|
break;
|
|
13
|
-
case RenderingEngineModeEnum.
|
|
14
|
-
this._implementation = new
|
|
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
|
|
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
|
|
185
|
-
private
|
|
186
|
-
private
|
|
187
|
-
private
|
|
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 {
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
395
|
-
|
|
394
|
+
tiled: this.canvasToWorldGPUTiled,
|
|
395
|
+
contextPool: this.canvasToWorldGPUContextPool,
|
|
396
396
|
},
|
|
397
397
|
},
|
|
398
398
|
worldToCanvas: {
|
|
399
399
|
cpu: this.worldToCanvasCPU,
|
|
400
400
|
gpu: {
|
|
401
|
-
|
|
402
|
-
|
|
401
|
+
tiled: this.worldToCanvasGPUTiled,
|
|
402
|
+
contextPool: this.worldToCanvasGPUContextPool,
|
|
403
403
|
},
|
|
404
404
|
},
|
|
405
405
|
getRenderer: {
|
|
406
406
|
cpu: () => this.getCPUFallbackError('getRenderer'),
|
|
407
|
-
gpu:
|
|
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
|
|
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.
|
|
474
|
-
functions.gpu.
|
|
475
|
-
this[key] =
|
|
476
|
-
? functions.gpu.
|
|
477
|
-
: functions.gpu.
|
|
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
|
|
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
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
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
|
|
4
|
-
import
|
|
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,
|
|
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
|
|
4
|
-
import
|
|
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,
|
|
10
|
+
export { getRenderingEngine, RenderingEngine, BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine, VolumeViewport, VolumeViewport3D, StackViewport, };
|
|
11
11
|
export default RenderingEngine;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var RenderingEngineModeEnum;
|
|
2
2
|
(function (RenderingEngineModeEnum) {
|
|
3
|
-
RenderingEngineModeEnum["
|
|
4
|
-
RenderingEngineModeEnum["
|
|
3
|
+
RenderingEngineModeEnum["Tiled"] = "tiled";
|
|
4
|
+
RenderingEngineModeEnum["ContextPool"] = "contextPool";
|
|
5
5
|
})(RenderingEngineModeEnum || (RenderingEngineModeEnum = {}));
|
|
6
6
|
export default RenderingEngineModeEnum;
|
package/dist/esm/index.d.ts
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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.
|
|
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;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
type RenderingEngineModeType = '
|
|
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 {};
|
|
@@ -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
|
-
|
|
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
|
|
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
|
|
34
|
+
new TiledRenderingEngine(renderingEngineId);
|
|
35
35
|
let viewport = renderingEngine.getViewport(viewportId);
|
|
36
36
|
if (!viewport) {
|
|
37
37
|
const viewportInput = {
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "3.
|
|
1
|
+
export declare const version = "3.30.0";
|
package/dist/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '3.
|
|
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.
|
|
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": "
|
|
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
|
-
}
|