@@ -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' ;
@@ -14,6 +13,7 @@ import HttpDataAccessHelper from '@kitware/vtk.js/IO/Core/DataAccessHelper/HttpD
1413import vtkVolumeController from '@kitware/vtk.js/Interaction/UI/VolumeController' ;
1514import vtkBoundingBox from '@kitware/vtk.js/Common/DataModel/BoundingBox' ;
1615import vtkFPSMonitor from '@kitware/vtk.js/Interaction/UI/FPSMonitor' ;
16+ import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData' ;
1717
1818import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor' ;
1919import vtkSphereSource from '@kitware/vtk.js/Filters/Sources/SphereSource' ;
@@ -31,19 +31,6 @@ const fpsMonitor = vtkFPSMonitor.newInstance();
3131const progressContainer = document . createElement ( 'div' ) ;
3232myContainer . appendChild ( progressContainer ) ;
3333
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-
4734// ----------------------------------------------------------------------------
4835// Main function to set up and render volume
4936// ----------------------------------------------------------------------------
@@ -94,11 +81,23 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
9481 const source = vtiReader . getOutputData ( 0 ) ;
9582
9683 const actor = vtkVolume . newInstance ( ) ;
97- const actorProperty = actor . getProperty ( ) ;
84+ const actorProperty = actor . getProperty ( 0 ) ;
9885 const mapper = vtkVolumeMapper . newInstance ( ) ;
9986
10087 actor . setMapper ( mapper ) ;
101- mapper . setInputData ( source ) ;
88+ mapper . addInputData ( source ) ;
89+
90+ for ( let i = 0 ; i < 0 ; ++ i ) {
91+ const otherImageData = vtkImageData . newInstance ( ) ;
92+ otherImageData . setPointData ( source . getPointData ( ) ) ;
93+ otherImageData . setDimensions ( ...source . getDimensions ( ) ) ;
94+ otherImageData . setSpacing ( ...source . getSpacing ( ) ) ;
95+ otherImageData . setOrigin ( ...source . getOrigin ( ) ) ;
96+ otherImageData . setDirection ( ...source . getDirection ( ) ) ;
97+ otherImageData . setOrigin ( ...[ 120 * ( i + 1 ) , 0 , 0 ] ) ;
98+ mapper . addInputData ( otherImageData ) ;
99+ actor . setProperty ( actorProperty , 1 + i ) ;
100+ }
102101
103102 // Add one positional light
104103 const bounds = actor . getBounds ( ) ;
@@ -125,6 +124,7 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
125124 . reduce ( ( a , b ) => a + b , 0 )
126125 ) ;
127126 mapper . setSampleDistance ( sampleDistance / 2.5 ) ;
127+ mapper . setVolumeShadowSamplingDistFactor ( 5.0 ) ;
128128
129129 // Add transfer function
130130 const lookupTable = vtkColorTransferFunction . newInstance ( ) ;
@@ -135,7 +135,6 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
135135 // Set actor properties
136136 actorProperty . setComputeNormalFromOpacity ( false ) ;
137137 actorProperty . setGlobalIlluminationReach ( 0.0 ) ;
138- actorProperty . setVolumeShadowSamplingDistFactor ( 5.0 ) ;
139138 actorProperty . setVolumetricScatteringBlending ( 0.0 ) ;
140139 actorProperty . setInterpolationTypeToLinear ( ) ;
141140 actorProperty . setScalarOpacityUnitDistance (
@@ -161,7 +160,6 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
161160 actorProperty . setSpecularPower ( 0.0 ) ;
162161 actorProperty . setUseLabelOutline ( false ) ;
163162 actorProperty . setLabelOutlineThickness ( 2 ) ;
164- renderer . addActor ( actor ) ;
165163
166164 // Control UI for sample distance, transfer function, and shadow on/off
167165 const controllerWidget = vtkVolumeController . newInstance ( {
@@ -201,7 +199,7 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
201199 }
202200 function updateSD ( e ) {
203201 const sd = Number ( e . target . value ) ;
204- actorProperty . setVolumeShadowSamplingDistFactor ( sd ) ;
202+ mapper . setVolumeShadowSamplingDistFactor ( sd ) ;
205203 renderWindow . render ( ) ;
206204 }
207205 function updateAT ( e ) {
@@ -257,6 +255,9 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
257255 renderer . addActor ( actorSphere ) ;
258256 }
259257
258+ // Add the volume actor here to avoid compiling the shader twice
259+ renderer . addActor ( actor ) ;
260+
260261 // Camera and first render
261262 renderer . resetCamera ( ) ;
262263 renderWindow . render ( ) ;
@@ -279,11 +280,7 @@ function createVolumeShadowViewer(rootContainer, fileContents) {
279280// Read volume and render
280281// ----------------------------------------------------------------------------
281282HttpDataAccessHelper . fetchBinary (
282- 'https://data.kitware.com/api/v1/item/59de9dc98d777f31ac641dc1/download' ,
283- {
284- progressCallback,
285- }
283+ `${ __BASE_PATH__ } /data/volume/head-binary.vti`
286284) . then ( ( binary ) => {
287- myContainer . removeChild ( progressContainer ) ;
288285 createVolumeShadowViewer ( myContainer , binary ) ;
289286} ) ;
0 commit comments