@@ -2,7 +2,6 @@ import '@kitware/vtk.js/favicon';
22
33import '@kitware/vtk.js/Rendering/Profiles/Volume' ;
44import '@kitware/vtk.js/Rendering/Profiles/Geometry' ;
5- import macro from '@kitware/vtk.js/macros' ;
65import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction' ;
76import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow' ;
87import vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction' ;
@@ -31,19 +30,6 @@ const fpsMonitor = vtkFPSMonitor.newInstance();
3130const progressContainer = document . createElement ( 'div' ) ;
3231myContainer . 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// ----------------------------------------------------------------------------
281269HttpDataAccessHelper . 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} ) ;
0 commit comments