@kitware/vtk.js
Version:
Visualization Toolkit for the Web
89 lines (87 loc) • 2.72 kB
JavaScript
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 };