UNPKG

molstar

Version:

A comprehensive macromolecular library.

135 lines (134 loc) 6.9 kB
"use strict"; /** * Copyright (c) 2023-2024 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Adam Midlik <midlik@gmail.com> * @author David Sehnal <david.sehnal@gmail.com> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.suppressCameraAutoreset = suppressCameraAutoreset; exports.setCamera = setCamera; exports.cameraParamsToCameraSnapshot = cameraParamsToCameraSnapshot; exports.setFocus = setFocus; exports.createPluginStateSnapshotCamera = createPluginStateSnapshotCamera; exports.setCanvas = setCanvas; exports.modifyCanvasProps = modifyCanvasProps; const canvas3d_1 = require("../../mol-canvas3d/canvas3d"); const linear_algebra_1 = require("../../mol-math/linear-algebra"); const focus_object_1 = require("../../mol-plugin-state/manager/focus-camera/focus-object"); const commands_1 = require("../../mol-plugin/commands"); const camera_1 = require("../../mol-util/camera"); const names_1 = require("../../mol-util/color/names"); const utils_1 = require("./helpers/utils"); const mvs_tree_1 = require("./tree/mvs/mvs-tree"); const DefaultFocusOptions = { minRadius: 5, extraRadius: 0, }; const DefaultCanvasBackgroundColor = names_1.ColorNames.white; const _tmpVec = (0, linear_algebra_1.Vec3)(); /** Set the camera position to the current position (thus suppress automatic adjustment). */ async function suppressCameraAutoreset(plugin) { var _a; const snapshot = { ...(_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.camera.state, radius: Infinity }; // `radius: Infinity` avoids clipping when the scene expands adjustSceneRadiusFactor(plugin, snapshot.target); await commands_1.PluginCommands.Camera.SetSnapshot(plugin, { snapshot }); } /** Set the camera based on a camera node params. */ async function setCamera(plugin, params) { const snapshot = cameraParamsToCameraSnapshot(plugin, params); adjustSceneRadiusFactor(plugin, snapshot.target); await commands_1.PluginCommands.Camera.SetSnapshot(plugin, { snapshot }); } function cameraParamsToCameraSnapshot(plugin, params) { const target = linear_algebra_1.Vec3.create(...params.target); let position = linear_algebra_1.Vec3.create(...params.position); const radius = linear_algebra_1.Vec3.distance(target, position) / 2; if (plugin.canvas3d) position = (0, camera_1.fovAdjustedPosition)(target, position, plugin.canvas3d.camera.state.mode, plugin.canvas3d.camera.state.fov); const up = linear_algebra_1.Vec3.create(...params.up); linear_algebra_1.Vec3.orthogonalize(up, linear_algebra_1.Vec3.sub(_tmpVec, target, position), up); const snapshot = { target, position, up, radius, radiusMax: radius }; return snapshot; } /** Focus the camera on the bounding sphere of a (sub)structure (or on the whole scene if `structureNodeSelector` is undefined). * Orient the camera based on a focus node params. **/ async function setFocus(plugin, focuses) { const snapshot = (0, focus_object_1.getFocusSnapshot)(plugin, { ...snapshotFocusInfoFromMvsFocuses(focuses), minRadius: DefaultFocusOptions.minRadius, }); if (!snapshot) return; resetSceneRadiusFactor(plugin); await commands_1.PluginCommands.Camera.SetSnapshot(plugin, { snapshot }); } function snapshotFocusInfoFromMvsFocuses(focuses) { var _a, _b; const lastFocus = (focuses.length > 0) ? focuses[focuses.length - 1] : undefined; const direction = (_a = lastFocus === null || lastFocus === void 0 ? void 0 : lastFocus.params.direction) !== null && _a !== void 0 ? _a : mvs_tree_1.MVSTreeSchema.nodes.focus.params.fields.direction.default; const up = (_b = lastFocus === null || lastFocus === void 0 ? void 0 : lastFocus.params.up) !== null && _b !== void 0 ? _b : mvs_tree_1.MVSTreeSchema.nodes.focus.params.fields.up.default; return { targets: focuses.map(f => { var _a; return ({ targetRef: f.target.ref === '-=root=-' ? undefined : f.target.ref, // need to treat root separately so it does not include invisible structure parts etc. radius: (_a = f.params.radius) !== null && _a !== void 0 ? _a : undefined, radiusFactor: f.params.radius_factor, extraRadius: f.params.radius_extent, }); }), direction: linear_algebra_1.Vec3.create(...direction), up: linear_algebra_1.Vec3.create(...up), }; } /** Adjust `sceneRadiusFactor` property so that the current scene is not cropped */ function adjustSceneRadiusFactor(plugin, cameraTarget) { var _a; if (!cameraTarget) return; const boundingSphere = (0, focus_object_1.getPluginBoundingSphere)(plugin); const offset = linear_algebra_1.Vec3.distance(cameraTarget, boundingSphere.center); const sceneRadiusFactor = boundingSphere.radius > 0 ? ((boundingSphere.radius + offset) / boundingSphere.radius) : 1; (_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.setProps({ sceneRadiusFactor }); } /** Reset `sceneRadiusFactor` property to the default value */ function resetSceneRadiusFactor(plugin) { var _a; const sceneRadiusFactor = canvas3d_1.Canvas3DParams.sceneRadiusFactor.defaultValue; (_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.setProps({ sceneRadiusFactor }); } /** Create object for PluginState.Snapshot.camera based on tree loading context and MVS snapshot metadata */ function createPluginStateSnapshotCamera(plugin, context, metadata) { var _a; const camera = { transitionStyle: 'animate', transitionDurationInMs: (_a = metadata.previousTransitionDurationMs) !== null && _a !== void 0 ? _a : 0, }; if (context.camera.cameraParams !== undefined) { const currentCameraSnapshot = plugin.canvas3d.camera.getSnapshot(); const cameraSnapshot = cameraParamsToCameraSnapshot(plugin, context.camera.cameraParams); camera.current = { ...currentCameraSnapshot, ...cameraSnapshot }; } else { camera.focus = snapshotFocusInfoFromMvsFocuses(context.camera.focuses); } return camera; } /** Set canvas properties based on a canvas node params. */ function setCanvas(plugin, params) { var _a; (_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.setProps(old => modifyCanvasProps(old, params)); } /** Create a deep copy of `oldCanvasProps` with values modified according to a canvas node params. */ function modifyCanvasProps(oldCanvasProps, params) { var _a; const backgroundColor = (_a = (0, utils_1.decodeColor)(params === null || params === void 0 ? void 0 : params.background_color)) !== null && _a !== void 0 ? _a : DefaultCanvasBackgroundColor; return { ...oldCanvasProps, renderer: { ...oldCanvasProps.renderer, backgroundColor: backgroundColor, }, }; }