Skip to content

Commit 7df81b4

Browse files
committed
feat(XR): Add button for AR viewing in GeometryViewer application
1 parent e82cef5 commit 7df81b4

File tree

1 file changed

+36
-4
lines changed
  • Examples/Applications/GeometryViewer

1 file changed

+36
-4
lines changed

Examples/Applications/GeometryViewer/index.js

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import icon from '../../../Documentation/content/icon/favicon-96x96.png';
3333

3434
let autoInit = true;
3535
let background = [0, 0, 0];
36+
let fullScreenRenderWindow;
3637
let renderWindow;
3738
let renderer;
3839
let scalarBarActor;
@@ -115,13 +116,13 @@ function emptyContainer(container) {
115116
// ----------------------------------------------------------------------------
116117

117118
function 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

Comments
 (0)