From c28dd8135cd61db9047967bcc1ab74bb6d67aad4 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alexander.rose@weirdbyte.de> Date: Sat, 28 Jan 2023 23:08:39 -0800 Subject: [PATCH] perf tweaks - reuse vec3 in getMatrices - fast path in createElementSphereImpostor --- .../structure/property/assembly.ts | 3 +- src/mol-repr/structure/visual/util/element.ts | 34 ++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/mol-model-formats/structure/property/assembly.ts b/src/mol-model-formats/structure/property/assembly.ts index 93b5ae666..062a75d16 100644 --- a/src/mol-model-formats/structure/property/assembly.ts +++ b/src/mol-model-formats/structure/property/assembly.ts @@ -74,10 +74,11 @@ function operatorGroupsProvider(generators: Generator[], matrices: Matrices): () function getMatrices(pdbx_struct_oper_list: StructOperList): Matrices { const { id, matrix, vector, _schema } = pdbx_struct_oper_list; const matrices = new Map<string, Mat4>(); + const t = Vec3(); for (let i = 0, _i = pdbx_struct_oper_list._rowCount; i < _i; i++) { const m = Tensor.toMat4(Mat4(), _schema.matrix.space, matrix.value(i)); - const t = Tensor.toVec3(Vec3(), _schema.vector.space, vector.value(i)); + Tensor.toVec3(t, _schema.vector.space, vector.value(i)); Mat4.setTranslation(m, t); Mat4.setValue(m, 3, 3, 1); matrices.set(id.value(i), m); diff --git a/src/mol-repr/structure/visual/util/element.ts b/src/mol-repr/structure/visual/util/element.ts index d19d99f2c..e166b56bf 100644 --- a/src/mol-repr/structure/visual/util/element.ts +++ b/src/mol-repr/structure/visual/util/element.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2018-2023 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> * @author David Sehnal <david.sehnal@gmail.com> @@ -80,15 +80,15 @@ export function createElementSphereMesh(ctx: VisualContext, unit: Unit, structur for (let i = 0; i < elementCount; i++) { if (ignore && ignore(elements[i])) continue; - l.element = elements[i]; pos(elements[i], v); v3add(center, center, v); count += 1; - builderState.currentGroup = i; + l.element = elements[i]; const size = themeSize(l); if (size > maxSize) maxSize = size; + builderState.currentGroup = i; addSphere(builderState, v, size * sizeFactor, detail); } @@ -132,17 +132,27 @@ export function createElementSphereImpostor(ctx: VisualContext, unit: Unit, stru let maxSize = 0; let count = 0; - for (let i = 0; i < elementCount; i++) { - if (ignore?.(elements[i])) continue; + if (ignore || theme.size.granularity !== 'uniform') { + for (let i = 0; i < elementCount; i++) { + if (ignore && ignore(elements[i])) continue; - pos(elements[i], v); - builder.add(v[0], v[1], v[2], i); - v3add(center, center, v); - count += 1; + pos(elements[i], v); + builder.add(v[0], v[1], v[2], i); + v3add(center, center, v); + count += 1; - l.element = elements[i]; - const size = themeSize(l); - if (size > maxSize) maxSize = size; + l.element = elements[i]; + const size = themeSize(l); + if (size > maxSize) maxSize = size; + } + } else { + for (let i = 0; i < elementCount; i++) { + pos(elements[i], v); + builder.add(v[0], v[1], v[2], i); + v3add(center, center, v); + } + count = elementCount; + maxSize = themeSize(l); } const oldBoundingSphere = spheres ? Sphere3D.clone(spheres.boundingSphere) : undefined; -- GitLab