Skip to content

Commit c826a67

Browse files
authored
Merge branch 'beta' into 1856-further-fix-key-events
2 parents 8cba154 + 24a81a9 commit c826a67

File tree

51 files changed

+3538
-3665
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+3538
-3665
lines changed

BREAKING_CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## From 32.x to 33
22

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`.
34
- **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.
45

56
## From 31.x to 32

Examples/Rendering/ManyRenderWindows/index.js

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,25 +44,24 @@ function createVolumeActor(imageData) {
4444
// Create and setup the mapper
4545
const mapper = vtkVolumeMapper.newInstance();
4646
mapper.setSampleDistance(0.7);
47-
mapper.setVolumetricScatteringBlending(0);
48-
mapper.setLocalAmbientOcclusion(0);
49-
mapper.setLAOKernelSize(10);
50-
mapper.setLAOKernelRadius(5);
51-
mapper.setComputeNormalFromOpacity(true);
5247
mapper.setInputData(imageData);
5348

5449
// Create and setup the actor
5550
const actor = vtkVolume.newInstance();
56-
actor
57-
.getProperty()
58-
.setRGBTransferFunction(0, getRandomColorTransferFunction());
59-
actor.getProperty().setScalarOpacity(0, sharedOpacityFunction);
60-
actor.getProperty().setInterpolationTypeToLinear();
61-
actor.getProperty().setShade(true);
62-
actor.getProperty().setAmbient(0.3);
63-
actor.getProperty().setDiffuse(0.8);
64-
actor.getProperty().setSpecular(1);
65-
actor.getProperty().setSpecularPower(8);
51+
const actorProperty = actor.getProperty();
52+
actorProperty.setComputeNormalFromOpacity(true);
53+
actorProperty.setLAOKernelRadius(5);
54+
actorProperty.setLAOKernelSize(10);
55+
actorProperty.setLocalAmbientOcclusion(0);
56+
actorProperty.setVolumetricScatteringBlending(0);
57+
actorProperty.setRGBTransferFunction(0, getRandomColorTransferFunction());
58+
actorProperty.setScalarOpacity(0, sharedOpacityFunction);
59+
actorProperty.setInterpolationTypeToLinear();
60+
actorProperty.setShade(true);
61+
actorProperty.setAmbient(0.3);
62+
actorProperty.setDiffuse(0.8);
63+
actorProperty.setSpecular(1);
64+
actorProperty.setSpecularPower(8);
6665
actor.setMapper(mapper);
6766

6867
return actor;

Examples/Rendering/QuadView/index.js

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -158,28 +158,27 @@ function createVolumeView(renderer, source) {
158158
.reduce((a, b) => a + b, 0)
159159
);
160160
mapper.setSampleDistance(sampleDistance / 2.5);
161-
mapper.setComputeNormalFromOpacity(false);
162-
mapper.setGlobalIlluminationReach(0.0);
163-
mapper.setVolumetricScatteringBlending(0.5);
164161
mapper.setVolumeShadowSamplingDistFactor(5.0);
165162

166163
// Set volume properties
167164
const volProp = vtkVolumeProperty.newInstance();
165+
volProp.setComputeNormalFromOpacity(false);
166+
volProp.setGlobalIlluminationReach(0.0);
167+
volProp.setVolumetricScatteringBlending(0.5);
168168
volProp.setInterpolationTypeToLinear();
169-
volume
170-
.getProperty()
171-
.setScalarOpacityUnitDistance(
172-
0,
173-
vtkBoundingBox.getDiagonalLength(source.getBounds()) /
174-
Math.max(...source.getDimensions())
175-
);
169+
volProp.setScalarOpacityUnitDistance(
170+
0,
171+
vtkBoundingBox.getDiagonalLength(source.getBounds()) /
172+
Math.max(...source.getDimensions())
173+
);
176174
volProp.setGradientOpacityMinimumValue(0, 0);
177175
const dataArray =
178176
source.getPointData().getScalars() || source.getPointData().getArrays()[0];
179177
const dataRange = dataArray.getRange();
180-
volume
181-
.getProperty()
182-
.setGradientOpacityMaximumValue(0, (dataRange[1] - dataRange[0]) * 0.05);
178+
volProp.setGradientOpacityMaximumValue(
179+
0,
180+
(dataRange[1] - dataRange[0]) * 0.05
181+
);
183182
volProp.setShade(true);
184183
volProp.setUseGradientOpacity(0, false);
185184
volProp.setGradientOpacityMinimumOpacity(0, 0.0);

Examples/Volume/VolumeMapperBlendModes/index.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,12 @@ const reader = vtkHttpDataSetReader.newInstance({ fetchGzip: true });
4040
const initialSampleDistance = 1.3;
4141

4242
const actor = vtkVolume.newInstance();
43+
const actorProperty = actor.getProperty();
4344
const mapper = vtkVolumeMapper.newInstance();
4445
mapper.setSampleDistance(initialSampleDistance);
4546

4647
// use half float at the cost of precision to save memory
47-
mapper.setPreferSizeOverAccuracy(true);
48+
actorProperty.setPreferSizeOverAccuracy(true);
4849

4950
actor.setMapper(mapper);
5051

@@ -125,16 +126,16 @@ function updateSampleDistance(event) {
125126
}
126127

127128
function updateScalarMin(event) {
128-
mapper.setIpScalarRange(
129+
actorProperty.setIpScalarRange(
129130
event.target.valueAsNumber,
130-
mapper.getIpScalarRange()[1]
131+
actorProperty.getIpScalarRange()[1]
131132
);
132133
renderWindow.render();
133134
}
134135

135136
function updateScalarMax(event) {
136-
mapper.setIpScalarRange(
137-
mapper.getIpScalarRange()[0],
137+
actorProperty.setIpScalarRange(
138+
actorProperty.getIpScalarRange()[0],
138139
event.target.valueAsNumber
139140
);
140141
renderWindow.render();
@@ -146,7 +147,7 @@ function updateBlendMode(event) {
146147
const radonScalars = document.querySelectorAll('.radonScalar');
147148

148149
mapper.setBlendMode(currentBlendMode);
149-
mapper.setIpScalarRange(0.0, 1.0);
150+
actorProperty.setIpScalarRange(0.0, 1.0);
150151

151152
// if average or additive blend mode
152153
for (let i = 0; i < ipScalarEls.length; i += 1) {

Examples/Volume/VolumeMapperLightAndShadow/index.js

Lines changed: 36 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import '@kitware/vtk.js/favicon';
22

33
import '@kitware/vtk.js/Rendering/Profiles/Volume';
44
import '@kitware/vtk.js/Rendering/Profiles/Geometry';
5-
import macro from '@kitware/vtk.js/macros';
65
import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
76
import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
87
import vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';
@@ -31,19 +30,6 @@ const fpsMonitor = vtkFPSMonitor.newInstance();
3130
const progressContainer = document.createElement('div');
3231
myContainer.appendChild(progressContainer);
3332

34-
const progressCallback = (progressEvent) => {
35-
if (progressEvent.lengthComputable) {
36-
const percent = Math.floor(
37-
(100 * progressEvent.loaded) / progressEvent.total
38-
);
39-
progressContainer.innerHTML = `Loading ${percent}%`;
40-
} else {
41-
progressContainer.innerHTML = macro.formatBytesToProperUnit(
42-
progressEvent.loaded
43-
);
44-
}
45-
};
46-
4733
// ----------------------------------------------------------------------------
4834
// Main function to set up and render volume
4935
// ----------------------------------------------------------------------------
@@ -94,10 +80,11 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
9480
const source = vtiReader.getOutputData(0);
9581

9682
const actor = vtkVolume.newInstance();
83+
const actorProperty = actor.getProperty(0);
9784
const mapper = vtkVolumeMapper.newInstance();
9885

9986
actor.setMapper(mapper);
100-
mapper.setInputData(source);
87+
mapper.addInputData(source);
10188

10289
// Add one positional light
10390
const bounds = actor.getBounds();
@@ -124,44 +111,42 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
124111
.reduce((a, b) => a + b, 0)
125112
);
126113
mapper.setSampleDistance(sampleDistance / 2.5);
127-
mapper.setComputeNormalFromOpacity(false);
128-
mapper.setGlobalIlluminationReach(0.0);
129-
mapper.setVolumetricScatteringBlending(0.0);
130114
mapper.setVolumeShadowSamplingDistFactor(5.0);
131115

132116
// Add transfer function
133117
const lookupTable = vtkColorTransferFunction.newInstance();
134118
const piecewiseFunction = vtkPiecewiseFunction.newInstance();
135-
actor.getProperty().setRGBTransferFunction(0, lookupTable);
136-
actor.getProperty().setScalarOpacity(0, piecewiseFunction);
119+
actorProperty.setRGBTransferFunction(0, lookupTable);
120+
actorProperty.setScalarOpacity(0, piecewiseFunction);
137121

138122
// Set actor properties
139-
actor.getProperty().setInterpolationTypeToLinear();
140-
actor
141-
.getProperty()
142-
.setScalarOpacityUnitDistance(
143-
0,
144-
vtkBoundingBox.getDiagonalLength(source.getBounds()) /
145-
Math.max(...source.getDimensions())
146-
);
147-
actor.getProperty().setGradientOpacityMinimumValue(0, 0);
123+
actorProperty.setComputeNormalFromOpacity(false);
124+
actorProperty.setGlobalIlluminationReach(0.0);
125+
actorProperty.setVolumetricScatteringBlending(0.0);
126+
actorProperty.setInterpolationTypeToLinear();
127+
actorProperty.setScalarOpacityUnitDistance(
128+
0,
129+
vtkBoundingBox.getDiagonalLength(source.getBounds()) /
130+
Math.max(...source.getDimensions())
131+
);
132+
actorProperty.setGradientOpacityMinimumValue(0, 0);
148133
const dataArray =
149134
source.getPointData().getScalars() || source.getPointData().getArrays()[0];
150135
const dataRange = dataArray.getRange();
151-
actor
152-
.getProperty()
153-
.setGradientOpacityMaximumValue(0, (dataRange[1] - dataRange[0]) * 0.05);
154-
actor.getProperty().setShade(true);
155-
actor.getProperty().setUseGradientOpacity(0, false);
156-
actor.getProperty().setGradientOpacityMinimumOpacity(0, 0.0);
157-
actor.getProperty().setGradientOpacityMaximumOpacity(0, 1.0);
158-
actor.getProperty().setAmbient(0.0);
159-
actor.getProperty().setDiffuse(2.0);
160-
actor.getProperty().setSpecular(0.0);
161-
actor.getProperty().setSpecularPower(0.0);
162-
actor.getProperty().setUseLabelOutline(false);
163-
actor.getProperty().setLabelOutlineThickness(2);
164-
renderer.addActor(actor);
136+
actorProperty.setGradientOpacityMaximumValue(
137+
0,
138+
(dataRange[1] - dataRange[0]) * 0.05
139+
);
140+
actorProperty.setShade(true);
141+
actorProperty.setUseGradientOpacity(0, false);
142+
actorProperty.setGradientOpacityMinimumOpacity(0, 0.0);
143+
actorProperty.setGradientOpacityMaximumOpacity(0, 1.0);
144+
actorProperty.setAmbient(0.0);
145+
actorProperty.setDiffuse(2.0);
146+
actorProperty.setSpecular(0.0);
147+
actorProperty.setSpecularPower(0.0);
148+
actorProperty.setUseLabelOutline(false);
149+
actorProperty.setLabelOutlineThickness(2);
165150

166151
// Control UI for sample distance, transfer function, and shadow on/off
167152
const controllerWidget = vtkVolumeController.newInstance({
@@ -191,12 +176,12 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
191176
// Add sliders to tune volume shadow effect
192177
function updateVSB(e) {
193178
const vsb = Number(e.target.value);
194-
mapper.setVolumetricScatteringBlending(vsb);
179+
actorProperty.setVolumetricScatteringBlending(vsb);
195180
renderWindow.render();
196181
}
197182
function updateGlobalReach(e) {
198183
const gir = Number(e.target.value);
199-
mapper.setGlobalIlluminationReach(gir);
184+
actorProperty.setGlobalIlluminationReach(gir);
200185
renderWindow.render();
201186
}
202187
function updateSD(e) {
@@ -206,7 +191,7 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
206191
}
207192
function updateAT(e) {
208193
const at = Number(e.target.value);
209-
mapper.setAnisotropy(at);
194+
actorProperty.setAnisotropy(at);
210195
renderWindow.render();
211196
}
212197
const el = document.querySelector('.volumeBlending');
@@ -235,7 +220,7 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
235220
const buttonID = document.querySelector('.text2');
236221
function toggleDensityNormal() {
237222
isDensity = !isDensity;
238-
mapper.setComputeNormalFromOpacity(isDensity);
223+
actorProperty.setComputeNormalFromOpacity(isDensity);
239224
buttonID.innerText = `(${isDensity ? 'on' : 'off'})`;
240225
renderWindow.render();
241226
}
@@ -257,6 +242,9 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
257242
renderer.addActor(actorSphere);
258243
}
259244

245+
// Add the volume actor here to avoid compiling the shader twice
246+
renderer.addActor(actor);
247+
260248
// Camera and first render
261249
renderer.resetCamera();
262250
renderWindow.render();
@@ -279,11 +267,7 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
279267
// Read volume and render
280268
// ----------------------------------------------------------------------------
281269
HttpDataAccessHelper.fetchBinary(
282-
'https://data.kitware.com/api/v1/item/59de9dc98d777f31ac641dc1/download',
283-
{
284-
progressCallback,
285-
}
270+
`${__BASE_PATH__}/data/volume/head-binary.vti`
286271
).then((binary) => {
287-
myContainer.removeChild(progressContainer);
288272
createVolumeShadowViewer(myContainer, binary);
289273
});

Examples/Volume/WebXRChestCTBlendedCVR/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ HttpDataAccessHelper.fetchBinary(fileURL).then((fileContents) => {
107107
actor.getProperty().setAmbient(0.2);
108108
actor.getProperty().setDiffuse(1.3);
109109
actor.getProperty().setSpecular(0.0);
110-
mapper.setGlobalIlluminationReach(0.1);
111-
mapper.setVolumetricScatteringBlending(0.5);
110+
actor.getProperty().setGlobalIlluminationReach(0.1);
111+
actor.getProperty().setVolumetricScatteringBlending(0.5);
112112
mapper.setVolumeShadowSamplingDistFactor(1.0);
113113
mapper.setAutoAdjustSampleDistances(false);
114114

Examples/Volume/WebXRHeadFullVolumeCVR/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ HttpDataAccessHelper.fetchBinary(fileURL).then((fileContents) => {
139139
actor.getProperty().setAmbient(0.0);
140140
actor.getProperty().setDiffuse(2.0);
141141
actor.getProperty().setSpecular(0.0);
142-
mapper.setGlobalIlluminationReach(1.0);
143-
mapper.setVolumetricScatteringBlending(1.0);
142+
actor.getProperty().setGlobalIlluminationReach(1.0);
143+
actor.getProperty().setVolumetricScatteringBlending(1.0);
144144
mapper.setVolumeShadowSamplingDistFactor(1.0);
145145
mapper.setAutoAdjustSampleDistances(false);
146146

Examples/Volume/WebXRHeadGradientCVR/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ HttpDataAccessHelper.fetchBinary(fileURL).then((fileContents) => {
136136

137137
// CVR
138138
actor.getProperty().setShade(true);
139-
mapper.setGlobalIlluminationReach(0.0);
140-
mapper.setVolumetricScatteringBlending(0.0);
139+
actor.getProperty().setGlobalIlluminationReach(0.0);
140+
actor.getProperty().setVolumetricScatteringBlending(0.0);
141141
mapper.setVolumeShadowSamplingDistFactor(1.0);
142142
mapper.setAutoAdjustSampleDistances(false);
143143

0 commit comments

Comments
 (0)