Skip to content
Snippets Groups Projects
Commit 9a2dfd7e authored by Alexander Rose's avatar Alexander Rose
Browse files

improve calculateInvariantBoundingSphere

parent c9a168a1
No related branches found
No related tags found
No related merge requests found
/**
* 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);
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment