diff --git a/src/mol-geo/geometry/lines/lines-builder.ts b/src/mol-geo/geometry/lines/lines-builder.ts index ac9d7a94f8a27b13f6bb30f77c111fb4c7752279..70d994dbbed725b91fb0a01836df7b5759ce7ec1 100644 --- a/src/mol-geo/geometry/lines/lines-builder.ts +++ b/src/mol-geo/geometry/lines/lines-builder.ts @@ -16,8 +16,8 @@ export interface LinesBuilder { getLines(): Lines } -const tmpA = Vec3.zero() -const tmpB = Vec3.zero() +const tmpVecA = Vec3.zero() +const tmpVecB = Vec3.zero() export namespace LinesBuilder { export function create(initialCount = 2048, chunkSize = 1024, lines?: Lines): LinesBuilder { @@ -47,11 +47,11 @@ export namespace LinesBuilder { addCage: (t: Mat4, cage: Cage, group: number) => { const { vertices, edges } = cage for (let i = 0, il = edges.length; i < il; i += 2) { - Vec3.fromArray(tmpA, vertices, edges[i] * 3) - Vec3.fromArray(tmpB, vertices, edges[i + 1] * 3) - Vec3.transformMat4(tmpA, tmpA, t) - Vec3.transformMat4(tmpB, tmpB, t) - add(tmpA[0], tmpA[1], tmpA[2], tmpB[0], tmpB[1], tmpB[2], group) + Vec3.fromArray(tmpVecA, vertices, edges[i] * 3) + Vec3.fromArray(tmpVecB, vertices, edges[i + 1] * 3) + Vec3.transformMat4(tmpVecA, tmpVecA, t) + Vec3.transformMat4(tmpVecB, tmpVecB, t) + add(tmpVecA[0], tmpVecA[1], tmpVecA[2], tmpVecB[0], tmpVecB[1], tmpVecB[2], group) } }, getLines: () => { diff --git a/src/mol-geo/geometry/mesh/mesh-builder.ts b/src/mol-geo/geometry/mesh/mesh-builder.ts index 742f41e719a5114e7b0862e61f3816086b79d89e..4ebb531123d1916f421c6b3b318a422af60ce3d8 100644 --- a/src/mol-geo/geometry/mesh/mesh-builder.ts +++ b/src/mol-geo/geometry/mesh/mesh-builder.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ @@ -10,9 +10,14 @@ import { ChunkedArray } from 'mol-data/util'; import { Mesh } from './mesh'; import { getNormalMatrix } from '../../util'; import { Primitive } from '../../primitive/primitive'; +import { Cage } from 'mol-geo/primitive/cage'; +import { addSphere } from './builder/sphere'; +import { addCylinder } from './builder/cylinder'; const tmpV = Vec3.zero() const tmpMat3 = Mat3.zero() +const tmpVecA = Vec3.zero() +const tmpVecB = Vec3.zero() export namespace MeshBuilder { export interface State { @@ -55,6 +60,20 @@ export namespace MeshBuilder { } } + export function addCage(state: State, t: Mat4, cage: Cage, radius: number, detail: number) { + const { vertices: va, edges: ea } = cage + const cylinderProps = { radiusTop: radius, radiusBottom: radius } + for (let i = 0, il = ea.length; i < il; i += 2) { + Vec3.fromArray(tmpVecA, va, ea[i] * 3) + Vec3.fromArray(tmpVecB, va, ea[i + 1] * 3) + Vec3.transformMat4(tmpVecA, tmpVecA, t) + Vec3.transformMat4(tmpVecB, tmpVecB, t) + addSphere(state, tmpVecA, radius, detail) + addSphere(state, tmpVecB, radius, detail) + addCylinder(state, tmpVecA, tmpVecB, 1, cylinderProps) + } + } + export function getMesh (state: State): Mesh { const { vertices, normals, indices, groups, mesh } = state const vb = ChunkedArray.compact(vertices, true) as Float32Array