Browse Source

remove alpha/opacity from overpaint params

- does not play well with layers and freely assigning colors as it is per representation
Alexander Rose 4 years ago
parent
commit
1b19136c18

+ 2 - 2
src/mol-geo/geometry/overpaint-data.ts

@@ -15,10 +15,10 @@ export type OverpaintData = {
     dOverpaint: ValueCell<boolean>,
 }
 
-export function applyOverpaintColor(array: Uint8Array, start: number, end: number, color: Color, alpha: number) {
+export function applyOverpaintColor(array: Uint8Array, start: number, end: number, color: Color) {
     for (let i = start; i < end; ++i) {
         Color.toArray(color, array, i * 4);
-        array[i * 4 + 3] = alpha * 255;
+        array[i * 4 + 3] = 255;
     }
     return true;
 }

+ 4 - 4
src/mol-plugin-state/helpers/structure-overpaint.ts

@@ -18,7 +18,7 @@ import { EmptyLoci, Loci } from '../../mol-model/loci';
 type OverpaintEachReprCallback = (update: StateBuilder.Root, repr: StateObjectCell<PluginStateObject.Molecule.Structure.Representation3D, StateTransform<typeof StateTransforms.Representation.StructureRepresentation3D>>, overpaint?: StateObjectCell<any, StateTransform<typeof StateTransforms.Representation.OverpaintStructureRepresentation3DFromBundle>>) => Promise<void>
 const OverpaintManagerTag = 'overpaint-controls';
 
-export async function setStructureOverpaint(plugin: PluginContext, components: StructureComponentRef[], color: Color | -1, lociGetter: (structure: Structure) => Promise<StructureElement.Loci | EmptyLoci>, types?: string[], alpha = 1) {
+export async function setStructureOverpaint(plugin: PluginContext, components: StructureComponentRef[], color: Color | -1, lociGetter: (structure: Structure) => Promise<StructureElement.Loci | EmptyLoci>, types?: string[]) {
     await eachRepr(plugin, components, async (update, repr, overpaintCell) => {
         if (types && types.length > 0 && !types.includes(repr.params!.values.type.name)) return;
 
@@ -37,11 +37,11 @@ export async function setStructureOverpaint(plugin: PluginContext, components: S
         if (overpaintCell) {
             const bundleLayers = [...overpaintCell.params!.values.layers, layer];
             const filtered = getFilteredBundle(bundleLayers, structure);
-            update.to(overpaintCell).update(Overpaint.toBundle(filtered, alpha));
+            update.to(overpaintCell).update(Overpaint.toBundle(filtered));
         } else {
             const filtered = getFilteredBundle([layer], structure);
             update.to(repr.transform.ref)
-                .apply(StateTransforms.Representation.OverpaintStructureRepresentation3DFromBundle, Overpaint.toBundle(filtered, alpha), { tags: OverpaintManagerTag });
+                .apply(StateTransforms.Representation.OverpaintStructureRepresentation3DFromBundle, Overpaint.toBundle(filtered), { tags: OverpaintManagerTag });
         }
     });
 }
@@ -70,7 +70,7 @@ async function eachRepr(plugin: PluginContext, components: StructureComponentRef
 
 /** filter overpaint layers for given structure */
 function getFilteredBundle(layers: Overpaint.BundleLayer[], structure: Structure) {
-    const overpaint = Overpaint.ofBundle(layers, 1, structure.root);
+    const overpaint = Overpaint.ofBundle(layers, structure.root);
     const merged = Overpaint.merge(overpaint);
     return Overpaint.filter(merged, structure);
 }

+ 2 - 3
src/mol-plugin-state/manager/structure/component.ts

@@ -369,10 +369,10 @@ class StructureComponentManager extends StatefulPluginComponent<StructureCompone
             const getLoci = async (s: Structure) => StructureSelection.toLociWithSourceUnits(await params.selection.getSelection(this.plugin, ctx, s));
             for (const s of xs) {
                 if (params.action.name === 'reset') {
-                    await setStructureOverpaint(this.plugin, s.components, -1, getLoci, params.representations, 1);
+                    await setStructureOverpaint(this.plugin, s.components, -1, getLoci, params.representations);
                 } else if (params.action.name === 'color') {
                     const p = params.action.params;
-                    await setStructureOverpaint(this.plugin, s.components, p.color, getLoci, params.representations, p.opacity);
+                    await setStructureOverpaint(this.plugin, s.components, p.color, getLoci, params.representations);
                 } else if (params.action.name === 'transparency') {
                     const p = params.action.params;
                     await setStructureTransparency(this.plugin, s.components, p.value, getLoci, params.representations);
@@ -472,7 +472,6 @@ namespace StructureComponentManager {
             action: PD.MappedStatic('color', {
                 color: PD.Group({
                     color: PD.Color(ColorNames.blue, { isExpanded: true }),
-                    opacity: PD.Numeric(1, { min: 0, max: 1, step: 0.01 }),
                 }, { isFlat: true }),
                 reset: PD.EmptyGroup({ label: 'Reset Color' }),
                 transparency: PD.Group({

+ 6 - 8
src/mol-plugin-state/transforms/representation.ts

@@ -279,7 +279,6 @@ const OverpaintStructureRepresentation3DFromScript = PluginStateTransform.BuiltI
                 clear: false
             }]
         }),
-        alpha: PD.Numeric(1, { min: 0, max: 1, step: 0.01 }, { label: 'Opacity' }),
     }
 })({
     canAutoUpdate() {
@@ -287,7 +286,7 @@ const OverpaintStructureRepresentation3DFromScript = PluginStateTransform.BuiltI
     },
     apply({ a, params }) {
         const structure = a.data.source.data;
-        const overpaint = Overpaint.ofScript(params.layers, params.alpha, structure);
+        const overpaint = Overpaint.ofScript(params.layers, structure);
 
         return new SO.Molecule.Structure.Representation3DState({
             state: { overpaint },
@@ -301,8 +300,8 @@ const OverpaintStructureRepresentation3DFromScript = PluginStateTransform.BuiltI
         const newStructure = a.data.source.data;
         if (newStructure !== oldStructure) return StateTransformer.UpdateResult.Recreate;
         const oldOverpaint = b.data.state.overpaint!;
-        const newOverpaint = Overpaint.ofScript(newParams.layers, newParams.alpha, newStructure);
-        if (oldParams.alpha === newParams.alpha && Overpaint.areEqual(oldOverpaint, newOverpaint)) return StateTransformer.UpdateResult.Unchanged;
+        const newOverpaint = Overpaint.ofScript(newParams.layers, newStructure);
+        if (Overpaint.areEqual(oldOverpaint, newOverpaint)) return StateTransformer.UpdateResult.Unchanged;
 
         b.data.state.overpaint = newOverpaint;
         b.data.source = a;
@@ -330,7 +329,6 @@ const OverpaintStructureRepresentation3DFromBundle = PluginStateTransform.BuiltI
             }],
             isHidden: true
         }),
-        alpha: PD.Numeric(1, { min: 0, max: 1, step: 0.01 }, { label: 'Opacity' }),
     }
 })({
     canAutoUpdate() {
@@ -338,7 +336,7 @@ const OverpaintStructureRepresentation3DFromBundle = PluginStateTransform.BuiltI
     },
     apply({ a, params }) {
         const structure = a.data.source.data;
-        const overpaint = Overpaint.ofBundle(params.layers, params.alpha, structure);
+        const overpaint = Overpaint.ofBundle(params.layers, structure);
 
         return new SO.Molecule.Structure.Representation3DState({
             state: { overpaint },
@@ -352,8 +350,8 @@ const OverpaintStructureRepresentation3DFromBundle = PluginStateTransform.BuiltI
         const newStructure = a.data.source.data;
         if (newStructure !== oldStructure) return StateTransformer.UpdateResult.Recreate;
         const oldOverpaint = b.data.state.overpaint!;
-        const newOverpaint = Overpaint.ofBundle(newParams.layers, newParams.alpha, newStructure);
-        if (oldParams.alpha === newParams.alpha && Overpaint.areEqual(oldOverpaint, newOverpaint)) return StateTransformer.UpdateResult.Unchanged;
+        const newOverpaint = Overpaint.ofBundle(newParams.layers, newStructure);
+        if (Overpaint.areEqual(oldOverpaint, newOverpaint)) return StateTransformer.UpdateResult.Unchanged;
 
         b.data.state.overpaint = newOverpaint;
         b.data.source = a;

+ 1 - 1
src/mol-repr/visual.ts

@@ -99,7 +99,7 @@ namespace Visual {
                 const end = Interval.end(interval);
                 return clear
                     ? clearOverpaint(array, start, end)
-                    : applyOverpaintColor(array, start, end, color, overpaint.alpha);
+                    : applyOverpaintColor(array, start, end, color);
             };
             lociApply(loci, apply, false);
         }

+ 14 - 15
src/mol-theme/overpaint.ts

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
@@ -11,20 +11,19 @@ import { Script } from '../mol-script/script';
 
 export { Overpaint };
 
-type Overpaint = { readonly layers: ReadonlyArray<Overpaint.Layer>, readonly alpha: number }
+type Overpaint = { readonly layers: ReadonlyArray<Overpaint.Layer> }
 
-function Overpaint(layers: ReadonlyArray<Overpaint.Layer>, alpha: number): Overpaint {
-    return { layers, alpha };
+function Overpaint(layers: ReadonlyArray<Overpaint.Layer>): Overpaint {
+    return { layers };
 }
 
 namespace Overpaint {
     export type Layer = { readonly loci: StructureElement.Loci, readonly color: Color, readonly clear: boolean }
-    export const Empty: Overpaint = { layers: [], alpha: 1 };
+    export const Empty: Overpaint = { layers: [] };
 
     export function areEqual(oA: Overpaint, oB: Overpaint) {
         if (oA.layers.length === 0 && oB.layers.length === 0) return true;
         if (oA.layers.length !== oB.layers.length) return false;
-        if (oA.alpha !== oB.alpha) return false;
         for (let i = 0, il = oA.layers.length; i < il; ++i) {
             if (oA.layers[i].clear !== oB.layers[i].clear) return false;
             if (oA.layers[i].color !== oB.layers[i].color) return false;
@@ -46,7 +45,7 @@ namespace Overpaint {
                 layers.push({ loci, color, clear });
             }
         }
-        return { layers, alpha: overpaint.alpha };
+        return { layers };
     }
 
     export function merge(overpaint: Overpaint): Overpaint {
@@ -72,7 +71,7 @@ namespace Overpaint {
             const color = colorOrClear === -1 ? Color(0) : colorOrClear;
             layers.push({ loci, color, clear });
         });
-        return { layers, alpha: overpaint.alpha };
+        return { layers };
     }
 
     export function filter(overpaint: Overpaint, filter: Structure): Overpaint {
@@ -89,11 +88,11 @@ namespace Overpaint {
                 layers.push({ loci, color, clear });
             }
         }
-        return { layers, alpha: overpaint.alpha };
+        return { layers };
     }
 
     export type ScriptLayer = { script: Script, color: Color, clear: boolean }
-    export function ofScript(scriptLayers: ScriptLayer[], alpha: number, structure: Structure): Overpaint {
+    export function ofScript(scriptLayers: ScriptLayer[], structure: Structure): Overpaint {
         const layers: Overpaint.Layer[] = [];
         for (let i = 0, il = scriptLayers.length; i < il; ++i) {
             const { script, color, clear } = scriptLayers[i];
@@ -102,27 +101,27 @@ namespace Overpaint {
                 layers.push({ loci, color, clear });
             }
         }
-        return { layers, alpha };
+        return { layers };
     }
 
     export type BundleLayer = { bundle: StructureElement.Bundle, color: Color, clear: boolean }
-    export function ofBundle(bundleLayers: BundleLayer[], alpha: number, structure: Structure): Overpaint {
+    export function ofBundle(bundleLayers: BundleLayer[], structure: Structure): Overpaint {
         const layers: Overpaint.Layer[] = [];
         for (let i = 0, il = bundleLayers.length; i < il; ++i) {
             const { bundle, color, clear } = bundleLayers[i];
             const loci = StructureElement.Bundle.toLoci(bundle, structure.root);
             layers.push({ loci, color, clear });
         }
-        return { layers, alpha };
+        return { layers };
     }
 
-    export function toBundle(overpaint: Overpaint, alpha: number) {
+    export function toBundle(overpaint: Overpaint) {
         const layers: BundleLayer[] = [];
         for (let i = 0, il = overpaint.layers.length; i < il; ++i) {
             let { loci, color, clear } = overpaint.layers[i];
             const bundle = StructureElement.Bundle.fromLoci(loci);
             layers.push({ bundle, color, clear });
         }
-        return { layers, alpha };
+        return { layers };
     }
 }