@kitware/vtk.js 31.1.0 → 31.2.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.
@@ -0,0 +1,194 @@
1
+ export interface ICoincidentTopology {
2
+ factor: number;
3
+ offset: number;
4
+ }
5
+
6
+ export enum Resolve {
7
+ Off,
8
+ PolygonOffset,
9
+ }
10
+
11
+ export interface StaticCoincidentTopologyMethods {
12
+ /**
13
+ *
14
+ * @param {ICoincidentTopology} params
15
+ */
16
+ setResolveCoincidentTopologyPolygonOffsetParameters(
17
+ params: ICoincidentTopology
18
+ ): boolean;
19
+
20
+ /**
21
+ *
22
+ * @param {ICoincidentTopology} params
23
+ */
24
+ setResolveCoincidentTopologyLineOffsetParameters(
25
+ params: ICoincidentTopology
26
+ ): boolean;
27
+
28
+ /**
29
+ *
30
+ * @param {ICoincidentTopology} params
31
+ */
32
+ setResolveCoincidentTopologyPointOffsetParameters(
33
+ params: ICoincidentTopology
34
+ ): boolean;
35
+
36
+ /**
37
+ *
38
+ * @param {Number} factor
39
+ * @param {Number} offset
40
+ */
41
+ setResolveCoincidentTopologyPolygonOffsetParameters(
42
+ factor: number,
43
+ offset: number
44
+ ): boolean;
45
+
46
+ /**
47
+ *
48
+ * @param {Number} factor
49
+ * @param {Number} offset
50
+ */
51
+ setResolveCoincidentTopologyLineOffsetParameters(
52
+ factor: number,
53
+ offset: number
54
+ ): boolean;
55
+
56
+ /**
57
+ *
58
+ * @param {Number} factor
59
+ * @param {Number} offset
60
+ */
61
+ setResolveCoincidentTopologyPointOffsetParameters(
62
+ factor: number,
63
+ offset: number
64
+ ): boolean;
65
+
66
+ /**
67
+ *
68
+ */
69
+ getResolveCoincidentTopologyLineOffsetParameters(): ICoincidentTopology;
70
+
71
+ /**
72
+ *
73
+ */
74
+ getResolveCoincidentTopologyPointOffsetParameters(): ICoincidentTopology;
75
+
76
+ /**
77
+ *
78
+ */
79
+ getResolveCoincidentTopologyPolygonOffsetParameters(): ICoincidentTopology;
80
+
81
+ /**
82
+ *
83
+ */
84
+ getResolveCoincidentTopologyPolygonOffsetFaces(): ICoincidentTopology;
85
+
86
+ /**
87
+ *
88
+ * @param {Number} value
89
+ */
90
+ setResolveCoincidentTopologyPolygonOffsetFaces(value: number): boolean;
91
+
92
+ /**
93
+ *
94
+ * @param mode
95
+ */
96
+ setResolveCoincidentTopology(mode?: Resolve): boolean;
97
+
98
+ /**
99
+ *
100
+ */
101
+ getResolveCoincidentTopology(): Resolve;
102
+
103
+ /**
104
+ *
105
+ */
106
+ setResolveCoincidentTopologyToDefault(): boolean;
107
+
108
+ /**
109
+ *
110
+ */
111
+ setResolveCoincidentTopologyToOff(): boolean;
112
+
113
+ /**
114
+ *
115
+ */
116
+ setResolveCoincidentTopologyToPolygonOffset(): boolean;
117
+
118
+ /**
119
+ *
120
+ */
121
+ getResolveCoincidentTopologyAsString(): string;
122
+ }
123
+
124
+ export default interface CoincidentTopologyHelper
125
+ extends StaticCoincidentTopologyMethods {
126
+ /**
127
+ *
128
+ * @param {ICoincidentTopology} params
129
+ */
130
+ setRelativeCoincidentTopologyLineOffsetParameters(
131
+ params: ICoincidentTopology
132
+ ): boolean;
133
+
134
+ /**
135
+ *
136
+ * @param {ICoincidentTopology} params
137
+ */
138
+ setRelativeCoincidentTopologyPointOffsetParameters(
139
+ params: ICoincidentTopology
140
+ ): boolean;
141
+
142
+ /**
143
+ *
144
+ * @param {ICoincidentTopology} params
145
+ */
146
+ setRelativeCoincidentTopologyPolygonOffsetParameters(
147
+ params: ICoincidentTopology
148
+ ): boolean;
149
+
150
+ /**
151
+ *
152
+ * @param {Number} factor
153
+ * @param {Number} offset
154
+ */
155
+ setRelativeCoincidentTopologyLineOffsetParameters(
156
+ factor: number,
157
+ offset: number
158
+ ): boolean;
159
+
160
+ /**
161
+ *
162
+ * @param {Number} factor
163
+ * @param {Number} offset
164
+ */
165
+ setRelativeCoincidentTopologyPointOffsetParameters(
166
+ factor: number,
167
+ offset: number
168
+ ): boolean;
169
+
170
+ /**
171
+ *
172
+ * @param {Number} factor
173
+ * @param {Number} offset
174
+ */
175
+ setRelativeCoincidentTopologyPolygonOffsetParameters(
176
+ factor: number,
177
+ offset: number
178
+ ): boolean;
179
+
180
+ /**
181
+ *
182
+ */
183
+ getCoincidentTopologyPolygonOffsetParameters(): ICoincidentTopology;
184
+
185
+ /**
186
+ *
187
+ */
188
+ getCoincidentTopologyLineOffsetParameters(): ICoincidentTopology;
189
+
190
+ /**
191
+ *
192
+ */
193
+ getCoincidentTopologyPointOffsetParameters(): ICoincidentTopology;
194
+ }
@@ -1,16 +1,15 @@
1
- import otherStaticMethods from './Static.js';
1
+ import otherStaticMethods, { Resolve } from './Static.js';
2
+ export { Resolve } from './Static.js';
2
3
  import { m as macro } from '../../../macros2.js';
3
4
 
4
5
  /* eslint-disable arrow-body-style */
5
6
  function addCoincidentTopologyMethods(publicAPI, model, nameList) {
6
7
  nameList.forEach(item => {
7
8
  publicAPI[`get${item.method}`] = () => model[item.key];
8
- publicAPI[`set${item.method}`] = (factor, offset) => {
9
- model[item.key] = {
10
- factor,
11
- offset
12
- };
13
- };
9
+ publicAPI[`set${item.method}`] = macro.objectSetterMap.object(publicAPI, model, {
10
+ name: item.key,
11
+ params: ['factor', 'offset']
12
+ });
14
13
  });
15
14
  }
16
15
  const CATEGORIES = ['Polygon', 'Line', 'Point'];
@@ -98,7 +97,8 @@ var CoincidentTopologyHelper = {
98
97
  implementCoincidentTopologyMethods,
99
98
  staticOffsetAPI,
100
99
  otherStaticMethods,
101
- CATEGORIES
100
+ CATEGORIES,
101
+ Resolve
102
102
  };
103
103
 
104
104
  export { CATEGORIES, CoincidentTopologyHelper as default };
@@ -1,35 +1,41 @@
1
- let resolveCoincidentTopologyPolygonOffsetFaces = 1;
2
- let resolveCoincidentTopology = 0;
1
+ const Resolve = {
2
+ Off: 0,
3
+ PolygonOffset: 1
4
+ };
5
+ let resolveCoincidentTopologyPolygonOffsetFaces = Resolve.PolygonOffset;
6
+ let resolveCoincidentTopology = Resolve.Off;
3
7
  const RESOLVE_COINCIDENT_TOPOLOGY_MODE = ['VTK_RESOLVE_OFF', 'VTK_RESOLVE_POLYGON_OFFSET'];
4
8
  function getResolveCoincidentTopologyPolygonOffsetFaces() {
5
9
  return resolveCoincidentTopologyPolygonOffsetFaces;
6
10
  }
7
11
  function setResolveCoincidentTopologyPolygonOffsetFaces(value) {
12
+ const changed = resolveCoincidentTopologyPolygonOffsetFaces === value;
8
13
  resolveCoincidentTopologyPolygonOffsetFaces = value;
14
+ return changed;
9
15
  }
10
16
  function getResolveCoincidentTopology() {
11
17
  return resolveCoincidentTopology;
12
18
  }
13
19
  function setResolveCoincidentTopology() {
14
20
  let mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
21
+ const changed = resolveCoincidentTopology === mode;
15
22
  resolveCoincidentTopology = mode;
23
+ return changed;
16
24
  }
17
25
  function setResolveCoincidentTopologyToDefault() {
18
- setResolveCoincidentTopology(0); // VTK_RESOLVE_OFF
26
+ return setResolveCoincidentTopology(Resolve.Off);
19
27
  }
20
-
21
28
  function setResolveCoincidentTopologyToOff() {
22
- setResolveCoincidentTopology(0); // VTK_RESOLVE_OFF
29
+ return setResolveCoincidentTopology(Resolve.Off);
23
30
  }
24
-
25
31
  function setResolveCoincidentTopologyToPolygonOffset() {
26
- setResolveCoincidentTopology(1); // VTK_RESOLVE_POLYGON_OFFSET
32
+ return setResolveCoincidentTopology(Resolve.PolygonOffset);
27
33
  }
28
-
29
34
  function getResolveCoincidentTopologyAsString() {
30
35
  return RESOLVE_COINCIDENT_TOPOLOGY_MODE[resolveCoincidentTopology];
31
36
  }
32
37
  var otherStaticMethods = {
38
+ Resolve,
33
39
  getResolveCoincidentTopologyAsString,
34
40
  getResolveCoincidentTopologyPolygonOffsetFaces,
35
41
  getResolveCoincidentTopology,
@@ -40,4 +46,4 @@ var otherStaticMethods = {
40
46
  setResolveCoincidentTopologyToPolygonOffset
41
47
  };
42
48
 
43
- export { RESOLVE_COINCIDENT_TOPOLOGY_MODE, otherStaticMethods as default, getResolveCoincidentTopology, getResolveCoincidentTopologyAsString, getResolveCoincidentTopologyPolygonOffsetFaces, setResolveCoincidentTopology, setResolveCoincidentTopologyPolygonOffsetFaces, setResolveCoincidentTopologyToDefault, setResolveCoincidentTopologyToOff, setResolveCoincidentTopologyToPolygonOffset };
49
+ export { RESOLVE_COINCIDENT_TOPOLOGY_MODE, Resolve, otherStaticMethods as default, getResolveCoincidentTopology, getResolveCoincidentTopologyAsString, getResolveCoincidentTopologyPolygonOffsetFaces, setResolveCoincidentTopology, setResolveCoincidentTopologyPolygonOffsetFaces, setResolveCoincidentTopologyToDefault, setResolveCoincidentTopologyToOff, setResolveCoincidentTopologyToPolygonOffset };
@@ -4,6 +4,9 @@ import vtkAbstractMapper3D, {
4
4
  } from './AbstractMapper3D';
5
5
  import { ColorMode, GetArray, ScalarMode } from './Mapper/Constants';
6
6
  import vtkDataArray from './../../Common/Core/DataArray';
7
+ import CoincidentTopologyHelper, {
8
+ StaticCoincidentTopologyMethods,
9
+ } from './Mapper/CoincidentTopologyHelper';
7
10
 
8
11
  interface IPrimitiveCount {
9
12
  points: number;
@@ -17,11 +20,6 @@ interface IAbstractScalars {
17
20
  scalars: Nullable<vtkDataArray>;
18
21
  }
19
22
 
20
- interface ICoincidentTopology {
21
- factor: number;
22
- offset: number;
23
- }
24
-
25
23
  interface IScalarToTextureCoordinate {
26
24
  texCoordS: number;
27
25
  texCoordT: number;
@@ -43,7 +41,9 @@ export interface IMapperInitialValues extends IAbstractMapper3DInitialValues {
43
41
  customShaderAttributes?: any;
44
42
  }
45
43
 
46
- export interface vtkMapper extends vtkAbstractMapper3D {
44
+ export interface vtkMapper
45
+ extends vtkAbstractMapper3D,
46
+ CoincidentTopologyHelper {
47
47
  /**
48
48
  *
49
49
  */
@@ -140,21 +140,6 @@ export interface vtkMapper extends vtkAbstractMapper3D {
140
140
  */
141
141
  getBounds(): Bounds;
142
142
 
143
- /**
144
- *
145
- */
146
- getCoincidentTopologyPolygonOffsetParameters(): ICoincidentTopology;
147
-
148
- /**
149
- *
150
- */
151
- getCoincidentTopologyLineOffsetParameters(): ICoincidentTopology;
152
-
153
- /**
154
- *
155
- */
156
- getCoincidentTopologyPointOffsetParameter(): ICoincidentTopology;
157
-
158
143
  /**
159
144
  * Get the array name to color by.
160
145
  */
@@ -515,10 +500,6 @@ export interface vtkMapper extends vtkAbstractMapper3D {
515
500
  setInterpolateScalarsBeforeMapping(
516
501
  interpolateScalarsBeforeMapping: boolean
517
502
  ): boolean;
518
-
519
- setResolveCoincidentTopologyToPolygonOffset(): boolean;
520
-
521
- setResolveCoincidentTopologyToOff(): boolean;
522
503
  }
523
504
 
524
505
  /**
@@ -540,80 +521,6 @@ export function extend(
540
521
  */
541
522
  export function newInstance(initialValues?: IMapperInitialValues): vtkMapper;
542
523
 
543
- /**
544
- *
545
- */
546
- export function getResolveCoincidentTopologyAsString(): string;
547
-
548
- /**
549
- *
550
- */
551
- export function getResolveCoincidentTopologyPolygonOffsetFaces(): ICoincidentTopology;
552
-
553
- /**
554
- *
555
- */
556
- export function getResolveCoincidentTopology(): ICoincidentTopology;
557
-
558
- /**
559
- *
560
- * @param {Number} [mode]
561
- */
562
- export function setResolveCoincidentTopology(mode?: number): boolean;
563
-
564
- /**
565
- *
566
- * @param value
567
- */
568
- export function setResolveCoincidentTopologyPolygonOffsetFaces(
569
- value: any
570
- ): boolean;
571
-
572
- /**
573
- *
574
- */
575
- export function setResolveCoincidentTopologyToDefault(): boolean;
576
-
577
- /**
578
- *
579
- */
580
- export function setResolveCoincidentTopologyToOff(): boolean;
581
-
582
- /**
583
- *
584
- */
585
- export function setResolveCoincidentTopologyToPolygonOffset(): boolean;
586
-
587
- /**
588
- *
589
- */
590
- export function getRelativeCoincidentTopologyLineOffsetParameters(): ICoincidentTopology;
591
-
592
- /**
593
- *
594
- */
595
- export function getRelativeCoincidentTopologyPointOffsetParameters(): ICoincidentTopology;
596
-
597
- /**
598
- *
599
- */
600
- export function getRelativeCoincidentTopologyPolygonOffsetParameters(): ICoincidentTopology;
601
-
602
- /**
603
- *
604
- */
605
- export function getResolveCoincidentTopologyLineOffsetParameters(): ICoincidentTopology;
606
-
607
- /**
608
- *
609
- */
610
- export function getResolveCoincidentTopologyPointOffsetParameters(): ICoincidentTopology;
611
-
612
- /**
613
- *
614
- */
615
- export function getResolveCoincidentTopologyPolygonOffsetParameters(): ICoincidentTopology;
616
-
617
524
  /**
618
525
  * vtkMapper is an abstract class to specify interface between data and
619
526
  * graphics primitives. Subclasses of vtkMapper map data through a
@@ -650,22 +557,8 @@ export function getResolveCoincidentTopologyPolygonOffsetParameters(): ICoincide
650
557
  export declare const vtkMapper: {
651
558
  newInstance: typeof newInstance;
652
559
  extend: typeof extend;
653
- getResolveCoincidentTopologyAsString: typeof getResolveCoincidentTopologyAsString;
654
- getResolveCoincidentTopologyPolygonOffsetFaces: typeof getResolveCoincidentTopologyPolygonOffsetFaces;
655
- getResolveCoincidentTopology: typeof getResolveCoincidentTopology;
656
- setResolveCoincidentTopology: typeof setResolveCoincidentTopology;
657
- setResolveCoincidentTopologyPolygonOffsetFaces: typeof setResolveCoincidentTopologyPolygonOffsetFaces;
658
- setResolveCoincidentTopologyToDefault: typeof setResolveCoincidentTopologyToDefault;
659
- setResolveCoincidentTopologyToOff: typeof setResolveCoincidentTopologyToOff;
660
- setResolveCoincidentTopologyToPolygonOffset: typeof setResolveCoincidentTopologyToPolygonOffset;
661
- getRelativeCoincidentTopologyLineOffsetParameters: typeof getRelativeCoincidentTopologyLineOffsetParameters;
662
- getRelativeCoincidentTopologyPointOffsetParameters: typeof getRelativeCoincidentTopologyPointOffsetParameters;
663
- getRelativeCoincidentTopologyPolygonOffsetParameters: typeof getRelativeCoincidentTopologyPolygonOffsetParameters;
664
- getResolveCoincidentTopologyLineOffsetParameters: typeof getResolveCoincidentTopologyLineOffsetParameters;
665
- getResolveCoincidentTopologyPointOffsetParameters: typeof getResolveCoincidentTopologyPointOffsetParameters;
666
- getResolveCoincidentTopologyPolygonOffsetParameters: typeof getResolveCoincidentTopologyPolygonOffsetParameters;
667
560
  ColorMode: typeof ColorMode;
668
561
  ScalarMode: typeof ScalarMode;
669
562
  GetArray: typeof GetArray;
670
- };
563
+ } & StaticCoincidentTopologyMethods;
671
564
  export default vtkMapper;
@@ -5,6 +5,7 @@ export declare enum BlendMode {
5
5
  AVERAGE_INTENSITY_BLEND = 3,
6
6
  ADDITIVE_INTENSITY_BLEND = 4,
7
7
  RADON_TRANSFORM_BLEND = 5,
8
+ LABELMAP_EDGE_PROJECTION_BLEND = 6,
8
9
  }
9
10
 
10
11
  export declare enum FilterMode {
@@ -4,7 +4,8 @@ const BlendMode = {
4
4
  MINIMUM_INTENSITY_BLEND: 2,
5
5
  AVERAGE_INTENSITY_BLEND: 3,
6
6
  ADDITIVE_INTENSITY_BLEND: 4,
7
- RADON_TRANSFORM_BLEND: 5
7
+ RADON_TRANSFORM_BLEND: 5,
8
+ LABELMAP_EDGE_PROJECTION_BLEND: 6
8
9
  };
9
10
  const FilterMode = {
10
11
  OFF: 0,
@@ -14,6 +14,8 @@ import vtkViewNode from '../SceneGraph/ViewNode.js';
14
14
  import { v as vtkPolyDataVS } from './glsl/vtkPolyDataVS.glsl.js';
15
15
  import { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';
16
16
  import { registerOverride } from './ViewNodeFactory.js';
17
+ import '../Core/Mapper/CoincidentTopologyHelper.js';
18
+ import { Resolve } from '../Core/Mapper/Static.js';
17
19
 
18
20
  const {
19
21
  vtkErrorMacro
@@ -68,7 +70,7 @@ function vtkOpenGLImageCPRMapper(publicAPI, model) {
68
70
  }
69
71
  };
70
72
  publicAPI.getCoincidentParameters = (ren, actor) => {
71
- if (model.renderable.getResolveCoincidentTopology()) {
73
+ if (model.renderable.getResolveCoincidentTopology() === Resolve.PolygonOffset) {
72
74
  return model.renderable.getCoincidentTopologyPolygonOffsetParameters();
73
75
  }
74
76
  return null;
@@ -14,7 +14,9 @@ import { InterpolationType } from '../Core/ImageProperty/Constants.js';
14
14
  import { v as vtkPolyDataVS } from './glsl/vtkPolyDataVS.glsl.js';
15
15
  import { v as vtkPolyDataFS } from './glsl/vtkPolyDataFS.glsl.js';
16
16
  import vtkReplacementShaderMapper from './ReplacementShaderMapper.js';
17
+ import '../Core/Mapper/CoincidentTopologyHelper.js';
17
18
  import { registerOverride } from './ViewNodeFactory.js';
19
+ import { Resolve } from '../Core/Mapper/Static.js';
18
20
 
19
21
  const {
20
22
  vtkErrorMacro
@@ -103,7 +105,10 @@ function vtkOpenGLImageMapper(publicAPI, model) {
103
105
  }
104
106
  };
105
107
  publicAPI.getCoincidentParameters = (ren, actor) => {
106
- if (model.renderable.getResolveCoincidentTopology()) {
108
+ if (
109
+ // backwards compat with code that (errorneously) set this to boolean
110
+ // eslint-disable-next-line eqeqeq
111
+ model.renderable.getResolveCoincidentTopology() == Resolve.PolygonOffset) {
107
112
  return model.renderable.getCoincidentTopologyPolygonOffsetParameters();
108
113
  }
109
114
  return null;
@@ -202,7 +207,7 @@ function vtkOpenGLImageMapper(publicAPI, model) {
202
207
  case 1:
203
208
  FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TCoord::Impl', [...splitStringOnEnter(`
204
209
  #ifdef vtkImageLabelOutlineOn
205
- vec3 centerPosIS = fragCoordToIndexSpace(gl_FragCoord);
210
+ vec3 centerPosIS = fragCoordToIndexSpace(gl_FragCoord);
206
211
  float centerValue = texture2D(texture1, centerPosIS.xy).r;
207
212
  bool pixelOnBorder = false;
208
213
  vec3 tColor = texture2D(colorTexture1, vec2(centerValue * cscale0 + cshift0, 0.5)).rgb;
@@ -20,6 +20,8 @@ import { InterpolationType } from '../Core/ImageProperty/Constants.js';
20
20
  import { Representation } from '../Core/Property/Constants.js';
21
21
  import { VtkDataTypes } from '../../Common/Core/DataArray/Constants.js';
22
22
  import { registerOverride } from './ViewNodeFactory.js';
23
+ import '../Core/Mapper/CoincidentTopologyHelper.js';
24
+ import { Resolve } from '../Core/Mapper/Static.js';
23
25
 
24
26
  const {
25
27
  vtkErrorMacro
@@ -94,7 +96,10 @@ function vtkOpenGLImageResliceMapper(publicAPI, model) {
94
96
  }
95
97
  };
96
98
  publicAPI.getCoincidentParameters = (ren, actor) => {
97
- if (model.renderable.getResolveCoincidentTopology()) {
99
+ if (
100
+ // backwards compat with code that (errorneously) set this to boolean
101
+ // eslint-disable-next-line eqeqeq
102
+ model.renderable.getResolveCoincidentTopology() == Resolve.PolygonOffset) {
98
103
  return model.renderable.getCoincidentTopologyPolygonOffsetParameters();
99
104
  }
100
105
  return null;
@@ -14,6 +14,8 @@ import vtkReplacementShaderMapper from './ReplacementShaderMapper.js';
14
14
  import { registerOverride } from './ViewNodeFactory.js';
15
15
  import { PassTypes } from './HardwareSelector/Constants.js';
16
16
  import vtkDataSet from '../../Common/DataModel/DataSet.js';
17
+ import '../Core/Mapper/CoincidentTopologyHelper.js';
18
+ import { Resolve } from '../Core/Mapper/Static.js';
17
19
 
18
20
  const {
19
21
  FieldAssociations
@@ -391,7 +393,10 @@ function vtkOpenGLPolyDataMapper(publicAPI, model) {
391
393
  offset: 0.0
392
394
  };
393
395
  const prop = actor.getProperty();
394
- if (model.renderable.getResolveCoincidentTopology() || prop.getEdgeVisibility() && prop.getRepresentation() === Representation.SURFACE) {
396
+ if (
397
+ // backwards compat with code that (errorneously) set this to boolean
398
+ // eslint-disable-next-line eqeqeq
399
+ model.renderable.getResolveCoincidentTopology() == Resolve.PolygonOffset || prop.getEdgeVisibility() && prop.getRepresentation() === Representation.SURFACE) {
395
400
  const primType = model.lastBoundBO.getPrimitiveType();
396
401
  if (primType === primTypes.Points || prop.getRepresentation() === Representation.POINTS) {
397
402
  cp = model.renderable.getCoincidentTopologyPointOffsetParameter();
@@ -175,10 +175,14 @@ function vtkOpenGLVolumeMapper(publicAPI, model) {
175
175
  if (iType === InterpolationType.LINEAR) {
176
176
  FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::TrilinearOn', '#define vtkTrilinearOn').result;
177
177
  }
178
- const vtkImageLabelOutline = actorProps.getUseLabelOutline();
178
+ const vtkImageLabelOutline = publicAPI.isLabelmapOutlineRequired(actor);
179
179
  if (vtkImageLabelOutline === true) {
180
180
  FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::ImageLabelOutlineOn', '#define vtkImageLabelOutlineOn').result;
181
181
  }
182
+ const LabelEdgeProjection = model.renderable.getBlendMode() === BlendMode.LABELMAP_EDGE_PROJECTION_BLEND;
183
+ if (LabelEdgeProjection) {
184
+ FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::LabelEdgeProjectionOn', '#define vtkLabelEdgeProjectionOn').result;
185
+ }
182
186
  const numComp = model.scalarTexture.getComponents();
183
187
  FSSource = vtkShaderProgram.substitute(FSSource, '//VTK::NumComponents', `#define vtkNumComponents ${numComp}`).result;
184
188
  const useIndependentComps = publicAPI.useIndependentComponents(actorProps);
@@ -350,7 +354,7 @@ function vtkOpenGLVolumeMapper(publicAPI, model) {
350
354
  iComps: actorProps.getIndependentComponents(),
351
355
  colorMixPreset: actorProps.getColorMixPreset(),
352
356
  interpolationType: actorProps.getInterpolationType(),
353
- useLabelOutline: actorProps.getUseLabelOutline(),
357
+ useLabelOutline: publicAPI.isLabelmapOutlineRequired(actor),
354
358
  numComp,
355
359
  maxSamples,
356
360
  useGradientOpacity: actorProps.getUseGradientOpacity(0),
@@ -512,6 +516,7 @@ function vtkOpenGLVolumeMapper(publicAPI, model) {
512
516
  vec3.divide(vctoijk, vctoijk, vsize);
513
517
  program.setUniform3f('vVCToIJK', vctoijk[0], vctoijk[1], vctoijk[2]);
514
518
  program.setUniform3i('volumeDimensions', dims[0], dims[1], dims[2]);
519
+ program.setUniform3f('volumeSpacings', spc[0], spc[1], spc[2]);
515
520
  if (!model._openGLRenderWindow.getWebgl2()) {
516
521
  const volInfo = model.scalarTexture.getVolumeInfo();
517
522
  program.setUniformf('texWidth', model.scalarTexture.getWidth());
@@ -562,7 +567,7 @@ function vtkOpenGLVolumeMapper(publicAPI, model) {
562
567
  program.setUniform3f(`vPlaneNormal${i}`, normal[0], normal[1], normal[2]);
563
568
  program.setUniformf(`vPlaneDistance${i}`, dist);
564
569
  }
565
- if (actor.getProperty().getUseLabelOutline()) {
570
+ if (publicAPI.isLabelmapOutlineRequired(actor)) {
566
571
  const image = model.currentInput;
567
572
  const worldToIndex = image.getWorldToIndex();
568
573
  program.setUniformMatrix('vWCtoIDX', worldToIndex);
@@ -750,7 +755,7 @@ function vtkOpenGLVolumeMapper(publicAPI, model) {
750
755
  program.setUniformf('goshift0', -goRange[0] * (gomax - gomin) / (goRange[1] - goRange[0]) + gomin);
751
756
  }
752
757
  }
753
- const vtkImageLabelOutline = actor.getProperty().getUseLabelOutline();
758
+ const vtkImageLabelOutline = publicAPI.isLabelmapOutlineRequired(actor);
754
759
  if (vtkImageLabelOutline === true) {
755
760
  const labelOutlineOpacity = actor.getProperty().getLabelOutlineOpacity();
756
761
  program.setUniformf('outlineOpacity', labelOutlineOpacity);
@@ -1252,6 +1257,11 @@ function vtkOpenGLVolumeMapper(publicAPI, model) {
1252
1257
  model.labelOutlineThicknessTexture = lTex.oglObject;
1253
1258
  }
1254
1259
  };
1260
+ publicAPI.isLabelmapOutlineRequired = actor => {
1261
+ const prop = actor.getProperty();
1262
+ const renderable = model.renderable;
1263
+ return prop.getUseLabelOutline() || renderable.getBlendMode() === BlendMode.LABELMAP_EDGE_PROJECTION_BLEND;
1264
+ };
1255
1265
  }
1256
1266
 
1257
1267
  // ----------------------------------------------------------------------------