@kitware/vtk.js
Version:
Visualization Toolkit for the Web
120 lines (111 loc) • 4.58 kB
JavaScript
import { n as newInstance$1, o as obj, e as setGet, l as setGetArray, h as chain } from '../../../../macros2.js';
import { l as normalize } from '../../../../Common/Core/Math/index.js';
const MODE_RESET_CAMERA = 'resetcamera';
const MODE_ORIENTATION = 'orientation';
const MODE_SAME = 'same';
const SynchronizationMode = {
MODE_RESET_CAMERA,
MODE_ORIENTATION,
MODE_SAME
};
function vtkCameraSynchronizer(publicAPI, model) {
model.classHierarchy.push('vtkCameraSynchronizer');
const cameraState = new Float64Array(9);
const direction = new Float64Array(3);
const subscriptions = [];
function updateListeners() {
while (subscriptions.length) {
subscriptions.pop().unsubscribe();
}
if (!model.srcRenderer || !model.dstRenderer) {
return;
}
const srcCamera = model.srcRenderer.getActiveCamera();
const interactor = model.srcRenderer.getRenderWindow().getInteractor();
subscriptions.push(srcCamera.onModified(() => {
if (!interactor.isAnimating()) {
publicAPI.update();
}
}));
subscriptions.push(interactor.onAnimation(publicAPI.update));
subscriptions.push(interactor.onEndAnimation(publicAPI.update));
}
// Update listeners automatically
model._onSrcRendererChanged = updateListeners;
model._onDstRendererChanged = updateListeners;
function updatePreviousValues(position, focalPoint, viewUp) {
if (cameraState[0] !== position[0] || cameraState[1] !== position[1] || cameraState[2] !== position[2] || cameraState[3] !== focalPoint[0] || cameraState[4] !== focalPoint[1] || cameraState[5] !== focalPoint[2] || cameraState[6] !== viewUp[0] || cameraState[7] !== viewUp[1] || cameraState[8] !== viewUp[2]) {
cameraState[0] = position[0];
cameraState[1] = position[1];
cameraState[2] = position[2];
cameraState[3] = focalPoint[0];
cameraState[4] = focalPoint[1];
cameraState[5] = focalPoint[2];
cameraState[6] = viewUp[0];
cameraState[7] = viewUp[1];
cameraState[8] = viewUp[2];
return cameraState;
}
return false;
}
publicAPI.update = () => {
if (!model.active || !model.srcRenderer || !model.dstRenderer) {
return;
}
const srcCamera = model.srcRenderer.getActiveCamera();
const dstCamera = model.dstRenderer.getActiveCamera();
const position = srcCamera.getReferenceByName('position');
const focalPoint = srcCamera.getReferenceByName('focalPoint');
const viewUp = srcCamera.getReferenceByName('viewUp');
const change = updatePreviousValues(position, focalPoint, viewUp);
if (!change) {
return;
}
if (model.mode === MODE_ORIENTATION) {
direction[0] = change[0] - change[3];
direction[1] = change[1] - change[4];
direction[2] = change[2] - change[5];
normalize(direction);
dstCamera.setPosition(model.focalPoint[0] + model.distance * direction[0], model.focalPoint[1] + model.distance * direction[1], model.focalPoint[2] + model.distance * direction[2]);
dstCamera.setFocalPoint(model.focalPoint[0], model.focalPoint[1], model.focalPoint[2]);
dstCamera.setViewUp(change[6], change[7], change[8]);
} else {
dstCamera.setPosition(change[0], change[1], change[2]);
dstCamera.setFocalPoint(change[3], change[4], change[5]);
dstCamera.setViewUp(change[6], change[7], change[8]);
}
if (model.mode === MODE_RESET_CAMERA) {
model.dstRenderer.resetCamera();
}
};
publicAPI.delete = chain(() => publicAPI.setSrcRenderer(null),
// Will clear any listener
publicAPI.delete);
// If src/dstRenderer provided at constructor register listeners
updateListeners();
}
const DEFAULT_VALUES = {
mode: MODE_ORIENTATION,
focalPoint: [0, 0, 0],
distance: 6.8,
active: true
// srcRenderer: null,
// dstRenderer: null,
};
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Build VTK API
obj(publicAPI, model);
setGet(publicAPI, model, ['mode', 'active', 'srcRenderer', 'dstRenderer', 'distance']);
setGetArray(publicAPI, model, ['focalPoint'], 3, 0);
// Object methods
vtkCameraSynchronizer(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = newInstance$1(extend, 'vtkCameraSynchronizer');
var vtkCameraSynchronizer$1 = {
newInstance,
extend,
SynchronizationMode
};
export { DEFAULT_VALUES, MODE_ORIENTATION, MODE_RESET_CAMERA, MODE_SAME, SynchronizationMode, vtkCameraSynchronizer$1 as default, extend, newInstance };