diff --git a/CHANGELOG.md b/CHANGELOG.md index dc895749e95c82721697b18d91399338e7059f77..8818db11f999bdd93911b2242a3d9d0bfcee4792 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Note that since we don't clearly distinguish between a public and private interf ## [Unreleased] +- Fix ``TransformData`` issues [#133](https://github.com/molstar/molstar/issues/133) ## [v2.2.1] - 2021-08-02 diff --git a/src/mol-geo/geometry/transform-data.ts b/src/mol-geo/geometry/transform-data.ts index 65f1ccc1e5f04080be3fca11e269f80a5e442dde..743d359b2a03de9fc158f84c9bc5beb4d52e8cf4 100644 --- a/src/mol-geo/geometry/transform-data.ts +++ b/src/mol-geo/geometry/transform-data.ts @@ -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), diff --git a/src/mol-plugin-state/animation/helpers.ts b/src/mol-plugin-state/animation/helpers.ts index b3e554b1b26d8483452fbfa46befaa874c3d0ae9..3ba368a7f2ff9dc2ccd21b91009534dbc847de21 100644 --- a/src/mol-plugin-state/animation/helpers.ts +++ b/src/mol-plugin-state/animation/helpers.ts @@ -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); diff --git a/src/mol-plugin-state/transforms/representation.ts b/src/mol-plugin-state/transforms/representation.ts index d4bb3e506bb40e988733dd96cfa111f1f4feb54e..6c1d37b0fd74453bf47878dca70639d0ddc91756 100644 --- a/src/mol-plugin-state/transforms/representation.ts +++ b/src/mol-plugin-state/transforms/representation.ts @@ -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;