@@ -2,6 +2,7 @@ import 'vtk.js/Sources/favicon';
2
2
3
3
// Load the rendering pieces we want to use (for both WebGL and WebGPU)
4
4
import 'vtk.js/Sources/Rendering/Profiles/Geometry' ;
5
+ import 'vtk.js/Sources/Rendering/Misc/RenderingAPIs' ;
5
6
6
7
import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor' ;
7
8
import vtkConeSource from 'vtk.js/Sources/Filters/Sources/ConeSource' ;
@@ -14,8 +15,6 @@ import vtkRenderWindowInteractor from 'vtk.js/Sources/Rendering/Core/RenderWindo
14
15
import vtkRenderer from 'vtk.js/Sources/Rendering/Core/Renderer' ;
15
16
import vtkInteractorStyleTrackballCamera from 'vtk.js/Sources/Interaction/Style/InteractorStyleTrackballCamera' ;
16
17
17
- import vtkOpenGLRenderWindow from 'vtk.js/Sources/Rendering/OpenGL/RenderWindow' ;
18
-
19
18
// ----------------------------------------------------------------------------
20
19
// Meshes
21
20
// ----------------------------------------------------------------------------
@@ -85,8 +84,8 @@ const colors = [
85
84
const RENDERERS = { } ;
86
85
87
86
const renderWindow = vtkRenderWindow . newInstance ( ) ;
88
- const openglRenderWindow = vtkOpenGLRenderWindow . newInstance ( ) ;
89
- renderWindow . addView ( openglRenderWindow ) ;
87
+ const renderWindowView = renderWindow . newAPISpecificView ( ) ;
88
+ renderWindow . addView ( renderWindowView ) ;
90
89
91
90
const rootContainer = document . createElement ( 'div' ) ;
92
91
rootContainer . style . position = 'fixed' ;
@@ -96,12 +95,11 @@ rootContainer.style.top = 0;
96
95
rootContainer . style . pointerEvents = 'none' ;
97
96
document . body . appendChild ( rootContainer ) ;
98
97
99
- openglRenderWindow . setContainer ( rootContainer ) ;
98
+ renderWindowView . setContainer ( rootContainer ) ;
100
99
101
100
const interactor = vtkRenderWindowInteractor . newInstance ( ) ;
102
- interactor . setView ( openglRenderWindow ) ;
101
+ interactor . setView ( renderWindowView ) ;
103
102
interactor . initialize ( ) ;
104
- interactor . bindEvents ( document . body ) ;
105
103
interactor . setInteractorStyle ( vtkInteractorStyleTrackballCamera . newInstance ( ) ) ;
106
104
107
105
function updateViewPort ( element , renderer ) {
@@ -129,12 +127,11 @@ function recomputeViewports() {
129
127
130
128
function resize ( ) {
131
129
rootContainer . style . width = `${ window . innerWidth } px` ;
132
- openglRenderWindow . setSize ( window . innerWidth , window . innerHeight ) ;
130
+ renderWindowView . setSize ( window . innerWidth , window . innerHeight ) ;
133
131
recomputeViewports ( ) ;
134
- // Object.values(RENDERERS).forEach((r) => r.resetCamera());
135
132
}
136
133
137
- window . addEventListener ( ' resize' , resize ) ;
134
+ new ResizeObserver ( resize ) . observe ( document . body ) ;
138
135
document . addEventListener ( 'scroll' , recomputeViewports ) ;
139
136
140
137
// ----------------------------------------------------------------------------
@@ -155,15 +152,36 @@ function applyStyle(element) {
155
152
element . style . display = 'inline-block' ;
156
153
element . style . boxSizing = 'border' ;
157
154
element . style . textAlign = 'center' ;
155
+ element . style . color = 'white' ;
158
156
return element ;
159
157
}
160
158
161
- function enterCurrentRenderer ( e ) {
162
- interactor . setCurrentRenderer ( RENDERERS [ e . target . id ] ) ;
159
+ let captureCurrentRenderer = false ;
160
+
161
+ function setCaptureCurrentRenderer ( yn ) {
162
+ captureCurrentRenderer = yn ;
163
+ if ( yn && interactor . getCurrentRenderer ( ) ) {
164
+ // fix the current renderer to, well, the current renderer
165
+ interactor . setCurrentRenderer ( interactor . getCurrentRenderer ( ) ) ;
166
+ } else {
167
+ // remove the fixed current renderer
168
+ interactor . setCurrentRenderer ( null ) ;
169
+ }
163
170
}
164
171
165
- function exitCurrentRenderer ( e ) {
166
- interactor . setCurrentRenderer ( null ) ;
172
+ function bindInteractor ( renderer , el ) {
173
+ // only change the interactor's container if needed
174
+ if ( interactor . getContainer ( ) !== el ) {
175
+ if ( interactor . getContainer ( ) ) {
176
+ interactor . unbindEvents ( ) ;
177
+ }
178
+ if ( captureCurrentRenderer ) {
179
+ interactor . setCurrentRenderer ( renderer ) ;
180
+ }
181
+ if ( el ) {
182
+ interactor . bindEvents ( el ) ;
183
+ }
184
+ }
167
185
}
168
186
169
187
function addRenderer ( ) {
@@ -188,8 +206,10 @@ function addRenderer() {
188
206
const renderer = vtkRenderer . newInstance ( { background } ) ;
189
207
container . innerHTML = `${ mesh . name } ${ prop . name } ` ;
190
208
191
- container . addEventListener ( 'mouseenter' , enterCurrentRenderer ) ;
192
- container . addEventListener ( 'mouseleave' , exitCurrentRenderer ) ;
209
+ container . addEventListener ( 'pointerenter' , ( ) =>
210
+ bindInteractor ( renderer , container )
211
+ ) ;
212
+ container . addEventListener ( 'pointerleave' , ( ) => bindInteractor ( null , null ) ) ;
193
213
194
214
renderer . addActor ( actor ) ;
195
215
renderWindow . addRenderer ( renderer ) ;
@@ -204,14 +224,29 @@ function addRenderer() {
204
224
// Fill up page
205
225
// ----------------------------------------------------------------------------
206
226
227
+ const checkbox = document . createElement ( 'input' ) ;
228
+ checkbox . type = 'checkbox' ;
229
+ checkbox . name = 'singleRendererCapture' ;
230
+ const label = document . createElement ( 'label' ) ;
231
+ label . for = checkbox . name ;
232
+ label . innerText = 'Enable single renderer capture' ;
233
+
234
+ checkbox . addEventListener ( 'input' , ( ev ) => {
235
+ setCaptureCurrentRenderer ( ev . target . checked ) ;
236
+ } ) ;
237
+
238
+ document . body . appendChild ( checkbox ) ;
239
+ document . body . appendChild ( label ) ;
240
+ document . body . appendChild ( document . createElement ( 'br' ) ) ;
241
+
207
242
for ( let i = 0 ; i < 64 ; i ++ ) {
208
243
addRenderer ( ) ;
209
244
}
210
245
resize ( ) ;
211
246
212
247
function updateCamera ( renderer ) {
213
248
const camera = renderer . getActiveCamera ( ) ;
214
- camera . azimuth ( 2 ) ;
249
+ camera . azimuth ( 0.5 ) ;
215
250
renderer . resetCameraClippingRange ( ) ;
216
251
}
217
252
@@ -228,5 +263,5 @@ window.requestAnimationFrame(animate);
228
263
// ----------------------------------------------------------------------------
229
264
230
265
global . rw = renderWindow ;
231
- global . glrw = openglRenderWindow ;
266
+ global . glrw = renderWindowView ;
232
267
global . renderers = RENDERERS ;
0 commit comments