@cornerstonejs/core 4.6.4 → 4.7.1
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/BaseVolumeViewport.d.ts +3 -1
- package/dist/esm/RenderingEngine/BaseVolumeViewport.js +22 -6
- package/dist/esm/RenderingEngine/StackViewport.d.ts +3 -1
- package/dist/esm/RenderingEngine/StackViewport.js +22 -5
- package/dist/esm/RenderingEngine/renderPasses/index.d.ts +2 -1
- package/dist/esm/RenderingEngine/renderPasses/index.js +2 -1
- package/dist/esm/RenderingEngine/renderPasses/smoothingRenderPass.d.ts +2 -0
- package/dist/esm/RenderingEngine/renderPasses/smoothingRenderPass.js +39 -0
- package/dist/esm/types/ViewportProperties.d.ts +1 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +2 -2
|
@@ -10,6 +10,7 @@ declare abstract class BaseVolumeViewport extends Viewport {
|
|
|
10
10
|
useCPURendering: boolean;
|
|
11
11
|
private _FrameOfReferenceUID;
|
|
12
12
|
private sharpening;
|
|
13
|
+
private smoothing;
|
|
13
14
|
protected initialTransferFunctionNodes: TransferFunctionNodes;
|
|
14
15
|
private globalDefaultProperties;
|
|
15
16
|
private perVolumeIdDefaultProperties;
|
|
@@ -48,8 +49,9 @@ declare abstract class BaseVolumeViewport extends Viewport {
|
|
|
48
49
|
setViewPlane(planeRestriction: PlaneRestriction): void;
|
|
49
50
|
setViewReference(viewRef: ViewReference): void;
|
|
50
51
|
private setThreshold;
|
|
51
|
-
setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, }?: VolumeViewportProperties, volumeId?: string, suppressEvents?: boolean): void;
|
|
52
|
+
setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, smoothing, }?: VolumeViewportProperties, volumeId?: string, suppressEvents?: boolean): void;
|
|
52
53
|
private setSharpening;
|
|
54
|
+
private setSmoothing;
|
|
53
55
|
protected shouldUseCustomRenderPass(): boolean;
|
|
54
56
|
getRenderPasses: () => any[];
|
|
55
57
|
resetToDefaultProperties(volumeId: string): void;
|
|
@@ -31,12 +31,13 @@ import { getCameraVectors } from './helpers/getCameraVectors';
|
|
|
31
31
|
import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine';
|
|
32
32
|
import mprCameraValues from '../constants/mprCameraValues';
|
|
33
33
|
import { isInvalidNumber } from './helpers/isInvalidNumber';
|
|
34
|
-
import { createSharpeningRenderPass } from './renderPasses';
|
|
34
|
+
import { createSharpeningRenderPass, createSmoothingRenderPass, } from './renderPasses';
|
|
35
35
|
class BaseVolumeViewport extends Viewport {
|
|
36
36
|
constructor(props) {
|
|
37
37
|
super(props);
|
|
38
38
|
this.useCPURendering = false;
|
|
39
39
|
this.sharpening = 0;
|
|
40
|
+
this.smoothing = 0;
|
|
40
41
|
this.perVolumeIdDefaultProperties = new Map();
|
|
41
42
|
this.viewportProperties = {};
|
|
42
43
|
this.volumeIds = new Set();
|
|
@@ -76,15 +77,26 @@ class BaseVolumeViewport extends Viewport {
|
|
|
76
77
|
this.sharpening = sharpening;
|
|
77
78
|
this.render();
|
|
78
79
|
};
|
|
80
|
+
this.setSmoothing = (smoothing) => {
|
|
81
|
+
this.smoothing = smoothing;
|
|
82
|
+
this.render();
|
|
83
|
+
};
|
|
79
84
|
this.getRenderPasses = () => {
|
|
80
85
|
if (!this.shouldUseCustomRenderPass()) {
|
|
81
86
|
return null;
|
|
82
87
|
}
|
|
88
|
+
const renderPasses = [];
|
|
83
89
|
try {
|
|
84
|
-
|
|
90
|
+
if (this.smoothing > 0) {
|
|
91
|
+
renderPasses.push(createSmoothingRenderPass(this.smoothing));
|
|
92
|
+
}
|
|
93
|
+
if (this.sharpening > 0) {
|
|
94
|
+
renderPasses.push(createSharpeningRenderPass(this.sharpening));
|
|
95
|
+
}
|
|
96
|
+
return renderPasses.length ? renderPasses : null;
|
|
85
97
|
}
|
|
86
98
|
catch (e) {
|
|
87
|
-
console.warn('Failed to create
|
|
99
|
+
console.warn('Failed to create custom render passes:', e);
|
|
88
100
|
return null;
|
|
89
101
|
}
|
|
90
102
|
};
|
|
@@ -134,6 +146,7 @@ class BaseVolumeViewport extends Viewport {
|
|
|
134
146
|
slabThickness: slabThickness,
|
|
135
147
|
preset,
|
|
136
148
|
sharpening: this.sharpening,
|
|
149
|
+
smoothing: this.smoothing,
|
|
137
150
|
};
|
|
138
151
|
};
|
|
139
152
|
this.getColormap = (volumeId) => {
|
|
@@ -721,7 +734,7 @@ class BaseVolumeViewport extends Viewport {
|
|
|
721
734
|
const newPosition = vec3.add(vec3.create(), position, focalShift);
|
|
722
735
|
this.setCamera({
|
|
723
736
|
focalPoint: newImagePositionPatient,
|
|
724
|
-
position: newPosition
|
|
737
|
+
position: newPosition,
|
|
725
738
|
});
|
|
726
739
|
this.render();
|
|
727
740
|
return;
|
|
@@ -761,7 +774,7 @@ class BaseVolumeViewport extends Viewport {
|
|
|
761
774
|
};
|
|
762
775
|
triggerEvent(this.element, Events.COLORMAP_MODIFIED, eventDetail);
|
|
763
776
|
}
|
|
764
|
-
setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, } = {}, volumeId, suppressEvents = false) {
|
|
777
|
+
setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, smoothing, } = {}, volumeId, suppressEvents = false) {
|
|
765
778
|
if (this.globalDefaultProperties == null) {
|
|
766
779
|
this.setDefaultProperties({
|
|
767
780
|
voiRange,
|
|
@@ -805,9 +818,12 @@ class BaseVolumeViewport extends Viewport {
|
|
|
805
818
|
if (typeof sharpening !== 'undefined') {
|
|
806
819
|
this.setSharpening(sharpening);
|
|
807
820
|
}
|
|
821
|
+
if (typeof smoothing !== 'undefined') {
|
|
822
|
+
this.setSmoothing(smoothing);
|
|
823
|
+
}
|
|
808
824
|
}
|
|
809
825
|
shouldUseCustomRenderPass() {
|
|
810
|
-
return
|
|
826
|
+
return !this.useCPURendering;
|
|
811
827
|
}
|
|
812
828
|
resetToDefaultProperties(volumeId) {
|
|
813
829
|
const properties = this.globalDefaultProperties;
|
|
@@ -28,6 +28,7 @@ declare class StackViewport extends Viewport {
|
|
|
28
28
|
private voiRange;
|
|
29
29
|
private voiUpdatedWithSetProperties;
|
|
30
30
|
private sharpening;
|
|
31
|
+
private smoothing;
|
|
31
32
|
private VOILUTFunction;
|
|
32
33
|
private invert;
|
|
33
34
|
private initialInvert;
|
|
@@ -78,6 +79,7 @@ declare class StackViewport extends Viewport {
|
|
|
78
79
|
private setInvertColor;
|
|
79
80
|
private setColormap;
|
|
80
81
|
private setSharpening;
|
|
82
|
+
private setSmoothing;
|
|
81
83
|
protected shouldUseCustomRenderPass(): boolean;
|
|
82
84
|
getRenderPasses: () => any[];
|
|
83
85
|
private initializeElementDisabledHandler;
|
|
@@ -92,7 +94,7 @@ declare class StackViewport extends Viewport {
|
|
|
92
94
|
private calibrateIfNecessary;
|
|
93
95
|
setDefaultProperties(ViewportProperties: StackViewportProperties, imageId?: string): void;
|
|
94
96
|
clearDefaultProperties(imageId?: string): void;
|
|
95
|
-
setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, }?: StackViewportProperties, suppressEvents?: boolean): void;
|
|
97
|
+
setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, smoothing, }?: StackViewportProperties, suppressEvents?: boolean): void;
|
|
96
98
|
getDefaultProperties: (imageId?: string) => StackViewportProperties;
|
|
97
99
|
getProperties: () => StackViewportProperties;
|
|
98
100
|
resetCameraForResize: () => boolean;
|
|
@@ -44,7 +44,7 @@ import getSpacingInNormalDirection from '../utilities/getSpacingInNormalDirectio
|
|
|
44
44
|
import getClosestImageId from '../utilities/getClosestImageId';
|
|
45
45
|
import { adjustInitialViewUp } from '../utilities/adjustInitialViewUp';
|
|
46
46
|
import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine';
|
|
47
|
-
import { createSharpeningRenderPass } from './renderPasses';
|
|
47
|
+
import { createSharpeningRenderPass, createSmoothingRenderPass, } from './renderPasses';
|
|
48
48
|
const log = coreLog.getLogger('RenderingEngine', 'StackViewport');
|
|
49
49
|
class StackViewport extends Viewport {
|
|
50
50
|
constructor(props) {
|
|
@@ -58,6 +58,7 @@ class StackViewport extends Viewport {
|
|
|
58
58
|
this.perImageIdDefaultProperties = new Map();
|
|
59
59
|
this.voiUpdatedWithSetProperties = false;
|
|
60
60
|
this.sharpening = 0;
|
|
61
|
+
this.smoothing = 0;
|
|
61
62
|
this.invert = false;
|
|
62
63
|
this.initialInvert = false;
|
|
63
64
|
this.initialTransferFunctionNodes = null;
|
|
@@ -70,15 +71,26 @@ class StackViewport extends Viewport {
|
|
|
70
71
|
this.sharpening = sharpening;
|
|
71
72
|
this.render();
|
|
72
73
|
};
|
|
74
|
+
this.setSmoothing = (smoothing) => {
|
|
75
|
+
this.smoothing = smoothing;
|
|
76
|
+
this.render();
|
|
77
|
+
};
|
|
73
78
|
this.getRenderPasses = () => {
|
|
74
79
|
if (!this.shouldUseCustomRenderPass()) {
|
|
75
80
|
return null;
|
|
76
81
|
}
|
|
82
|
+
const renderPasses = [];
|
|
77
83
|
try {
|
|
78
|
-
|
|
84
|
+
if (this.smoothing > 0) {
|
|
85
|
+
renderPasses.push(createSmoothingRenderPass(this.smoothing));
|
|
86
|
+
}
|
|
87
|
+
if (this.sharpening > 0) {
|
|
88
|
+
renderPasses.push(createSharpeningRenderPass(this.sharpening));
|
|
89
|
+
}
|
|
90
|
+
return renderPasses.length ? renderPasses : null;
|
|
79
91
|
}
|
|
80
92
|
catch (e) {
|
|
81
|
-
console.warn('Failed to create
|
|
93
|
+
console.warn('Failed to create custom render passes:', e);
|
|
82
94
|
return null;
|
|
83
95
|
}
|
|
84
96
|
};
|
|
@@ -133,6 +145,7 @@ class StackViewport extends Viewport {
|
|
|
133
145
|
invert,
|
|
134
146
|
isComputedVOI: !voiUpdatedWithSetProperties,
|
|
135
147
|
sharpening: this.sharpening,
|
|
148
|
+
smoothing: this.smoothing,
|
|
136
149
|
};
|
|
137
150
|
};
|
|
138
151
|
this.resetCameraForResize = () => {
|
|
@@ -535,7 +548,7 @@ class StackViewport extends Viewport {
|
|
|
535
548
|
camera.setFreezeFocalPoint(true);
|
|
536
549
|
}
|
|
537
550
|
shouldUseCustomRenderPass() {
|
|
538
|
-
return
|
|
551
|
+
return !this.useCPURendering;
|
|
539
552
|
}
|
|
540
553
|
initializeElementDisabledHandler() {
|
|
541
554
|
eventTarget.addEventListener(Events.ELEMENT_DISABLED, function elementDisabledHandler() {
|
|
@@ -658,7 +671,7 @@ class StackViewport extends Viewport {
|
|
|
658
671
|
this.resetToDefaultProperties();
|
|
659
672
|
}
|
|
660
673
|
}
|
|
661
|
-
setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, } = {}, suppressEvents = false) {
|
|
674
|
+
setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, smoothing, } = {}, suppressEvents = false) {
|
|
662
675
|
this.viewportStatus = this.csImage
|
|
663
676
|
? ViewportStatus.PRE_RENDER
|
|
664
677
|
: ViewportStatus.LOADING;
|
|
@@ -669,6 +682,7 @@ class StackViewport extends Viewport {
|
|
|
669
682
|
invert: this.globalDefaultProperties.invert ?? invert,
|
|
670
683
|
interpolationType: this.globalDefaultProperties.interpolationType ?? interpolationType,
|
|
671
684
|
sharpening: this.globalDefaultProperties.sharpening ?? sharpening,
|
|
685
|
+
smoothing: this.globalDefaultProperties.smoothing ?? smoothing,
|
|
672
686
|
};
|
|
673
687
|
if (typeof colormap !== 'undefined') {
|
|
674
688
|
this.setColormap(colormap);
|
|
@@ -689,6 +703,9 @@ class StackViewport extends Viewport {
|
|
|
689
703
|
if (typeof sharpening !== 'undefined') {
|
|
690
704
|
this.setSharpening(sharpening);
|
|
691
705
|
}
|
|
706
|
+
if (typeof smoothing !== 'undefined') {
|
|
707
|
+
this.setSmoothing(smoothing);
|
|
708
|
+
}
|
|
692
709
|
}
|
|
693
710
|
resetProperties() {
|
|
694
711
|
this.cpuRenderingInvalidated = true;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import vtkConvolution2DPass from '@kitware/vtk.js/Rendering/OpenGL/Convolution2DPass';
|
|
2
|
+
import vtkForwardPass from '@kitware/vtk.js/Rendering/OpenGL/ForwardPass';
|
|
3
|
+
function createSmoothingRenderPass(intensity) {
|
|
4
|
+
let renderPass = vtkForwardPass.newInstance();
|
|
5
|
+
if (intensity > 0) {
|
|
6
|
+
const convolutionPass = vtkConvolution2DPass.newInstance();
|
|
7
|
+
convolutionPass.setDelegates([renderPass]);
|
|
8
|
+
const smoothStrength = Math.min(intensity, 1000);
|
|
9
|
+
const kernelSize = 15;
|
|
10
|
+
const sigma = 5.0;
|
|
11
|
+
const gaussianKernel = createGaussianKernel(kernelSize, sigma);
|
|
12
|
+
const totalElements = kernelSize * kernelSize;
|
|
13
|
+
const centerIndex = Math.floor(totalElements / 2);
|
|
14
|
+
const identityKernel = Array(totalElements).fill(0);
|
|
15
|
+
identityKernel[centerIndex] = 1;
|
|
16
|
+
const alpha = Math.min(smoothStrength / 10, 1.0);
|
|
17
|
+
const kernel = gaussianKernel.map((g, i) => (1 - alpha) * identityKernel[i] + alpha * g);
|
|
18
|
+
convolutionPass.setKernelDimension(15);
|
|
19
|
+
convolutionPass.setKernel(kernel);
|
|
20
|
+
renderPass = convolutionPass;
|
|
21
|
+
}
|
|
22
|
+
return renderPass;
|
|
23
|
+
}
|
|
24
|
+
function createGaussianKernel(size, sigma) {
|
|
25
|
+
const kernel = [];
|
|
26
|
+
const mean = (size - 1) / 2;
|
|
27
|
+
let sum = 0;
|
|
28
|
+
for (let y = 0; y < size; y++) {
|
|
29
|
+
for (let x = 0; x < size; x++) {
|
|
30
|
+
const dx = x - mean;
|
|
31
|
+
const dy = y - mean;
|
|
32
|
+
const value = Math.exp(-(dx * dx + dy * dy) / (2 * Math.pow(sigma, 2)));
|
|
33
|
+
kernel.push(value);
|
|
34
|
+
sum += value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return kernel.map((v) => v / sum);
|
|
38
|
+
}
|
|
39
|
+
export { createSmoothingRenderPass };
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "4.
|
|
1
|
+
export declare const version = "4.7.1";
|
package/dist/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '4.
|
|
1
|
+
export const version = '4.7.1';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/core",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.7.1",
|
|
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": "299a34f3fa18444c85bd3b2f37a42b1de4586c4c"
|
|
101
101
|
}
|