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