@kitware/vtk.js 32.5.0 → 33.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.
- package/BREAKING_CHANGES.md +3 -0
- package/Rendering/Core/Actor.d.ts +5 -20
- package/Rendering/Core/Actor.js +5 -68
- package/Rendering/Core/ImageSlice.d.ts +7 -23
- package/Rendering/Core/ImageSlice.js +9 -68
- package/Rendering/Core/Prop3D.d.ts +39 -2
- package/Rendering/Core/Prop3D.js +81 -2
- package/Rendering/Core/Volume.d.ts +5 -20
- package/Rendering/Core/Volume.js +2 -70
- package/Rendering/Core/VolumeMapper/Constants.d.ts +0 -7
- package/Rendering/Core/VolumeMapper/Constants.js +2 -8
- package/Rendering/Core/VolumeMapper.d.ts +16 -140
- package/Rendering/Core/VolumeMapper.js +17 -52
- package/Rendering/Core/VolumeProperty/Constants.d.ts +12 -3
- package/Rendering/Core/VolumeProperty/Constants.js +11 -4
- package/Rendering/Core/VolumeProperty.d.ts +120 -4
- package/Rendering/Core/VolumeProperty.js +49 -4
- package/Rendering/OpenGL/ImageCPRMapper.js +27 -19
- package/Rendering/OpenGL/ImageMapper.js +27 -27
- package/Rendering/OpenGL/ImageResliceMapper.js +267 -173
- package/Rendering/OpenGL/PolyDataMapper.js +1 -8
- package/Rendering/OpenGL/RenderWindow/resourceSharingHelper.d.ts +3 -3
- package/Rendering/OpenGL/RenderWindow/resourceSharingHelper.js +8 -5
- package/Rendering/OpenGL/VolumeMapper.js +710 -772
- package/Rendering/OpenGL/glsl/vtkVolumeFS.glsl.js +1 -1
- package/Rendering/WebGPU/VolumePassFSQ.js +2 -2
- package/macros2.js +1 -1
- package/package.json +8 -3
package/BREAKING_CHANGES.md
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
## From 32.x to 33
|
|
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`.
|
|
1
4
|
## From 31.x to 32
|
|
2
5
|
|
|
3
6
|
- **vtkMapper**: remove `mapScalarsToTexture` from the public API. The function becomes protected and its API changes. This shouldn't cause any issue in most cases.
|
|
@@ -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
|
-
|
|
116
|
-
|
|
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
|
/**
|
package/Rendering/Core/Actor.js
CHANGED
|
@@ -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.
|
|
26
|
+
if (!model.properties[0]) {
|
|
33
27
|
// force creation of a property
|
|
34
28
|
publicAPI.getProperty();
|
|
35
29
|
}
|
|
36
|
-
let isOpaque = model.
|
|
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.
|
|
44
|
+
if (!model.properties[0]) {
|
|
51
45
|
// force creation of a property
|
|
52
|
-
publicAPI.
|
|
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
|
|
@@ -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.
|
|
24
|
+
if (!model.properties[0]) {
|
|
29
25
|
// force creation of a property
|
|
30
26
|
publicAPI.getProperty();
|
|
31
27
|
}
|
|
32
|
-
let isOpaque = model.
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
if (
|
|
144
|
-
|
|
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);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mat4, quat } from 'gl-matrix';
|
|
2
2
|
import { Bounds, Vector3, Range } from './../../types';
|
|
3
3
|
import vtkProp, { IPropInitialValues } from './Prop';
|
|
4
|
+
import { vtkObject } from './../../interfaces';
|
|
4
5
|
|
|
5
6
|
export interface IProp3DInitialValues extends IPropInitialValues {
|
|
6
7
|
origin?: number[];
|
|
@@ -19,11 +20,17 @@ export interface vtkProp3D extends vtkProp {
|
|
|
19
20
|
addPosition(deltaXYZ: number[]): void;
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
|
-
* Get the bounds as [xmin, xmax, ymin, ymax, zmin, zmax].
|
|
23
|
-
*
|
|
23
|
+
* Get the bounds of this actor as [xmin, xmax, ymin, ymax, zmin, zmax].
|
|
24
|
+
* They are the bounds of the underlying mapper, transformed using the actor's matrix.
|
|
25
|
+
* @return {Bounds} The bounds for the actor.
|
|
24
26
|
*/
|
|
25
27
|
getBounds(): Bounds;
|
|
26
28
|
|
|
29
|
+
/**
|
|
30
|
+
* Same as getBounds() but the returned array is not copied, so it should not be written to.
|
|
31
|
+
*/
|
|
32
|
+
getBoundsByReference(): Bounds;
|
|
33
|
+
|
|
27
34
|
/**
|
|
28
35
|
* Check if there was a modification or transformation.
|
|
29
36
|
* @default null
|
|
@@ -131,6 +138,21 @@ export interface vtkProp3D extends vtkProp {
|
|
|
131
138
|
*/
|
|
132
139
|
getUserMatrix(): mat4;
|
|
133
140
|
|
|
141
|
+
/**
|
|
142
|
+
* Get the actor property for the specified mapper input port, which defaults to 0
|
|
143
|
+
* It controls this actors rendering properties. If one isn’t specified,
|
|
144
|
+
* then one will be generated automatically. Multiple actors can share one
|
|
145
|
+
* property object.
|
|
146
|
+
* @param {number} mapperInputPort Defaults to 0
|
|
147
|
+
*/
|
|
148
|
+
getProperty(mapperInputPort?: number): vtkObject;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Get the actor properties array
|
|
152
|
+
* Each element of the array corresponds to a mapper input port
|
|
153
|
+
*/
|
|
154
|
+
getProperties(): vtkObject[];
|
|
155
|
+
|
|
134
156
|
/**
|
|
135
157
|
* Rotate the Prop3D in degrees about the X axis using the right hand
|
|
136
158
|
* rule. The axis is the Prop3D’s X axis, which can change as other
|
|
@@ -256,6 +278,21 @@ export interface vtkProp3D extends vtkProp {
|
|
|
256
278
|
* Generate the matrix based on internal model.
|
|
257
279
|
*/
|
|
258
280
|
computeMatrix(): void;
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Set the actor property for the specified mapper input port, which defaults to 0
|
|
284
|
+
* @param {vtkObject} property
|
|
285
|
+
* @param {number} mapperInputPort Is 0 when not given
|
|
286
|
+
*/
|
|
287
|
+
setProperty(mapperInputPort: number, property: vtkObject): boolean;
|
|
288
|
+
setProperty(property: vtkObject): boolean;
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Set the actor properties array
|
|
292
|
+
* Each element of the array corresponds to a mapper input port
|
|
293
|
+
* @param {vtkObject[]} properties
|
|
294
|
+
*/
|
|
295
|
+
setProperties(properties: vtkObject[]): boolean;
|
|
259
296
|
}
|
|
260
297
|
|
|
261
298
|
/**
|
package/Rendering/Core/Prop3D.js
CHANGED
|
@@ -121,6 +121,54 @@ function vtkProp3D(publicAPI, model) {
|
|
|
121
121
|
model.matrixMTime.modified();
|
|
122
122
|
}
|
|
123
123
|
};
|
|
124
|
+
publicAPI.getBoundsByReference = () => {
|
|
125
|
+
if (model.mapper === null) {
|
|
126
|
+
return model.bounds;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Check for the special case when the mapper's bounds are unknown
|
|
130
|
+
const bds = model.mapper.getBounds();
|
|
131
|
+
if (!bds || bds.length !== 6) {
|
|
132
|
+
return bds;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Check for the special case when the actor is empty.
|
|
136
|
+
if (bds[0] > bds[1]) {
|
|
137
|
+
// No need to copy bds, a new array is created when calling getBounds()
|
|
138
|
+
model.mapperBounds = bds;
|
|
139
|
+
model.bounds = [...vtkBoundingBox.INIT_BOUNDS];
|
|
140
|
+
model.boundsMTime.modified();
|
|
141
|
+
return bds;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Check if we have cached values for these bounds - we cache the
|
|
145
|
+
// values returned by model.mapper.getBounds() and we store the time
|
|
146
|
+
// of caching. If the values returned this time are different, or
|
|
147
|
+
// the modified time of this class is newer than the cached time,
|
|
148
|
+
// then we need to rebuild.
|
|
149
|
+
if (!model.mapperBounds || !bds.every((_, i) => bds[i] === model.mapperBounds[i]) || publicAPI.getMTime() > model.boundsMTime.getMTime()) {
|
|
150
|
+
macro.vtkDebugMacro('Recomputing bounds...');
|
|
151
|
+
// No need to copy bds, a new array is created when calling getBounds()
|
|
152
|
+
model.mapperBounds = bds;
|
|
153
|
+
|
|
154
|
+
// Compute actor bounds from matrix and mapper bounds
|
|
155
|
+
publicAPI.computeMatrix();
|
|
156
|
+
const transposedMatrix = new Float64Array(16);
|
|
157
|
+
mat4.transpose(transposedMatrix, model.matrix);
|
|
158
|
+
vtkBoundingBox.transformBounds(bds, transposedMatrix, model.bounds);
|
|
159
|
+
model.boundsMTime.modified();
|
|
160
|
+
}
|
|
161
|
+
return model.bounds;
|
|
162
|
+
};
|
|
163
|
+
publicAPI.getBounds = () => {
|
|
164
|
+
const bounds = publicAPI.getBoundsByReference();
|
|
165
|
+
// Handle case when bounds are not iterable (for example null or undefined)
|
|
166
|
+
try {
|
|
167
|
+
return [...bounds];
|
|
168
|
+
} catch {
|
|
169
|
+
return bounds;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
124
172
|
publicAPI.getCenter = () => vtkBoundingBox.getCenter(model.bounds);
|
|
125
173
|
publicAPI.getLength = () => vtkBoundingBox.getLength(model.bounds);
|
|
126
174
|
publicAPI.getXRange = () => vtkBoundingBox.getXRange(model.bounds);
|
|
@@ -131,6 +179,35 @@ function vtkProp3D(publicAPI, model) {
|
|
|
131
179
|
publicAPI.computeMatrix();
|
|
132
180
|
}
|
|
133
181
|
publicAPI.onModified(updateIdentityFlag);
|
|
182
|
+
publicAPI.getProperty = function () {
|
|
183
|
+
let mapperInputPort = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
184
|
+
if (model.properties[mapperInputPort] == null) {
|
|
185
|
+
model.properties[mapperInputPort] = publicAPI.makeProperty?.();
|
|
186
|
+
}
|
|
187
|
+
return model.properties[mapperInputPort];
|
|
188
|
+
};
|
|
189
|
+
publicAPI.setProperty = (firstArg, secondArg) => {
|
|
190
|
+
// Two options for argument layout:
|
|
191
|
+
// - (mapperInputPort, property)
|
|
192
|
+
// - (property)
|
|
193
|
+
const useInputPortArgument = Number.isInteger(firstArg);
|
|
194
|
+
const [mapperInputPort, property] = useInputPortArgument ? [firstArg, secondArg] : [0, firstArg];
|
|
195
|
+
if (model.properties[mapperInputPort] === property) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
model.properties[mapperInputPort] = property;
|
|
199
|
+
return true;
|
|
200
|
+
};
|
|
201
|
+
publicAPI.getMTime = () => {
|
|
202
|
+
let mt = model.mtime;
|
|
203
|
+
model.properties.forEach(property => {
|
|
204
|
+
if (property !== null) {
|
|
205
|
+
const time = property.getMTime();
|
|
206
|
+
mt = time > mt ? time : mt;
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
return mt;
|
|
210
|
+
};
|
|
134
211
|
}
|
|
135
212
|
|
|
136
213
|
// ----------------------------------------------------------------------------
|
|
@@ -143,7 +220,8 @@ const DEFAULT_VALUES = {
|
|
|
143
220
|
orientation: [0, 0, 0],
|
|
144
221
|
rotation: null,
|
|
145
222
|
scale: [1, 1, 1],
|
|
146
|
-
bounds: [
|
|
223
|
+
bounds: [...vtkBoundingBox.INIT_BOUNDS],
|
|
224
|
+
properties: [],
|
|
147
225
|
userMatrix: null,
|
|
148
226
|
userMatrixMTime: null,
|
|
149
227
|
cachedProp3D: null,
|
|
@@ -163,9 +241,10 @@ function extend(publicAPI, model) {
|
|
|
163
241
|
macro.obj(model.matrixMTime);
|
|
164
242
|
|
|
165
243
|
// Build VTK API
|
|
166
|
-
macro.get(publicAPI, model, ['
|
|
244
|
+
macro.get(publicAPI, model, ['isIdentity']);
|
|
167
245
|
macro.getArray(publicAPI, model, ['orientation']);
|
|
168
246
|
macro.setGetArray(publicAPI, model, ['origin', 'position', 'scale'], 3);
|
|
247
|
+
macro.setGet(publicAPI, model, ['properties']);
|
|
169
248
|
|
|
170
249
|
// Object internal instance
|
|
171
250
|
model.matrix = mat4.identity(new Float64Array(16));
|
|
@@ -29,22 +29,6 @@ export interface vtkVolume extends vtkProp3D {
|
|
|
29
29
|
*/
|
|
30
30
|
getVolumes(): vtkVolume[];
|
|
31
31
|
|
|
32
|
-
/**
|
|
33
|
-
* Get the volume property
|
|
34
|
-
*/
|
|
35
|
-
getProperty(): vtkVolumeProperty;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Get the bounds for this mapper as [xmin, xmax, ymin, ymax,zmin, zmax].
|
|
39
|
-
* @return {Bounds} The bounds for the mapper.
|
|
40
|
-
*/
|
|
41
|
-
getBounds(): Bounds;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Get the bounds as [xmin, xmax, ymin, ymax, zmin, zmax].
|
|
45
|
-
*/
|
|
46
|
-
getBoundsByReference(): Bounds;
|
|
47
|
-
|
|
48
32
|
/**
|
|
49
33
|
* Get the `Modified Time` which is a monotonic increasing integer
|
|
50
34
|
* global for all vtkObjects.
|
|
@@ -75,11 +59,12 @@ export interface vtkVolume extends vtkProp3D {
|
|
|
75
59
|
*/
|
|
76
60
|
setMapper(mapper: vtkVolumeMapper): boolean;
|
|
77
61
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
62
|
+
// Inherited from vtkProp3D, but takes a vtkVolumeProperty instead of a generic vtkObject
|
|
63
|
+
getProperty(mapperInputPort?: number): vtkVolumeProperty;
|
|
64
|
+
getProperties(): vtkVolumeProperty[];
|
|
65
|
+
setProperty(mapperInputPort: number, property: vtkVolumeProperty): boolean;
|
|
82
66
|
setProperty(property: vtkVolumeProperty): boolean;
|
|
67
|
+
setProperties(properties: vtkVolumeProperty[]): boolean;
|
|
83
68
|
}
|
|
84
69
|
|
|
85
70
|
/**
|
package/Rendering/Core/Volume.js
CHANGED
|
@@ -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 vtkVolumeProperty from './VolumeProperty.js';
|
|
6
4
|
|
|
7
|
-
const {
|
|
8
|
-
vtkDebugMacro
|
|
9
|
-
} = macro;
|
|
10
|
-
|
|
11
5
|
// ----------------------------------------------------------------------------
|
|
12
6
|
// vtkVolume methods
|
|
13
7
|
// ----------------------------------------------------------------------------
|
|
@@ -15,66 +9,8 @@ const {
|
|
|
15
9
|
function vtkVolume(publicAPI, model) {
|
|
16
10
|
// Set our className
|
|
17
11
|
model.classHierarchy.push('vtkVolume');
|
|
18
|
-
publicAPI.getVolumes = () => publicAPI;
|
|
12
|
+
publicAPI.getVolumes = () => [publicAPI];
|
|
19
13
|
publicAPI.makeProperty = vtkVolumeProperty.newInstance;
|
|
20
|
-
publicAPI.getProperty = () => {
|
|
21
|
-
if (model.property === null) {
|
|
22
|
-
model.property = publicAPI.makeProperty();
|
|
23
|
-
}
|
|
24
|
-
return model.property;
|
|
25
|
-
};
|
|
26
|
-
publicAPI.getBounds = () => {
|
|
27
|
-
if (model.mapper === null) {
|
|
28
|
-
return model.bounds;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Check for the special case when the mapper's bounds are unknown
|
|
32
|
-
const bds = model.mapper.getBounds();
|
|
33
|
-
if (!bds || bds.length !== 6) {
|
|
34
|
-
return bds;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Check for the special case when the actor is empty.
|
|
38
|
-
if (bds[0] > bds[1]) {
|
|
39
|
-
model.mapperBounds = bds.concat(); // copy the mapper's bounds
|
|
40
|
-
model.bounds = [1, -1, 1, -1, 1, -1];
|
|
41
|
-
model.boundsMTime.modified();
|
|
42
|
-
return bds;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Check if we have cached values for these bounds - we cache the
|
|
46
|
-
// values returned by model.mapper.getBounds() and we store the time
|
|
47
|
-
// of caching. If the values returned this time are different, or
|
|
48
|
-
// the modified time of this class is newer than the cached time,
|
|
49
|
-
// then we need to rebuild.
|
|
50
|
-
const zip = rows => rows[0].map((_, c) => rows.map(row => row[c]));
|
|
51
|
-
if (!model.mapperBounds || !zip([bds, model.mapperBounds]).reduce((a, b) => a && b[0] === b[1], true) || publicAPI.getMTime() > model.boundsMTime.getMTime()) {
|
|
52
|
-
vtkDebugMacro('Recomputing bounds...');
|
|
53
|
-
model.mapperBounds = bds.map(x => x);
|
|
54
|
-
const bbox = [];
|
|
55
|
-
vtkBoundingBox.getCorners(bds, bbox);
|
|
56
|
-
publicAPI.computeMatrix();
|
|
57
|
-
const tmp4 = new Float64Array(16);
|
|
58
|
-
mat4.transpose(tmp4, model.matrix);
|
|
59
|
-
bbox.forEach(pt => vec3.transformMat4(pt, pt, tmp4));
|
|
60
|
-
|
|
61
|
-
/* eslint-disable no-multi-assign */
|
|
62
|
-
model.bounds[0] = model.bounds[2] = model.bounds[4] = Number.MAX_VALUE;
|
|
63
|
-
model.bounds[1] = model.bounds[3] = model.bounds[5] = -Number.MAX_VALUE;
|
|
64
|
-
/* eslint-enable no-multi-assign */
|
|
65
|
-
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));
|
|
66
|
-
model.boundsMTime.modified();
|
|
67
|
-
}
|
|
68
|
-
return model.bounds;
|
|
69
|
-
};
|
|
70
|
-
publicAPI.getMTime = () => {
|
|
71
|
-
let mt = model.mtime;
|
|
72
|
-
if (model.property !== null) {
|
|
73
|
-
const time = model.property.getMTime();
|
|
74
|
-
mt = time > mt ? time : mt;
|
|
75
|
-
}
|
|
76
|
-
return mt;
|
|
77
|
-
};
|
|
78
14
|
publicAPI.getRedrawMTime = () => {
|
|
79
15
|
let mt = model.mtime;
|
|
80
16
|
if (model.mapper !== null) {
|
|
@@ -96,9 +32,7 @@ function vtkVolume(publicAPI, model) {
|
|
|
96
32
|
// ----------------------------------------------------------------------------
|
|
97
33
|
|
|
98
34
|
const DEFAULT_VALUES = {
|
|
99
|
-
mapper: null
|
|
100
|
-
property: null,
|
|
101
|
-
bounds: [1, -1, 1, -1, 1, -1]
|
|
35
|
+
mapper: null
|
|
102
36
|
};
|
|
103
37
|
|
|
104
38
|
// ----------------------------------------------------------------------------
|
|
@@ -115,9 +49,7 @@ function extend(publicAPI, model) {
|
|
|
115
49
|
macro.obj(model.boundsMTime);
|
|
116
50
|
|
|
117
51
|
// Build VTK API
|
|
118
|
-
macro.set(publicAPI, model, ['property']);
|
|
119
52
|
macro.setGet(publicAPI, model, ['mapper']);
|
|
120
|
-
macro.getArray(publicAPI, model, ['bounds'], 6);
|
|
121
53
|
|
|
122
54
|
// Object methods
|
|
123
55
|
vtkVolume(publicAPI, model);
|