Browse Source

perf tweaks

- reuse vec3 in getMatrices
- fast path in createElementSphereImpostor
Alexander Rose 2 years ago
parent
commit
c28dd8135c

+ 2 - 1
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);

+ 22 - 12
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;