@@ -33,6 +33,7 @@ import icon from '../../../Documentation/content/icon/favicon-96x96.png';
3333
3434let autoInit = true ;
3535let background = [ 0 , 0 , 0 ] ;
36+ let fullScreenRenderWindow ;
3637let renderWindow ;
3738let renderer ;
3839let scalarBarActor ;
@@ -115,13 +116,13 @@ function emptyContainer(container) {
115116// ----------------------------------------------------------------------------
116117
117118function createViewer ( container ) {
118- const fullScreenRenderer = vtkFullScreenRenderWindow . newInstance ( {
119+ fullScreenRenderWindow = vtkFullScreenRenderWindow . newInstance ( {
119120 background,
120121 rootContainer : container ,
121122 containerStyle : { height : '100%' , width : '100%' , position : 'absolute' } ,
122123 } ) ;
123- renderer = fullScreenRenderer . getRenderer ( ) ;
124- renderWindow = fullScreenRenderer . getRenderWindow ( ) ;
124+ renderer = fullScreenRenderWindow . getRenderer ( ) ;
125+ renderWindow = fullScreenRenderWindow . getRenderWindow ( ) ;
125126 renderWindow . getInteractor ( ) . setDesiredUpdateRate ( 15 ) ;
126127
127128 container . appendChild ( rootControllerContainer ) ;
@@ -139,7 +140,7 @@ function createViewer(container) {
139140 }
140141 fpsMonitor . setRenderWindow ( renderWindow ) ;
141142 fpsMonitor . setContainer ( container ) ;
142- fullScreenRenderer . setResizeCallback ( fpsMonitor . update ) ;
143+ fullScreenRenderWindow . setResizeCallback ( fpsMonitor . update ) ;
143144 }
144145}
145146
@@ -194,6 +195,10 @@ function createPipeline(fileName, fileContents) {
194195 labelSelector . setAttribute ( 'class' , selectorClass ) ;
195196 labelSelector . innerHTML = fileName ;
196197
198+ const immersionSelector = document . createElement ( 'button' ) ;
199+ immersionSelector . setAttribute ( 'class' , selectorClass ) ;
200+ immersionSelector . innerHTML = 'Start AR' ;
201+
197202 const controlContainer = document . createElement ( 'div' ) ;
198203 controlContainer . setAttribute ( 'class' , style . control ) ;
199204 controlContainer . appendChild ( labelSelector ) ;
@@ -202,6 +207,13 @@ function createPipeline(fileName, fileContents) {
202207 controlContainer . appendChild ( colorBySelector ) ;
203208 controlContainer . appendChild ( componentSelector ) ;
204209 controlContainer . appendChild ( opacitySelector ) ;
210+
211+ if (
212+ navigator . xr !== undefined &&
213+ navigator . xr . isSessionSupported ( 'immersive-ar' )
214+ ) {
215+ controlContainer . appendChild ( immersionSelector ) ;
216+ }
205217 rootControllerContainer . appendChild ( controlContainer ) ;
206218
207219 // VTK pipeline
@@ -364,6 +376,26 @@ function createPipeline(fileName, fileContents) {
364376 }
365377 componentSelector . addEventListener ( 'change' , updateColorByComponent ) ;
366378
379+ // --------------------------------------------------------------------
380+ // Immersion handling
381+ // --------------------------------------------------------------------
382+
383+ function toggleAR ( ) {
384+ const SESSION_IS_AR = true ;
385+ if ( immersionSelector . textContent === 'Start AR' ) {
386+ fullScreenRenderWindow . setBackground ( [ ...background , 0 ] ) ;
387+ fullScreenRenderWindow
388+ . getApiSpecificRenderWindow ( )
389+ . startXR ( SESSION_IS_AR ) ;
390+ immersionSelector . textContent = 'Exit AR' ;
391+ } else {
392+ fullScreenRenderWindow . setBackground ( [ ...background , 255 ] ) ;
393+ fullScreenRenderWindow . getApiSpecificRenderWindow ( ) . stopXR ( SESSION_IS_AR ) ;
394+ immersionSelector . textContent = 'Start AR' ;
395+ }
396+ }
397+ immersionSelector . addEventListener ( 'click' , toggleAR ) ;
398+
367399 // --------------------------------------------------------------------
368400 // Pipeline handling
369401 // --------------------------------------------------------------------
0 commit comments