diff --git a/CHANGELOG.md b/CHANGELOG.md index 7aa641ca6cd71ee11a3187b63a8fdd1364fb89e7..a518560fde128d7795a404d29834bbf86bfa018a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ Note that since we don't clearly distinguish between a public and private interf ## [Unreleased] +- Enable odd dash count (1,3,5) + ## [v3.33.0] - 2023-04-02 - Handle resizes of viewer element even when window remains the same size diff --git a/src/mol-geo/geometry/cylinders/cylinders-builder.ts b/src/mol-geo/geometry/cylinders/cylinders-builder.ts index aa28124cf5da42846404e3ffcc63bf5a568d4b3c..9f0e7f589aa45a0031d2b545a4b1f5d92fa0a745 100644 --- a/src/mol-geo/geometry/cylinders/cylinders-builder.ts +++ b/src/mol-geo/geometry/cylinders/cylinders-builder.ts @@ -45,24 +45,21 @@ export namespace CylindersBuilder { const addFixedCountDashes = (start: Vec3, end: Vec3, segmentCount: number, radiusScale: number, topCap: boolean, bottomCap: boolean, stubCap: boolean, group: number) => { const d = Vec3.distance(start, end); const isOdd = segmentCount % 2 !== 0; - segmentCount++; - const s = Math.floor(segmentCount / 2); - const step = 1 / segmentCount; - const offset = step / 2; + const s = Math.floor((segmentCount + 1) / 2); + const step = d / (segmentCount + 0.5); - Vec3.sub(tmpDir, end, start); + Vec3.setMagnitude(tmpDir, Vec3.sub(tmpDir, end, start), step); + Vec3.copy(tmpVecA, start); for (let j = 0; j < s; ++j) { - const f = step * (j * 2 + 1) + offset; - Vec3.setMagnitude(tmpDir, tmpDir, d * f); - Vec3.add(tmpVecA, start, tmpDir); + Vec3.add(tmpVecA, tmpVecA, tmpDir); if (isOdd && j === s - 1) { Vec3.copy(tmpVecB, end); if (!stubCap) bottomCap = false; } else { - Vec3.setMagnitude(tmpDir, tmpDir, d * (step * ((j + 1) * 2) + offset)); - Vec3.add(tmpVecB, start, tmpDir); + Vec3.add(tmpVecB, tmpVecA, tmpDir); } add(tmpVecA[0], tmpVecA[1], tmpVecA[2], tmpVecB[0], tmpVecB[1], tmpVecB[2], radiusScale, topCap, bottomCap, group); + Vec3.add(tmpVecA, tmpVecA, tmpDir); } }; diff --git a/src/mol-geo/geometry/lines/lines-builder.ts b/src/mol-geo/geometry/lines/lines-builder.ts index d8d512dd643d4410ee290dbf5de72dec3e32dd66..2d36442b6da9122afed2d82b95b919573a558273 100644 --- a/src/mol-geo/geometry/lines/lines-builder.ts +++ b/src/mol-geo/geometry/lines/lines-builder.ts @@ -52,23 +52,20 @@ export namespace LinesBuilder { const addFixedCountDashes = (start: Vec3, end: Vec3, segmentCount: number, group: number) => { const d = Vec3.distance(start, end); const isOdd = segmentCount % 2 !== 0; - segmentCount++; - const s = Math.floor(segmentCount / 2); - const step = 1 / segmentCount; - const offset = step / 2; + const s = Math.floor((segmentCount + 1) / 2); + const step = d / (segmentCount + 0.5); - Vec3.sub(tmpDir, end, start); + Vec3.setMagnitude(tmpDir, Vec3.sub(tmpDir, end, start), step); + Vec3.copy(tmpVecA, start); for (let j = 0; j < s; ++j) { - const f = step * (j * 2 + 1) + offset; - Vec3.setMagnitude(tmpDir, tmpDir, d * f); - Vec3.add(tmpVecA, start, tmpDir); + Vec3.add(tmpVecA, tmpVecA, tmpDir); if (isOdd && j === s - 1) { Vec3.copy(tmpVecB, end); } else { - Vec3.setMagnitude(tmpDir, tmpDir, d * step * ((j + 1) * 2) + offset); - Vec3.add(tmpVecB, start, tmpDir); + Vec3.add(tmpVecB, tmpVecA, tmpDir); } add(tmpVecA[0], tmpVecA[1], tmpVecA[2], tmpVecB[0], tmpVecB[1], tmpVecB[2], group); + Vec3.add(tmpVecA, tmpVecA, tmpDir); } }; diff --git a/src/mol-geo/geometry/mesh/builder/cylinder.ts b/src/mol-geo/geometry/mesh/builder/cylinder.ts index d432a13a405eff46f9fa3defb9361da152cd8905..76ad187f767e5823366d42d01bde3d3e315fdf73 100644 --- a/src/mol-geo/geometry/mesh/builder/cylinder.ts +++ b/src/mol-geo/geometry/mesh/builder/cylinder.ts @@ -101,28 +101,24 @@ export function addDoubleCylinder(state: MeshBuilder.State, start: Vec3, end: Ve export function addFixedCountDashedCylinder(state: MeshBuilder.State, start: Vec3, end: Vec3, lengthScale: number, segmentCount: number, stubCap: boolean, props: BasicCylinderProps) { const d = Vec3.distance(start, end) * lengthScale; const isOdd = segmentCount % 2 !== 0; - segmentCount++; - const s = Math.floor(segmentCount / 2); - const step = 1 / segmentCount; - const offset = step / 2; + const s = Math.floor((segmentCount + 1) / 2); + let step = d / (segmentCount + 0.5); let cylinder = getCylinder(props); - Vec3.sub(tmpCylinderDir, end, start); - + Vec3.setMagnitude(tmpCylinderDir, Vec3.sub(tmpCylinderDir, end, start), step); + Vec3.copy(tmpCylinderStart, start); for (let j = 0; j < s; ++j) { - const f = step * (j * 2 + 1) + offset; - let len = d * step; - Vec3.setMagnitude(tmpCylinderDir, tmpCylinderDir, d * f); - Vec3.add(tmpCylinderStart, start, tmpCylinderDir); - + Vec3.add(tmpCylinderStart, tmpCylinderStart, tmpCylinderDir); if (isOdd && j === s - 1) { if (!stubCap && props.topCap) { props.topCap = false; cylinder = getCylinder(props); } - len /= 2; + step /= 2; } - setCylinderMat(tmpCylinderMat, tmpCylinderStart, tmpCylinderDir, len, false); + setCylinderMat(tmpCylinderMat, tmpCylinderStart, tmpCylinderDir, step, false); MeshBuilder.addPrimitive(state, tmpCylinderMat, cylinder); + + Vec3.add(tmpCylinderStart, tmpCylinderStart, tmpCylinderDir); } }