@kitware/vtk.js 33.2.0 → 34.0.0-beta.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.
Files changed (45) hide show
  1. package/BREAKING_CHANGES.md +10 -0
  2. package/Interaction/Manipulators/KeyboardCameraManipulator.d.ts +113 -0
  3. package/Rendering/Core/Actor.d.ts +5 -20
  4. package/Rendering/Core/Actor.js +5 -68
  5. package/Rendering/Core/ImageCPRMapper.d.ts +1 -20
  6. package/Rendering/Core/ImageCPRMapper.js +1 -2
  7. package/Rendering/Core/ImageProperty.d.ts +20 -1
  8. package/Rendering/Core/ImageProperty.js +7 -5
  9. package/Rendering/Core/ImageResliceMapper.d.ts +1 -20
  10. package/Rendering/Core/ImageResliceMapper.js +1 -2
  11. package/Rendering/Core/ImageSlice.d.ts +7 -23
  12. package/Rendering/Core/ImageSlice.js +9 -68
  13. package/Rendering/Core/Prop3D.d.ts +39 -2
  14. package/Rendering/Core/Prop3D.js +81 -2
  15. package/Rendering/Core/RenderWindowInteractor.d.ts +6 -0
  16. package/Rendering/Core/RenderWindowInteractor.js +7 -5
  17. package/Rendering/Core/Volume.d.ts +5 -20
  18. package/Rendering/Core/Volume.js +2 -70
  19. package/Rendering/Core/VolumeMapper/Constants.d.ts +0 -7
  20. package/Rendering/Core/VolumeMapper/Constants.js +2 -8
  21. package/Rendering/Core/VolumeMapper.d.ts +16 -173
  22. package/Rendering/Core/VolumeMapper.js +16 -51
  23. package/Rendering/Core/VolumeProperty/Constants.d.ts +12 -3
  24. package/Rendering/Core/VolumeProperty/Constants.js +11 -4
  25. package/Rendering/Core/VolumeProperty.d.ts +140 -5
  26. package/Rendering/Core/VolumeProperty.js +54 -7
  27. package/Rendering/OpenGL/Framebuffer.js +7 -1
  28. package/Rendering/OpenGL/ImageCPRMapper.js +72 -27
  29. package/Rendering/OpenGL/ImageMapper.js +71 -33
  30. package/Rendering/OpenGL/ImageResliceMapper.js +306 -183
  31. package/Rendering/OpenGL/OrderIndependentTranslucentPass.js +20 -3
  32. package/Rendering/OpenGL/PolyDataMapper.js +8 -9
  33. package/Rendering/OpenGL/RenderWindow/resourceSharingHelper.d.ts +3 -3
  34. package/Rendering/OpenGL/RenderWindow/resourceSharingHelper.js +8 -5
  35. package/Rendering/OpenGL/SurfaceLIC/LineIntegralConvolution2D/pingpong.js +7 -1
  36. package/Rendering/OpenGL/SurfaceLIC/SurfaceLICInterface.js +20 -3
  37. package/Rendering/OpenGL/Texture.d.ts +110 -62
  38. package/Rendering/OpenGL/Texture.js +145 -37
  39. package/Rendering/OpenGL/VolumeMapper.js +763 -783
  40. package/Rendering/OpenGL/glsl/vtkVolumeFS.glsl.js +1 -1
  41. package/Rendering/WebGPU/VolumePassFSQ.js +2 -2
  42. package/index.d.ts +1 -0
  43. package/macros.js +1 -1
  44. package/macros2.js +8 -3
  45. package/package.json +1 -1
@@ -1,3 +1,13 @@
1
+ ## From 33.x to 34
2
+
3
+ - **vtkMapper**: many properties have moved to `vtkVolumeProperty`. The full list of changed methods is: `getAnisotropy`, `getComputeNormalFromOpacity`, `getFilterMode`, `getFilterModeAsString`, `getGlobalIlluminationReach`, `getIpScalarRange`, `getIpScalarRangeByReference`, `getLAOKernelRadius`, `getLAOKernelSize`, `getLocalAmbientOcclusion`, `getPreferSizeOverAccuracy`, `getVolumetricScatteringBlending`, `setAnisotropy`, `setAverageIPScalarRange`, `setComputeNormalFromOpacity`, `setFilterMode`, `setFilterModeToNormalized`, `setFilterModeToOff`, `setFilterModeToRaw`, `setGlobalIlluminationReach`, `setIpScalarRange`, `setIpScalarRangeFrom`, `setLAOKernelRadius`, `setLAOKernelSize`, `setLocalAmbientOcclusion`, `setPreferSizeOverAccuracy`, `setVolumetricScatteringBlending`.
4
+ - **vtkRenderWindowInteractor**: KeyPress, KeyDown and KeyUp events are now observed on the container and no longer on the document. "tabIndex=0" is now automatically added on RWI containers to give focus on your render windows and catch key events. Check the KeyPressEvents example for usage.
5
+ - **vtkOpenGLTexture**: The public `create2D*` and `create3D*` methods used to have positional parameters. These methods now use named parameters via passing in an object record.
6
+
7
+ ## From 32.x to 33
8
+
9
+ - **vtkColorTransferFunction**, **vtkMapper**: Previous log scaling was disabled but functionality is now quite different from what it maybe was before it was disabled. ColorTransfer function now maps the model.nodes in logarithmic scales so there's an even spacing between powers of ten.
10
+
1
11
  ## From 31.x to 32
2
12
 
3
13
  - **vtkMapper**: remove `mapScalarsToTexture` from the public API. The function becomes protected and its API changes. This shouldn't cause any issue in most cases.
@@ -0,0 +1,113 @@
1
+ import { Vector3 } from './../../types';
2
+ import { vtkObject } from './../../interfaces';
3
+ import vtkCompositeKeyboardManipulator from './CompositeKeyboardManipulator';
4
+ import vtkRenderWindowInteractor from './../../Rendering/Core/RenderWindowInteractor';
5
+ import vtkCamera from './../../Rendering/Core/Camera';
6
+ import vtkRenderer from './../../Rendering/Core/Renderer';
7
+
8
+ export interface vtkKeyboardCameraManipulator
9
+ extends vtkObject,
10
+ vtkCompositeKeyboardManipulator {
11
+ /**
12
+ * Returns whether a movement is ongoing.
13
+ */
14
+ inMotion(): boolean;
15
+
16
+ /**
17
+ * Reset the movement speed to be proportional to the longest length of the renderer's bounds.
18
+ */
19
+ resetMovementSpeed(): void;
20
+
21
+ /**
22
+ * Initialize a movement of the current camera.
23
+ */
24
+ startMovement(): void;
25
+
26
+ /**
27
+ * Cancel any ongoing camera movement.
28
+ */
29
+ endMovement(): void;
30
+
31
+ /**
32
+ * Update active camera direction, depending on currently pressed keys.
33
+ */
34
+ calculateCurrentDirection(): void;
35
+
36
+ /**
37
+ * Returns the direction vector of the given camera for the given key.
38
+ * @param key the movedkey
39
+ * @param camera the camera
40
+ */
41
+ getDirectionFromKey(key: KeyboardEvent['key'], camera: vtkCamera): Vector3;
42
+
43
+ /**
44
+ * Moves the given camera, in the given direction, at the given speed.
45
+ * @param camera the moved camera
46
+ * @param direction the direction of the movemnt
47
+ * @param speed the speed
48
+ */
49
+ moveCamera(camera: vtkCamera, direction: Vector3, speed: number): void;
50
+
51
+ /**
52
+ * Handles a keypress event.
53
+ * @param interactor the interactor
54
+ * @param renderer the renderer
55
+ * @param key the key
56
+ */
57
+ onKeyPress(
58
+ interactor: vtkRenderWindowInteractor,
59
+ renderer: vtkRenderer,
60
+ key: KeyboardEvent['key']
61
+ ): void;
62
+
63
+ /**
64
+ * Handles a keydown event.
65
+ * @param interactor the interactor
66
+ * @param renderer the renderer
67
+ * @param key the key
68
+ */
69
+ onKeyDown(
70
+ interactor: vtkRenderWindowInteractor,
71
+ renderer: vtkRenderer,
72
+ key: KeyboardEvent['key']
73
+ ): void;
74
+
75
+ /**
76
+ * Handles a keyup event.
77
+ * @param interactor the interactor
78
+ * @param renderer the renderer
79
+ * @param key the key
80
+ */
81
+ onKeyUp(
82
+ interactor: vtkRenderWindowInteractor,
83
+ renderer: vtkRenderer,
84
+ key: KeyboardEvent['key']
85
+ ): void;
86
+ }
87
+
88
+ export interface IKeyboardCameraManipulatorInitialValues {
89
+ movementSpeed?: number;
90
+ moveForwardKeys?: KeyboardEvent['key'][];
91
+ moveLeftKeys?: KeyboardEvent['key'][];
92
+ moveBackwardKeys?: KeyboardEvent['key'][];
93
+ moveRightKeys?: KeyboardEvent['key'][];
94
+ moveUpKeys?: KeyboardEvent['key'][];
95
+ moveDownKeys?: KeyboardEvent['key'][];
96
+ }
97
+
98
+ export function newInstance(
99
+ initialValues?: IKeyboardCameraManipulatorInitialValues
100
+ ): vtkKeyboardCameraManipulator;
101
+
102
+ export function extend(
103
+ publicAPI: object,
104
+ model: object,
105
+ initialValues?: IKeyboardCameraManipulatorInitialValues
106
+ ): void;
107
+
108
+ export const vtkKeyboardCameraManipulator: {
109
+ newInstance: typeof newInstance;
110
+ extend: typeof extend;
111
+ };
112
+
113
+ export default vtkKeyboardCameraManipulator;
@@ -36,12 +36,6 @@ export interface vtkActor extends vtkProp3D {
36
36
  */
37
37
  getBackfaceProperty(): vtkProperty;
38
38
 
39
- /**
40
- * Get the bounds for this mapper as [xmin, xmax, ymin, ymax,zmin, zmax].
41
- * @return {Bounds} The bounds for the mapper.
42
- */
43
- getBounds(): Bounds;
44
-
45
39
  /**
46
40
  * Check whether the opaque is forced or not.
47
41
  */
@@ -63,16 +57,6 @@ export interface vtkActor extends vtkProp3D {
63
57
  */
64
58
  getMapper(): Nullable<vtkMapper>;
65
59
 
66
- /**
67
- * Get the property object that controls this actors surface
68
- * properties. This should be an instance of a vtkProperty object. Every
69
- * actor must have a property associated with it. If one isn’t specified,
70
- * then one will be generated automatically. Multiple actors can share one
71
- * property object.
72
- * @return {vtkProperty} The property object
73
- */
74
- getProperty(): vtkProperty;
75
-
76
60
  /**
77
61
  * Check whether if the actor supports selection
78
62
  * @return {Boolean} true if the actor support selection.
@@ -111,11 +95,12 @@ export interface vtkActor extends vtkProp3D {
111
95
  */
112
96
  setMapper(mapper: vtkMapper): boolean;
113
97
 
114
- /**
115
- * Set the property object that controls this actors surface properties.
116
- * @param {vtkProperty} property The vtkProperty instance.
117
- */
98
+ // Inherited from vtkProp3D, but takes a vtkProperty instead of a generic vtkObject
99
+ getProperty(mapperInputPort?: number): vtkProperty;
100
+ getProperties(): vtkProperty[];
101
+ setProperty(mapperInputPort: number, property: vtkProperty): boolean;
118
102
  setProperty(property: vtkProperty): boolean;
103
+ setProperties(properties: vtkProperty[]): boolean;
119
104
  }
120
105
 
121
106
  /**
@@ -1,13 +1,7 @@
1
- import { mat4, vec3 } from 'gl-matrix';
2
1
  import { m as macro } from '../../macros2.js';
3
- import vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';
4
2
  import vtkProp3D from './Prop3D.js';
5
3
  import vtkProperty from './Property.js';
6
4
 
7
- const {
8
- vtkDebugMacro
9
- } = macro;
10
-
11
5
  // ----------------------------------------------------------------------------
12
6
  // vtkActor methods
13
7
  // ----------------------------------------------------------------------------
@@ -29,11 +23,11 @@ function vtkActor(publicAPI, model) {
29
23
  return false;
30
24
  }
31
25
  // make sure we have a property
32
- if (!model.property) {
26
+ if (!model.properties[0]) {
33
27
  // force creation of a property
34
28
  publicAPI.getProperty();
35
29
  }
36
- let isOpaque = model.property.getOpacity() >= 1.0;
30
+ let isOpaque = model.properties[0].getOpacity() >= 1.0;
37
31
 
38
32
  // are we using an opaque texture, if any?
39
33
  isOpaque = isOpaque && (!model.texture || !model.texture.isTranslucent());
@@ -47,71 +41,17 @@ function vtkActor(publicAPI, model) {
47
41
  return false;
48
42
  }
49
43
  // make sure we have a property
50
- if (model.property === null) {
44
+ if (!model.properties[0]) {
51
45
  // force creation of a property
52
- publicAPI.setProperty(publicAPI.makeProperty());
46
+ publicAPI.getProperty();
53
47
  }
54
48
 
55
49
  // is this actor opaque ?
56
50
  return !publicAPI.getIsOpaque();
57
51
  };
58
52
  publicAPI.makeProperty = vtkProperty.newInstance;
59
- publicAPI.getProperty = () => {
60
- if (model.property === null) {
61
- model.property = publicAPI.makeProperty();
62
- }
63
- return model.property;
64
- };
65
- publicAPI.getBounds = () => {
66
- if (model.mapper === null) {
67
- return model.bounds;
68
- }
69
-
70
- // Check for the special case when the mapper's bounds are unknown
71
- const bds = model.mapper.getBounds();
72
- if (!bds || bds.length !== 6) {
73
- return bds;
74
- }
75
-
76
- // Check for the special case when the actor is empty.
77
- if (bds[0] > bds[1]) {
78
- model.mapperBounds = bds.concat(); // copy the mapper's bounds
79
- model.bounds = [1, -1, 1, -1, 1, -1];
80
- model.boundsMTime.modified();
81
- return bds;
82
- }
83
-
84
- // Check if we have cached values for these bounds - we cache the
85
- // values returned by model.mapper.getBounds() and we store the time
86
- // of caching. If the values returned this time are different, or
87
- // the modified time of this class is newer than the cached time,
88
- // then we need to rebuild.
89
- if (!model.mapperBounds || bds[0] !== model.mapperBounds[0] || bds[1] !== model.mapperBounds[1] || bds[2] !== model.mapperBounds[2] || bds[3] !== model.mapperBounds[3] || bds[4] !== model.mapperBounds[4] || bds[5] !== model.mapperBounds[5] || publicAPI.getMTime() > model.boundsMTime.getMTime()) {
90
- vtkDebugMacro('Recomputing bounds...');
91
- model.mapperBounds = bds.concat(); // copy the mapper's bounds
92
- const bbox = [];
93
- vtkBoundingBox.getCorners(bds, bbox);
94
- publicAPI.computeMatrix();
95
- const tmp4 = new Float64Array(16);
96
- mat4.transpose(tmp4, model.matrix);
97
- bbox.forEach(pt => vec3.transformMat4(pt, pt, tmp4));
98
-
99
- /* eslint-disable no-multi-assign */
100
- model.bounds[0] = model.bounds[2] = model.bounds[4] = Number.MAX_VALUE;
101
- model.bounds[1] = model.bounds[3] = model.bounds[5] = -Number.MAX_VALUE;
102
- /* eslint-enable no-multi-assign */
103
-
104
- model.bounds = model.bounds.map((d, i) => i % 2 === 0 ? bbox.reduce((a, b) => a > b[i / 2] ? b[i / 2] : a, d) : bbox.reduce((a, b) => a < b[(i - 1) / 2] ? b[(i - 1) / 2] : a, d));
105
- model.boundsMTime.modified();
106
- }
107
- return model.bounds;
108
- };
109
53
  publicAPI.getMTime = () => {
110
54
  let mt = superClass.getMTime();
111
- if (model.property !== null) {
112
- const time = model.property.getMTime();
113
- mt = time > mt ? time : mt;
114
- }
115
55
  if (model.backfaceProperty !== null) {
116
56
  const time = model.backfaceProperty.getMTime();
117
57
  mt = time > mt ? time : mt;
@@ -146,11 +86,9 @@ function vtkActor(publicAPI, model) {
146
86
 
147
87
  const DEFAULT_VALUES = {
148
88
  mapper: null,
149
- property: null,
150
89
  backfaceProperty: null,
151
90
  forceOpaque: false,
152
- forceTranslucent: false,
153
- bounds: [1, -1, 1, -1, 1, -1]
91
+ forceTranslucent: false
154
92
  };
155
93
 
156
94
  // ----------------------------------------------------------------------------
@@ -167,7 +105,6 @@ function extend(publicAPI, model) {
167
105
  macro.obj(model.boundsMTime);
168
106
 
169
107
  // Build VTK API
170
- macro.set(publicAPI, model, ['property']);
171
108
  macro.setGet(publicAPI, model, ['backfaceProperty', 'forceOpaque', 'forceTranslucent', 'mapper']);
172
109
 
173
110
  // Object methods
@@ -1,5 +1,5 @@
1
1
  import { mat3, mat4, quat, vec3 } from 'gl-matrix';
2
- import { Extent, Nullable } from './../../types';
2
+ import { Nullable } from './../../types';
3
3
  import { vtkOutputPort } from './../../interfaces';
4
4
  import {
5
5
  vtkAbstractMapper3D,
@@ -309,25 +309,6 @@ export interface vtkImageCPRMapper
309
309
  * @param imageData
310
310
  */
311
311
  setImageConnection(imageData: vtkOutputPort): void;
312
-
313
- /**
314
- * Tells the mapper to only update the specified extents.
315
- *
316
- * If there are zero extents, the mapper updates the entire volume texture.
317
- * Otherwise, the mapper will only update the texture by the specified extents
318
- * during the next render call.
319
- *
320
- * This array is cleared after a successful render.
321
- * @param extents
322
- */
323
- setUpdatedExtents(extents: Extent[]): boolean;
324
-
325
- /**
326
- * Retrieves the updated extents.
327
- *
328
- * This array is cleared after every successful render.
329
- */
330
- getUpdatedExtents(): Extent[];
331
312
  }
332
313
 
333
314
  /**
@@ -283,7 +283,6 @@ const defaultValues = initialValues => ({
283
283
  projectionSlabThickness: 1,
284
284
  projectionSlabNumberOfSamples: 1,
285
285
  projectionMode: ProjectionMode.MAX,
286
- updatedExtents: [],
287
286
  ...initialValues
288
287
  });
289
288
 
@@ -304,7 +303,7 @@ function extend(publicAPI, model) {
304
303
  });
305
304
 
306
305
  // Setters and getters
307
- macro.setGet(publicAPI, model, ['width', 'uniformOrientation', 'useUniformOrientation', 'centerPoint', 'preferSizeOverAccuracy', 'orientationArrayName', 'tangentDirection', 'bitangentDirection', 'normalDirection', 'projectionSlabThickness', 'projectionSlabNumberOfSamples', 'projectionMode', 'updatedExtents']);
306
+ macro.setGet(publicAPI, model, ['width', 'uniformOrientation', 'useUniformOrientation', 'centerPoint', 'preferSizeOverAccuracy', 'orientationArrayName', 'tangentDirection', 'bitangentDirection', 'normalDirection', 'projectionSlabThickness', 'projectionSlabNumberOfSamples', 'projectionMode']);
308
307
  CoincidentTopologyHelper.implementCoincidentTopologyMethods(publicAPI, model);
309
308
 
310
309
  // Object methods
@@ -1,5 +1,5 @@
1
1
  import { vtkObject } from './../../interfaces';
2
- import { Nullable } from './../../types';
2
+ import { Extent, Nullable } from './../../types';
3
3
  import vtkColorTransferFunction from './ColorTransferFunction';
4
4
  import vtkPiecewiseFunction from './../../Common/DataModel/PiecewiseFunction';
5
5
  import { InterpolationType } from './ImageProperty/Constants';
@@ -231,6 +231,25 @@ export interface vtkImageProperty extends vtkObject {
231
231
  * @param {Boolean} useLookupTableScalarRange
232
232
  */
233
233
  setUseLookupTableScalarRange(useLookupTableScalarRange: boolean): boolean;
234
+
235
+ /**
236
+ * Informs the mapper to only update the specified extents at the next render.
237
+ *
238
+ * If there are zero extents, the mapper updates the entire volume texture.
239
+ * Otherwise, the mapper will only update the texture by the specified extents
240
+ * during the next render call.
241
+ *
242
+ * This array is cleared after a successful render.
243
+ * @param extents
244
+ */
245
+ setUpdatedExtents(extents: Extent[]): boolean;
246
+
247
+ /**
248
+ * Retrieves the updated extents.
249
+ *
250
+ * This array is cleared after every successful render.
251
+ */
252
+ getUpdatedExtents(): Extent[];
234
253
  }
235
254
 
236
255
  /**
@@ -136,7 +136,7 @@ function vtkImageProperty(publicAPI, model) {
136
136
  // ----------------------------------------------------------------------------
137
137
  // Object factory
138
138
  // ----------------------------------------------------------------------------
139
- const DEFAULT_VALUES = {
139
+ const defaultValues = initialValues => ({
140
140
  independentComponents: false,
141
141
  interpolationType: InterpolationType.LINEAR,
142
142
  colorWindow: 255,
@@ -147,14 +147,16 @@ const DEFAULT_VALUES = {
147
147
  useLookupTableScalarRange: false,
148
148
  useLabelOutline: false,
149
149
  labelOutlineThickness: [1],
150
- labelOutlineOpacity: 1.0
151
- };
150
+ labelOutlineOpacity: 1.0,
151
+ updatedExtents: [],
152
+ ...initialValues
153
+ });
152
154
 
153
155
  // ----------------------------------------------------------------------------
154
156
 
155
157
  function extend(publicAPI, model) {
156
158
  let initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
157
- Object.assign(model, DEFAULT_VALUES, initialValues);
159
+ Object.assign(model, defaultValues(initialValues));
158
160
 
159
161
  // Build VTK API
160
162
  macro.obj(publicAPI, model);
@@ -168,7 +170,7 @@ function extend(publicAPI, model) {
168
170
  });
169
171
  }
170
172
  }
171
- macro.setGet(publicAPI, model, ['independentComponents', 'interpolationType', 'colorWindow', 'colorLevel', 'ambient', 'diffuse', 'opacity', 'useLookupTableScalarRange', 'useLabelOutline', 'labelOutlineOpacity']);
173
+ macro.setGet(publicAPI, model, ['independentComponents', 'interpolationType', 'colorWindow', 'colorLevel', 'ambient', 'diffuse', 'opacity', 'useLookupTableScalarRange', 'useLabelOutline', 'labelOutlineOpacity', 'updatedExtents']);
172
174
  macro.setGetArray(publicAPI, model, ['labelOutlineThickness']);
173
175
 
174
176
  // Object methods
@@ -4,7 +4,7 @@ import {
4
4
  } from './AbstractImageMapper';
5
5
  import { vtkPlane } from './../../Common/DataModel/Plane';
6
6
  import { vtkPolyData } from './../../Common/DataModel/PolyData';
7
- import { Bounds, Extent } from './../../types';
7
+ import { Bounds } from './../../types';
8
8
  import { SlabTypes } from './ImageResliceMapper/Constants';
9
9
  import {
10
10
  CoincidentTopologyHelper,
@@ -117,25 +117,6 @@ export interface vtkImageResliceMapper
117
117
  * @param {vtkPolyData} slicePolyData The polydata to slice the volume with. Default: null
118
118
  */
119
119
  setSlicePolyData(slicePolyData: vtkPolyData): boolean;
120
-
121
- /**
122
- * Tells the mapper to only update the specified extents.
123
- *
124
- * If there are zero extents, the mapper updates the entire volume texture.
125
- * Otherwise, the mapper will only update the texture by the specified extents
126
- * during the next render call.
127
- *
128
- * This array is cleared after a successful render.
129
- * @param extents
130
- */
131
- setUpdatedExtents(extents: Extent[]): boolean;
132
-
133
- /**
134
- * Retrieves the updated extents.
135
- *
136
- * This array is cleared after every successful render.
137
- */
138
- getUpdatedExtents(): Extent[];
139
120
  }
140
121
 
141
122
  /**
@@ -44,7 +44,6 @@ const defaultValues = initialValues => ({
44
44
  slabType: SlabTypes.MEAN,
45
45
  slicePlane: null,
46
46
  slicePolyData: null,
47
- updatedExtents: [],
48
47
  ...initialValues
49
48
  });
50
49
 
@@ -56,7 +55,7 @@ function extend(publicAPI, model) {
56
55
 
57
56
  // Build VTK API
58
57
  vtkAbstractImageMapper.extend(publicAPI, model, initialValues);
59
- macro.setGet(publicAPI, model, ['slabThickness', 'slabTrapezoidIntegration', 'slabType', 'slicePlane', 'slicePolyData', 'updatedExtents']);
58
+ macro.setGet(publicAPI, model, ['slabThickness', 'slabTrapezoidIntegration', 'slabType', 'slicePlane', 'slicePolyData']);
60
59
  CoincidentTopologyHelper.implementCoincidentTopologyMethods(publicAPI, model);
61
60
 
62
61
  // Object methods
@@ -17,18 +17,6 @@ export interface vtkImageSlice extends vtkProp3D {
17
17
  */
18
18
  getActors(): any;
19
19
 
20
- /**
21
- * Get the bounds for this mapper as [xmin, xmax, ymin, ymax,zmin, zmax].
22
- * @return {Bounds} The bounds for the mapper.
23
- */
24
- getBounds(): Bounds;
25
-
26
- /**
27
- * Get the bounds for this mapper as [xmin, xmax, ymin, ymax,zmin, zmax].
28
- * @return {Bounds} The bounds for the mapper.
29
- */
30
- getBoundsByReference(): Bounds;
31
-
32
20
  /**
33
21
  * Get the bounds for a given slice as [xmin, xmax, ymin, ymax,zmin, zmax].
34
22
  * @param {Number} slice The slice index. If undefined, the current slice is considered.
@@ -47,11 +35,6 @@ export interface vtkImageSlice extends vtkProp3D {
47
35
  */
48
36
  getIsOpaque(): boolean;
49
37
 
50
- /**
51
- *
52
- */
53
- getProperty(): vtkImageProperty;
54
-
55
38
  /**
56
39
  *
57
40
  */
@@ -130,12 +113,6 @@ export interface vtkImageSlice extends vtkProp3D {
130
113
  */
131
114
  setMapper(mapper: vtkAbstractImageMapper): boolean;
132
115
 
133
- /**
134
- *
135
- * @param {vtkImageProperty} property The vtkImageProperty instance.
136
- */
137
- setProperty(property: vtkImageProperty): boolean;
138
-
139
116
  /**
140
117
  *
141
118
  * @param {boolean} forceOpaque If true, render during opaque pass even if opacity value is below 1.0.
@@ -147,6 +124,13 @@ export interface vtkImageSlice extends vtkProp3D {
147
124
  * @param {boolean} forceTranslucent If true, render during translucent pass even if opacity value is 1.0.
148
125
  */
149
126
  setForceTranslucent(forceTranslucent: boolean): boolean;
127
+
128
+ // Inherited from vtkProp3D, but takes a vtkImageProperty instead of a generic vtkObject
129
+ getProperty(mapperInputPort?: number): vtkImageProperty;
130
+ getProperties(): vtkImageProperty[];
131
+ setProperty(mapperInputPort: number, property: vtkImageProperty): boolean;
132
+ setProperty(property: vtkImageProperty): boolean;
133
+ setProperties(properties: vtkImageProperty[]): boolean;
150
134
  }
151
135
 
152
136
  /**
@@ -4,10 +4,6 @@ import vtkBoundingBox from '../../Common/DataModel/BoundingBox.js';
4
4
  import vtkProp3D from './Prop3D.js';
5
5
  import vtkImageProperty from './ImageProperty.js';
6
6
 
7
- const {
8
- vtkDebugMacro
9
- } = macro;
10
-
11
7
  // ----------------------------------------------------------------------------
12
8
  // vtkImageSlice methods
13
9
  // ----------------------------------------------------------------------------
@@ -25,11 +21,11 @@ function vtkImageSlice(publicAPI, model) {
25
21
  return false;
26
22
  }
27
23
  // make sure we have a property
28
- if (!model.property) {
24
+ if (!model.properties[0]) {
29
25
  // force creation of a property
30
26
  publicAPI.getProperty();
31
27
  }
32
- let isOpaque = model.property.getOpacity() >= 1.0;
28
+ let isOpaque = model.properties[0].getOpacity() >= 1.0;
33
29
 
34
30
  // are we using an opaque scalar array, if any?
35
31
  isOpaque = isOpaque && (!model.mapper || model.mapper.getIsOpaque());
@@ -43,48 +39,6 @@ function vtkImageSlice(publicAPI, model) {
43
39
  // and the Renderer will do the images in their own pass.
44
40
  publicAPI.hasTranslucentPolygonalGeometry = () => false;
45
41
  publicAPI.makeProperty = vtkImageProperty.newInstance;
46
- publicAPI.getProperty = () => {
47
- if (model.property === null) {
48
- model.property = publicAPI.makeProperty();
49
- }
50
- return model.property;
51
- };
52
- publicAPI.getBounds = () => {
53
- if (model.mapper === null) {
54
- return model.bounds;
55
- }
56
-
57
- // Check for the special case when the mapper's bounds are unknown
58
- const bds = model.mapper.getBounds();
59
- if (!bds || bds.length !== 6) {
60
- return bds;
61
- }
62
-
63
- // Check for the special case when the actor is empty.
64
- if (bds[0] > bds[1]) {
65
- model.mapperBounds = bds.concat(); // copy the mapper's bounds
66
- model.bounds = [1, -1, 1, -1, 1, -1];
67
- model.boundsMTime.modified();
68
- return bds;
69
- }
70
-
71
- // Check if we have cached values for these bounds - we cache the
72
- // values returned by model.mapper.getBounds() and we store the time
73
- // of caching. If the values returned this time are different, or
74
- // the modified time of this class is newer than the cached time,
75
- // then we need to rebuild.
76
- const zip = rows => rows[0].map((_, c) => rows.map(row => row[c]));
77
- if (!model.mapperBounds || !zip([bds, model.mapperBounds]).reduce((a, b) => a && b[0] === b[1], true) || publicAPI.getMTime() > model.boundsMTime.getMTime()) {
78
- vtkDebugMacro('Recomputing bounds...');
79
- model.mapperBounds = bds.map(x => x);
80
- publicAPI.computeMatrix();
81
- const tmp4 = new Float64Array(16);
82
- mat4.transpose(tmp4, model.matrix);
83
- vtkBoundingBox.transformBounds(bds, tmp4, model.bounds);
84
- model.boundsMTime.modified();
85
- }
86
- return model.bounds;
87
- };
88
42
  publicAPI.getBoundsForSlice = (slice, thickness) => {
89
43
  // Check for the special case when the mapper's bounds are unknown
90
44
  const bds = model.mapper.getBoundsForSlice(slice, thickness);
@@ -117,14 +71,6 @@ function vtkImageSlice(publicAPI, model) {
117
71
 
118
72
  // Get the maximum Z bound
119
73
  publicAPI.getMaxZBound = () => publicAPI.getBounds()[5];
120
- publicAPI.getMTime = () => {
121
- let mt = model.mtime;
122
- if (model.property !== null) {
123
- const time = model.property.getMTime();
124
- mt = time > mt ? time : mt;
125
- }
126
- return mt;
127
- };
128
74
  publicAPI.getRedrawMTime = () => {
129
75
  let mt = model.mtime;
130
76
  if (model.mapper !== null) {
@@ -137,14 +83,13 @@ function vtkImageSlice(publicAPI, model) {
137
83
  mt = time > mt ? time : mt;
138
84
  }
139
85
  }
140
- if (model.property !== null) {
141
- let time = model.property.getMTime();
142
- mt = time > mt ? time : mt;
143
- if (model.property.getRGBTransferFunction() !== null) {
144
- time = model.property.getRGBTransferFunction().getMTime();
145
- mt = time > mt ? time : mt;
86
+ model.properties.forEach(property => {
87
+ mt = Math.max(mt, property.getMTime());
88
+ const rgbFunc = property.getRGBTransferFunction();
89
+ if (rgbFunc !== null) {
90
+ mt = Math.max(mt, rgbFunc.getMTime());
146
91
  }
147
- }
92
+ });
148
93
  return mt;
149
94
  };
150
95
  publicAPI.getSupportsSelection = () => model.mapper ? model.mapper.getSupportsSelection() : false;
@@ -156,10 +101,8 @@ function vtkImageSlice(publicAPI, model) {
156
101
 
157
102
  const DEFAULT_VALUES = {
158
103
  mapper: null,
159
- property: null,
160
104
  forceOpaque: false,
161
- forceTranslucent: false,
162
- bounds: [...vtkBoundingBox.INIT_BOUNDS]
105
+ forceTranslucent: false
163
106
  };
164
107
 
165
108
  // ----------------------------------------------------------------------------
@@ -176,9 +119,7 @@ function extend(publicAPI, model) {
176
119
  macro.obj(model.boundsMTime);
177
120
 
178
121
  // Build VTK API
179
- macro.set(publicAPI, model, ['property']);
180
122
  macro.setGet(publicAPI, model, ['mapper', 'forceOpaque', 'forceTranslucent']);
181
- macro.getArray(publicAPI, model, ['bounds'], 6);
182
123
 
183
124
  // Object methods
184
125
  vtkImageSlice(publicAPI, model);