molstar
Version:
A comprehensive macromolecular library.
124 lines (123 loc) • 4.31 kB
JavaScript
/**
* Copyright (c) 2018-2024 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
* @author Gianluca Tomasello <giagitom@gmail.com>
* @author Cai Huiyu <szmun.caihy@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.EmptyLocationIterator = void 0;
exports.LocationIterator = LocationIterator;
exports.PositionLocation = PositionLocation;
exports.isPositionLocation = isPositionLocation;
const linear_algebra_1 = require("../../mol-math/linear-algebra");
const location_1 = require("../../mol-model/location");
function LocationIterator(groupCount, instanceCount, stride, getLocation, nonInstanceable = false, isSecondary = () => false, getLocation2) {
if (groupCount % stride !== 0) {
throw new Error('incompatible groupCount and stride');
}
const value = {
location: location_1.NullLocation,
location2: location_1.NullLocation,
index: 0,
groupIndex: 0,
instanceIndex: 0,
isSecondary: false
};
let hasNext = value.groupIndex < groupCount;
let isNextNewInstance = false;
let groupIndex = 0;
let instanceIndex = 0;
let voidInstances = false;
const hasLocation2 = !!getLocation2;
return {
get hasNext() { return hasNext; },
get isNextNewInstance() { return isNextNewInstance; },
groupCount,
instanceCount,
count: groupCount * instanceCount,
stride,
nonInstanceable,
hasLocation2,
move() {
if (hasNext) {
value.groupIndex = groupIndex;
value.instanceIndex = instanceIndex;
value.index = instanceIndex * groupCount + groupIndex;
value.location = getLocation(groupIndex, voidInstances ? -1 : instanceIndex);
if (hasLocation2)
value.location2 = getLocation2(groupIndex, voidInstances ? -1 : instanceIndex);
value.isSecondary = isSecondary(groupIndex, voidInstances ? -1 : instanceIndex);
groupIndex += stride;
if (groupIndex === groupCount) {
++instanceIndex;
isNextNewInstance = true;
if (instanceIndex < instanceCount)
groupIndex = 0;
}
else {
isNextNewInstance = false;
}
hasNext = groupIndex < groupCount;
}
return value;
},
reset() {
value.location = location_1.NullLocation;
value.location2 = location_1.NullLocation;
value.index = 0;
value.groupIndex = 0;
value.instanceIndex = 0;
value.isSecondary = false;
hasNext = value.groupIndex < groupCount;
isNextNewInstance = false;
groupIndex = 0;
instanceIndex = 0;
voidInstances = false;
},
skipInstance() {
if (hasNext && value.instanceIndex === instanceIndex) {
++instanceIndex;
groupIndex = 0;
hasNext = instanceIndex < instanceCount;
}
},
voidInstances() {
voidInstances = true;
}
};
}
exports.EmptyLocationIterator = {
get hasNext() { return false; },
get isNextNewInstance() { return false; },
groupCount: 0,
instanceCount: 0,
count: 0,
stride: 0,
nonInstanceable: false,
hasLocation2: false,
move() {
return {
location: location_1.NullLocation,
location2: location_1.NullLocation,
index: 0,
groupIndex: 0,
instanceIndex: 0,
isSecondary: false
};
},
reset() { },
skipInstance() { },
voidInstances() { }
};
function PositionLocation(position, normal) {
return {
kind: 'position-location',
position: position ? linear_algebra_1.Vec3.clone(position) : (0, linear_algebra_1.Vec3)(),
normal: normal ? linear_algebra_1.Vec3.clone(normal) : (0, linear_algebra_1.Vec3)()
};
}
function isPositionLocation(x) {
return !!x && x.kind === 'position-location';
}
;