|
13 | 13 | </div> |
14 | 14 | <div id="inset"></div> |
15 | 15 |
|
16 | | - <script src="../build/three.js"></script> |
17 | | - |
18 | | - <script src="js/controls/OrbitControls.js"></script> |
19 | | - |
20 | | - <script src="js/misc/Volume.js"></script> |
21 | | - <script src="js/loaders/NRRDLoader.js"></script> |
22 | | - <script src="js/shaders/VolumeShader.js"></script> |
23 | | - |
24 | 16 | <script src="js/WebGL.js"></script> |
25 | | - <script src="js/libs/gunzip.min.js"></script> |
26 | | - <script src="js/libs/dat.gui.min.js"></script> |
27 | 17 |
|
28 | | - <script> |
| 18 | + <script type="module"> |
| 19 | + import { |
| 20 | + BackSide, |
| 21 | + BoxBufferGeometry, |
| 22 | + DataTexture3D, |
| 23 | + FloatType, |
| 24 | + LinearFilter, |
| 25 | + Mesh, |
| 26 | + OrthographicCamera, |
| 27 | + RedFormat, |
| 28 | + Scene, |
| 29 | + ShaderMaterial, |
| 30 | + TextureLoader, |
| 31 | + UniformsUtils, |
| 32 | + WebGLRenderer |
| 33 | + } from "../build/three.module.js"; |
| 34 | + |
| 35 | + import { GUI } from './jsm/libs/dat.gui.module.js'; |
| 36 | + import { OrbitControls } from './jsm/controls/OrbitControls.js'; |
| 37 | + import { NRRDLoader } from './jsm/loaders/NRRDLoader.js'; |
| 38 | + import { VolumeRenderShader1 } from './jsm/shaders/VolumeShader.js'; |
29 | 39 |
|
30 | 40 | if ( WEBGL.isWebGL2Available() === false ) { |
31 | 41 |
|
32 | 42 | document.body.appendChild( WEBGL.getWebGL2ErrorMessage() ); |
33 | 43 |
|
34 | 44 | } |
35 | 45 |
|
36 | | - var container, |
37 | | - renderer, |
| 46 | + var renderer, |
38 | 47 | scene, |
39 | 48 | camera, |
40 | 49 | controls, |
|
46 | 55 |
|
47 | 56 | function init() { |
48 | 57 |
|
49 | | - scene = new THREE.Scene(); |
| 58 | + scene = new Scene(); |
50 | 59 |
|
51 | 60 | // Create renderer |
52 | 61 | var canvas = document.createElement( 'canvas' ); |
53 | 62 | var context = canvas.getContext( 'webgl2' ); |
54 | | - renderer = new THREE.WebGLRenderer( { canvas: canvas, context: context } ); |
| 63 | + renderer = new WebGLRenderer( { canvas: canvas, context: context } ); |
55 | 64 | renderer.setPixelRatio( window.devicePixelRatio ); |
56 | 65 | renderer.setSize( window.innerWidth, window.innerHeight ); |
57 | 66 | document.body.appendChild( renderer.domElement ); |
58 | 67 |
|
59 | 68 | // Create camera (The volume renderer does not work very well with perspective yet) |
60 | 69 | var h = 512; // frustum height |
61 | 70 | var aspect = window.innerWidth / window.innerHeight; |
62 | | - camera = new THREE.OrthographicCamera( - h * aspect / 2, h * aspect / 2, h / 2, - h / 2, 1, 1000 ); |
| 71 | + camera = new OrthographicCamera( - h * aspect / 2, h * aspect / 2, h / 2, - h / 2, 1, 1000 ); |
63 | 72 | camera.position.set( 0, 0, 128 ); |
64 | 73 | camera.up.set( 0, 0, 1 ); // In our data, z is up |
65 | 74 |
|
66 | 75 | // Create controls |
67 | | - controls = new THREE.OrbitControls( camera, renderer.domElement ); |
| 76 | + controls = new OrbitControls( camera, renderer.domElement ); |
68 | 77 | controls.addEventListener( 'change', render ); |
69 | 78 | controls.target.set( 64, 64, 128 ); |
70 | 79 | controls.minZoom = 0.5; |
71 | 80 | controls.maxZoom = 4; |
72 | 81 | controls.update(); |
73 | 82 |
|
74 | | - // scene.add( new THREE.AxesHelper( 128 ) ); |
| 83 | + // scene.add( new AxesHelper( 128 ) ); |
75 | 84 |
|
76 | 85 | // Lighting is baked into the shader a.t.m. |
77 | | - // var dirLight = new THREE.DirectionalLight( 0xffffff ); |
| 86 | + // var dirLight = new DirectionalLight( 0xffffff ); |
78 | 87 |
|
79 | 88 | // The gui for interaction |
80 | 89 | volconfig = { clim1: 0, clim2: 1, renderstyle: 'iso', isothreshold: 0.15, colormap: 'viridis' }; |
81 | | - var gui = new dat.GUI(); |
| 90 | + var gui = new GUI(); |
82 | 91 | gui.add( volconfig, 'clim1', 0, 1, 0.01 ).onChange( updateUniforms ); |
83 | 92 | gui.add( volconfig, 'clim2', 0, 1, 0.01 ).onChange( updateUniforms ); |
84 | 93 | gui.add( volconfig, 'colormap', { gray: 'gray', viridis: 'viridis' } ).onChange( updateUniforms ); |
85 | 94 | gui.add( volconfig, 'renderstyle', { mip: 'mip', iso: 'iso' } ).onChange( updateUniforms ); |
86 | 95 | gui.add( volconfig, 'isothreshold', 0, 1, 0.01 ).onChange( updateUniforms ); |
87 | 96 |
|
88 | 97 | // Load the data ... |
89 | | - new THREE.NRRDLoader().load( "models/nrrd/stent.nrrd", function ( volume ) { |
| 98 | + new NRRDLoader().load( "models/nrrd/stent.nrrd", function ( volume ) { |
90 | 99 |
|
91 | 100 | // Texture to hold the volume. We have scalars, so we put our data in the red channel. |
92 | 101 | // THREEJS will select R32F (33326) based on the RedFormat and FloatType. |
93 | 102 | // Also see https://www.khronos.org/registry/webgl/specs/latest/2.0/#TEXTURE_TYPES_FORMATS_FROM_DOM_ELEMENTS_TABLE |
94 | 103 | // TODO: look the dtype up in the volume metadata |
95 | | - var texture = new THREE.DataTexture3D( volume.data, volume.xLength, volume.yLength, volume.zLength ); |
96 | | - texture.format = THREE.RedFormat; |
97 | | - texture.type = THREE.FloatType; |
98 | | - texture.minFilter = texture.magFilter = THREE.LinearFilter; |
| 104 | + var texture = new DataTexture3D( volume.data, volume.xLength, volume.yLength, volume.zLength ); |
| 105 | + texture.format = RedFormat; |
| 106 | + texture.type = FloatType; |
| 107 | + texture.minFilter = texture.magFilter = LinearFilter; |
99 | 108 | texture.unpackAlignment = 1; |
100 | 109 | texture.needsUpdate = true; |
101 | 110 |
|
102 | 111 | // Colormap textures |
103 | 112 | cmtextures = { |
104 | | - viridis: new THREE.TextureLoader().load( 'textures/cm_viridis.png', render ), |
105 | | - gray: new THREE.TextureLoader().load( 'textures/cm_gray.png', render ) |
| 113 | + viridis: new TextureLoader().load( 'textures/cm_viridis.png', render ), |
| 114 | + gray: new TextureLoader().load( 'textures/cm_gray.png', render ) |
106 | 115 | }; |
107 | 116 |
|
108 | 117 | // Material |
109 | | - var shader = THREE.VolumeRenderShader1; |
| 118 | + var shader = VolumeRenderShader1; |
110 | 119 |
|
111 | | - var uniforms = THREE.UniformsUtils.clone( shader.uniforms ); |
| 120 | + var uniforms = UniformsUtils.clone( shader.uniforms ); |
112 | 121 |
|
113 | 122 | uniforms[ "u_data" ].value = texture; |
114 | 123 | uniforms[ "u_size" ].value.set( volume.xLength, volume.yLength, volume.zLength ); |
|
117 | 126 | uniforms[ "u_renderthreshold" ].value = volconfig.isothreshold; // For ISO renderstyle |
118 | 127 | uniforms[ "u_cmdata" ].value = cmtextures[ volconfig.colormap ]; |
119 | 128 |
|
120 | | - material = new THREE.ShaderMaterial( { |
| 129 | + material = new ShaderMaterial( { |
121 | 130 | uniforms: uniforms, |
122 | 131 | vertexShader: shader.vertexShader, |
123 | 132 | fragmentShader: shader.fragmentShader, |
124 | | - side: THREE.BackSide // The volume shader uses the backface as its "reference point" |
| 133 | + side: BackSide // The volume shader uses the backface as its "reference point" |
125 | 134 | } ); |
126 | 135 |
|
127 | 136 | // Mesh |
128 | | - var geometry = new THREE.BoxBufferGeometry( volume.xLength, volume.yLength, volume.zLength ); |
| 137 | + var geometry = new BoxBufferGeometry( volume.xLength, volume.yLength, volume.zLength ); |
129 | 138 | geometry.translate( volume.xLength / 2 - 0.5, volume.yLength / 2 - 0.5, volume.zLength / 2 - 0.5 ); |
130 | 139 |
|
131 | | - var mesh = new THREE.Mesh( geometry, material ); |
| 140 | + var mesh = new Mesh( geometry, material ); |
132 | 141 | scene.add( mesh ); |
133 | 142 |
|
134 | 143 | render(); |
|
0 commit comments