UNPKG

molstar

Version:

A comprehensive macromolecular library.

97 lines 4.38 kB
"use strict"; /** * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.transformPrimitive = exports.PrimitiveBuilder = exports.copyPrimitive = exports.createPrimitive = void 0; var linear_algebra_1 = require("../../mol-math/linear-algebra"); var a = (0, linear_algebra_1.Vec3)(), b = (0, linear_algebra_1.Vec3)(), c = (0, linear_algebra_1.Vec3)(); /** Create primitive with face normals from vertices and indices */ function createPrimitive(vertices, indices) { var count = indices.length; var builder = PrimitiveBuilder(count / 3); for (var i = 0; i < count; i += 3) { linear_algebra_1.Vec3.fromArray(a, vertices, indices[i] * 3); linear_algebra_1.Vec3.fromArray(b, vertices, indices[i + 1] * 3); linear_algebra_1.Vec3.fromArray(c, vertices, indices[i + 2] * 3); builder.add(a, b, c); } return builder.getPrimitive(); } exports.createPrimitive = createPrimitive; function copyPrimitive(primitive) { return { vertices: new Float32Array(primitive.vertices), normals: new Float32Array(primitive.normals), indices: new Uint32Array(primitive.indices) }; } exports.copyPrimitive = copyPrimitive; var vn = (0, linear_algebra_1.Vec3)(); /** Builder to create primitive with face normals */ function PrimitiveBuilder(triangleCount, vertexCount) { if (vertexCount === undefined) vertexCount = triangleCount * 3; var vertices = new Float32Array(vertexCount * 3); var normals = new Float32Array(vertexCount * 3); var indices = new Uint32Array(triangleCount * 3); var vOffset = 0; var iOffset = 0; return { add: function (a, b, c) { linear_algebra_1.Vec3.toArray(a, vertices, vOffset); linear_algebra_1.Vec3.toArray(b, vertices, vOffset + 3); linear_algebra_1.Vec3.toArray(c, vertices, vOffset + 6); linear_algebra_1.Vec3.triangleNormal(vn, a, b, c); for (var j = 0; j < 3; ++j) { linear_algebra_1.Vec3.toArray(vn, normals, vOffset + 3 * j); indices[iOffset + j] = vOffset / 3 + j; } vOffset += 9; iOffset += 3; }, addQuad: function (a, b, c, d) { linear_algebra_1.Vec3.toArray(a, vertices, vOffset); linear_algebra_1.Vec3.toArray(b, vertices, vOffset + 3); linear_algebra_1.Vec3.toArray(c, vertices, vOffset + 6); linear_algebra_1.Vec3.toArray(d, vertices, vOffset + 9); linear_algebra_1.Vec3.triangleNormal(vn, a, b, c); for (var j = 0; j < 4; ++j) { linear_algebra_1.Vec3.toArray(vn, normals, vOffset + 3 * j); } var vOffset3 = vOffset / 3; // a, b, c indices[iOffset] = vOffset3; indices[iOffset + 1] = vOffset3 + 1; indices[iOffset + 2] = vOffset3 + 2; // a, b, c indices[iOffset + 3] = vOffset3 + 2; indices[iOffset + 4] = vOffset3 + 3; indices[iOffset + 5] = vOffset3; vOffset += 12; iOffset += 6; }, getPrimitive: function () { return ({ vertices: vertices, normals: normals, indices: indices }); } }; } exports.PrimitiveBuilder = PrimitiveBuilder; var tmpV = (0, linear_algebra_1.Vec3)(); var tmpMat3 = (0, linear_algebra_1.Mat3)(); /** Transform primitive in-place */ function transformPrimitive(primitive, t) { var vertices = primitive.vertices, normals = primitive.normals; var n = linear_algebra_1.Mat3.directionTransform(tmpMat3, t); for (var i = 0, il = vertices.length; i < il; i += 3) { // position linear_algebra_1.Vec3.transformMat4(tmpV, linear_algebra_1.Vec3.fromArray(tmpV, vertices, i), t); linear_algebra_1.Vec3.toArray(tmpV, vertices, i); // normal linear_algebra_1.Vec3.transformMat3(tmpV, linear_algebra_1.Vec3.fromArray(tmpV, normals, i), n); linear_algebra_1.Vec3.toArray(tmpV, normals, i); } return primitive; } exports.transformPrimitive = transformPrimitive; //# sourceMappingURL=primitive.js.map