diff --git a/src/mol-geo/geometry/geometry.ts b/src/mol-geo/geometry/geometry.ts index c2c082d3150d260ccf45bfb5f31fa9324f32c174..37cdf4b43955673e25acfdef657fcc058de5eebe 100644 --- a/src/mol-geo/geometry/geometry.ts +++ b/src/mol-geo/geometry/geometry.ts @@ -17,6 +17,8 @@ import { ParamDefinition as PD } from 'mol-util/param-definition' import { DirectVolume } from './direct-volume/direct-volume'; import { BuiltInSizeThemeOptions, BuiltInSizeThemeName } from 'mol-theme/size'; import { BuiltInColorThemeName, BuiltInColorThemeOptions } from 'mol-theme/color'; +import { Color } from 'mol-util/color'; +import { Vec3 } from 'mol-math/linear-algebra'; // @@ -63,6 +65,8 @@ export namespace Geometry { visible: PD.Boolean('Visible', '', true), depthMask: PD.Boolean('Depth Mask', '', true), useFog: PD.Boolean('Use Fog', '', false), + highlightColor: PD.Color('Highlight Color', '', Color.fromNormalizedRgb(1.0, 0.4, 0.6)), + selectColor: PD.Color('Select Color', '', Color.fromNormalizedRgb(0.2, 1.0, 0.1)), quality: PD.Select<VisualQuality>('Quality', '', 'auto', VisualQualityOptions), @@ -77,6 +81,8 @@ export namespace Geometry { export function createValues(props: Props, counts: Counts) { return { uAlpha: ValueCell.create(props.alpha), + uHighlightColor: ValueCell.create(Color.toArrayNormalized(props.highlightColor, Vec3.zero(), 0)), + uSelectColor: ValueCell.create(Color.toArrayNormalized(props.selectColor, Vec3.zero(), 0)), uGroupCount: ValueCell.create(counts.groupCount), drawCount: ValueCell.create(counts.drawCount), dUseFog: ValueCell.create(props.useFog), @@ -84,6 +90,12 @@ export namespace Geometry { } export function updateValues(values: BaseValues, props: Props) { + if (Color.fromNormalizedArray(values.uHighlightColor.ref.value, 0) !== props.highlightColor) { + ValueCell.update(values.uHighlightColor, Color.toArrayNormalized(props.highlightColor, values.uHighlightColor.ref.value, 0)) + } + if (Color.fromNormalizedArray(values.uSelectColor.ref.value, 0) !== props.selectColor) { + ValueCell.update(values.uSelectColor, Color.toArrayNormalized(props.selectColor, values.uSelectColor.ref.value, 0)) + } ValueCell.updateIfChanged(values.uAlpha, props.alpha) ValueCell.updateIfChanged(values.dUseFog, props.useFog) } diff --git a/src/mol-gl/_spec/renderer.spec.ts b/src/mol-gl/_spec/renderer.spec.ts index 06cf3256925a27bc717b7529cb3529368bdec630..51552ebf2dac61950224535024a725c0574b78d6 100644 --- a/src/mol-gl/_spec/renderer.spec.ts +++ b/src/mol-gl/_spec/renderer.spec.ts @@ -69,6 +69,8 @@ function createPoints() { ...size, uAlpha: ValueCell.create(1.0), + uHighlightColor: ValueCell.create(Vec3.create(1.0, 0.4, 0.6)), + uSelectColor: ValueCell.create(Vec3.create(0.2, 1.0, 0.1)), uInstanceCount: ValueCell.create(1), uGroupCount: ValueCell.create(3), diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index 765f6dc2e237c9a383a5e8163f8b79e248436f54..bac604bea5230fd1a8f6eb2d8f453d14a9247d00 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -146,9 +146,6 @@ export const GlobalUniformSchema = { uViewportHeight: UniformSpec('f'), uViewport: UniformSpec('v4'), - uHighlightColor: UniformSpec('v3'), - uSelectColor: UniformSpec('v3'), - uFogNear: UniformSpec('f'), uFogFar: UniformSpec('f'), uFogColor: UniformSpec('v3'), @@ -193,6 +190,8 @@ export const BaseSchema = { uInstanceCount: UniformSpec('i'), uGroupCount: UniformSpec('i'), uMarkerTexDim: UniformSpec('v2'), + uHighlightColor: UniformSpec('v3'), + uSelectColor: UniformSpec('v3'), tMarker: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'), diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index 9050d0cf5e0669988e7eb6cd60dc74bd6ae21a8f..f5ec7890e703c217ed8529e6b29d7bb353c7fe01 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -60,8 +60,6 @@ namespace Renderer { // const lightPosition = Vec3.create(0, 0, -100) const lightColor = Vec3.create(1.0, 1.0, 1.0) const lightAmbient = Vec3.create(0.5, 0.5, 0.5) - const highlightColor = Vec3.create(1.0, 0.4, 0.6) - const selectColor = Vec3.create(0.2, 1.0, 0.1) const fogColor = Vec3.create(0.0, 0.0, 0.0) function setClearColor(color: Color) { @@ -97,9 +95,6 @@ namespace Renderer { uLightColor: ValueCell.create(Vec3.clone(lightColor)), uLightAmbient: ValueCell.create(Vec3.clone(lightAmbient)), - uHighlightColor: ValueCell.create(Vec3.clone(highlightColor)), - uSelectColor: ValueCell.create(Vec3.clone(selectColor)), - uFogNear: ValueCell.create(camera.state.near), uFogFar: ValueCell.create(camera.state.far / 50), uFogColor: ValueCell.create(Vec3.clone(fogColor)), diff --git a/src/mol-util/color/color.ts b/src/mol-util/color/color.ts index 426c639b538118909cfc392688197f6db691020a..9fd800b4b0a78ee9a32606efb172666ed4e326ca 100644 --- a/src/mol-util/color/color.ts +++ b/src/mol-util/color/color.ts @@ -26,26 +26,36 @@ export namespace Color { return [ (hexColor >> 16 & 255) / 255, (hexColor >> 8 & 255) / 255, (hexColor & 255) / 255 ] } - export function fromRgb(r: number, g: number, b: number ): Color { + export function fromRgb(r: number, g: number, b: number): Color { return ((r << 16) | (g << 8) | b) as Color } - export function fromNormalizedRgb(r: number, g: number, b: number ): Color { + export function fromNormalizedRgb(r: number, g: number, b: number): Color { return (((r * 255) << 16) | ((g * 255) << 8) | (b * 255)) as Color } + export function fromArray(array: Helpers.NumberArray, offset: number): Color { + return fromRgb(array[offset], array[offset + 1], array[offset + 2]) + } + + export function fromNormalizedArray(array: Helpers.NumberArray, offset: number): Color { + return fromNormalizedRgb(array[offset], array[offset + 1], array[offset + 2]) + } + /** Copies hex color to rgb array */ export function toArray(hexColor: Color, array: Helpers.NumberArray, offset: number) { array[ offset ] = (hexColor >> 16 & 255) array[ offset + 1 ] = (hexColor >> 8 & 255) array[ offset + 2 ] = (hexColor & 255) + return array } /** Copies normalized (0 to 1) hex color to rgb array */ - export function toArrayNormalized(hexColor: Color, array: Helpers.NumberArray, offset: number) { + export function toArrayNormalized<T extends Helpers.NumberArray>(hexColor: Color, array: T, offset: number) { array[ offset ] = (hexColor >> 16 & 255) / 255 array[ offset + 1 ] = (hexColor >> 8 & 255) / 255 array[ offset + 2 ] = (hexColor & 255) / 255 + return array } /** Linear interpolation between two colors */