UNPKG

molstar

Version:

A comprehensive macromolecular library.

57 lines 2.48 kB
/** * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { createPrimitive } from './primitive'; import { dodecahedronVertices, dodecahedronFaces } from './dodecahedron'; import { Vec3 } from '../../mol-math/linear-algebra'; function calcCenter(out) { var vec3s = []; for (var _i = 1; _i < arguments.length; _i++) { vec3s[_i - 1] = arguments[_i]; } Vec3.set(out, 0, 0, 0); for (var i = 0, il = vec3s.length; i < il; ++i) { Vec3.add(out, out, vec3s[i]); } Vec3.scale(out, out, 1 / vec3s.length); return out; } var center = Vec3.zero(); var dir = Vec3.zero(); var tip = Vec3.zero(); var vecA = Vec3.zero(); var vecB = Vec3.zero(); var vecC = Vec3.zero(); var vecD = Vec3.zero(); var vecE = Vec3.zero(); /** * Create a spiked ball derived from a dodecahedron * @param radiusRatio ratio between inner radius (dodecahedron) and outher radius (spikes) */ export function SpikedBall(radiusRatio) { if (radiusRatio === void 0) { radiusRatio = 1; } var vertices = dodecahedronVertices.slice(0); var indices = []; var offset = vertices.length / 3; for (var i = 0, il = dodecahedronFaces.length; i < il; i += 5) { Vec3.fromArray(vecA, dodecahedronVertices, dodecahedronFaces[i] * 3); Vec3.fromArray(vecB, dodecahedronVertices, dodecahedronFaces[i + 1] * 3); Vec3.fromArray(vecC, dodecahedronVertices, dodecahedronFaces[i + 2] * 3); Vec3.fromArray(vecD, dodecahedronVertices, dodecahedronFaces[i + 3] * 3); Vec3.fromArray(vecE, dodecahedronVertices, dodecahedronFaces[i + 4] * 3); calcCenter(center, vecA, vecB, vecC, vecD, vecE); Vec3.triangleNormal(dir, vecA, vecB, vecC); Vec3.scaleAndAdd(tip, center, dir, radiusRatio); Vec3.toArray(tip, vertices, offset * 3); indices.push(offset, dodecahedronFaces[i], dodecahedronFaces[i + 1]); indices.push(offset, dodecahedronFaces[i + 1], dodecahedronFaces[i + 2]); indices.push(offset, dodecahedronFaces[i + 2], dodecahedronFaces[i + 3]); indices.push(offset, dodecahedronFaces[i + 3], dodecahedronFaces[i + 4]); indices.push(offset, dodecahedronFaces[i + 4], dodecahedronFaces[i]); offset += 1; } return createPrimitive(vertices, indices); } //# sourceMappingURL=spiked-ball.js.map