浏览代码

mol-geo improvements for mesh, cage and primitive

Alexander Rose 5 年之前
父节点
当前提交
ca92931bf2

+ 2 - 2
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 { 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) {
         for (let i = 0, il = ea.length; i < il; i += 2) {
             Vec3.fromArray(tmpVecA, va, ea[i] * 3)
             Vec3.fromArray(tmpVecA, va, ea[i] * 3)
             Vec3.fromArray(tmpVecB, va, ea[i + 1] * 3)
             Vec3.fromArray(tmpVecB, va, ea[i + 1] * 3)

+ 23 - 0
src/mol-geo/primitive/cage.ts

@@ -4,6 +4,9 @@
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  * @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 {
 export interface Cage {
     readonly vertices: ArrayLike<number>
     readonly vertices: ArrayLike<number>
     readonly edges: ArrayLike<number>
     readonly edges: ArrayLike<number>
@@ -11,4 +14,24 @@ export interface Cage {
 
 
 export function createCage(vertices: ArrayLike<number>, edges: ArrayLike<number>): Cage {
 export function createCage(vertices: ArrayLike<number>, edges: ArrayLike<number>): Cage {
     return { vertices, edges }
     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
 }
 }

+ 8 - 0
src/mol-geo/primitive/primitive.ts

@@ -30,6 +30,14 @@ export function createPrimitive(vertices: ArrayLike<number>, indices: ArrayLike<
     return builder.getPrimitive()
     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 {
 export interface PrimitiveBuilder {
     add(a: Vec3, b: Vec3, c: Vec3): void
     add(a: Vec3, b: Vec3, c: Vec3): void
     getPrimitive(): Primitive
     getPrimitive(): Primitive

+ 1 - 1
src/tests/browser/render-mesh.ts

@@ -31,7 +31,7 @@ function meshRepr() {
     const builderState = MeshBuilder.createState()
     const builderState = MeshBuilder.createState()
 
 
     const t = Mat4.identity()
     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()
     const t2 = Mat4.identity()
     Mat4.scaleUniformly(t2, t2, 0.1)
     Mat4.scaleUniformly(t2, t2, 0.1)