|
@@ -9,8 +9,8 @@ import { UnitsVisual } from '..';
|
|
import { RuntimeContext } from 'mol-task'
|
|
import { RuntimeContext } from 'mol-task'
|
|
import { Mesh } from '../../../mesh/mesh';
|
|
import { Mesh } from '../../../mesh/mesh';
|
|
import { MeshBuilder } from '../../../mesh/mesh-builder';
|
|
import { MeshBuilder } from '../../../mesh/mesh-builder';
|
|
-import { getPolymerGapCount, PolymerGapIterator } from './util/polymer';
|
|
|
|
-import { getElementLoci, markElement, StructureElementIterator } from './util/element';
|
|
|
|
|
|
+import { getPolymerGapCount, PolymerGapIterator, PolymerGapLocationIterator } from './util/polymer';
|
|
|
|
+import { getElementLoci, markElement } from './util/element';
|
|
import { Vec3 } from 'mol-math/linear-algebra';
|
|
import { Vec3 } from 'mol-math/linear-algebra';
|
|
import { UnitsMeshVisual, DefaultUnitsMeshProps } from '../units-visual';
|
|
import { UnitsMeshVisual, DefaultUnitsMeshProps } from '../units-visual';
|
|
import { SizeThemeProps, SizeTheme } from 'mol-view/theme/size';
|
|
import { SizeThemeProps, SizeTheme } from 'mol-view/theme/size';
|
|
@@ -35,11 +35,9 @@ async function createPolymerGapCylinderMesh(ctx: RuntimeContext, unit: Unit, pro
|
|
const vertexCountEstimate = segmentCount * radialSegments * 2 * polymerGapCount * 2
|
|
const vertexCountEstimate = segmentCount * radialSegments * 2 * polymerGapCount * 2
|
|
const builder = MeshBuilder.create(vertexCountEstimate, vertexCountEstimate / 10, mesh)
|
|
const builder = MeshBuilder.create(vertexCountEstimate, vertexCountEstimate / 10, mesh)
|
|
|
|
|
|
- const { elements } = unit
|
|
|
|
const pos = unit.conformation.invariantPosition
|
|
const pos = unit.conformation.invariantPosition
|
|
const pA = Vec3.zero()
|
|
const pA = Vec3.zero()
|
|
const pB = Vec3.zero()
|
|
const pB = Vec3.zero()
|
|
- const l = StructureElement.create(unit)
|
|
|
|
const cylinderProps: CylinderProps = {
|
|
const cylinderProps: CylinderProps = {
|
|
radiusTop: 1, radiusBottom: 1, topCap: true, bottomCap: true, radialSegments
|
|
radiusTop: 1, radiusBottom: 1, topCap: true, bottomCap: true, radialSegments
|
|
}
|
|
}
|
|
@@ -49,30 +47,26 @@ async function createPolymerGapCylinderMesh(ctx: RuntimeContext, unit: Unit, pro
|
|
while (polymerGapIt.hasNext) {
|
|
while (polymerGapIt.hasNext) {
|
|
const { centerA, centerB } = polymerGapIt.move()
|
|
const { centerA, centerB } = polymerGapIt.move()
|
|
if (centerA.element === centerB.element) {
|
|
if (centerA.element === centerB.element) {
|
|
- builder.setGroup(centerA.element)
|
|
|
|
- pos(elements[centerA.element], pA)
|
|
|
|
|
|
+ builder.setGroup(i)
|
|
|
|
+ pos(centerA.element, pA)
|
|
addSphere(builder, pA, 0.6, 0)
|
|
addSphere(builder, pA, 0.6, 0)
|
|
} else {
|
|
} else {
|
|
- const elmA = elements[centerA.element]
|
|
|
|
- const elmB = elements[centerB.element]
|
|
|
|
- pos(elmA, pA)
|
|
|
|
- pos(elmB, pB)
|
|
|
|
|
|
+ pos(centerA.element, pA)
|
|
|
|
+ pos(centerB.element, pB)
|
|
|
|
|
|
- l.element = elmA
|
|
|
|
- cylinderProps.radiusTop = cylinderProps.radiusBottom = sizeTheme.size(l)
|
|
|
|
- builder.setGroup(centerA.element)
|
|
|
|
|
|
+ cylinderProps.radiusTop = cylinderProps.radiusBottom = sizeTheme.size(centerA)
|
|
|
|
+ builder.setGroup(i)
|
|
addFixedCountDashedCylinder(builder, pA, pB, 0.5, segmentCount, cylinderProps)
|
|
addFixedCountDashedCylinder(builder, pA, pB, 0.5, segmentCount, cylinderProps)
|
|
|
|
|
|
- l.element = elmB
|
|
|
|
- cylinderProps.radiusTop = cylinderProps.radiusBottom = sizeTheme.size(l)
|
|
|
|
- builder.setGroup(centerB.element)
|
|
|
|
|
|
+ cylinderProps.radiusTop = cylinderProps.radiusBottom = sizeTheme.size(centerB)
|
|
|
|
+ builder.setGroup(i + 1)
|
|
addFixedCountDashedCylinder(builder, pB, pA, 0.5, segmentCount, cylinderProps)
|
|
addFixedCountDashedCylinder(builder, pB, pA, 0.5, segmentCount, cylinderProps)
|
|
}
|
|
}
|
|
|
|
|
|
if (i % 10000 === 0 && ctx.shouldUpdate) {
|
|
if (i % 10000 === 0 && ctx.shouldUpdate) {
|
|
await ctx.update({ message: 'Gap mesh', current: i, max: polymerGapCount });
|
|
await ctx.update({ message: 'Gap mesh', current: i, max: polymerGapCount });
|
|
}
|
|
}
|
|
- ++i
|
|
|
|
|
|
+ i += 2
|
|
}
|
|
}
|
|
|
|
|
|
return builder.getMesh()
|
|
return builder.getMesh()
|
|
@@ -88,7 +82,7 @@ export function PolymerGapVisual(): UnitsVisual<PolymerGapProps> {
|
|
return UnitsMeshVisual<PolymerGapProps>({
|
|
return UnitsMeshVisual<PolymerGapProps>({
|
|
defaultProps: DefaultPolymerGapProps,
|
|
defaultProps: DefaultPolymerGapProps,
|
|
createMesh: createPolymerGapCylinderMesh,
|
|
createMesh: createPolymerGapCylinderMesh,
|
|
- createLocationIterator: StructureElementIterator.fromGroup,
|
|
|
|
|
|
+ createLocationIterator: PolymerGapLocationIterator.fromGroup,
|
|
getLoci: getElementLoci,
|
|
getLoci: getElementLoci,
|
|
mark: markElement,
|
|
mark: markElement,
|
|
setUpdateState: () => {}
|
|
setUpdateState: () => {}
|