UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

89 lines (87 loc) 2.72 kB
const listeners = []; const orientation = { device: {}, screen: window.orientation || 0, supported: !!window.DeviceMotionEvent, update: false }; const SCREEN_ORIENTATION_MAP = { 'landscape-primary': 90, 'landscape-secondary': -90, 'portrait-secondary': 180, 'portrait-primary': 0 }; function isEventValid(evt) { return Number.isFinite(evt.alpha); } function onDeviceOrientationChangeEvent(evt) { orientation.device = evt; if (!Number.isFinite(evt.alpha)) { orientation.supported = false; } } function onScreenOrientationChangeEvent() { orientation.screen = SCREEN_ORIENTATION_MAP[window.screen.orientation || window.screen.mozOrientation] || window.orientation || 0; } function addWindowListeners() { window.addEventListener('orientationchange', onScreenOrientationChangeEvent, false); window.addEventListener('deviceorientation', onDeviceOrientationChangeEvent, false); orientation.update = true; listeners.filter(i => !!i).forEach(i => i.renderWindowInteractor.requestAnimation(i)); } function removeWindowListeners() { window.removeEventListener('orientationchange', onScreenOrientationChangeEvent, false); window.removeEventListener('deviceorientation', onDeviceOrientationChangeEvent, false); orientation.update = false; listeners.filter(i => !!i).forEach(i => i.renderWindowInteractor.cancelAnimation(i)); } function addCameraToSynchronize(renderWindowInteractor, camera, onCameraUpdate) { function onAnimation() { if (orientation.update && isEventValid(orientation.device)) { const { alpha, beta, gamma } = orientation.device; const { screen } = orientation; camera.setDeviceAngles(alpha, beta, gamma, screen); if (onCameraUpdate) { onCameraUpdate(); } } } const subscription = renderWindowInteractor.onAnimation(onAnimation); const listener = { subscription, renderWindowInteractor }; const listenerId = listeners.length; listeners.push(listener); if (orientation.update) { listener.renderWindowInteractor.requestAnimation(listener); } return listenerId; } function removeCameraToSynchronize(id, cancelAnimation = true) { const listener = listeners[id]; if (listener) { listener.subscription.unsubscribe(); if (cancelAnimation) { listener.renderWindowInteractor.cancelAnimation(listener); } } listeners[id] = null; } function isDeviceOrientationSupported() { return orientation.supported; } var vtkDeviceOrientationToCamera = { addCameraToSynchronize, addWindowListeners, isDeviceOrientationSupported, removeCameraToSynchronize, removeWindowListeners }; export { vtkDeviceOrientationToCamera as default };