mirror of
https://github.com/molstar/molstar.git
synced 2026-06-05 14:04:36 +08:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f833efae37 | ||
|
|
be4b787e66 | ||
|
|
950b1c179a | ||
|
|
2bd1a01afb | ||
|
|
9d34dbff0f | ||
|
|
ba1b03f01b | ||
|
|
791f7ca3c8 | ||
|
|
c14d50e4ff |
@@ -7,6 +7,11 @@ Note that since we don't clearly distinguish between a public and private interf
|
||||
## [Unreleased]
|
||||
|
||||
|
||||
## [v2.2.2] - 2021-08-11
|
||||
|
||||
- Fix ``TransformData`` issues [#133](https://github.com/molstar/molstar/issues/133)
|
||||
- Fix ``mol-script`` query compiler const expression recognition.
|
||||
|
||||
## [v2.2.1] - 2021-08-02
|
||||
|
||||
- Add surrounding atoms (5 Angstrom) structure selection query
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "molstar",
|
||||
"version": "2.2.1",
|
||||
"version": "2.2.2",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"version": "2.2.1",
|
||||
"version": "2.2.2",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/argparse": "^1.0.38",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "molstar",
|
||||
"version": "2.2.1",
|
||||
"version": "2.2.2",
|
||||
"description": "A comprehensive macromolecular library.",
|
||||
"homepage": "https://github.com/molstar/molstar#readme",
|
||||
"repository": {
|
||||
|
||||
@@ -21,7 +21,6 @@ const tmpCylinderCenter = Vec3();
|
||||
const tmpCylinderMat = Mat4();
|
||||
const tmpCylinderMatRot = Mat4();
|
||||
const tmpCylinderScale = Vec3();
|
||||
const tmpCylinderMatScale = Mat4();
|
||||
const tmpCylinderStart = Vec3();
|
||||
const tmpUp = Vec3();
|
||||
|
||||
@@ -32,9 +31,9 @@ function setCylinderMat(m: Mat4, start: Vec3, dir: Vec3, length: number, matchDi
|
||||
// direction so the triangles of adjacent cylinder will line up
|
||||
if (matchDir) Vec3.matchDirection(tmpUp, up, tmpCylinderMatDir);
|
||||
else Vec3.copy(tmpUp, up);
|
||||
Mat4.fromScaling(tmpCylinderMatScale, Vec3.set(tmpCylinderScale, 1, length, 1));
|
||||
Vec3.set(tmpCylinderScale, 1, length, 1);
|
||||
Vec3.makeRotation(tmpCylinderMatRot, tmpUp, tmpCylinderMatDir);
|
||||
Mat4.mul(m, tmpCylinderMatRot, tmpCylinderMatScale);
|
||||
Mat4.scale(m, tmpCylinderMatRot, tmpCylinderScale);
|
||||
return Mat4.setTranslation(m, tmpCylinderCenter);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2018-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
@@ -43,12 +43,13 @@ export function createTransform(transformArray: Float32Array, instanceCount: num
|
||||
|
||||
if (transformData) {
|
||||
ValueCell.update(transformData.matrix, transformData.matrix.ref.value);
|
||||
ValueCell.update(transformData.transform, transformArray);
|
||||
const transform = transformData.transform.ref.value.length >= instanceCount * 16 ? transformData.transform.ref.value : new Float32Array(instanceCount * 16);
|
||||
transform.set(transformArray);
|
||||
ValueCell.update(transformData.transform, transform);
|
||||
ValueCell.updateIfChanged(transformData.uInstanceCount, instanceCount);
|
||||
ValueCell.updateIfChanged(transformData.instanceCount, instanceCount);
|
||||
|
||||
const aTransform = transformData.aTransform.ref.value.length >= instanceCount * 16 ? transformData.aTransform.ref.value : new Float32Array(instanceCount * 16);
|
||||
aTransform.set(transformArray);
|
||||
ValueCell.update(transformData.aTransform, aTransform);
|
||||
|
||||
// Note that this sets `extraTransform` to identity transforms
|
||||
@@ -64,9 +65,9 @@ export function createTransform(transformArray: Float32Array, instanceCount: num
|
||||
return transformData;
|
||||
} else {
|
||||
return {
|
||||
aTransform: ValueCell.create(new Float32Array(transformArray)),
|
||||
aTransform: ValueCell.create(new Float32Array(instanceCount * 16)),
|
||||
matrix: ValueCell.create(Mat4.identity()),
|
||||
transform: ValueCell.create(transformArray),
|
||||
transform: ValueCell.create(new Float32Array(transformArray)),
|
||||
extraTransform: ValueCell.create(fillIdentityTransform(new Float32Array(instanceCount * 16), instanceCount)),
|
||||
uInstanceCount: ValueCell.create(instanceCount),
|
||||
instanceCount: ValueCell.create(instanceCount),
|
||||
|
||||
@@ -64,21 +64,19 @@ function createHistopyramidReductionRenderable(ctx: WebGLContext, inputLevel: Te
|
||||
}
|
||||
|
||||
type TextureFramebuffer = { texture: Texture, framebuffer: Framebuffer }
|
||||
const LevelTexturesFramebuffers: TextureFramebuffer[] = [];
|
||||
function getLevelTextureFramebuffer(ctx: WebGLContext, level: number) {
|
||||
let textureFramebuffer = LevelTexturesFramebuffers[level];
|
||||
const size = Math.pow(2, level);
|
||||
if (textureFramebuffer === undefined) {
|
||||
const texture = ctx.isWebGL2
|
||||
? getTexture(`level${level}`, ctx, 'image-int32', 'alpha', 'int', 'nearest')
|
||||
: getTexture(`level${level}`, ctx, 'image-uint8', 'rgba', 'ubyte', 'nearest');
|
||||
texture.define(size, size);
|
||||
const framebuffer = getFramebuffer(`level${level}`, ctx);
|
||||
const name = `level${level}`;
|
||||
const texture = ctx.isWebGL2
|
||||
? getTexture(name, ctx, 'image-int32', 'alpha', 'int', 'nearest')
|
||||
: getTexture(name, ctx, 'image-uint8', 'rgba', 'ubyte', 'nearest');
|
||||
texture.define(size, size);
|
||||
let framebuffer = tryGetFramebuffer(name, ctx);
|
||||
if (!framebuffer) {
|
||||
framebuffer = getFramebuffer(name, ctx);
|
||||
texture.attachFramebuffer(framebuffer, 0);
|
||||
textureFramebuffer = { texture, framebuffer };
|
||||
LevelTexturesFramebuffers[level] = textureFramebuffer;
|
||||
}
|
||||
return textureFramebuffer;
|
||||
return { texture, framebuffer };
|
||||
}
|
||||
|
||||
function setRenderingDefaults(ctx: WebGLContext) {
|
||||
@@ -108,6 +106,11 @@ function getTexture(name: string, webgl: WebGLContext, kind: TextureKind, format
|
||||
return webgl.namedTextures[_name];
|
||||
}
|
||||
|
||||
function tryGetFramebuffer(name: string, webgl: WebGLContext): Framebuffer | undefined {
|
||||
const _name = `${HistogramPyramidName}-${name}`;
|
||||
return webgl.namedFramebuffers[_name];
|
||||
}
|
||||
|
||||
export interface HistogramPyramid {
|
||||
pyramidTex: Texture
|
||||
count: number
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
*/
|
||||
|
||||
import { ParamDefinition as PD } from '../../mol-util/param-definition';
|
||||
import { SymmetryOperator } from '../../mol-math/geometry';
|
||||
import { Sphere3D, SymmetryOperator } from '../../mol-math/geometry';
|
||||
import { Mat4, Vec3 } from '../../mol-math/linear-algebra';
|
||||
import { Structure } from '../../mol-model/structure';
|
||||
import { StructureUnitTransforms } from '../../mol-model/structure/structure/util/unit-transforms';
|
||||
|
||||
const _unwindMatrix = Mat4.zero();
|
||||
const _unwindMatrix = Mat4();
|
||||
export function unwindStructureAssembly(structure: Structure, unitTransforms: StructureUnitTransforms, t: number) {
|
||||
for (let i = 0, _i = structure.units.length; i < _i; i++) {
|
||||
const u = structure.units[i];
|
||||
@@ -20,15 +20,14 @@ export function unwindStructureAssembly(structure: Structure, unitTransforms: St
|
||||
}
|
||||
}
|
||||
|
||||
const _centerVec = Vec3.zero(), _transVec = Vec3.zero(), _transMat = Mat4.zero();
|
||||
export function explodeStructure(structure: Structure, unitTransforms: StructureUnitTransforms, t: number) {
|
||||
const boundary = structure.boundary.sphere;
|
||||
const d = boundary.radius * t;
|
||||
const _centerVec = Vec3(), _transVec = Vec3(), _transMat = Mat4();
|
||||
export function explodeStructure(structure: Structure, unitTransforms: StructureUnitTransforms, t: number, sphere: Sphere3D) {
|
||||
const d = sphere.radius * t;
|
||||
|
||||
for (let i = 0, _i = structure.units.length; i < _i; i++) {
|
||||
const u = structure.units[i];
|
||||
Vec3.transformMat4(_centerVec, u.lookup3d.boundary.sphere.center, u.conformation.operator.matrix);
|
||||
Vec3.sub(_transVec, _centerVec, boundary.center);
|
||||
Vec3.sub(_transVec, _centerVec, sphere.center);
|
||||
Vec3.setMagnitude(_transVec, _transVec, d);
|
||||
Mat4.fromTranslation(_transMat, _transVec);
|
||||
|
||||
|
||||
@@ -236,23 +236,23 @@ const ExplodeStructureRepresentation3D = PluginStateTransform.BuiltIn({
|
||||
},
|
||||
apply({ a, params }) {
|
||||
const structure = a.data.sourceData;
|
||||
const unitTransforms = new StructureUnitTransforms(structure.root);
|
||||
explodeStructure(structure, unitTransforms, params.t);
|
||||
const unitTransforms = new StructureUnitTransforms(structure);
|
||||
explodeStructure(structure, unitTransforms, params.t, structure.root.boundary.sphere);
|
||||
return new SO.Molecule.Structure.Representation3DState({
|
||||
state: { unitTransforms },
|
||||
initialState: { unitTransforms: new StructureUnitTransforms(structure.root) },
|
||||
info: structure.root,
|
||||
initialState: { unitTransforms: new StructureUnitTransforms(structure) },
|
||||
info: structure,
|
||||
repr: a.data.repr
|
||||
}, { label: `Explode T = ${params.t.toFixed(2)}` });
|
||||
},
|
||||
update({ a, b, newParams, oldParams }) {
|
||||
const structure = a.data.sourceData;
|
||||
if (b.data.info !== structure.root) return StateTransformer.UpdateResult.Recreate;
|
||||
if (b.data.info !== structure) return StateTransformer.UpdateResult.Recreate;
|
||||
if (a.data.repr !== b.data.repr) return StateTransformer.UpdateResult.Recreate;
|
||||
|
||||
if (oldParams.t === newParams.t) return StateTransformer.UpdateResult.Unchanged;
|
||||
const unitTransforms = b.data.state.unitTransforms!;
|
||||
explodeStructure(structure.root, unitTransforms, newParams.t);
|
||||
explodeStructure(structure, unitTransforms, newParams.t, structure.root.boundary.sphere);
|
||||
b.label = `Explode T = ${newParams.t.toFixed(2)}`;
|
||||
b.data.repr = a.data.repr;
|
||||
return StateTransformer.UpdateResult.Updated;
|
||||
@@ -275,27 +275,27 @@ const SpinStructureRepresentation3D = PluginStateTransform.BuiltIn({
|
||||
},
|
||||
apply({ a, params }) {
|
||||
const structure = a.data.sourceData;
|
||||
const unitTransforms = new StructureUnitTransforms(structure.root);
|
||||
const unitTransforms = new StructureUnitTransforms(structure);
|
||||
|
||||
const { axis, origin } = getSpinStructureAxisAndOrigin(structure.root, params);
|
||||
spinStructure(structure, unitTransforms, params.t, axis, origin);
|
||||
return new SO.Molecule.Structure.Representation3DState({
|
||||
state: { unitTransforms },
|
||||
initialState: { unitTransforms: new StructureUnitTransforms(structure.root) },
|
||||
info: structure.root,
|
||||
initialState: { unitTransforms: new StructureUnitTransforms(structure) },
|
||||
info: structure,
|
||||
repr: a.data.repr
|
||||
}, { label: `Spin T = ${params.t.toFixed(2)}` });
|
||||
},
|
||||
update({ a, b, newParams, oldParams }) {
|
||||
const structure = a.data.sourceData;
|
||||
if (b.data.info !== structure.root) return StateTransformer.UpdateResult.Recreate;
|
||||
if (b.data.info !== structure) return StateTransformer.UpdateResult.Recreate;
|
||||
if (a.data.repr !== b.data.repr) return StateTransformer.UpdateResult.Recreate;
|
||||
|
||||
if (oldParams.t === newParams.t && oldParams.axis === newParams.axis && oldParams.origin === newParams.origin) return StateTransformer.UpdateResult.Unchanged;
|
||||
|
||||
const unitTransforms = b.data.state.unitTransforms!;
|
||||
const { axis, origin } = getSpinStructureAxisAndOrigin(structure.root, newParams);
|
||||
spinStructure(structure.root, unitTransforms, newParams.t, axis, origin);
|
||||
spinStructure(structure, unitTransforms, newParams.t, axis, origin);
|
||||
b.label = `Spin T = ${newParams.t.toFixed(2)}`;
|
||||
b.data.repr = a.data.repr;
|
||||
return StateTransformer.UpdateResult.Updated;
|
||||
|
||||
@@ -120,7 +120,7 @@ class SymbolRuntimeImpl<S extends MSymbol> implements QuerySymbolRuntime {
|
||||
constArgs = true;
|
||||
} else if (Expression.isArgumentsArray(inputArgs)) {
|
||||
args = [];
|
||||
constArgs = false;
|
||||
constArgs = true;
|
||||
for (const arg of inputArgs) {
|
||||
const compiled = _compile(ctx, arg);
|
||||
constArgs = constArgs && compiled.isConst;
|
||||
@@ -128,7 +128,7 @@ class SymbolRuntimeImpl<S extends MSymbol> implements QuerySymbolRuntime {
|
||||
}
|
||||
} else {
|
||||
args = Object.create(null);
|
||||
constArgs = false;
|
||||
constArgs = true;
|
||||
for (const key of Object.keys(inputArgs)) {
|
||||
const compiled = _compile(ctx, inputArgs[key]);
|
||||
constArgs = constArgs && compiled.isConst;
|
||||
|
||||
Reference in New Issue
Block a user