Skip to content
Snippets Groups Projects
Commit 50a85ddc authored by Alexander Rose's avatar Alexander Rose
Browse files

size assignment related fixes

parent af769160
No related branches found
No related tags found
No related merge requests found
...@@ -75,6 +75,7 @@ export function createTextureColor(colors: TextureImage<Uint8Array>, type: Color ...@@ -75,6 +75,7 @@ export function createTextureColor(colors: TextureImage<Uint8Array>, type: Color
export function createInstanceColor(locationIt: LocationIterator, color: LocationColor, colorData?: ColorData): ColorData { export function createInstanceColor(locationIt: LocationIterator, color: LocationColor, colorData?: ColorData): ColorData {
const { instanceCount } = locationIt const { instanceCount } = locationIt
const colors = colorData && colorData.tColor.ref.value.array.length >= instanceCount * 3 ? colorData.tColor.ref.value : createTextureImage(instanceCount, 3) const colors = colorData && colorData.tColor.ref.value.array.length >= instanceCount * 3 ? colorData.tColor.ref.value : createTextureImage(instanceCount, 3)
locationIt.reset()
while (locationIt.hasNext) { while (locationIt.hasNext) {
const { location, isSecondary, instanceIndex } = locationIt.move() const { location, isSecondary, instanceIndex } = locationIt.move()
Color.toArray(color(location, isSecondary), colors.array, instanceIndex * 3) Color.toArray(color(location, isSecondary), colors.array, instanceIndex * 3)
...@@ -87,6 +88,7 @@ export function createInstanceColor(locationIt: LocationIterator, color: Locatio ...@@ -87,6 +88,7 @@ export function createInstanceColor(locationIt: LocationIterator, color: Locatio
export function createGroupColor(locationIt: LocationIterator, color: LocationColor, colorData?: ColorData): ColorData { export function createGroupColor(locationIt: LocationIterator, color: LocationColor, colorData?: ColorData): ColorData {
const { groupCount } = locationIt const { groupCount } = locationIt
const colors = colorData && colorData.tColor.ref.value.array.length >= groupCount * 3 ? colorData.tColor.ref.value : createTextureImage(groupCount, 3) 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) { while (locationIt.hasNext && !locationIt.isNextNewInstance) {
const { location, isSecondary, groupIndex } = locationIt.move() const { location, isSecondary, groupIndex } = locationIt.move()
Color.toArray(color(location, isSecondary), colors.array, groupIndex * 3) Color.toArray(color(location, isSecondary), colors.array, groupIndex * 3)
...@@ -99,6 +101,7 @@ export function createGroupInstanceColor(locationIt: LocationIterator, color: Lo ...@@ -99,6 +101,7 @@ export function createGroupInstanceColor(locationIt: LocationIterator, color: Lo
const { groupCount, instanceCount } = locationIt const { groupCount, instanceCount } = locationIt
const count = instanceCount * groupCount const count = instanceCount * groupCount
const colors = colorData && colorData.tColor.ref.value.array.length >= count * 3 ? colorData.tColor.ref.value : createTextureImage(count, 3) const colors = colorData && colorData.tColor.ref.value.array.length >= count * 3 ? colorData.tColor.ref.value : createTextureImage(count, 3)
locationIt.reset()
while (locationIt.hasNext) { while (locationIt.hasNext) {
const { location, isSecondary, index } = locationIt.move() const { location, isSecondary, index } = locationIt.move()
Color.toArray(color(location, isSecondary), colors.array, index * 3) Color.toArray(color(location, isSecondary), colors.array, index * 3)
......
...@@ -11,6 +11,7 @@ import { LocationIterator } from '../util/location-iterator'; ...@@ -11,6 +11,7 @@ import { LocationIterator } from '../util/location-iterator';
import { Location, NullLocation } from 'mol-model/location'; import { Location, NullLocation } from 'mol-model/location';
import { SizeTheme } from 'mol-theme/size'; import { SizeTheme } from 'mol-theme/size';
import { getGranularity } from './geometry'; import { getGranularity } from './geometry';
import { encodeFloatLog } from 'mol-util/float-packing';
export type SizeType = 'uniform' | 'instance' | 'group' | 'groupInstance' export type SizeType = 'uniform' | 'instance' | 'group' | 'groupInstance'
...@@ -83,9 +84,10 @@ export function createTextureSize(sizes: TextureImage<Uint8Array>, type: SizeTyp ...@@ -83,9 +84,10 @@ export function createTextureSize(sizes: TextureImage<Uint8Array>, type: SizeTyp
export function createInstanceSize(locationIt: LocationIterator, sizeFn: LocationSize, sizeData?: SizeData): SizeData { export function createInstanceSize(locationIt: LocationIterator, sizeFn: LocationSize, sizeData?: SizeData): SizeData {
const { instanceCount} = locationIt const { instanceCount} = locationIt
const sizes = sizeData && sizeData.tSize.ref.value.array.length >= instanceCount ? sizeData.tSize.ref.value : createTextureImage(instanceCount, 1) const sizes = sizeData && sizeData.tSize.ref.value.array.length >= instanceCount ? sizeData.tSize.ref.value : createTextureImage(instanceCount, 1)
locationIt.reset()
while (locationIt.hasNext && !locationIt.isNextNewInstance) { while (locationIt.hasNext && !locationIt.isNextNewInstance) {
const v = locationIt.move() const v = locationIt.move()
sizes.array[v.instanceIndex] = sizeFn(v.location) sizes.array[v.instanceIndex] = encodeFloatLog(sizeFn(v.location)) * 255
locationIt.skipInstance() locationIt.skipInstance()
} }
return createTextureSize(sizes, 'instance', sizeData) return createTextureSize(sizes, 'instance', sizeData)
...@@ -95,9 +97,10 @@ export function createInstanceSize(locationIt: LocationIterator, sizeFn: Locatio ...@@ -95,9 +97,10 @@ export function createInstanceSize(locationIt: LocationIterator, sizeFn: Locatio
export function createGroupSize(locationIt: LocationIterator, sizeFn: LocationSize, sizeData?: SizeData): SizeData { export function createGroupSize(locationIt: LocationIterator, sizeFn: LocationSize, sizeData?: SizeData): SizeData {
const { groupCount } = locationIt const { groupCount } = locationIt
const sizes = sizeData && sizeData.tSize.ref.value.array.length >= groupCount ? sizeData.tSize.ref.value : createTextureImage(groupCount, 1) const sizes = sizeData && sizeData.tSize.ref.value.array.length >= groupCount ? sizeData.tSize.ref.value : createTextureImage(groupCount, 1)
locationIt.reset()
while (locationIt.hasNext && !locationIt.isNextNewInstance) { while (locationIt.hasNext && !locationIt.isNextNewInstance) {
const v = locationIt.move() 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) return createTextureSize(sizes, 'group', sizeData)
} }
...@@ -107,9 +110,10 @@ export function createGroupInstanceSize(locationIt: LocationIterator, sizeFn: Lo ...@@ -107,9 +110,10 @@ export function createGroupInstanceSize(locationIt: LocationIterator, sizeFn: Lo
const { groupCount, instanceCount } = locationIt const { groupCount, instanceCount } = locationIt
const count = instanceCount * groupCount const count = instanceCount * groupCount
const sizes = sizeData && sizeData.tSize.ref.value.array.length >= count ? sizeData.tSize.ref.value : createTextureImage(count, 1) const sizes = sizeData && sizeData.tSize.ref.value.array.length >= count ? sizeData.tSize.ref.value : createTextureImage(count, 1)
locationIt.reset()
while (locationIt.hasNext && !locationIt.isNextNewInstance) { while (locationIt.hasNext && !locationIt.isNextNewInstance) {
const v = locationIt.move() 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) return createTextureSize(sizes, 'groupInstance', sizeData)
} }
\ No newline at end of file
...@@ -3,9 +3,13 @@ ...@@ -3,9 +3,13 @@
#elif defined(dSizeType_attribute) #elif defined(dSizeType_attribute)
float size = aSize; float size = aSize;
#elif defined(dSizeType_instance) #elif defined(dSizeType_instance)
float size = readFromTexture(tSize, aInstance, uSizeTexDim).r; float size = readFromTexture(tSize, aInstance, uSizeTexDim).a;
#elif defined(dSizeType_group) #elif defined(dSizeType_group)
float size = readFromTexture(tSize, aGroup, uSizeTexDim).r; float size = readFromTexture(tSize, aGroup, uSizeTexDim).a;
#elif defined(dSizeType_groupInstance) #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 #endif
\ No newline at end of file
...@@ -5,4 +5,5 @@ ...@@ -5,4 +5,5 @@
#elif defined(dSizeType_instance) || defined(dSizeType_group) || defined(dSizeType_groupInstance) #elif defined(dSizeType_instance) || defined(dSizeType_group) || defined(dSizeType_groupInstance)
uniform vec2 uSizeTexDim; uniform vec2 uSizeTexDim;
uniform sampler2D tSize; uniform sampler2D tSize;
#pragma glslify: decodeFloatLog = require(../utils/decode-float-log.glsl)
#endif #endif
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment