From 50a85ddc252fcdaba224a13b5aa7eebb86c99a24 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Fri, 11 Jan 2019 16:30:13 -0800 Subject: [PATCH] size assignment related fixes --- src/mol-geo/geometry/color-data.ts | 3 +++ src/mol-geo/geometry/size-data.ts | 10 +++++++--- src/mol-gl/shader/chunks/assign-size.glsl | 10 +++++++--- src/mol-gl/shader/chunks/size-vert-params.glsl | 1 + 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/mol-geo/geometry/color-data.ts b/src/mol-geo/geometry/color-data.ts index 1f4fb376a..8cba01234 100644 --- a/src/mol-geo/geometry/color-data.ts +++ b/src/mol-geo/geometry/color-data.ts @@ -75,6 +75,7 @@ export function createTextureColor(colors: TextureImage<Uint8Array>, type: Color export function createInstanceColor(locationIt: LocationIterator, color: LocationColor, colorData?: ColorData): ColorData { const { instanceCount } = locationIt const colors = colorData && colorData.tColor.ref.value.array.length >= instanceCount * 3 ? colorData.tColor.ref.value : createTextureImage(instanceCount, 3) + locationIt.reset() while (locationIt.hasNext) { const { location, isSecondary, instanceIndex } = locationIt.move() Color.toArray(color(location, isSecondary), colors.array, instanceIndex * 3) @@ -87,6 +88,7 @@ export function createInstanceColor(locationIt: LocationIterator, color: Locatio export function createGroupColor(locationIt: LocationIterator, color: LocationColor, colorData?: ColorData): ColorData { const { groupCount } = locationIt const colors = colorData && colorData.tColor.ref.value.array.length >= groupCount * 3 ? colorData.tColor.ref.value : createTextureImage(groupCount, 3) + locationIt.reset() while (locationIt.hasNext && !locationIt.isNextNewInstance) { const { location, isSecondary, groupIndex } = locationIt.move() Color.toArray(color(location, isSecondary), colors.array, groupIndex * 3) @@ -99,6 +101,7 @@ export function createGroupInstanceColor(locationIt: LocationIterator, color: Lo const { groupCount, instanceCount } = locationIt const count = instanceCount * groupCount const colors = colorData && colorData.tColor.ref.value.array.length >= count * 3 ? colorData.tColor.ref.value : createTextureImage(count, 3) + locationIt.reset() while (locationIt.hasNext) { const { location, isSecondary, index } = locationIt.move() Color.toArray(color(location, isSecondary), colors.array, index * 3) diff --git a/src/mol-geo/geometry/size-data.ts b/src/mol-geo/geometry/size-data.ts index 6cb0e8b75..87211474c 100644 --- a/src/mol-geo/geometry/size-data.ts +++ b/src/mol-geo/geometry/size-data.ts @@ -11,6 +11,7 @@ import { LocationIterator } from '../util/location-iterator'; import { Location, NullLocation } from 'mol-model/location'; import { SizeTheme } from 'mol-theme/size'; import { getGranularity } from './geometry'; +import { encodeFloatLog } from 'mol-util/float-packing'; export type SizeType = 'uniform' | 'instance' | 'group' | 'groupInstance' @@ -83,9 +84,10 @@ export function createTextureSize(sizes: TextureImage<Uint8Array>, type: SizeTyp export function createInstanceSize(locationIt: LocationIterator, sizeFn: LocationSize, sizeData?: SizeData): SizeData { const { instanceCount} = locationIt const sizes = sizeData && sizeData.tSize.ref.value.array.length >= instanceCount ? sizeData.tSize.ref.value : createTextureImage(instanceCount, 1) + locationIt.reset() while (locationIt.hasNext && !locationIt.isNextNewInstance) { const v = locationIt.move() - sizes.array[v.instanceIndex] = sizeFn(v.location) + sizes.array[v.instanceIndex] = encodeFloatLog(sizeFn(v.location)) * 255 locationIt.skipInstance() } return createTextureSize(sizes, 'instance', sizeData) @@ -95,9 +97,10 @@ export function createInstanceSize(locationIt: LocationIterator, sizeFn: Locatio export function createGroupSize(locationIt: LocationIterator, sizeFn: LocationSize, sizeData?: SizeData): SizeData { const { groupCount } = locationIt const sizes = sizeData && sizeData.tSize.ref.value.array.length >= groupCount ? sizeData.tSize.ref.value : createTextureImage(groupCount, 1) + locationIt.reset() while (locationIt.hasNext && !locationIt.isNextNewInstance) { const v = locationIt.move() - sizes.array[v.groupIndex] = sizeFn(v.location) + sizes.array[v.groupIndex] = encodeFloatLog(sizeFn(v.location)) * 255 } return createTextureSize(sizes, 'group', sizeData) } @@ -107,9 +110,10 @@ export function createGroupInstanceSize(locationIt: LocationIterator, sizeFn: Lo const { groupCount, instanceCount } = locationIt const count = instanceCount * groupCount const sizes = sizeData && sizeData.tSize.ref.value.array.length >= count ? sizeData.tSize.ref.value : createTextureImage(count, 1) + locationIt.reset() while (locationIt.hasNext && !locationIt.isNextNewInstance) { const v = locationIt.move() - sizes.array[v.index] = sizeFn(v.location) + sizes.array[v.index] = encodeFloatLog(sizeFn(v.location)) * 255 } return createTextureSize(sizes, 'groupInstance', sizeData) } \ No newline at end of file diff --git a/src/mol-gl/shader/chunks/assign-size.glsl b/src/mol-gl/shader/chunks/assign-size.glsl index e40ee951b..20a66c9fd 100644 --- a/src/mol-gl/shader/chunks/assign-size.glsl +++ b/src/mol-gl/shader/chunks/assign-size.glsl @@ -3,9 +3,13 @@ #elif defined(dSizeType_attribute) float size = aSize; #elif defined(dSizeType_instance) - float size = readFromTexture(tSize, aInstance, uSizeTexDim).r; + float size = readFromTexture(tSize, aInstance, uSizeTexDim).a; #elif defined(dSizeType_group) - float size = readFromTexture(tSize, aGroup, uSizeTexDim).r; + float size = readFromTexture(tSize, aGroup, uSizeTexDim).a; #elif defined(dSizeType_groupInstance) - float size = readFromTexture(tSize, aInstance * float(uGroupCount) + aGroup, uSizeTexDim).r; + float size = readFromTexture(tSize, aInstance * float(uGroupCount) + aGroup, uSizeTexDim).a; +#endif + +#if defined(dSizeType_instance) || defined(dSizeType_group) || defined(dSizeType_groupInstance) + size = decodeFloatLog(size); #endif \ No newline at end of file diff --git a/src/mol-gl/shader/chunks/size-vert-params.glsl b/src/mol-gl/shader/chunks/size-vert-params.glsl index 763815b67..8ccf85e69 100644 --- a/src/mol-gl/shader/chunks/size-vert-params.glsl +++ b/src/mol-gl/shader/chunks/size-vert-params.glsl @@ -5,4 +5,5 @@ #elif defined(dSizeType_instance) || defined(dSizeType_group) || defined(dSizeType_groupInstance) uniform vec2 uSizeTexDim; uniform sampler2D tSize; + #pragma glslify: decodeFloatLog = require(../utils/decode-float-log.glsl) #endif \ No newline at end of file -- GitLab