From 8e2585a5c039e1cbf73d7d3403a4e4ae65f2c258 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alexander.rose@weirdbyte.de> Date: Sat, 23 Jul 2022 11:26:34 -0700 Subject: [PATCH] add material annotation support for textures --- CHANGELOG.md | 1 + .../geometry/texture-mesh/color-smoothing.ts | 18 ++++++----------- src/mol-gl/renderable/schema.ts | 14 ++++++++----- .../color-smoothing/accumulate.vert.ts | 3 +-- src/mol-gl/webgl/render-item.ts | 20 ++++++++++++++++++- src/mol-math/geometry/gaussian-density/gpu.ts | 2 +- 6 files changed, 37 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 386d89643..243602929 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Note that since we don't clearly distinguish between a public and private interf - Fix: only update camera state if manualReset is off (#494) - Improve handling principal axes of points in a plane +- Add 'material' annotation support for textures ## [v3.12.1] - 2022-07-20 diff --git a/src/mol-geo/geometry/texture-mesh/color-smoothing.ts b/src/mol-geo/geometry/texture-mesh/color-smoothing.ts index 7d28455cd..0a0a1786c 100644 --- a/src/mol-geo/geometry/texture-mesh/color-smoothing.ts +++ b/src/mol-geo/geometry/texture-mesh/color-smoothing.ts @@ -27,20 +27,18 @@ export const ColorAccumulateSchema = { instanceCount: ValueSpec('number'), stride: ValueSpec('number'), - uTotalCount: UniformSpec('i'), - uInstanceCount: UniformSpec('i'), - uGroupCount: UniformSpec('i'), + uGroupCount: UniformSpec('i', 'material'), aTransform: AttributeSpec('float32', 16, 1), aInstance: AttributeSpec('float32', 1, 1), aSample: AttributeSpec('float32', 1, 0), - uGeoTexDim: UniformSpec('v2', 'buffered'), - tPosition: TextureSpec('texture', 'rgba', 'float', 'nearest'), - tGroup: TextureSpec('texture', 'rgba', 'float', 'nearest'), + uGeoTexDim: UniformSpec('v2', 'material'), + tPosition: TextureSpec('texture', 'rgba', 'float', 'nearest', 'material'), + tGroup: TextureSpec('texture', 'rgba', 'float', 'nearest', 'material'), - uColorTexDim: UniformSpec('v2'), - tColor: TextureSpec('texture', 'rgba', 'ubyte', 'nearest'), + uColorTexDim: UniformSpec('v2', 'material'), + tColor: TextureSpec('texture', 'rgba', 'ubyte', 'nearest', 'material'), dColorType: DefineSpec('string', ['group', 'groupInstance', 'vertex', 'vertexInstance']), uCurrentSlice: UniformSpec('f'), @@ -88,8 +86,6 @@ function getAccumulateRenderable(ctx: WebGLContext, input: AccumulateInput, box: ValueCell.updateIfChanged(v.instanceCount, input.instanceCount); ValueCell.updateIfChanged(v.stride, stride); - ValueCell.updateIfChanged(v.uTotalCount, input.vertexCount); - ValueCell.updateIfChanged(v.uInstanceCount, input.instanceCount); ValueCell.updateIfChanged(v.uGroupCount, input.groupCount); ValueCell.update(v.aTransform, input.transformBuffer); @@ -126,8 +122,6 @@ function createAccumulateRenderable(ctx: WebGLContext, input: AccumulateInput, b instanceCount: ValueCell.create(input.instanceCount), stride: ValueCell.create(stride), - uTotalCount: ValueCell.create(input.vertexCount), - uInstanceCount: ValueCell.create(input.instanceCount), uGroupCount: ValueCell.create(input.groupCount), aTransform: ValueCell.create(input.transformBuffer), diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index a364a1cd4..71578c4d2 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -36,6 +36,7 @@ export function splitValues(schema: RenderableSchema, values: RenderableValues) const attributeValues: AttributeValues = {}; const defineValues: DefineValues = {}; const textureValues: TextureValues = {}; + const materialTextureValues: TextureValues = {}; const uniformValues: UniformValues = {}; const materialUniformValues: UniformValues = {}; const bufferedUniformValues: UniformValues = {}; @@ -44,7 +45,10 @@ export function splitValues(schema: RenderableSchema, values: RenderableValues) if (spec.type === 'attribute') attributeValues[k] = values[k]; if (spec.type === 'define') defineValues[k] = values[k]; // check if k exists in values to exclude global textures - if (spec.type === 'texture' && values[k] !== undefined) textureValues[k] = values[k]; + if (spec.type === 'texture' && values[k] !== undefined) { + if (spec.variant === 'material') materialTextureValues[k] = values[k]; + else textureValues[k] = values[k]; + } // check if k exists in values to exclude global uniforms if (spec.type === 'uniform' && values[k] !== undefined) { if (spec.variant === 'material') materialUniformValues[k] = values[k]; @@ -52,7 +56,7 @@ export function splitValues(schema: RenderableSchema, values: RenderableValues) else uniformValues[k] = values[k]; } }); - return { attributeValues, defineValues, textureValues, uniformValues, materialUniformValues, bufferedUniformValues }; + return { attributeValues, defineValues, textureValues, materialTextureValues, uniformValues, materialUniformValues, bufferedUniformValues }; } export type Versions<T extends RenderableValues> = { [k in keyof T]: number } @@ -76,9 +80,9 @@ export function UniformSpec<K extends UniformKind>(kind: K, variant?: 'material' return { type: 'uniform', kind, variant }; } -export type TextureSpec<K extends TextureKind> = { type: 'texture', kind: K, format: TextureFormat, dataType: TextureType, filter: TextureFilter } -export function TextureSpec<K extends TextureKind>(kind: K, format: TextureFormat, dataType: TextureType, filter: TextureFilter): TextureSpec<K> { - return { type: 'texture', kind, format, dataType, filter }; +export type TextureSpec<K extends TextureKind> = { type: 'texture', kind: K, format: TextureFormat, dataType: TextureType, filter: TextureFilter, variant?: 'material' } +export function TextureSpec<K extends TextureKind>(kind: K, format: TextureFormat, dataType: TextureType, filter: TextureFilter, variant?: 'material'): TextureSpec<K> { + return { type: 'texture', kind, format, dataType, filter, variant }; } export type ElementsSpec<K extends ElementsKind> = { type: 'elements', kind: K } diff --git a/src/mol-gl/shader/compute/color-smoothing/accumulate.vert.ts b/src/mol-gl/shader/compute/color-smoothing/accumulate.vert.ts index e6c36a658..bec192c19 100644 --- a/src/mol-gl/shader/compute/color-smoothing/accumulate.vert.ts +++ b/src/mol-gl/shader/compute/color-smoothing/accumulate.vert.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2021-2022 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ @@ -10,7 +10,6 @@ precision highp float; #include common #include read_from_texture -uniform int uTotalCount; uniform int uGroupCount; attribute float aSample; diff --git a/src/mol-gl/webgl/render-item.ts b/src/mol-gl/webgl/render-item.ts index 04fd09723..e05dced71 100644 --- a/src/mol-gl/webgl/render-item.ts +++ b/src/mol-gl/webgl/render-item.ts @@ -118,7 +118,7 @@ export function createRenderItem<T extends string>(ctx: WebGLContext, drawMode: (schema as any).aVertex = AttributeSpec('float32', 1, 0); } - const { attributeValues, defineValues, textureValues, uniformValues, materialUniformValues, bufferedUniformValues } = splitValues(schema, values); + const { attributeValues, defineValues, textureValues, materialTextureValues, uniformValues, materialUniformValues, bufferedUniformValues } = splitValues(schema, values); const uniformValueEntries = Object.entries(uniformValues); const materialUniformValueEntries = Object.entries(materialUniformValues); @@ -136,6 +136,7 @@ export function createRenderItem<T extends string>(ctx: WebGLContext, drawMode: } const textures = createTextures(ctx, schema, textureValues); + const materialTextures = createTextures(ctx, schema, materialTextureValues); const attributeBuffers = createAttributeBuffers(ctx, schema, attributeValues); let elementsBuffer: ElementsBuffer | undefined; @@ -180,6 +181,7 @@ export function createRenderItem<T extends string>(ctx: WebGLContext, drawMode: // console.log('program.id changed or materialId changed/-1', materialId) if (program.id !== state.currentProgramId) program.use(); program.setUniforms(materialUniformValueEntries); + program.bindTextures(materialTextures, sharedTexturesCount + textures.length); state.currentMaterialId = materialId; currentProgramId = program.id; } @@ -314,6 +316,22 @@ export function createRenderItem<T extends string>(ctx: WebGLContext, drawMode: } } + for (let i = 0, il = materialTextures.length; i < il; ++i) { + const [k, texture] = materialTextures[i]; + const value = materialTextureValues[k]; + if (value.ref.version !== versions[k]) { + // update of textures with kind 'texture' is done externally + if (schema[k].kind !== 'texture') { + // console.log('texture version changed, uploading image', k); + texture.load(value.ref.value as TextureImage<any> | TextureVolume<any>); + valueChanges.textures = true; + } else { + materialTextures[i][1] = value.ref.value as Texture; + } + versions[k] = value.ref.version; + } + } + for (let i = 0, il = backBufferUniformValueEntries.length; i < il; ++i) { const [k, uniform] = backBufferUniformValueEntries[i]; if (uniform.ref.version !== versions[k]) { diff --git a/src/mol-math/geometry/gaussian-density/gpu.ts b/src/mol-math/geometry/gaussian-density/gpu.ts index 23f7612d6..97c5f0c86 100644 --- a/src/mol-math/geometry/gaussian-density/gpu.ts +++ b/src/mol-math/geometry/gaussian-density/gpu.ts @@ -42,7 +42,7 @@ const GaussianDensitySchema = { uAlpha: UniformSpec('f', 'material'), uResolution: UniformSpec('f', 'material'), uRadiusFactorInv: UniformSpec('f', 'material'), - tMinDistanceTex: TextureSpec('texture', 'rgba', 'float', 'nearest'), + tMinDistanceTex: TextureSpec('texture', 'rgba', 'float', 'nearest', 'material'), dGridTexType: DefineSpec('string', ['2d', '3d']), dCalcType: DefineSpec('string', ['density', 'minDistance', 'groupId']), -- GitLab