@kitware/vtk.js
Version:
Visualization Toolkit for the Web
132 lines (108 loc) • 4.41 kB
JavaScript
import { m as macro } from '../../macros2.js';
import vtkCompositeCameraManipulator from './CompositeCameraManipulator.js';
import vtkCompositeMouseManipulator from './CompositeMouseManipulator.js';
const ANIMATION_REQUESTER = 'vtkMouseCameraTrackballFirstPersonManipulator';
// ----------------------------------------------------------------------------
// vtkMouseCameraTrackballFirstPersonManipulator methods
// ----------------------------------------------------------------------------
function vtkMouseCameraTrackballFirstPersonManipulator(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkMouseCameraTrackballFirstPersonManipulator');
const internal = {
interactor: null,
renderer: null
};
//--------------------------------------------------------------------------
publicAPI.onButtonDown = (interactor, renderer, position) => {
if (model.usePointerLock && !interactor.isPointerLocked()) {
Object.assign(internal, {
interactor,
renderer
});
interactor.requestPointerLock();
}
};
//--------------------------------------------------------------------------
publicAPI.onMouseMove = (interactor, renderer, position) => {
if (!position) {
return;
}
const sensitivity = model.sensitivity;
const yaw = -position.movementX * sensitivity;
const pitch = -position.movementY * sensitivity;
Object.assign(internal, {
interactor,
renderer
});
publicAPI.moveCamera(yaw, pitch);
};
//--------------------------------------------------------------------------
publicAPI.moveCamera = (yaw, pitch) => {
const {
renderer,
interactor
} = internal;
const camera = renderer.getActiveCamera();
// We need to pick a number of steps here that is not too few
// (or the camera will be jittery) and not too many (or the
// animations will take too long).
// Perhaps this should be calculated?
const numSteps = model.numAnimationSteps;
const yawStep = yaw / numSteps;
const pitchStep = pitch / numSteps;
const now = performance.now().toString();
const animationRequester = `${ANIMATION_REQUESTER}.${now}`;
let curStep = 0;
let animationSub = null;
const performStep = () => {
camera.yaw(yawStep);
camera.pitch(pitchStep);
camera.orthogonalizeViewUp();
curStep += 1;
if (curStep === numSteps) {
animationSub.unsubscribe();
renderer.resetCameraClippingRange();
if (interactor.getLightFollowCamera()) {
renderer.updateLightsGeometryToFollowCamera();
}
// This needs to be posted to the event loop so it isn't called
// in the `handleAnimation` stack, or else the animation will
// not be canceled.
const cancelRequest = () => {
internal.interactor.cancelAnimation(animationRequester);
};
setTimeout(cancelRequest, 0);
}
};
interactor.requestAnimation(animationRequester);
animationSub = interactor.onAnimation(() => performStep());
};
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
numAnimationSteps: 5,
sensitivity: 0.05,
usePointerLock: true
};
// ----------------------------------------------------------------------------
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Inheritance
macro.obj(publicAPI, model);
vtkCompositeCameraManipulator.extend(publicAPI, model, initialValues);
vtkCompositeMouseManipulator.extend(publicAPI, model, initialValues);
// Create get-set macros
macro.setGet(publicAPI, model, ['numAnimationSteps', 'sensitivity', 'usePointerLock']);
// Object specific methods
vtkMouseCameraTrackballFirstPersonManipulator(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkMouseCameraTrackballFirstPersonManipulator');
// ----------------------------------------------------------------------------
var vtkMouseCameraTrackballFirstPersonManipulator$1 = {
newInstance,
extend
};
export { vtkMouseCameraTrackballFirstPersonManipulator$1 as default, extend, newInstance };