diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 1a3aac0ad7f7b60eee121cdbba4a56b8fe04295e..d34f8a656f0f21d50f32ae6aed3404a51723b391 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -17,7 +17,7 @@ import { Representation } from '../mol-repr/representation'; import Scene from '../mol-gl/scene'; import { GraphicsRenderVariant } from '../mol-gl/webgl/render-item'; import { PickingId } from '../mol-geo/geometry/picking'; -import { MarkerAction } from '../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../mol-util/marker-action'; import { Loci, EmptyLoci, isEmptyLoci } from '../mol-model/loci'; import { Camera } from './camera'; import { ParamDefinition as PD } from '../mol-util/param-definition'; diff --git a/src/mol-geo/geometry/marker-data.ts b/src/mol-geo/geometry/marker-data.ts index 5e4feee990eb009c180352a64ed9de755f3e7ac6..508786dbf0625aee411bb596e84b8b7592ecefce 100644 --- a/src/mol-geo/geometry/marker-data.ts +++ b/src/mol-geo/geometry/marker-data.ts @@ -13,57 +13,6 @@ export type MarkerData = { uMarkerTexDim: ValueCell<Vec2> } -export enum MarkerAction { - Highlight, - RemoveHighlight, - Select, - Deselect, - Toggle, - Clear -} - -export function applyMarkerAction(array: Uint8Array, start: number, end: number, action: MarkerAction) { - let changed = false - for (let i = start; i < end; ++i) { - let v = array[i] - switch (action) { - case MarkerAction.Highlight: - if (v % 2 === 0) { - v += 1 - } - break - case MarkerAction.RemoveHighlight: - if (v % 2 !== 0) { - v -= 1 - } - break - case MarkerAction.Select: - if (v < 2) v += 2 - // v += 2 - break - case MarkerAction.Deselect: - // if (v >= 2) { - // v -= 2 - // } - v = v % 2 - break - case MarkerAction.Toggle: - if (v >= 2) { - v -= 2 - } else { - v += 2 - } - break - case MarkerAction.Clear: - v = 0 - break - } - changed = array[i] !== v || changed - array[i] = v - } - return changed -} - export function createMarkers(count: number, markerData?: MarkerData): MarkerData { const markers = createTextureImage(Math.max(1, count), 1, Uint8Array, markerData && markerData.tMarker.ref.value.array) if (markerData) { diff --git a/src/mol-plugin/behavior/dynamic/representation.ts b/src/mol-plugin/behavior/dynamic/representation.ts index 5760897bdb39ff0d34d820daae79756c45c81e61..df6a30f76ab16a3d2c4d2bf58e8923016b452df7 100644 --- a/src/mol-plugin/behavior/dynamic/representation.ts +++ b/src/mol-plugin/behavior/dynamic/representation.ts @@ -5,7 +5,7 @@ * @author Alexander Rose <alexander.rose@weirdbyte.de> */ -import { MarkerAction } from '../../../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../../../mol-util/marker-action'; import { PluginContext } from '../../../mol-plugin/context'; import { labelFirst } from '../../../mol-theme/label'; import { PluginBehavior } from '../behavior'; diff --git a/src/mol-plugin/ui/sequence.tsx b/src/mol-plugin/ui/sequence.tsx index 63ae9ebf76df201a6d0248378a977d52e164d51d..c8460f6e7f42b9a742eecba8bdd2adbf9f903b22 100644 --- a/src/mol-plugin/ui/sequence.tsx +++ b/src/mol-plugin/ui/sequence.tsx @@ -13,7 +13,7 @@ import { PluginStateObject as SO } from '../state/objects'; import { Interaction } from '../util/interaction'; import { OrderedSet, Interval } from '../../mol-data/int'; import { Loci } from '../../mol-model/loci'; -import { applyMarkerAction, MarkerAction } from '../../mol-geo/geometry/marker-data'; +import { applyMarkerAction, MarkerAction } from '../../mol-util/marker-action'; import { ButtonsType, ModifiersKeys, getButtons, getModifiers } from '../../mol-util/input/input-observer'; function getStructureSeqKey(structureSeq: StructureSeq) { @@ -87,6 +87,7 @@ function createQuery(entityId: string, label_seq_id: number) { }); } +/** Zero-indexed */ function getSeqIdInterval(location: StructureElement): Interval { const { unit, element } = location const { model } = unit @@ -94,16 +95,16 @@ function getSeqIdInterval(location: StructureElement): Interval { case Unit.Kind.Atomic: const residueIndex = model.atomicHierarchy.residueAtomSegments.index[element] const seqId = model.atomicHierarchy.residues.label_seq_id.value(residueIndex) - return Interval.ofSingleton(seqId) + return Interval.ofSingleton(seqId - 1) case Unit.Kind.Spheres: return Interval.ofRange( - model.coarseHierarchy.spheres.seq_id_begin.value(element), - model.coarseHierarchy.spheres.seq_id_end.value(element) + model.coarseHierarchy.spheres.seq_id_begin.value(element) - 1, + model.coarseHierarchy.spheres.seq_id_end.value(element) - 1 ) case Unit.Kind.Gaussians: return Interval.ofRange( - model.coarseHierarchy.gaussians.seq_id_begin.value(element), - model.coarseHierarchy.gaussians.seq_id_end.value(element) + model.coarseHierarchy.gaussians.seq_id_begin.value(element) - 1, + model.coarseHierarchy.gaussians.seq_id_end.value(element) - 1 ) } } @@ -132,13 +133,7 @@ function eachResidue(loci: Loci, structureSeq: StructureSeq, apply: (interval: I function markResidue(loci: Loci, structureSeq: StructureSeq, array: Uint8Array, action: MarkerAction) { const { structure, seq } = structureSeq return eachResidue(loci, { structure , seq }, (i: Interval) => { - let changed = false - OrderedSet.forEach(i, (v: number) => { - const start = Interval.start(i) - 1 - const end = Interval.end(i) - 1 - if (applyMarkerAction(array, start, end, action)) changed = true - }) - return changed + return applyMarkerAction(array, i, action) }) } diff --git a/src/mol-plugin/util/interaction.ts b/src/mol-plugin/util/interaction.ts index 226421501fb1bf5cf13f45a9f7b975b78c75d5f1..e97670cbd468d25596868ae385587f7bd44bd561 100644 --- a/src/mol-plugin/util/interaction.ts +++ b/src/mol-plugin/util/interaction.ts @@ -9,7 +9,7 @@ import { Loci as ModelLoci, EmptyLoci } from '../../mol-model/loci'; import { ModifiersKeys, ButtonsType } from '../../mol-util/input/input-observer'; import { Representation } from '../../mol-repr/representation'; import { StructureElement } from '../../mol-model/structure'; -import { MarkerAction } from '../../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../../mol-util/marker-action'; import { StructureElementSelectionManager } from './structure-element-selection'; import { PluginContext } from '../context'; diff --git a/src/mol-repr/representation.ts b/src/mol-repr/representation.ts index d7ff15ff57084e67667a7e7f0d8b3203bdcdcf42..2926beefdb7d70336a539749e86ee0abf05d29e6 100644 --- a/src/mol-repr/representation.ts +++ b/src/mol-repr/representation.ts @@ -13,7 +13,7 @@ import { Subject } from 'rxjs'; import { GraphicsRenderObject } from '../mol-gl/render-object'; import { Task } from '../mol-task'; import { PickingId } from '../mol-geo/geometry/picking'; -import { MarkerAction } from '../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../mol-util/marker-action'; import { Loci as ModelLoci, EmptyLoci, isEmptyLoci } from '../mol-model/loci'; import { Overpaint } from '../mol-theme/overpaint'; import { Transparency } from '../mol-theme/transparency'; diff --git a/src/mol-repr/shape/representation.ts b/src/mol-repr/shape/representation.ts index a7196b8b24a6c6ac9ea7826c14e43f274c44476f..c0cb0693992ff6750882978730e2e0ab9d70fe03 100644 --- a/src/mol-repr/shape/representation.ts +++ b/src/mol-repr/shape/representation.ts @@ -14,7 +14,8 @@ import { LocationIterator } from '../../mol-geo/util/location-iterator'; import { VisualUpdateState } from '../util'; import { ShapeGroupColorTheme } from '../../mol-theme/color/shape-group'; import { ShapeGroupSizeTheme } from '../../mol-theme/size/shape-group'; -import { createMarkers, MarkerAction } from '../../mol-geo/geometry/marker-data'; +import { createMarkers } from '../../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../../mol-util/marker-action'; import { ValueCell } from '../../mol-util'; import { createColors } from '../../mol-geo/geometry/color-data'; import { createSizes } from '../../mol-geo/geometry/size-data'; diff --git a/src/mol-repr/structure/complex-representation.ts b/src/mol-repr/structure/complex-representation.ts index 872c691b2a5909587c712623ea51396d400ce682..ee4fb95d0d02c57e8368122fb8643a47fe31c292 100644 --- a/src/mol-repr/structure/complex-representation.ts +++ b/src/mol-repr/structure/complex-representation.ts @@ -15,7 +15,7 @@ import { createEmptyTheme, Theme } from '../../mol-theme/theme'; import { Task } from '../../mol-task'; import { PickingId } from '../../mol-geo/geometry/picking'; import { EmptyLoci, Loci } from '../../mol-model/loci'; -import { MarkerAction } from '../../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../../mol-util/marker-action'; export function ComplexRepresentation<P extends StructureParams>(label: string, ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, P>, visualCtor: (materialId: number) => ComplexVisual<P>): StructureRepresentation<P> { let version = 0 diff --git a/src/mol-repr/structure/complex-visual.ts b/src/mol-repr/structure/complex-visual.ts index 3b3be5db20517fcca4931916ee531d8965622cfc..7770c03f517635c5175a9cd6f112a50b18644536 100644 --- a/src/mol-repr/structure/complex-visual.ts +++ b/src/mol-repr/structure/complex-visual.ts @@ -23,7 +23,7 @@ import { ColorTheme } from '../../mol-theme/color'; import { ValueCell, deepEqual } from '../../mol-util'; import { createSizes } from '../../mol-geo/geometry/size-data'; import { createColors } from '../../mol-geo/geometry/color-data'; -import { MarkerAction } from '../../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../../mol-util/marker-action'; import { Mat4 } from '../../mol-math/linear-algebra'; import { Overpaint } from '../../mol-theme/overpaint'; import { Transparency } from '../../mol-theme/transparency'; diff --git a/src/mol-repr/structure/units-representation.ts b/src/mol-repr/structure/units-representation.ts index 6c690ea2f73b736d859cc008d2b739f356576e3c..2a731d88898a2218dacdd058967c86e57ae1956c 100644 --- a/src/mol-repr/structure/units-representation.ts +++ b/src/mol-repr/structure/units-representation.ts @@ -18,7 +18,7 @@ import { createEmptyTheme, Theme } from '../../mol-theme/theme'; import { Task } from '../../mol-task'; import { PickingId } from '../../mol-geo/geometry/picking'; import { Loci, EmptyLoci, isEmptyLoci } from '../../mol-model/loci'; -import { MarkerAction } from '../../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../../mol-util/marker-action'; export const UnitsParams = { ...StructureParams, diff --git a/src/mol-repr/structure/units-visual.ts b/src/mol-repr/structure/units-visual.ts index f7888713b9d2e2526aa9b4e305cbce0da080cd0f..b440d393fe93c42b176458a3f6565da5c9e3ec37 100644 --- a/src/mol-repr/structure/units-visual.ts +++ b/src/mol-repr/structure/units-visual.ts @@ -19,7 +19,8 @@ import { Loci, isEveryLoci, EmptyLoci } from '../../mol-model/loci'; import { Interval } from '../../mol-data/int'; import { VisualUpdateState } from '../util'; import { ColorTheme } from '../../mol-theme/color'; -import { createMarkers, MarkerAction } from '../../mol-geo/geometry/marker-data'; +import { createMarkers } from '../../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../../mol-util/marker-action'; import { ValueCell, deepEqual } from '../../mol-util'; import { createSizes } from '../../mol-geo/geometry/size-data'; import { createColors } from '../../mol-geo/geometry/color-data'; diff --git a/src/mol-repr/visual.ts b/src/mol-repr/visual.ts index fd205a7fa842433d0811f6059003f93adfa95119..1b6f2530b7bf6f6b4ba3146045092d3c0ca8495f 100644 --- a/src/mol-repr/visual.ts +++ b/src/mol-repr/visual.ts @@ -8,7 +8,7 @@ import { RuntimeContext } from '../mol-task' import { GraphicsRenderObject } from '../mol-gl/render-object' import { PickingId } from '../mol-geo/geometry/picking'; import { Loci, isEmptyLoci } from '../mol-model/loci'; -import { MarkerAction, applyMarkerAction } from '../mol-geo/geometry/marker-data'; +import { MarkerAction, applyMarkerAction } from '../mol-util/marker-action'; import { ParamDefinition as PD } from '../mol-util/param-definition'; import { WebGLContext } from '../mol-gl/webgl/context'; import { Theme } from '../mol-theme/theme'; @@ -65,9 +65,7 @@ namespace Visual { const { tMarker } = renderObject.values function apply(interval: Interval) { - const start = Interval.start(interval) - const end = Interval.end(interval) - return applyMarkerAction(tMarker.ref.value.array, start, end, action) + return applyMarkerAction(tMarker.ref.value.array, interval, action) } const changed = lociApply(loci, apply) diff --git a/src/mol-repr/volume/representation.ts b/src/mol-repr/volume/representation.ts index a4be3321f7a39e433700eb3658976f1a52d8899f..3a9de1fb680c49e4de9f9f9c7f74dbeb0736c07a 100644 --- a/src/mol-repr/volume/representation.ts +++ b/src/mol-repr/volume/representation.ts @@ -20,7 +20,7 @@ import { ColorTheme } from '../../mol-theme/color'; import { ValueCell } from '../../mol-util'; import { createSizes } from '../../mol-geo/geometry/size-data'; import { createColors } from '../../mol-geo/geometry/color-data'; -import { MarkerAction } from '../../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../../mol-util/marker-action'; import { Mat4 } from '../../mol-math/linear-algebra'; import { Overpaint } from '../../mol-theme/overpaint'; import { Transparency } from '../../mol-theme/transparency'; diff --git a/src/mol-util/marker-action.ts b/src/mol-util/marker-action.ts new file mode 100644 index 0000000000000000000000000000000000000000..2175a4edf3b3e52ba28882861dad507c05d6679f --- /dev/null +++ b/src/mol-util/marker-action.ts @@ -0,0 +1,60 @@ +import { OrderedSet } from '../mol-data/int'; + +/** + * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info. + * + * @author Alexander Rose <alexander.rose@weirdbyte.de> + */ + +export enum MarkerAction { + Highlight, + RemoveHighlight, + Select, + Deselect, + Toggle, + Clear +} + +export function applyMarkerAction(array: Uint8Array, set: OrderedSet, action: MarkerAction) { + let changed = false; + OrderedSet.forEach(set, i => { + let v = array[i]; + switch (action) { + case MarkerAction.Highlight: + if (v % 2 === 0) { + v += 1; + } + break; + case MarkerAction.RemoveHighlight: + if (v % 2 !== 0) { + v -= 1; + } + break; + case MarkerAction.Select: + if (v < 2) + v += 2; + // v += 2 + break; + case MarkerAction.Deselect: + // if (v >= 2) { + // v -= 2 + // } + v = v % 2; + break; + case MarkerAction.Toggle: + if (v >= 2) { + v -= 2; + } + else { + v += 2; + } + break; + case MarkerAction.Clear: + v = 0; + break; + } + changed = array[i] !== v || changed; + array[i] = v; + }) + return changed; +} diff --git a/src/tests/browser/render-shape.ts b/src/tests/browser/render-shape.ts index f2ade96d7fdeff6b2dbd4b9d6e3ae9bf9b8057c2..ff1039952f4fddea97d845632f306d4b95e70c16 100644 --- a/src/tests/browser/render-shape.ts +++ b/src/tests/browser/render-shape.ts @@ -9,7 +9,7 @@ import { resizeCanvas } from '../../mol-canvas3d/util'; import { Representation } from '../../mol-repr/representation'; import { Canvas3D } from '../../mol-canvas3d/canvas3d'; import { labelFirst } from '../../mol-theme/label'; -import { MarkerAction } from '../../mol-geo/geometry/marker-data'; +import { MarkerAction } from '../../mol-util/marker-action'; import { EveryLoci } from '../../mol-model/loci'; import { RuntimeContext, Progress } from '../../mol-task'; import { Mesh } from '../../mol-geo/geometry/mesh/mesh';