polymer-direction-wedge.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Unit, Structure } from 'mol-model/structure';
  7. import { UnitsVisual } from '..';
  8. import { RuntimeContext } from 'mol-task'
  9. import { Mesh } from '../../../mesh/mesh';
  10. import { MeshBuilder } from '../../../mesh/mesh-builder';
  11. import { PolymerTraceIterator, createCurveSegmentState, interpolateCurveSegment, PolymerLocationIterator, getPolymerElementLoci, markPolymerElement } from './util/polymer';
  12. import { Vec3, Mat4 } from 'mol-math/linear-algebra';
  13. import { SecondaryStructureType, isNucleic } from 'mol-model/structure/model/types';
  14. import { DefaultUnitsMeshProps, UnitsMeshVisual } from '../units-visual';
  15. import { SizeThemeProps, SizeTheme } from 'mol-view/theme/size';
  16. import { Wedge } from '../../../primitive/wedge';
  17. const t = Mat4.identity()
  18. const sVec = Vec3.zero()
  19. const n0 = Vec3.zero()
  20. const n1 = Vec3.zero()
  21. const upVec = Vec3.zero()
  22. const depthFactor = 4
  23. const widthFactor = 4
  24. const heightFactor = 6
  25. const wedge = Wedge()
  26. export interface PolymerDirectionWedgeProps {
  27. sizeTheme: SizeThemeProps
  28. }
  29. async function createPolymerDirectionWedgeMesh(ctx: RuntimeContext, unit: Unit, structure: Structure, props: PolymerDirectionWedgeProps, mesh?: Mesh) {
  30. const polymerElementCount = unit.polymerElements.length
  31. if (!polymerElementCount) return Mesh.createEmpty(mesh)
  32. const sizeTheme = SizeTheme(props.sizeTheme)
  33. const vertexCount = polymerElementCount * 24
  34. const builder = MeshBuilder.create(vertexCount, vertexCount / 10, mesh)
  35. const linearSegments = 1
  36. const state = createCurveSegmentState(linearSegments)
  37. const { normalVectors, binormalVectors } = state
  38. let i = 0
  39. const polymerTraceIt = PolymerTraceIterator(unit)
  40. while (polymerTraceIt.hasNext) {
  41. const v = polymerTraceIt.move()
  42. builder.setGroup(i)
  43. const isNucleicType = isNucleic(v.moleculeType)
  44. const isSheet = SecondaryStructureType.is(v.secStrucType, SecondaryStructureType.Flag.Beta)
  45. const tension = (isNucleicType || isSheet) ? 0.5 : 0.9
  46. const shift = isNucleicType ? 0.3 : 0.5
  47. interpolateCurveSegment(state, v, tension, shift)
  48. if ((isSheet && !v.secStrucChange) || !isSheet) {
  49. const size = sizeTheme.size(v.center)
  50. const depth = depthFactor * size
  51. const width = widthFactor * size
  52. const height = heightFactor * size
  53. const vectors = isNucleicType ? binormalVectors : normalVectors
  54. Vec3.fromArray(n0, vectors, 0)
  55. Vec3.fromArray(n1, vectors, 3)
  56. Vec3.normalize(upVec, Vec3.add(upVec, n0, n1))
  57. Mat4.targetTo(t, v.p3, v.p1, upVec)
  58. Mat4.mul(t, t, Mat4.rotY90Z180)
  59. Mat4.scale(t, t, Vec3.set(sVec, height, width, depth))
  60. Mat4.setTranslation(t, v.p2)
  61. builder.add(t, wedge)
  62. }
  63. if (i % 10000 === 0 && ctx.shouldUpdate) {
  64. await ctx.update({ message: 'Polymer direction mesh', current: i, max: polymerElementCount });
  65. }
  66. ++i
  67. }
  68. return builder.getMesh()
  69. }
  70. export const DefaultPolymerDirectionProps = {
  71. ...DefaultUnitsMeshProps
  72. }
  73. export type PolymerDirectionProps = typeof DefaultPolymerDirectionProps
  74. export function PolymerDirectionVisual(): UnitsVisual<PolymerDirectionProps> {
  75. return UnitsMeshVisual<PolymerDirectionProps>({
  76. defaultProps: DefaultPolymerDirectionProps,
  77. createMesh: createPolymerDirectionWedgeMesh,
  78. createLocationIterator: PolymerLocationIterator.fromGroup,
  79. getLoci: getPolymerElementLoci,
  80. mark: markPolymerElement,
  81. setUpdateState: () => {}
  82. })
  83. }