From 9a2dfd7e57d2fc8ff09ffc8617d9c1e29b68e46b Mon Sep 17 00:00:00 2001 From: Alexander Rose <alexander.rose@weirdbyte.de> Date: Sun, 8 Jan 2023 20:53:59 -0800 Subject: [PATCH] improve calculateInvariantBoundingSphere --- src/mol-gl/renderable/util.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/mol-gl/renderable/util.ts b/src/mol-gl/renderable/util.ts index cb54c9a73..c642c6507 100644 --- a/src/mol-gl/renderable/util.ts +++ b/src/mol-gl/renderable/util.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> */ @@ -10,6 +10,10 @@ import { BoundaryHelper } from '../../mol-math/geometry/boundary-helper'; import { TextureFilter } from '../webgl/texture'; import { arrayMinMax } from '../../mol-util/array'; +// avoiding namespace lookup improved performance in Chrome (Aug 2020) +const v3fromArray = Vec3.fromArray; +const v3transformMat4Offset = Vec3.transformMat4Offset; + export function calculateTextureInfo(n: number, itemSize: number) { n = Math.max(n, 2); // observed issues with 1 pixel textures const sqN = Math.sqrt(n); @@ -137,21 +141,21 @@ export function calculateInvariantBoundingSphere(position: Float32Array, positio boundaryHelper.reset(); for (let i = 0, _i = positionCount * 3; i < _i; i += step) { - Vec3.fromArray(v, position, i); + v3fromArray(v, position, i); boundaryHelper.includePosition(v); } boundaryHelper.finishedIncludeStep(); for (let i = 0, _i = positionCount * 3; i < _i; i += step) { - Vec3.fromArray(v, position, i); + v3fromArray(v, position, i); boundaryHelper.radiusPosition(v); } const sphere = boundaryHelper.getSphere(); - if (positionCount <= 98) { + if (positionCount <= 14) { const extrema: Vec3[] = []; for (let i = 0, _i = positionCount * 3; i < _i; i += step) { - extrema.push(Vec3.fromArray(Vec3(), position, i)); + extrema.push(v3fromArray(Vec3(), position, i)); } Sphere3D.setExtrema(sphere, extrema); } @@ -174,28 +178,28 @@ export function calculateTransformBoundingSphere(invariantBoundingSphere: Sphere const { center, radius, extrema } = invariantBoundingSphere; // only use extrema if there are not too many transforms - if (extrema && transformCount < 50) { + if (extrema && transformCount <= 14) { for (let i = 0, _i = transformCount; i < _i; ++i) { for (const e of extrema) { - Vec3.transformMat4Offset(v, e, transform, 0, 0, i * 16); + v3transformMat4Offset(v, e, transform, 0, 0, i * 16); boundaryHelper.includePosition(v); } } boundaryHelper.finishedIncludeStep(); for (let i = 0, _i = transformCount; i < _i; ++i) { for (const e of extrema) { - Vec3.transformMat4Offset(v, e, transform, 0, 0, i * 16); + v3transformMat4Offset(v, e, transform, 0, 0, i * 16); boundaryHelper.radiusPosition(v); } } } else { for (let i = 0, _i = transformCount; i < _i; ++i) { - Vec3.transformMat4Offset(v, center, transform, 0, 0, i * 16); + v3transformMat4Offset(v, center, transform, 0, 0, i * 16); boundaryHelper.includePositionRadius(v, radius); } boundaryHelper.finishedIncludeStep(); for (let i = 0, _i = transformCount; i < _i; ++i) { - Vec3.transformMat4Offset(v, center, transform, 0, 0, i * 16); + v3transformMat4Offset(v, center, transform, 0, 0, i * 16); boundaryHelper.radiusPositionRadius(v, radius); } } -- GitLab