From ca92931bf263494b588d7594ee2ec43def70f016 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Wed, 2 Oct 2019 17:52:48 -0700 Subject: [PATCH] mol-geo improvements for mesh, cage and primitive --- src/mol-geo/geometry/mesh/mesh-builder.ts | 4 ++-- src/mol-geo/primitive/cage.ts | 23 +++++++++++++++++++++++ src/mol-geo/primitive/primitive.ts | 8 ++++++++ src/tests/browser/render-mesh.ts | 2 +- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/mol-geo/geometry/mesh/mesh-builder.ts b/src/mol-geo/geometry/mesh/mesh-builder.ts index 0381fd2c7..87a0bf310 100644 --- a/src/mol-geo/geometry/mesh/mesh-builder.ts +++ b/src/mol-geo/geometry/mesh/mesh-builder.ts @@ -101,9 +101,9 @@ export namespace MeshBuilder { } } - export function addCage(state: State, t: Mat4, cage: Cage, radius: number, detail: number) { + export function addCage(state: State, t: Mat4, cage: Cage, radius: number, detail: number, radialSegments: number) { const { vertices: va, edges: ea } = cage - const cylinderProps = { radiusTop: radius, radiusBottom: radius } + const cylinderProps = { radiusTop: radius, radiusBottom: radius, radialSegments } 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) diff --git a/src/mol-geo/primitive/cage.ts b/src/mol-geo/primitive/cage.ts index 6c235c61f..3fad311d5 100644 --- a/src/mol-geo/primitive/cage.ts +++ b/src/mol-geo/primitive/cage.ts @@ -4,6 +4,9 @@ * @author Alexander Rose <alexander.rose@weirdbyte.de> */ +import { Mat4, Vec3 } from '../../mol-math/linear-algebra' +import { NumberArray } from '../../mol-util/type-helpers' + export interface Cage { readonly vertices: ArrayLike<number> readonly edges: ArrayLike<number> @@ -11,4 +14,24 @@ export interface Cage { export function createCage(vertices: ArrayLike<number>, edges: ArrayLike<number>): Cage { return { vertices, edges } +} + +export function copyCage(cage: Cage): Cage { + return { + vertices: new Float32Array(cage.vertices), + edges: new Uint32Array(cage.edges) + } +} + +const tmpV = Vec3.zero() + +/** Transform primitive in-place */ +export function transformCage(cage: Cage, t: Mat4) { + const { vertices } = cage + for (let i = 0, il = vertices.length; i < il; i += 3) { + // position + Vec3.transformMat4(tmpV, Vec3.fromArray(tmpV, vertices, i), t) + Vec3.toArray(tmpV, vertices as NumberArray, i) + } + return cage } \ No newline at end of file diff --git a/src/mol-geo/primitive/primitive.ts b/src/mol-geo/primitive/primitive.ts index c565dbc70..fcac1d238 100644 --- a/src/mol-geo/primitive/primitive.ts +++ b/src/mol-geo/primitive/primitive.ts @@ -30,6 +30,14 @@ export function createPrimitive(vertices: ArrayLike<number>, indices: ArrayLike< return builder.getPrimitive() } +export function copyPrimitive(primitive: Primitive): Primitive { + return { + vertices: new Float32Array(primitive.vertices), + normals: new Float32Array(primitive.normals), + indices: new Uint32Array(primitive.indices) + } +} + export interface PrimitiveBuilder { add(a: Vec3, b: Vec3, c: Vec3): void getPrimitive(): Primitive diff --git a/src/tests/browser/render-mesh.ts b/src/tests/browser/render-mesh.ts index 363d64150..ca5ee131a 100644 --- a/src/tests/browser/render-mesh.ts +++ b/src/tests/browser/render-mesh.ts @@ -31,7 +31,7 @@ function meshRepr() { const builderState = MeshBuilder.createState() const t = Mat4.identity() - MeshBuilder.addCage(builderState, t, HexagonalPrismCage(), 0.005, 2) + MeshBuilder.addCage(builderState, t, HexagonalPrismCage(), 0.005, 2, 20) const t2 = Mat4.identity() Mat4.scaleUniformly(t2, t2, 0.1) -- GitLab