UNPKG

molstar

Version:

A comprehensive macromolecular library.

81 lines 4.64 kB
"use strict"; /** * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.AnimateStateInterpolation = void 0; var tslib_1 = require("tslib"); var commands_1 = require("../../../mol-plugin/commands"); var mol_state_1 = require("../../../mol-state"); var mol_util_1 = require("../../../mol-util"); var param_definition_1 = require("../../../mol-util/param-definition"); var model_1 = require("../model"); exports.AnimateStateInterpolation = model_1.PluginStateAnimation.create({ name: 'built-in.animate-state-interpolation', display: { name: 'Animate State (experimental)' }, params: function () { return ({ transtionDurationInMs: param_definition_1.ParamDefinition.Numeric(2000, { min: 100, max: 30000, step: 10 }) }); }, canApply: function (plugin) { return { canApply: plugin.managers.snapshot.state.entries.size > 1 }; }, initialState: function () { return ({}); }, apply: function (animState, t, ctx) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { var snapshots, currentT, srcIndex, tarIndex, _src, _tar, src, tar, state, update, _i, src_1, s, _a, tar_1, t_1, e, f, oldState, newState; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: snapshots = ctx.plugin.managers.snapshot.state.entries; if (snapshots.size < 2) return [2 /*return*/, { kind: 'finished' }]; currentT = (t.current % ctx.params.transtionDurationInMs) / ctx.params.transtionDurationInMs; srcIndex = Math.floor(t.current / ctx.params.transtionDurationInMs) % snapshots.size; tarIndex = Math.ceil(t.current / ctx.params.transtionDurationInMs); if (tarIndex === srcIndex) tarIndex++; tarIndex = tarIndex % snapshots.size; _src = snapshots.get(srcIndex).snapshot, _tar = snapshots.get(tarIndex).snapshot; if (!_src.data || !_tar.data) return [2 /*return*/, { kind: 'skip' }]; src = _src.data.tree.transforms, tar = _tar.data.tree.transforms; state = ctx.plugin.state.data; update = state.build(); for (_i = 0, src_1 = src; _i < src_1.length; _i++) { s = src_1[_i]; for (_a = 0, tar_1 = tar; _a < tar_1.length; _a++) { t_1 = tar_1[_a]; // TODO: better than quadratic alg. // TODO: support for adding/removing nodes if (t_1.ref !== s.ref) continue; if (t_1.version === s.version) continue; e = mol_state_1.StateTransform.fromJSON(s), f = mol_state_1.StateTransform.fromJSON(t_1); oldState = state.cells.get(s.ref); if (!oldState) continue; newState = void 0; if (!e.transformer.definition.interpolate) { newState = currentT <= 0.5 ? e.params : f.params; } else { newState = e.transformer.definition.interpolate(e.params, f.params, currentT, ctx.plugin); } if (!(0, mol_util_1.shallowEqual)(oldState, newState)) { update.to(s.ref).update(newState); } } } return [4 /*yield*/, commands_1.PluginCommands.State.Update(ctx.plugin, { state: state, tree: update, options: { doNotLogTiming: true } })]; case 1: _b.sent(); return [2 /*return*/, { kind: 'next', state: {} }]; } }); }); } }); //# sourceMappingURL=state-interpolation.js.map