|
@@ -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>
|
|
|
*/
|
|
@@ -12,12 +12,15 @@ import { Cage } from '../../../mol-geo/primitive/cage';
|
|
|
|
|
|
export interface LinesBuilder {
|
|
|
add(startX: number, startY: number, startZ: number, endX: number, endY: number, endZ: number, group: number): void
|
|
|
+ addFixedCountDashes(start: Vec3, end: Vec3, segmentCount: number, group: number): void
|
|
|
+ addFixedLengthDashes(start: Vec3, end: Vec3, segmentLength: number, group: number): void
|
|
|
addCage(t: Mat4, cage: Cage, group: number): void
|
|
|
getLines(): Lines
|
|
|
}
|
|
|
|
|
|
-const tmpVecA = Vec3.zero()
|
|
|
-const tmpVecB = Vec3.zero()
|
|
|
+const tmpVecA = Vec3()
|
|
|
+const tmpVecB = Vec3()
|
|
|
+const tmpDir = Vec3()
|
|
|
|
|
|
export namespace LinesBuilder {
|
|
|
export function create(initialCount = 2048, chunkSize = 1024, lines?: Lines): LinesBuilder {
|
|
@@ -42,8 +45,29 @@ export namespace LinesBuilder {
|
|
|
ChunkedArray.add3(indices, offset + 1, offset + 3, offset + 2);
|
|
|
}
|
|
|
|
|
|
+ const addFixedCountDashes = (start: Vec3, end: Vec3, segmentCount: number, group: number) => {
|
|
|
+ const d = Vec3.distance(start, end)
|
|
|
+ const s = Math.floor(segmentCount / 2)
|
|
|
+ const step = 1 / segmentCount
|
|
|
+
|
|
|
+ Vec3.sub(tmpDir, end, start)
|
|
|
+ for (let j = 0; j < s; ++j) {
|
|
|
+ const f = step * (j * 2 + 1)
|
|
|
+ Vec3.setMagnitude(tmpDir, tmpDir, d * f)
|
|
|
+ Vec3.add(tmpVecA, start, tmpDir)
|
|
|
+ Vec3.setMagnitude(tmpDir, tmpDir, d * step * ((j + 1) * 2))
|
|
|
+ Vec3.add(tmpVecB, start, tmpDir)
|
|
|
+ add(tmpVecA[0], tmpVecA[1], tmpVecA[2], tmpVecB[0], tmpVecB[1], tmpVecB[2], group)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return {
|
|
|
add,
|
|
|
+ addFixedCountDashes,
|
|
|
+ addFixedLengthDashes: (start: Vec3, end: Vec3, segmentLength: number, group: number) => {
|
|
|
+ const d = Vec3.distance(start, end)
|
|
|
+ addFixedCountDashes(start, end, d / segmentLength, group)
|
|
|
+ },
|
|
|
addCage: (t: Mat4, cage: Cage, group: number) => {
|
|
|
const { vertices, edges } = cage
|
|
|
for (let i = 0, il = edges.length; i < il; i += 2) {
|