molstar
Version:
A comprehensive macromolecular library.
46 lines • 2.17 kB
JavaScript
/**
* Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { Vec2, Vec3 } from '../../mol-math/linear-algebra';
export var ObjectControls;
(function (ObjectControls) {
function mouseOnScreen(out, page, viewport) {
return Vec2.set(out, (page[0] - viewport.x) / viewport.width, (page[1] - viewport.y) / viewport.height);
}
var panMouseChange = Vec2();
var panObjUp = Vec3();
var panOffset = Vec3();
var eye = Vec3();
var panStart = Vec2();
var panEnd = Vec2();
var target = Vec3();
/**
* Get vector for movement in camera projection plane:
* `pageStart` and `pageEnd` are 2d window coordinates;
* `ref` defines the plane depth, if not given `camera.target` is used
*/
function panDirection(out, pageStart, pageEnd, camera, ref) {
mouseOnScreen(panStart, pageStart, camera.viewport);
mouseOnScreen(panEnd, pageEnd, camera.viewport);
Vec2.sub(panMouseChange, Vec2.copy(panMouseChange, panEnd), panStart);
Vec3.sub(eye, camera.position, camera.target);
if (!ref || camera.state.mode === 'orthographic')
Vec3.copy(target, camera.target);
else
Vec3.projectPointOnVector(target, ref, eye, camera.position);
var dist = Vec3.distance(camera.position, target);
var height = 2 * Math.tan(camera.state.fov / 2) * dist;
var zoom = camera.viewport.height / height;
panMouseChange[0] *= (1 / zoom) * camera.viewport.width * camera.pixelRatio;
panMouseChange[1] *= (1 / zoom) * camera.viewport.height * camera.pixelRatio;
Vec3.cross(panOffset, Vec3.copy(panOffset, eye), camera.up);
Vec3.setMagnitude(panOffset, panOffset, panMouseChange[0]);
Vec3.setMagnitude(panObjUp, camera.up, panMouseChange[1]);
Vec3.add(panOffset, panOffset, panObjUp);
return Vec3.negate(out, panOffset);
}
ObjectControls.panDirection = panDirection;
})(ObjectControls || (ObjectControls = {}));
//# sourceMappingURL=object.js.map