molstar
Version:
A comprehensive macromolecular library.
127 lines • 4.45 kB
JavaScript
/**
* Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { Vec3 } from '../mol-math/linear-algebra';
import { arrayMax } from '../mol-util/array';
export function normalizeVec3Array(a, count) {
for (var i = 0, il = count * 3; i < il; i += 3) {
var x = a[i];
var y = a[i + 1];
var z = a[i + 2];
var s = 1 / Math.sqrt(x * x + y * y + z * z);
a[i] = x * s;
a[i + 1] = y * s;
a[i + 2] = z * s;
}
return a;
}
var tmpV3 = Vec3();
export function transformPositionArray(t, array, offset, count) {
for (var i = 0, il = count * 3; i < il; i += 3) {
Vec3.fromArray(tmpV3, array, offset + i);
Vec3.transformMat4(tmpV3, tmpV3, t);
Vec3.toArray(tmpV3, array, offset + i);
}
}
export function transformDirectionArray(n, array, offset, count) {
for (var i = 0, il = count * 3; i < il; i += 3) {
Vec3.fromArray(tmpV3, array, offset + i);
Vec3.transformMat3(tmpV3, tmpV3, n);
Vec3.toArray(tmpV3, array, offset + i);
}
}
/** iterate over the entire array and apply the radius to each vertex */
export function appplyRadius(vertices, radius) {
for (var i = 0, il = vertices.length; i < il; i += 3) {
Vec3.fromArray(tmpV3, vertices, i);
Vec3.normalize(tmpV3, tmpV3);
Vec3.scale(tmpV3, tmpV3, radius);
Vec3.toArray(tmpV3, vertices, i);
}
}
var a = Vec3();
var b = Vec3();
var c = Vec3();
var cb = Vec3();
var ab = Vec3();
/**
* indexed vertex normals weighted by triangle areas
* http://www.iquilezles.org/www/articles/normals/normals.htm
* - normals array must contain only zeros
*/
export function computeIndexedVertexNormals(vertices, indices, normals, vertexCount, triangleCount) {
for (var i = 0, il = triangleCount * 3; i < il; i += 3) {
var ai = indices[i] * 3;
var bi = indices[i + 1] * 3;
var ci = indices[i + 2] * 3;
Vec3.fromArray(a, vertices, ai);
Vec3.fromArray(b, vertices, bi);
Vec3.fromArray(c, vertices, ci);
Vec3.sub(cb, c, b);
Vec3.sub(ab, a, b);
Vec3.cross(cb, cb, ab);
normals[ai] += cb[0];
normals[ai + 1] += cb[1];
normals[ai + 2] += cb[2];
normals[bi] += cb[0];
normals[bi + 1] += cb[1];
normals[bi + 2] += cb[2];
normals[ci] += cb[0];
normals[ci + 1] += cb[1];
normals[ci + 2] += cb[2];
}
return normalizeVec3Array(normals, vertexCount);
}
/**
* vertex normals for unindexed triangle soup
* - normals array must contain only zeros
*/
export function computeVertexNormals(vertices, normals, vertexCount) {
for (var i = 0, il = vertexCount * 3; i < il; i += 9) {
Vec3.fromArray(a, vertices, i);
Vec3.fromArray(b, vertices, i + 3);
Vec3.fromArray(c, vertices, i + 6);
Vec3.sub(cb, c, b);
Vec3.sub(ab, a, b);
Vec3.cross(cb, cb, ab);
normals[i] = cb[0];
normals[i + 1] = cb[1];
normals[i + 2] = cb[2];
normals[i + 3] = cb[0];
normals[i + 4] = cb[1];
normals[i + 5] = cb[2];
normals[i + 6] = cb[0];
normals[i + 7] = cb[1];
normals[i + 8] = cb[2];
}
return normalizeVec3Array(normals, vertexCount);
}
/**
* The `step` parameter allows to skip over repeated values in `groups`
*/
export function createGroupMapping(groups, dataCount, step) {
if (step === void 0) { step = 1; }
var maxId = arrayMax(groups);
var offsets = new Int32Array(maxId + 2);
var bucketFill = new Int32Array(dataCount);
var bucketSizes = new Int32Array(dataCount);
for (var i = 0, il = dataCount * step; i < il; i += step)
++bucketSizes[groups[i]];
var offset = 0;
for (var i = 0; i < dataCount; i++) {
offsets[i] = offset;
offset += bucketSizes[i];
}
offsets[dataCount] = offset;
var indices = new Int32Array(offset);
for (var i = 0, il = dataCount * step; i < il; i += step) {
var g = groups[i];
var og = offsets[g] + bucketFill[g];
indices[og] = i;
++bucketFill[g];
}
return { indices: indices, offsets: offsets };
}
//# sourceMappingURL=util.js.map