diff --git a/src/mol-canvas3d/helper/bounding-sphere-helper.ts b/src/mol-canvas3d/helper/bounding-sphere-helper.ts index c3272d840f4a26240a0ef4ae42cc8ba8821ddd75..191e13a807569f380adbe458ce44e4589d329560 100644 --- a/src/mol-canvas3d/helper/bounding-sphere-helper.ts +++ b/src/mol-canvas3d/helper/bounding-sphere-helper.ts @@ -4,7 +4,7 @@ * @author Alexander Rose <alexander.rose@weirdbyte.de> */ -import { createRenderObject, RenderObject } from 'mol-gl/render-object' +import { createRenderObject, RenderObject, getNextMaterialId } from 'mol-gl/render-object' import { MeshBuilder } from 'mol-geo/geometry/mesh/mesh-builder'; import { addSphere } from 'mol-geo/geometry/mesh/builder/sphere'; import { Mesh } from 'mol-geo/geometry/mesh/mesh'; @@ -136,7 +136,8 @@ function createBoundingSphereMesh(boundingSphere: Sphere3D, mesh?: Mesh) { return MeshBuilder.getMesh(builderState) } +const boundingSphereHelberMaterialId = getNextMaterialId() function createBoundingSphereRenderObject(mesh: Mesh, color: Color, transform?: TransformData) { const values = Mesh.Utils.createValuesSimple(mesh, { alpha: 0.1, doubleSided: false }, color, 1, transform) - return createRenderObject('mesh', values, { visible: true, alphaFactor: 1, pickable: false, opaque: false }) + return createRenderObject('mesh', values, { visible: true, alphaFactor: 1, pickable: false, opaque: false }, boundingSphereHelberMaterialId) } \ No newline at end of file diff --git a/src/mol-geo/geometry/base.ts b/src/mol-geo/geometry/base.ts index eabbbc2454694f7f9e6696f68401f1d23f3ad782..c168c5a03b3f019e950e25b6c184976dfa0b39a3 100644 --- a/src/mol-geo/geometry/base.ts +++ b/src/mol-geo/geometry/base.ts @@ -64,9 +64,10 @@ export namespace BaseGeometry { 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)), + dUseFog: ValueCell.create(props.useFog), + uGroupCount: ValueCell.create(counts.groupCount), drawCount: ValueCell.create(counts.drawCount), - dUseFog: ValueCell.create(props.useFog), } } diff --git a/src/mol-gl/_spec/renderer.spec.ts b/src/mol-gl/_spec/renderer.spec.ts index 314d75f0bd3dc31c67d860fd296c56e969a8c4b1..59e21b88aaad8ad0a0712c011308369eb5a3d7bc 100644 --- a/src/mol-gl/_spec/renderer.spec.ts +++ b/src/mol-gl/_spec/renderer.spec.ts @@ -102,7 +102,7 @@ function createPoints() { opaque: true } - return createRenderObject('points', values, state) + return createRenderObject('points', values, state, -1) } describe('renderer', () => { diff --git a/src/mol-gl/render-object.ts b/src/mol-gl/render-object.ts index 57ad487070e0ec547dc07fe982808eecab3690ae..0103f84fa9bec989bc7168ee7d21926af8f24cb0 100644 --- a/src/mol-gl/render-object.ts +++ b/src/mol-gl/render-object.ts @@ -18,7 +18,9 @@ import { TextValues, TextRenderable } from './renderable/text'; const getNextId = idFactory(0, 0x7FFFFFFF) -export interface BaseRenderObject { id: number, type: string, values: RenderableValues, state: RenderableState } +export const getNextMaterialId = idFactory(0, 0x7FFFFFFF) + +export interface BaseRenderObject { id: number, type: string, values: RenderableValues, state: RenderableState, materialId: number } export interface MeshRenderObject extends BaseRenderObject { type: 'mesh', values: MeshValues } export interface PointsRenderObject extends BaseRenderObject { type: 'points', values: PointsValues } export interface SpheresRenderObject extends BaseRenderObject { type: 'spheres', values: SpheresValues } @@ -60,18 +62,18 @@ export type RenderObjectType = keyof RenderObjectKindType // -export function createRenderObject<T extends RenderObjectType>(type: T, values: RenderObjectValuesType[T], state: RenderableState): RenderObjectKindType[T] { - return { id: getNextId(), type, values, state } as RenderObjectKindType[T] +export function createRenderObject<T extends RenderObjectType>(type: T, values: RenderObjectValuesType[T], state: RenderableState, materialId: number): RenderObjectKindType[T] { + return { id: getNextId(), type, values, state, materialId } as RenderObjectKindType[T] } export function createRenderable(ctx: WebGLContext, o: RenderObject): Renderable<any> { switch (o.type) { - case 'mesh': return MeshRenderable(ctx, o.id, o.values, o.state) - case 'points': return PointsRenderable(ctx, o.id, o.values, o.state) - case 'spheres': return SpheresRenderable(ctx, o.id, o.values, o.state) - case 'text': return TextRenderable(ctx, o.id, o.values, o.state) - case 'lines': return LinesRenderable(ctx, o.id, o.values, o.state) - case 'direct-volume': return DirectVolumeRenderable(ctx, o.id, o.values, o.state) + case 'mesh': return MeshRenderable(ctx, o.id, o.values, o.state, o.materialId) + case 'points': return PointsRenderable(ctx, o.id, o.values, o.state, o.materialId) + case 'spheres': return SpheresRenderable(ctx, o.id, o.values, o.state, o.materialId) + case 'text': return TextRenderable(ctx, o.id, o.values, o.state, o.materialId) + case 'lines': return LinesRenderable(ctx, o.id, o.values, o.state, o.materialId) + case 'direct-volume': return DirectVolumeRenderable(ctx, o.id, o.values, o.state, o.materialId) case 'gaussian-density': return GaussianDensityRenderable(ctx, o.id, o.values, o.state) } diff --git a/src/mol-gl/renderable/direct-volume.ts b/src/mol-gl/renderable/direct-volume.ts index eb94c44996943bdd529c67c93898f25375b9009c..1c01119ecdbfcf8ebd7ae6de1708de39956a581e 100644 --- a/src/mol-gl/renderable/direct-volume.ts +++ b/src/mol-gl/renderable/direct-volume.ts @@ -67,13 +67,13 @@ export const DirectVolumeSchema = { export type DirectVolumeSchema = typeof DirectVolumeSchema export type DirectVolumeValues = Values<DirectVolumeSchema> -export function DirectVolumeRenderable(ctx: WebGLContext, id: number, values: DirectVolumeValues, state: RenderableState): Renderable<DirectVolumeValues> { +export function DirectVolumeRenderable(ctx: WebGLContext, id: number, values: DirectVolumeValues, state: RenderableState, materialId: number): Renderable<DirectVolumeValues> { const schema = { ...GlobalUniformSchema, ...InternalSchema, ...DirectVolumeSchema } const internalValues: InternalValues = { uObjectId: ValueCell.create(id), - uPickable: ValueCell.create(state.pickable ? 1 : 0) + uPickable: ValueCell.create(state.pickable ? 1 : 0), } const shaderCode = DirectVolumeShaderCode - const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }) + const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }, materialId) return createRenderable(renderItem, values, state); } \ No newline at end of file diff --git a/src/mol-gl/renderable/gaussian-density.ts b/src/mol-gl/renderable/gaussian-density.ts index a8b4f1518a862487568da811962de281eb30bc9e..7a31f7678051155cc6031dfe2bdf57556356b10b 100644 --- a/src/mol-gl/renderable/gaussian-density.ts +++ b/src/mol-gl/renderable/gaussian-density.ts @@ -38,7 +38,7 @@ export type GaussianDensityValues = Values<GaussianDensitySchema> export function GaussianDensityRenderable(ctx: WebGLContext, id: number, values: GaussianDensityValues, state: RenderableState): Renderable<GaussianDensityValues> { const schema = { ...GaussianDensitySchema } const shaderCode = GaussianDensityShaderCode - const renderItem = createRenderItem(ctx, 'points', shaderCode, schema, values) + const renderItem = createRenderItem(ctx, 'points', shaderCode, schema, values, -1) return createRenderable(renderItem, values, state); } \ No newline at end of file diff --git a/src/mol-gl/renderable/lines.ts b/src/mol-gl/renderable/lines.ts index 54e62c5b448bf5b4bf8bcf88037092564fcf52ce..74fcca839773656e9d5c67aa0baddfc3479eba08 100644 --- a/src/mol-gl/renderable/lines.ts +++ b/src/mol-gl/renderable/lines.ts @@ -25,14 +25,14 @@ export const LinesSchema = { export type LinesSchema = typeof LinesSchema export type LinesValues = Values<LinesSchema> -export function LinesRenderable(ctx: WebGLContext, id: number, values: LinesValues, state: RenderableState): Renderable<LinesValues> { +export function LinesRenderable(ctx: WebGLContext, id: number, values: LinesValues, state: RenderableState, materialId: number): Renderable<LinesValues> { const schema = { ...GlobalUniformSchema, ...InternalSchema, ...LinesSchema } const internalValues: InternalValues = { uObjectId: ValueCell.create(id), uPickable: ValueCell.create(state.pickable ? 1 : 0) } const shaderCode = LinesShaderCode - const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }) + const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }, materialId) return createRenderable(renderItem, values, state); } \ No newline at end of file diff --git a/src/mol-gl/renderable/mesh.ts b/src/mol-gl/renderable/mesh.ts index a3d70909409dda202f1649ab5397ae0cc47e8d29..a8ebba4b3942e0937efe47caf654bbee916c0c23 100644 --- a/src/mol-gl/renderable/mesh.ts +++ b/src/mol-gl/renderable/mesh.ts @@ -23,14 +23,14 @@ export const MeshSchema = { export type MeshSchema = typeof MeshSchema export type MeshValues = Values<MeshSchema> -export function MeshRenderable(ctx: WebGLContext, id: number, values: MeshValues, state: RenderableState): Renderable<MeshValues> { +export function MeshRenderable(ctx: WebGLContext, id: number, values: MeshValues, state: RenderableState, materialId: number): Renderable<MeshValues> { const schema = { ...GlobalUniformSchema, ...InternalSchema, ...MeshSchema } const internalValues: InternalValues = { uObjectId: ValueCell.create(id), uPickable: ValueCell.create(state.pickable ? 1 : 0) } const shaderCode = MeshShaderCode - const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }) + const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }, materialId) return createRenderable(renderItem, values, state) } \ No newline at end of file diff --git a/src/mol-gl/renderable/points.ts b/src/mol-gl/renderable/points.ts index 60f9f243622fcda3422b43bc1ce5b028f8dd1be2..ff3726edb43cae8d1769ee5318820d38db74f7b0 100644 --- a/src/mol-gl/renderable/points.ts +++ b/src/mol-gl/renderable/points.ts @@ -22,13 +22,13 @@ export const PointsSchema = { export type PointsSchema = typeof PointsSchema export type PointsValues = Values<PointsSchema> -export function PointsRenderable(ctx: WebGLContext, id: number, values: PointsValues, state: RenderableState): Renderable<PointsValues> { +export function PointsRenderable(ctx: WebGLContext, id: number, values: PointsValues, state: RenderableState, materialId: number): Renderable<PointsValues> { const schema = { ...GlobalUniformSchema, ...InternalSchema, ...PointsSchema } const internalValues: InternalValues = { uObjectId: ValueCell.create(id), uPickable: ValueCell.create(state.pickable ? 1 : 0) } const shaderCode = PointsShaderCode - const renderItem = createRenderItem(ctx, 'points', shaderCode, schema, { ...values, ...internalValues }) + const renderItem = createRenderItem(ctx, 'points', shaderCode, schema, { ...values, ...internalValues }, materialId) return createRenderable(renderItem, values, state); } \ No newline at end of file diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index f8ec2c54e066093d2779aac0d879f1f9d048b1f7..c1f3a4f93338c285e9661f4d9c45f0a6db0b59a6 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ @@ -68,27 +68,32 @@ export function splitValues(schema: RenderableSchema, values: RenderableValues) const defineValues: DefineValues = {} const textureValues: TextureValues = {} const uniformValues: UniformValues = {} + const materialUniformValues: UniformValues = {} Object.keys(schema).forEach(k => { - if (schema[k].type === 'attribute') attributeValues[k] = values[k] - if (schema[k].type === 'define') defineValues[k] = values[k] - if (schema[k].type === 'texture') textureValues[k] = values[k] - if (schema[k].type === 'uniform') uniformValues[k] = values[k] + const spec = schema[k] + if (spec.type === 'attribute') attributeValues[k] = values[k] + if (spec.type === 'define') defineValues[k] = values[k] + if (spec.type === 'texture') textureValues[k] = values[k] + // check if k exists in values so that global uniforms are excluded here + if (spec.type === 'uniform' && values[k] !== undefined) { + if (spec.isMaterial) materialUniformValues[k] = values[k] + else uniformValues[k] = values[k] + } }) - return { attributeValues, defineValues, textureValues, uniformValues } + return { attributeValues, defineValues, textureValues, uniformValues, materialUniformValues } } export function splitKeys(schema: RenderableSchema) { const attributeKeys: string[] = [] const defineKeys: string[] = [] const textureKeys: string[] = [] - const uniformKeys: string[] = [] Object.keys(schema).forEach(k => { - if (schema[k].type === 'attribute') attributeKeys.push(k) - if (schema[k].type === 'define') defineKeys.push(k) - if (schema[k].type === 'texture') textureKeys.push(k) - if (schema[k].type === 'uniform') uniformKeys.push(k) + const spec = schema[k] + if (spec.type === 'attribute') attributeKeys.push(k) + if (spec.type === 'define') defineKeys.push(k) + if (spec.type === 'texture') textureKeys.push(k) }) - return { attributeKeys, defineKeys, textureKeys, uniformKeys } + return { attributeKeys, defineKeys, textureKeys } } export type Versions<T extends RenderableValues> = { [k in keyof T]: number } @@ -107,9 +112,9 @@ export function AttributeSpec<K extends ArrayKind>(kind: K, itemSize: AttributeI return { type: 'attribute', kind, itemSize, divisor } } -export type UniformSpec<K extends UniformKind> = { type: 'uniform', kind: K } -export function UniformSpec<K extends UniformKind>(kind: K): UniformSpec<K> { - return { type: 'uniform', kind } +export type UniformSpec<K extends UniformKind> = { type: 'uniform', kind: K, isMaterial: boolean } +export function UniformSpec<K extends UniformKind>(kind: K, isMaterial = false): UniformSpec<K> { + return { type: 'uniform', kind, isMaterial } } export type TextureSpec<K extends TextureKind> = { type: 'texture', kind: K, format: TextureFormat, dataType: TextureType, filter: TextureFilter } @@ -174,14 +179,14 @@ export type GlobalUniformValues = { [k in keyof GlobalUniformSchema]: ValueCell< export const InternalSchema = { uObjectId: UniformSpec('i'), - uPickable: UniformSpec('i'), + uPickable: UniformSpec('i', true), } export type InternalSchema = typeof InternalSchema export type InternalValues = { [k in keyof InternalSchema]: ValueCell<any> } export const ColorSchema = { // aColor: AttributeSpec('float32', 3, 0), // TODO - uColor: UniformSpec('v3'), + uColor: UniformSpec('v3', true), uColorTexDim: UniformSpec('v2'), tColor: TextureSpec('image-uint8', 'rgb', 'ubyte', 'nearest'), dColorType: DefineSpec('string', ['uniform', 'attribute', 'instance', 'group', 'group_instance']), @@ -191,7 +196,7 @@ export type ColorValues = Values<ColorSchema> export const SizeSchema = { // aSize: AttributeSpec('float32', 1, 0), // TODO - uSize: UniformSpec('f'), + uSize: UniformSpec('f', true), uSizeTexDim: UniformSpec('v2'), tSize: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'), dSizeType: DefineSpec('string', ['uniform', 'attribute', 'instance', 'group', 'group_instance']), @@ -231,12 +236,12 @@ export const BaseSchema = { /** * final alpha, calculated as `values.alpha * state.alpha` */ - uAlpha: UniformSpec('f'), + uAlpha: UniformSpec('f', true), uInstanceCount: UniformSpec('i'), uGroupCount: UniformSpec('i'), - uHighlightColor: UniformSpec('v3'), - uSelectColor: UniformSpec('v3'), + uHighlightColor: UniformSpec('v3', true), + uSelectColor: UniformSpec('v3', true), drawCount: ValueSpec('number'), instanceCount: ValueSpec('number'), diff --git a/src/mol-gl/renderable/spheres.ts b/src/mol-gl/renderable/spheres.ts index 0136658ab4f5451c1610e301a89837a6c3bb759c..3806cf18304240f7f7e8256b00f8fcd11572f4a5 100644 --- a/src/mol-gl/renderable/spheres.ts +++ b/src/mol-gl/renderable/spheres.ts @@ -24,13 +24,13 @@ export const SpheresSchema = { export type SpheresSchema = typeof SpheresSchema export type SpheresValues = Values<SpheresSchema> -export function SpheresRenderable(ctx: WebGLContext, id: number, values: SpheresValues, state: RenderableState): Renderable<SpheresValues> { +export function SpheresRenderable(ctx: WebGLContext, id: number, values: SpheresValues, state: RenderableState, materialId: number): Renderable<SpheresValues> { const schema = { ...GlobalUniformSchema, ...InternalSchema, ...SpheresSchema } const internalValues: InternalValues = { uObjectId: ValueCell.create(id), uPickable: ValueCell.create(state.pickable ? 1 : 0) } const shaderCode = SpheresShaderCode - const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }) + const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }, materialId) return createRenderable(renderItem, values, state); } \ No newline at end of file diff --git a/src/mol-gl/renderable/text.ts b/src/mol-gl/renderable/text.ts index 6f10a8fad2fc94589cfe215d39f0bbd8466b5c0e..3e9a2c4764de39404ec00a6d20b919c8934561e8 100644 --- a/src/mol-gl/renderable/text.ts +++ b/src/mol-gl/renderable/text.ts @@ -34,13 +34,13 @@ export const TextSchema = { export type TextSchema = typeof TextSchema export type TextValues = Values<TextSchema> -export function TextRenderable(ctx: WebGLContext, id: number, values: TextValues, state: RenderableState): Renderable<TextValues> { +export function TextRenderable(ctx: WebGLContext, id: number, values: TextValues, state: RenderableState, materialId: number): Renderable<TextValues> { const schema = { ...GlobalUniformSchema, ...InternalSchema, ...TextSchema } const internalValues: InternalValues = { uObjectId: ValueCell.create(id), uPickable: ValueCell.create(state.pickable ? 1 : 0) } const shaderCode = TextShaderCode - const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }) + const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues }, materialId) return createRenderable(renderItem, values, state); } \ No newline at end of file diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index a85a8f3a0278bb2b0e7e1bd73782f7f155866450..60ac75d626075db5d00d4cae31ca30d4519e54d8 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -1,10 +1,9 @@ /** - * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ -// import { Vec3, Mat4 } from 'mol-math/linear-algebra' import { Viewport } from 'mol-canvas3d/camera/util'; import { Camera } from 'mol-canvas3d/camera'; @@ -112,11 +111,13 @@ namespace Renderer { const program = r.getProgram(variant) if (r.state.visible) { if (ctx.currentProgramId !== program.id) { + // console.log('new program') globalUniformsNeedUpdate = true } program.use() if (globalUniformsNeedUpdate) { + // console.log('globalUniformsNeedUpdate') program.setUniforms(globalUniforms) globalUniformsNeedUpdate = false } diff --git a/src/mol-gl/shader/chunks/common-vert-params.glsl b/src/mol-gl/shader/chunks/common-vert-params.glsl index b20c57468507aeee7240689513961782a986bee6..390f0f1c6b22288090a448f1512bf27e95f650c6 100644 --- a/src/mol-gl/shader/chunks/common-vert-params.glsl +++ b/src/mol-gl/shader/chunks/common-vert-params.glsl @@ -1,12 +1,6 @@ uniform mat4 uProjection, uModel, uView; uniform vec3 uCameraPosition; -uniform Common { - mat4 uProjection; - int uObjectId; - int uInstanceCount; -} uboCommon; - uniform int uObjectId; uniform int uInstanceCount; uniform int uGroupCount; diff --git a/src/mol-gl/webgl/buffer.ts b/src/mol-gl/webgl/buffer.ts index 183adacbda3e31eaeb122b440d82bd51f8d39bf9..0206991a7a026fb37cd271fd6ef153be7f6ea697 100644 --- a/src/mol-gl/webgl/buffer.ts +++ b/src/mol-gl/webgl/buffer.ts @@ -215,33 +215,4 @@ export function createElementsBuffer(ctx: WebGLContext, array: ElementsType, usa gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, _buffer); } } -} - -// - -export type UniformType = Float32Array -export type UniformKind = 'float32' - -// export type AttributeDefs = { -// [k: string]: { kind: ArrayKind, itemSize: BufferItemSize, divisor: number } -// } -// export type AttributeValues = { [k: string]: ValueCell<ArrayType> } -export type UniformBuffers = { [k: string]: UniformBuffer } - -export interface UniformBuffer extends Buffer { - bind: (location: number) => void -} - -export function createUniformBuffer(ctx: WebGLContext, array: UniformType, usageHint: UsageHint = 'dynamic'): UniformBuffer { - const gl = ctx.gl as WebGL2RenderingContext - const buffer = createBuffer(ctx, array, usageHint, 'uniform') - const { _buffer } = buffer - - return { - ...buffer, - bind: (location: number) => { - gl.bindBuffer(gl.UNIFORM_BUFFER, _buffer) - gl.bindBufferBase(gl.UNIFORM_BUFFER, location, _buffer) - } - } -} +} \ No newline at end of file diff --git a/src/mol-gl/webgl/context.ts b/src/mol-gl/webgl/context.ts index 9b231fdfb20ffafb28829c4bfcd83b75af089a03..b849f9f9ae06d4120d3576d4f6be6936d128708d 100644 --- a/src/mol-gl/webgl/context.ts +++ b/src/mol-gl/webgl/context.ts @@ -136,6 +136,7 @@ export interface WebGLContext { readonly framebufferCache: FramebufferCache currentProgramId: number + currentMaterialId: number bufferCount: number framebufferCount: number @@ -263,6 +264,7 @@ export function createContext(gl: GLRenderingContext): WebGLContext { framebufferCache, currentProgramId: -1, + currentMaterialId: -1, bufferCount: 0, framebufferCount: 0, diff --git a/src/mol-gl/webgl/program.ts b/src/mol-gl/webgl/program.ts index 585ed8874a923ea2fdb25a7802b0b9f33a262010..f894cc1a328a1bea2bc61f0092a7a8f2117ec2f9 100644 --- a/src/mol-gl/webgl/program.ts +++ b/src/mol-gl/webgl/program.ts @@ -7,7 +7,8 @@ import { ShaderCode, DefineValues, addShaderDefines } from '../shader-code' import { WebGLContext } from './context'; import { UniformValues, getUniformSetters } from './uniform'; -import { AttributeBuffers, UniformBuffers, createUniformBuffer } from './buffer'; +import { AttributeBuffers } from './buffer'; +// import { AttributeBuffers, UniformBuffers, createUniformBuffer } from './buffer'; import { Textures, TextureId } from './texture'; import { createReferenceCache, ReferenceCache } from 'mol-util/reference-cache'; import { idFactory } from 'mol-util/id-factory'; @@ -21,8 +22,6 @@ export interface Program { use: () => void setUniforms: (uniformValues: UniformValues) => void - setUniformBuffers: (uniformBuffers: UniformBuffers, uniformValues: UniformValues) => void - bindUniformBuffers: (/* uniformBuffers: UniformBuffers */) => void bindAttributes: (attribueBuffers: AttributeBuffers) => void bindTextures: (textures: Textures) => void @@ -79,32 +78,6 @@ export function createProgram(ctx: WebGLContext, props: ProgramProps): Program { const locations = getLocations(ctx, program, schema) const uniformSetters = getUniformSetters(schema) - interface UniformBufferInfo { - blockIndex: number, - blockSize: number, - uniformIndices: number[], - uniformOffsets: number[] - } - function getUniformBufferInfo(gl: WebGL2RenderingContext, program: WebGLProgram, name: string, uniformNames: string[]): UniformBufferInfo { - const blockIndex = gl.getUniformBlockIndex(program, name) - const blockSize = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE) - const uniformIndices = gl.getUniformIndices(program, uniformNames) - if (uniformIndices === null) throw new Error(`Could not get uniform indices`) - const uniformOffsets = gl.getActiveUniforms(program, uniformIndices, gl.UNIFORM_OFFSET) - return { blockIndex, blockSize, uniformIndices, uniformOffsets } - } - - const uniformBufferInfos: { [k: string]: UniformBufferInfo } = { - 'Common': getUniformBufferInfo(gl as WebGL2RenderingContext, program, 'Common', [ - 'Common.uProjection', 'Common.uObjectId', 'Common.uInstanceCount' - ]) - } - console.log(uniformBufferInfos) - - const uniformBuffers: UniformBuffers = { - 'Common': createUniformBuffer(ctx, new Float32Array(uniformBufferInfos['Common'].blockSize)) - } - let destroyed = false return { @@ -124,23 +97,6 @@ export function createProgram(ctx: WebGLContext, props: ProgramProps): Program { if (v) uniformSetters[k](gl, l, v.ref.value) } }, - setUniformBuffers: (uniformBuffers: UniformBuffers, uniformValues: UniformValues) => { - const uniformBufferKeys = Object.keys(uniformBuffers) - for (let i = 0, il = uniformBufferKeys.length; i < il; ++i) { - // const k = uniformBufferKeys[i] - // const info = uniformBufferInfos[k] - // uniformBuffers[k].updateData() - } - }, - bindUniformBuffers: (/* uniformBuffers: UniformBuffers */) => { - const uniformBufferKeys = Object.keys(uniformBuffers) - for (let i = 0, il = uniformBufferKeys.length; i < il; ++i) { - const k = uniformBufferKeys[i] - const info = uniformBufferInfos[k] - uniformBuffers[k].bind(i) - ;(gl as WebGL2RenderingContext).uniformBlockBinding(program, info.blockIndex, i) - } - }, bindAttributes: (attribueBuffers: AttributeBuffers) => { const attributeKeys = Object.keys(attribueBuffers) for (let i = 0, il = attributeKeys.length; i < il; ++i) { @@ -155,6 +111,8 @@ export function createProgram(ctx: WebGLContext, props: ProgramProps): Program { const k = textureKeys[i] const l = locations[k] textures[k].bind(i as TextureId) + // TODO if the order and count of textures in a material can be made invariant + // this needs to be set only when the material changes uniformSetters[k](gl, l, i as TextureId) } }, diff --git a/src/mol-gl/webgl/render-item.ts b/src/mol-gl/webgl/render-item.ts index 6e522bd1b3f254b92ed5cdb361e9321989509a8d..6809b6c3c5f7427eb4dd204258e6fb6d05537964 100644 --- a/src/mol-gl/webgl/render-item.ts +++ b/src/mol-gl/webgl/render-item.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ @@ -58,7 +58,7 @@ interface ValueChanges { defines: boolean elements: boolean textures: boolean - uniforms: boolean + // uniforms: boolean } function createValueChanges() { return { @@ -66,7 +66,6 @@ function createValueChanges() { defines: false, elements: false, textures: false, - uniforms: false, } } function resetValueChanges(valueChanges: ValueChanges) { @@ -74,7 +73,6 @@ function resetValueChanges(valueChanges: ValueChanges) { valueChanges.defines = false valueChanges.elements = false valueChanges.textures = false - valueChanges.uniforms = false } // TODO make `RenderVariantDefines` a parameter for `createRenderItem` @@ -84,12 +82,12 @@ function resetValueChanges(valueChanges: ValueChanges) { * * - assumes that `values.drawCount` and `values.instanceCount` exist */ -export function createRenderItem(ctx: WebGLContext, drawMode: DrawMode, shaderCode: ShaderCode, schema: RenderableSchema, values: RenderableValues): RenderItem { +export function createRenderItem(ctx: WebGLContext, drawMode: DrawMode, shaderCode: ShaderCode, schema: RenderableSchema, values: RenderableValues, materialId: number): RenderItem { const id = getNextRenderItemId() const { programCache } = ctx const { instancedArrays, vertexArrayObject } = ctx.extensions - const { attributeValues, defineValues, textureValues, uniformValues } = splitValues(schema, values) + const { attributeValues, defineValues, textureValues, uniformValues, materialUniformValues } = splitValues(schema, values) const { attributeKeys, defineKeys, textureKeys } = splitKeys(schema) const versions = getValueVersions(values) @@ -139,7 +137,12 @@ export function createRenderItem(ctx: WebGLContext, drawMode: DrawMode, shaderCo const program = programs[variant].value const vertexArray = vertexArrays[variant] program.setUniforms(uniformValues) - program.bindUniformBuffers() + if (materialId === -1 || materialId !== ctx.currentMaterialId) { + // console.log('materialId changed or -1', materialId) + program.setUniforms(materialUniformValues) + ctx.currentMaterialId = materialId + } + program.bindTextures(textures) if (vertexArrayObject && vertexArray) { vertexArrayObject.bindVertexArray(vertexArray) // need to bind elements buffer explicitly since it is not always recorded in the VAO @@ -148,7 +151,6 @@ export function createRenderItem(ctx: WebGLContext, drawMode: DrawMode, shaderCo if (elementsBuffer) elementsBuffer.bind() program.bindAttributes(attributeBuffers) } - program.bindTextures(textures) if (elementsBuffer) { instancedArrays.drawElementsInstanced(glDrawMode, drawCount, elementsBuffer._dataType, 0, instanceCount); } else { diff --git a/src/mol-gl/webgl/uniform.ts b/src/mol-gl/webgl/uniform.ts index 2a416c57875fc947f9b66eb18d07c4ad52a7b44c..a979a64fee9228f01f052d39aa94f067a2289807 100644 --- a/src/mol-gl/webgl/uniform.ts +++ b/src/mol-gl/webgl/uniform.ts @@ -8,7 +8,6 @@ import { Mat3, Mat4, Vec2, Vec3, Vec4 } from 'mol-math/linear-algebra' import { ValueCell } from 'mol-util'; import { GLRenderingContext } from './compat'; import { RenderableSchema } from 'mol-gl/renderable/schema'; -import { WebGLContext } from './context'; export type UniformKindValue = { 'f': number @@ -73,18 +72,4 @@ export function getUniformSetters(schema: RenderableSchema) { } }) return setters -} - -// - -export interface UniformBlock { - update(): void - bind(): void -} - -export function createUniformBlock(ctx: WebGLContext, ) { - - return { - - } } \ No newline at end of file diff --git a/src/mol-math/geometry/gaussian-density/gpu.ts b/src/mol-math/geometry/gaussian-density/gpu.ts index 2f91bcd1af1f8228fc22c7979abb0a1493b63a13..2a361c5ae427e06737ed9ff7901ed97aa20e4753 100644 --- a/src/mol-math/geometry/gaussian-density/gpu.ts +++ b/src/mol-math/geometry/gaussian-density/gpu.ts @@ -237,7 +237,7 @@ function getGaussianDensityRenderObject(webgl: WebGLContext, drawCount: number, opaque: true } - const renderObject = createRenderObject('gaussian-density', values, state) + const renderObject = createRenderObject('gaussian-density', values, state, -1) return renderObject } diff --git a/src/mol-model-props/rcsb/representations/assembly-symmetry-axes.ts b/src/mol-model-props/rcsb/representations/assembly-symmetry-axes.ts index 09abfebeb49ec7b35be09744fa09ef1c202cbc30..1ba6eb9512c43ac603fcbe19d9679a079a684979 100644 --- a/src/mol-model-props/rcsb/representations/assembly-symmetry-axes.ts +++ b/src/mol-model-props/rcsb/representations/assembly-symmetry-axes.ts @@ -59,7 +59,7 @@ export const AssemblySymmetryAxesRepresentationProvider: StructureRepresentation // -export function AssemblySymmetryAxesVisual(): ComplexVisual<AssemblySymmetryAxesParams> { +export function AssemblySymmetryAxesVisual(materialId: number): ComplexVisual<AssemblySymmetryAxesParams> { return ComplexMeshVisual<AssemblySymmetryAxesParams>({ defaultProps: PD.getDefaultValues(AssemblySymmetryAxesParams), createGeometry: createAssemblySymmetryAxesMesh, @@ -73,7 +73,7 @@ export function AssemblySymmetryAxesVisual(): ComplexVisual<AssemblySymmetryAxes newProps.symmetryId !== currentProps.symmetryId ) } - }) + }, materialId) } function createLocationIterator(structure: Structure) { diff --git a/src/mol-repr/shape/representation.ts b/src/mol-repr/shape/representation.ts index ebd0f7afcd791e1cb62c1a482beac1c677212c31..c9d32c61f99ca9a47856e8f6aad9b073601e5942 100644 --- a/src/mol-repr/shape/representation.ts +++ b/src/mol-repr/shape/representation.ts @@ -5,7 +5,7 @@ */ import { Task, RuntimeContext } from 'mol-task' -import { createRenderObject, GraphicsRenderObject } from 'mol-gl/render-object'; +import { createRenderObject, GraphicsRenderObject, getNextMaterialId } from 'mol-gl/render-object'; import { Representation } from '../representation'; import { Loci, EmptyLoci, isEveryLoci } from 'mol-model/loci'; import { ValueCell } from 'mol-util'; @@ -35,6 +35,7 @@ export function ShapeRepresentation<D, G extends Geometry, P extends Geometry.Pa let version = 0 const updated = new Subject<number>() const _state = Representation.createState() + const materialId = getNextMaterialId() const renderObjects: GraphicsRenderObject[] = [] let _renderObject: GraphicsRenderObject | undefined let _shape: Shape<G> @@ -101,7 +102,7 @@ export function ShapeRepresentation<D, G extends Geometry, P extends Geometry.Pa const values = geometryUtils.createValues(_shape.geometry, transform, locationIt, _theme, newProps) const state = geometryUtils.createRenderableState(newProps) - _renderObject = createRenderObject(_shape.geometry.kind, values, state) + _renderObject = createRenderObject(_shape.geometry.kind, values, state, materialId) if (_renderObject) renderObjects.push(_renderObject) // add new renderObject to list } else { if (!_renderObject) { diff --git a/src/mol-repr/structure/complex-representation.ts b/src/mol-repr/structure/complex-representation.ts index bbb8325859e481f190099c5e212bb79588ce0b95..da59074da1cf8f6c0b2c6978cf93581f1fbcb887 100644 --- a/src/mol-repr/structure/complex-representation.ts +++ b/src/mol-repr/structure/complex-representation.ts @@ -16,11 +16,12 @@ import { RepresentationContext, RepresentationParamsGetter } from 'mol-repr/repr import { Theme, createEmptyTheme } from 'mol-theme/theme'; import { ParamDefinition as PD } from 'mol-util/param-definition'; import { Subject } from 'rxjs'; -import { GraphicsRenderObject } from 'mol-gl/render-object'; +import { GraphicsRenderObject, getNextMaterialId } from 'mol-gl/render-object'; -export function ComplexRepresentation<P extends StructureParams>(label: string, ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, P>, visualCtor: () => ComplexVisual<P>): StructureRepresentation<P> { +export function ComplexRepresentation<P extends StructureParams>(label: string, ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, P>, visualCtor: (materialId: number) => ComplexVisual<P>): StructureRepresentation<P> { let version = 0 const updated = new Subject<number>() + const materialId = getNextMaterialId() const renderObjects: GraphicsRenderObject[] = [] const _state = StructureRepresentationStateBuilder.create() let visual: ComplexVisual<P> | undefined @@ -39,7 +40,7 @@ export function ComplexRepresentation<P extends StructureParams>(label: string, _props = Object.assign({}, _props, props) return Task.create('Creating or updating ComplexRepresentation', async runtime => { - if (!visual) visual = visualCtor() + if (!visual) visual = visualCtor(materialId) const promise = visual.createOrUpdate({ webgl: ctx.webgl, runtime }, _theme, _props, structure) if (promise) await promise // update list of renderObjects diff --git a/src/mol-repr/structure/complex-visual.ts b/src/mol-repr/structure/complex-visual.ts index 7f5407789c126d221f45642205eab9576b0150df..a5cf1607f5897e18e7884dddb1df327f843f0d18 100644 --- a/src/mol-repr/structure/complex-visual.ts +++ b/src/mol-repr/structure/complex-visual.ts @@ -32,12 +32,12 @@ import { Overpaint } from 'mol-theme/overpaint'; export interface ComplexVisual<P extends StructureParams> extends Visual<Structure, P> { } -function createComplexRenderObject<G extends Geometry>(structure: Structure, geometry: G, locationIt: LocationIterator, theme: Theme, props: PD.Values<Geometry.Params<G>>) { +function createComplexRenderObject<G extends Geometry>(structure: Structure, geometry: G, locationIt: LocationIterator, theme: Theme, props: PD.Values<Geometry.Params<G>>, materialId: number) { const { createValues, createRenderableState } = Geometry.getUtils(geometry) const transform = createIdentityTransform() const values = createValues(geometry, transform, locationIt, theme, props) const state = createRenderableState(props) - return createRenderObject(geometry.kind, values, state) + return createRenderObject(geometry.kind, values, state, materialId) } const ComplexParams = { @@ -59,7 +59,7 @@ interface ComplexVisualGeometryBuilder<P extends UnitsParams, G extends Geometry geometryUtils: GeometryUtils<G> } -export function ComplexVisual<G extends Geometry, P extends ComplexParams & Geometry.Params<G>>(builder: ComplexVisualGeometryBuilder<P, G>): ComplexVisual<P> { +export function ComplexVisual<G extends Geometry, P extends ComplexParams & Geometry.Params<G>>(builder: ComplexVisualGeometryBuilder<P, G>, materialId: number): ComplexVisual<P> { const { defaultProps, createGeometry, createLocationIterator, getLoci, eachLocation, setUpdateState } = builder const { updateValues, updateBoundingSphere, updateRenderableState } = builder.geometryUtils const updateState = VisualUpdateState.create() @@ -117,7 +117,7 @@ export function ComplexVisual<G extends Geometry, P extends ComplexParams & Geom if (updateState.createNew) { locationIt = createLocationIterator(newStructure) if (newGeometry) { - renderObject = createComplexRenderObject(newStructure, newGeometry, locationIt, newTheme, newProps) + renderObject = createComplexRenderObject(newStructure, newGeometry, locationIt, newTheme, newProps, materialId) } else { throw new Error('expected geometry to be given') } @@ -216,7 +216,7 @@ export type ComplexMeshParams = typeof ComplexMeshParams export interface ComplexMeshVisualBuilder<P extends ComplexMeshParams> extends ComplexVisualBuilder<P, Mesh> { } -export function ComplexMeshVisual<P extends ComplexMeshParams>(builder: ComplexMeshVisualBuilder<P>): ComplexVisual<P> { +export function ComplexMeshVisual<P extends ComplexMeshParams>(builder: ComplexMeshVisualBuilder<P>, materialId: number): ComplexVisual<P> { return ComplexVisual<Mesh, StructureMeshParams & UnitsParams>({ ...builder, setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme) => { @@ -224,7 +224,7 @@ export function ComplexMeshVisual<P extends ComplexMeshParams>(builder: ComplexM if (!SizeTheme.areEqual(newTheme.size, currentTheme.size)) state.createGeometry = true }, geometryUtils: Mesh.Utils - }) + }, materialId) } // direct-volume @@ -237,7 +237,7 @@ export type ComplexDirectVolumeParams = typeof ComplexDirectVolumeParams export interface ComplexDirectVolumeVisualBuilder<P extends ComplexDirectVolumeParams> extends ComplexVisualBuilder<P, DirectVolume> { } -export function ComplexDirectVolumeVisual<P extends ComplexDirectVolumeParams>(builder: ComplexDirectVolumeVisualBuilder<P>): ComplexVisual<P> { +export function ComplexDirectVolumeVisual<P extends ComplexDirectVolumeParams>(builder: ComplexDirectVolumeVisualBuilder<P>, materialId: number): ComplexVisual<P> { return ComplexVisual<DirectVolume, StructureDirectVolumeParams & UnitsParams>({ ...builder, setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme) => { @@ -245,5 +245,5 @@ export function ComplexDirectVolumeVisual<P extends ComplexDirectVolumeParams>(b if (!SizeTheme.areEqual(newTheme.size, currentTheme.size)) state.createGeometry = true }, geometryUtils: DirectVolume.Utils - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/units-representation.ts b/src/mol-repr/structure/units-representation.ts index 92e0c6e28cb1581a2aa9843a2eb2921898ebaa19..8985cb7750405864cae3d68ab9f7d158380c6c3c 100644 --- a/src/mol-repr/structure/units-representation.ts +++ b/src/mol-repr/structure/units-representation.ts @@ -7,7 +7,7 @@ import { Structure, Unit } from 'mol-model/structure'; import { Task } from 'mol-task' -import { GraphicsRenderObject } from 'mol-gl/render-object'; +import { GraphicsRenderObject, getNextMaterialId } from 'mol-gl/render-object'; import { RepresentationContext, RepresentationParamsGetter } from '../representation'; import { Visual } from '../visual'; import { Loci, EmptyLoci, isEmptyLoci } from 'mol-model/loci'; @@ -28,9 +28,10 @@ export type UnitsParams = typeof UnitsParams export interface UnitsVisual<P extends UnitsParams> extends Visual<StructureGroup, P> { } -export function UnitsRepresentation<P extends UnitsParams>(label: string, ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, P>, visualCtor: () => UnitsVisual<P>): StructureRepresentation<P> { +export function UnitsRepresentation<P extends UnitsParams>(label: string, ctx: RepresentationContext, getParams: RepresentationParamsGetter<Structure, P>, visualCtor: (materialId: number) => UnitsVisual<P>): StructureRepresentation<P> { let version = 0 const updated = new Subject<number>() + const materialId = getNextMaterialId() const renderObjects: GraphicsRenderObject[] = [] const _state = StructureRepresentationStateBuilder.create() let visuals = new Map<number, { group: Unit.SymmetryGroup, visual: UnitsVisual<P> }>() @@ -57,7 +58,7 @@ export function UnitsRepresentation<P extends UnitsParams>(label: string, ctx: R _groups = structure.unitSymmetryGroups; for (let i = 0; i < _groups.length; i++) { const group = _groups[i]; - const visual = visualCtor() + const visual = visualCtor(materialId) const promise = visual.createOrUpdate({ webgl: ctx.webgl, runtime }, _theme, _props, { group, structure }) if (promise) await promise visuals.set(group.hashCode, { visual, group }) @@ -86,7 +87,7 @@ export function UnitsRepresentation<P extends UnitsParams>(label: string, ctx: R } else { // console.log(label, 'not found visualGroup to reuse, creating new') // newGroups.push(group) - const visual = visualCtor() + const visual = visualCtor(materialId) const promise = visual.createOrUpdate({ webgl: ctx.webgl, runtime }, _theme, _props, { group, structure }) if (promise) await promise visuals.set(group.hashCode, { visual, group }) diff --git a/src/mol-repr/structure/units-visual.ts b/src/mol-repr/structure/units-visual.ts index 4f3c5bf22635d6cd2a7c1a1f09d8d7e5059241f9..e8d4ed6a8bbade55e1bbad733862e9caf3e083f0 100644 --- a/src/mol-repr/structure/units-visual.ts +++ b/src/mol-repr/structure/units-visual.ts @@ -37,12 +37,12 @@ export type StructureGroup = { structure: Structure, group: Unit.SymmetryGroup } export interface UnitsVisual<P extends RepresentationProps = {}> extends Visual<StructureGroup, P> { } -function createUnitsRenderObject<G extends Geometry>(group: Unit.SymmetryGroup, geometry: G, locationIt: LocationIterator, theme: Theme, props: PD.Values<Geometry.Params<G>>) { +function createUnitsRenderObject<G extends Geometry>(group: Unit.SymmetryGroup, geometry: G, locationIt: LocationIterator, theme: Theme, props: PD.Values<Geometry.Params<G>>, materialId: number) { const { createValues, createRenderableState } = Geometry.getUtils(geometry) const transform = createUnitsTransform(group) const values = createValues(geometry, transform, locationIt, theme, props) const state = createRenderableState(props) - return createRenderObject(geometry.kind, values, state) + return createRenderObject(geometry.kind, values, state, materialId) } interface UnitsVisualBuilder<P extends UnitsParams, G extends Geometry> { @@ -58,7 +58,7 @@ interface UnitsVisualGeometryBuilder<P extends UnitsParams, G extends Geometry> geometryUtils: GeometryUtils<G> } -export function UnitsVisual<G extends Geometry, P extends UnitsParams & Geometry.Params<G>>(builder: UnitsVisualGeometryBuilder<P, G>): UnitsVisual<P> { +export function UnitsVisual<G extends Geometry, P extends UnitsParams & Geometry.Params<G>>(builder: UnitsVisualGeometryBuilder<P, G>, materialId: number): UnitsVisual<P> { const { defaultProps, createGeometry, createLocationIterator, getLoci, eachLocation, setUpdateState } = builder const { createEmpty: createEmptyGeometry, updateValues, updateBoundingSphere, updateRenderableState } = builder.geometryUtils const updateState = VisualUpdateState.create() @@ -140,7 +140,7 @@ export function UnitsVisual<G extends Geometry, P extends UnitsParams & Geometry if (updateState.createNew) { locationIt = createLocationIterator(newStructureGroup.group) if (newGeometry) { - renderObject = createUnitsRenderObject(newStructureGroup.group, newGeometry, locationIt, newTheme, newProps) + renderObject = createUnitsRenderObject(newStructureGroup.group, newGeometry, locationIt, newTheme, newProps, materialId) } else { throw new Error('expected geometry to be given') } @@ -258,7 +258,7 @@ export const UnitsMeshParams = { ...StructureMeshParams, ...UnitsParams } export type UnitsMeshParams = typeof UnitsMeshParams export interface UnitsMeshVisualBuilder<P extends UnitsMeshParams> extends UnitsVisualBuilder<P, Mesh> { } -export function UnitsMeshVisual<P extends UnitsMeshParams>(builder: UnitsMeshVisualBuilder<P>): UnitsVisual<P> { +export function UnitsMeshVisual<P extends UnitsMeshParams>(builder: UnitsMeshVisualBuilder<P>, materialId: number): UnitsVisual<P> { return UnitsVisual<Mesh, StructureMeshParams & UnitsParams>({ ...builder, setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme) => { @@ -266,7 +266,7 @@ export function UnitsMeshVisual<P extends UnitsMeshParams>(builder: UnitsMeshVis if (!SizeTheme.areEqual(newTheme.size, currentTheme.size)) state.createGeometry = true }, geometryUtils: Mesh.Utils - }) + }, materialId) } // spheres @@ -275,7 +275,7 @@ export const UnitsSpheresParams = { ...StructureSpheresParams, ...UnitsParams } export type UnitsSpheresParams = typeof UnitsSpheresParams export interface UnitsSpheresVisualBuilder<P extends UnitsSpheresParams> extends UnitsVisualBuilder<P, Spheres> { } -export function UnitsSpheresVisual<P extends UnitsSpheresParams>(builder: UnitsSpheresVisualBuilder<P>): UnitsVisual<P> { +export function UnitsSpheresVisual<P extends UnitsSpheresParams>(builder: UnitsSpheresVisualBuilder<P>, materialId: number): UnitsVisual<P> { return UnitsVisual<Spheres, StructureSpheresParams & UnitsParams>({ ...builder, setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme) => { @@ -283,7 +283,7 @@ export function UnitsSpheresVisual<P extends UnitsSpheresParams>(builder: UnitsS if (!SizeTheme.areEqual(newTheme.size, currentTheme.size)) state.updateSize = true }, geometryUtils: Spheres.Utils - }) + }, materialId) } // points @@ -292,7 +292,7 @@ export const UnitsPointsParams = { ...StructurePointsParams, ...UnitsParams } export type UnitsPointsParams = typeof UnitsPointsParams export interface UnitsPointVisualBuilder<P extends UnitsPointsParams> extends UnitsVisualBuilder<P, Points> { } -export function UnitsPointsVisual<P extends UnitsPointsParams>(builder: UnitsPointVisualBuilder<P>): UnitsVisual<P> { +export function UnitsPointsVisual<P extends UnitsPointsParams>(builder: UnitsPointVisualBuilder<P>, materialId: number): UnitsVisual<P> { return UnitsVisual<Points, StructurePointsParams & UnitsParams>({ ...builder, setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme) => { @@ -300,7 +300,7 @@ export function UnitsPointsVisual<P extends UnitsPointsParams>(builder: UnitsPoi if (!SizeTheme.areEqual(newTheme.size, currentTheme.size)) state.updateSize = true }, geometryUtils: Points.Utils - }) + }, materialId) } // lines @@ -309,7 +309,7 @@ export const UnitsLinesParams = { ...StructureLinesParams, ...UnitsParams } export type UnitsLinesParams = typeof UnitsLinesParams export interface UnitsLinesVisualBuilder<P extends UnitsLinesParams> extends UnitsVisualBuilder<P, Lines> { } -export function UnitsLinesVisual<P extends UnitsLinesParams>(builder: UnitsLinesVisualBuilder<P>): UnitsVisual<P> { +export function UnitsLinesVisual<P extends UnitsLinesParams>(builder: UnitsLinesVisualBuilder<P>, materialId: number): UnitsVisual<P> { return UnitsVisual<Lines, StructureLinesParams & UnitsParams>({ ...builder, setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme) => { @@ -317,7 +317,7 @@ export function UnitsLinesVisual<P extends UnitsLinesParams>(builder: UnitsLines if (!SizeTheme.areEqual(newTheme.size, currentTheme.size)) state.updateSize = true }, geometryUtils: Lines.Utils - }) + }, materialId) } // direct-volume @@ -326,7 +326,7 @@ export const UnitsDirectVolumeParams = { ...StructureDirectVolumeParams, ...Unit export type UnitsDirectVolumeParams = typeof UnitsDirectVolumeParams export interface UnitsDirectVolumeVisualBuilder<P extends UnitsDirectVolumeParams> extends UnitsVisualGeometryBuilder<P, DirectVolume> { } -export function UnitsDirectVolumeVisual<P extends UnitsDirectVolumeParams>(builder: UnitsDirectVolumeVisualBuilder<P>): UnitsVisual<P> { +export function UnitsDirectVolumeVisual<P extends UnitsDirectVolumeParams>(builder: UnitsDirectVolumeVisualBuilder<P>, materialId: number): UnitsVisual<P> { return UnitsVisual<DirectVolume, StructureDirectVolumeParams & UnitsParams>({ ...builder, setUpdateState: (state: VisualUpdateState, newProps: PD.Values<P>, currentProps: PD.Values<P>, newTheme: Theme, currentTheme: Theme) => { @@ -334,5 +334,5 @@ export function UnitsDirectVolumeVisual<P extends UnitsDirectVolumeParams>(build if (!SizeTheme.areEqual(newTheme.size, currentTheme.size)) state.createGeometry = true }, geometryUtils: DirectVolume.Utils - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/carbohydrate-link-cylinder.ts b/src/mol-repr/structure/visual/carbohydrate-link-cylinder.ts index c699d7464aecdc28c8c48e764db74c516e48d872..73cd6fe643016d4532dae2938660a55d23956009 100644 --- a/src/mol-repr/structure/visual/carbohydrate-link-cylinder.ts +++ b/src/mol-repr/structure/visual/carbohydrate-link-cylinder.ts @@ -55,7 +55,7 @@ export const CarbohydrateLinkParams = { } export type CarbohydrateLinkParams = typeof CarbohydrateLinkParams -export function CarbohydrateLinkVisual(): ComplexVisual<CarbohydrateLinkParams> { +export function CarbohydrateLinkVisual(materialId: number): ComplexVisual<CarbohydrateLinkParams> { return ComplexMeshVisual<CarbohydrateLinkParams>({ defaultProps: PD.getDefaultValues(CarbohydrateLinkParams), createGeometry: createCarbohydrateLinkCylinderMesh, @@ -68,7 +68,7 @@ export function CarbohydrateLinkVisual(): ComplexVisual<CarbohydrateLinkParams> newProps.radialSegments !== currentProps.radialSegments ) } - }) + }, materialId) } function CarbohydrateLinkIterator(structure: Structure): LocationIterator { diff --git a/src/mol-repr/structure/visual/carbohydrate-symbol-mesh.ts b/src/mol-repr/structure/visual/carbohydrate-symbol-mesh.ts index bc4e4ad6f71267d9e7599562be026c6324863535..c1c2b046f1d908e78c76dd2a27e102733a026ecd 100644 --- a/src/mol-repr/structure/visual/carbohydrate-symbol-mesh.ts +++ b/src/mol-repr/structure/visual/carbohydrate-symbol-mesh.ts @@ -148,7 +148,7 @@ export const CarbohydrateSymbolParams = { } export type CarbohydrateSymbolParams = typeof CarbohydrateSymbolParams -export function CarbohydrateSymbolVisual(): ComplexVisual<CarbohydrateSymbolParams> { +export function CarbohydrateSymbolVisual(materialId: number): ComplexVisual<CarbohydrateSymbolParams> { return ComplexMeshVisual<CarbohydrateSymbolParams>({ defaultProps: PD.getDefaultValues(CarbohydrateSymbolParams), createGeometry: createCarbohydrateSymbolMesh, @@ -161,7 +161,7 @@ export function CarbohydrateSymbolVisual(): ComplexVisual<CarbohydrateSymbolPara newProps.detail !== currentProps.detail ) } - }) + }, materialId) } function CarbohydrateElementIterator(structure: Structure): LocationIterator { diff --git a/src/mol-repr/structure/visual/carbohydrate-terminal-link-cylinder.ts b/src/mol-repr/structure/visual/carbohydrate-terminal-link-cylinder.ts index d78b03bd16a475cbfc7aa617f9d77a27104ef1d9..7a3d4e35a5274199d73aa36877da4172a214b866 100644 --- a/src/mol-repr/structure/visual/carbohydrate-terminal-link-cylinder.ts +++ b/src/mol-repr/structure/visual/carbohydrate-terminal-link-cylinder.ts @@ -65,7 +65,7 @@ export const CarbohydrateTerminalLinkParams = { } export type CarbohydrateTerminalLinkParams = typeof CarbohydrateTerminalLinkParams -export function CarbohydrateTerminalLinkVisual(): ComplexVisual<CarbohydrateTerminalLinkParams> { +export function CarbohydrateTerminalLinkVisual(materialId: number): ComplexVisual<CarbohydrateTerminalLinkParams> { return ComplexMeshVisual<CarbohydrateTerminalLinkParams>({ defaultProps: PD.getDefaultValues(CarbohydrateTerminalLinkParams), createGeometry: createCarbohydrateTerminalLinkCylinderMesh, @@ -78,7 +78,7 @@ export function CarbohydrateTerminalLinkVisual(): ComplexVisual<CarbohydrateTerm newProps.radialSegments !== currentProps.radialSegments ) } - }) + }, materialId) } function CarbohydrateTerminalLinkIterator(structure: Structure): LocationIterator { diff --git a/src/mol-repr/structure/visual/cross-link-restraint-cylinder.ts b/src/mol-repr/structure/visual/cross-link-restraint-cylinder.ts index 26de0839cfa9744b7ecd4e5e980ec98afc4da141..ccfb6c46ec9e170f9f4867156d1e017e3b7416aa 100644 --- a/src/mol-repr/structure/visual/cross-link-restraint-cylinder.ts +++ b/src/mol-repr/structure/visual/cross-link-restraint-cylinder.ts @@ -58,7 +58,7 @@ export const CrossLinkRestraintParams = { } export type CrossLinkRestraintParams = typeof CrossLinkRestraintParams -export function CrossLinkRestraintVisual(): ComplexVisual<CrossLinkRestraintParams> { +export function CrossLinkRestraintVisual(materialId: number): ComplexVisual<CrossLinkRestraintParams> { return ComplexMeshVisual<CrossLinkRestraintParams>({ defaultProps: PD.getDefaultValues(CrossLinkRestraintParams), createGeometry: createCrossLinkRestraintCylinderMesh, @@ -71,7 +71,7 @@ export function CrossLinkRestraintVisual(): ComplexVisual<CrossLinkRestraintPara newProps.radialSegments !== currentProps.radialSegments ) } - }) + }, materialId) } function CrossLinkRestraintIterator(structure: Structure): LocationIterator { diff --git a/src/mol-repr/structure/visual/element-point.ts b/src/mol-repr/structure/visual/element-point.ts index 64db953cbb4402571c10e3db99a2cf44d8109da8..5292dfa8fb9fd51f34b0cab92788c401fd0a778a 100644 --- a/src/mol-repr/structure/visual/element-point.ts +++ b/src/mol-repr/structure/visual/element-point.ts @@ -42,7 +42,7 @@ export function createElementPoint(ctx: VisualContext, unit: Unit, structure: St return builder.getPoints() } -export function ElementPointVisual(): UnitsVisual<ElementPointParams> { +export function ElementPointVisual(materialId: number): UnitsVisual<ElementPointParams> { return UnitsPointsVisual<ElementPointParams>({ defaultProps: PD.getDefaultValues(ElementPointParams), createGeometry: createElementPoint, @@ -52,5 +52,5 @@ export function ElementPointVisual(): UnitsVisual<ElementPointParams> { setUpdateState: (state: VisualUpdateState, newProps: PD.Values<ElementPointParams>, currentProps: PD.Values<ElementPointParams>) => { } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/element-sphere.ts b/src/mol-repr/structure/visual/element-sphere.ts index afbe90fbb144fe2a3dad2aff1817781fa19df137..6bff3a354f331036e868e6112026cc0b0cd4b616 100644 --- a/src/mol-repr/structure/visual/element-sphere.ts +++ b/src/mol-repr/structure/visual/element-sphere.ts @@ -24,7 +24,7 @@ export function getElementSphereVisual(webgl?: WebGLContext) { return webgl && webgl.extensions.fragDepth ? ElementSphereImpostorVisual : ElementSphereMeshVisual } -export function ElementSphereImpostorVisual(): UnitsVisual<ElementSphereParams> { +export function ElementSphereImpostorVisual(materialId: number): UnitsVisual<ElementSphereParams> { return UnitsSpheresVisual<ElementSphereParams>({ defaultProps: PD.getDefaultValues(ElementSphereParams), createGeometry: createElementSphereImpostor, @@ -34,10 +34,10 @@ export function ElementSphereImpostorVisual(): UnitsVisual<ElementSphereParams> setUpdateState: (state: VisualUpdateState, newProps: PD.Values<ElementSphereParams>, currentProps: PD.Values<ElementSphereParams>) => { } - }) + }, materialId) } -export function ElementSphereMeshVisual(): UnitsVisual<ElementSphereParams> { +export function ElementSphereMeshVisual(materialId: number): UnitsVisual<ElementSphereParams> { return UnitsMeshVisual<ElementSphereParams>({ defaultProps: PD.getDefaultValues(ElementSphereParams), createGeometry: createElementSphereMesh, @@ -50,5 +50,5 @@ export function ElementSphereMeshVisual(): UnitsVisual<ElementSphereParams> { newProps.detail !== currentProps.detail ) } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/gaussian-density-point.ts b/src/mol-repr/structure/visual/gaussian-density-point.ts index beef6aae62dbbf963c6d2b9460309e24664d48d4..f83f431163b9b78283cf2f9d805a3245fe015d7e 100644 --- a/src/mol-repr/structure/visual/gaussian-density-point.ts +++ b/src/mol-repr/structure/visual/gaussian-density-point.ts @@ -55,7 +55,7 @@ export async function createGaussianDensityPoint(ctx: VisualContext, unit: Unit, return builder.getPoints() } -export function GaussianDensityPointVisual(): UnitsVisual<GaussianDensityPointParams> { +export function GaussianDensityPointVisual(materialId: number): UnitsVisual<GaussianDensityPointParams> { return UnitsPointsVisual<GaussianDensityPointParams>({ defaultProps: PD.getDefaultValues(GaussianDensityPointParams), createGeometry: createGaussianDensityPoint, @@ -68,5 +68,5 @@ export function GaussianDensityPointVisual(): UnitsVisual<GaussianDensityPointPa if (newProps.smoothness !== currentProps.smoothness) state.createGeometry = true if (newProps.useGpu !== currentProps.useGpu) state.createGeometry = true } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/gaussian-density-volume.ts b/src/mol-repr/structure/visual/gaussian-density-volume.ts index 7aac5a7b9aafbbe775f4769c0051f77c36e00152..1a1e314eaa5e68217ef4ea2a3c2cbcedcee1b65d 100644 --- a/src/mol-repr/structure/visual/gaussian-density-volume.ts +++ b/src/mol-repr/structure/visual/gaussian-density-volume.ts @@ -34,7 +34,7 @@ export const GaussianDensityVolumeParams = { } export type GaussianDensityVolumeParams = typeof GaussianDensityVolumeParams -export function GaussianDensityVolumeVisual(): ComplexVisual<GaussianDensityVolumeParams> { +export function GaussianDensityVolumeVisual(materialId: number): ComplexVisual<GaussianDensityVolumeParams> { return ComplexDirectVolumeVisual<GaussianDensityVolumeParams>({ defaultProps: PD.getDefaultValues(GaussianDensityVolumeParams), createGeometry: createGaussianDensityVolume, @@ -49,5 +49,5 @@ export function GaussianDensityVolumeVisual(): ComplexVisual<GaussianDensityVolu newProps.isoValueNorm = Math.exp(-newProps.smoothness) } } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/gaussian-surface-mesh.ts b/src/mol-repr/structure/visual/gaussian-surface-mesh.ts index 166252a81a076d7e1ccd496890c2c63496264b8b..b2622071a44b99b20cc5919a52c7e4fac35a6997 100644 --- a/src/mol-repr/structure/visual/gaussian-surface-mesh.ts +++ b/src/mol-repr/structure/visual/gaussian-surface-mesh.ts @@ -40,7 +40,7 @@ export const GaussianSurfaceParams = { } export type GaussianSurfaceParams = typeof GaussianSurfaceParams -export function GaussianSurfaceVisual(): UnitsVisual<GaussianSurfaceParams> { +export function GaussianSurfaceVisual(materialId: number): UnitsVisual<GaussianSurfaceParams> { return UnitsMeshVisual<GaussianSurfaceParams>({ defaultProps: PD.getDefaultValues(GaussianSurfaceParams), createGeometry: createGaussianSurfaceMesh, @@ -53,5 +53,5 @@ export function GaussianSurfaceVisual(): UnitsVisual<GaussianSurfaceParams> { if (newProps.smoothness !== currentProps.smoothness) state.createGeometry = true if (newProps.useGpu !== currentProps.useGpu) state.createGeometry = true } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/gaussian-surface-wireframe.ts b/src/mol-repr/structure/visual/gaussian-surface-wireframe.ts index 5efe3f47bf6395431987a0717b27e6f7d4558b38..834b6fd41612761c1665a620955f1f224d038bca 100644 --- a/src/mol-repr/structure/visual/gaussian-surface-wireframe.ts +++ b/src/mol-repr/structure/visual/gaussian-surface-wireframe.ts @@ -39,7 +39,7 @@ export const GaussianWireframeParams = { } export type GaussianWireframeParams = typeof GaussianWireframeParams -export function GaussianWireframeVisual(): UnitsVisual<GaussianWireframeParams> { +export function GaussianWireframeVisual(materialId: number): UnitsVisual<GaussianWireframeParams> { return UnitsLinesVisual<GaussianWireframeParams>({ defaultProps: PD.getDefaultValues(GaussianWireframeParams), createGeometry: createGaussianWireframe, @@ -52,5 +52,5 @@ export function GaussianWireframeVisual(): UnitsVisual<GaussianWireframeParams> if (newProps.smoothness !== currentProps.smoothness) state.createGeometry = true if (newProps.useGpu !== currentProps.useGpu) state.createGeometry = true } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/inter-unit-link-cylinder.ts b/src/mol-repr/structure/visual/inter-unit-link-cylinder.ts index fa55745425b88e8b15149d9d2e83ee4af92e5377..90999a7f28ddfe8e4ff180e5f234ef69b30ee866 100644 --- a/src/mol-repr/structure/visual/inter-unit-link-cylinder.ts +++ b/src/mol-repr/structure/visual/inter-unit-link-cylinder.ts @@ -58,7 +58,7 @@ export const InterUnitLinkParams = { } export type InterUnitLinkParams = typeof InterUnitLinkParams -export function InterUnitLinkVisual(): ComplexVisual<InterUnitLinkParams> { +export function InterUnitLinkVisual(materialId: number): ComplexVisual<InterUnitLinkParams> { return ComplexMeshVisual<InterUnitLinkParams>({ defaultProps: PD.getDefaultValues(InterUnitLinkParams), createGeometry: createInterUnitLinkCylinderMesh, @@ -74,7 +74,7 @@ export function InterUnitLinkVisual(): ComplexVisual<InterUnitLinkParams> { newProps.linkSpacing !== currentProps.linkSpacing ) } - }) + }, materialId) } function getLinkLoci(pickingId: PickingId, structure: Structure, id: number) { diff --git a/src/mol-repr/structure/visual/intra-unit-link-cylinder.ts b/src/mol-repr/structure/visual/intra-unit-link-cylinder.ts index 9f86c6700696e789bcfd4b4b4895b981facc26bc..7cbe60c189d4455ae3e134abbd682a02a1dd3adc 100644 --- a/src/mol-repr/structure/visual/intra-unit-link-cylinder.ts +++ b/src/mol-repr/structure/visual/intra-unit-link-cylinder.ts @@ -78,7 +78,7 @@ export const IntraUnitLinkParams = { } export type IntraUnitLinkParams = typeof IntraUnitLinkParams -export function IntraUnitLinkVisual(): UnitsVisual<IntraUnitLinkParams> { +export function IntraUnitLinkVisual(materialId: number): UnitsVisual<IntraUnitLinkParams> { return UnitsMeshVisual<IntraUnitLinkParams>({ defaultProps: PD.getDefaultValues(IntraUnitLinkParams), createGeometry: createIntraUnitLinkCylinderMesh, @@ -94,7 +94,7 @@ export function IntraUnitLinkVisual(): UnitsVisual<IntraUnitLinkParams> { newProps.linkSpacing !== currentProps.linkSpacing ) } - }) + }, materialId) } function getLinkLoci(pickingId: PickingId, structureGroup: StructureGroup, id: number) { diff --git a/src/mol-repr/structure/visual/nucleotide-block-mesh.ts b/src/mol-repr/structure/visual/nucleotide-block-mesh.ts index 78fa5aa2f974b63e88cac56235da5aa3a09a66d4..f23f1424ef64516424b4be5826a2a8f8f0df7232 100644 --- a/src/mol-repr/structure/visual/nucleotide-block-mesh.ts +++ b/src/mol-repr/structure/visual/nucleotide-block-mesh.ts @@ -128,7 +128,7 @@ export const NucleotideBlockParams = { } export type NucleotideBlockParams = typeof NucleotideBlockParams -export function NucleotideBlockVisual(): UnitsVisual<NucleotideBlockParams> { +export function NucleotideBlockVisual(materialId: number): UnitsVisual<NucleotideBlockParams> { return UnitsMeshVisual<NucleotideBlockParams>({ defaultProps: PD.getDefaultValues(NucleotideBlockParams), createGeometry: createNucleotideBlockMesh, @@ -141,5 +141,5 @@ export function NucleotideBlockVisual(): UnitsVisual<NucleotideBlockParams> { newProps.radialSegments !== currentProps.radialSegments ) } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/nucleotide-ring-mesh.ts b/src/mol-repr/structure/visual/nucleotide-ring-mesh.ts index 6baef02237f105ec1392ceb42465fa160525e571..d3b246d5c68bea5bd3751d12a255f4e225a2616d 100644 --- a/src/mol-repr/structure/visual/nucleotide-ring-mesh.ts +++ b/src/mol-repr/structure/visual/nucleotide-ring-mesh.ts @@ -175,7 +175,7 @@ export const NucleotideRingParams = { } export type NucleotideRingParams = typeof NucleotideRingParams -export function NucleotideRingVisual(): UnitsVisual<NucleotideRingParams> { +export function NucleotideRingVisual(materialId: number): UnitsVisual<NucleotideRingParams> { return UnitsMeshVisual<NucleotideRingParams>({ defaultProps: PD.getDefaultValues(NucleotideRingParams), createGeometry: createNucleotideRingMesh, @@ -188,5 +188,5 @@ export function NucleotideRingVisual(): UnitsVisual<NucleotideRingParams> { newProps.radialSegments !== currentProps.radialSegments ) } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/polymer-backbone-cylinder.ts b/src/mol-repr/structure/visual/polymer-backbone-cylinder.ts index 8584245222c4ebd57889f01f13c254ab3790bf40..ce98d3d40174b412a73abff94212c3789c9c9634 100644 --- a/src/mol-repr/structure/visual/polymer-backbone-cylinder.ts +++ b/src/mol-repr/structure/visual/polymer-backbone-cylinder.ts @@ -67,7 +67,7 @@ export const PolymerBackboneParams = { } export type PolymerBackboneParams = typeof PolymerBackboneParams -export function PolymerBackboneVisual(): UnitsVisual<PolymerBackboneParams> { +export function PolymerBackboneVisual(materialId: number): UnitsVisual<PolymerBackboneParams> { return UnitsMeshVisual<PolymerBackboneParams>({ defaultProps: PD.getDefaultValues(PolymerBackboneParams), createGeometry: createPolymerBackboneCylinderMesh, @@ -81,5 +81,5 @@ export function PolymerBackboneVisual(): UnitsVisual<PolymerBackboneParams> { newProps.radialSegments !== currentProps.radialSegments ) } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/polymer-direction-wedge.ts b/src/mol-repr/structure/visual/polymer-direction-wedge.ts index ab3e037548ced5b766f2c8b630fd14b14697310d..43712a89d45b50cd00ffd9e810b4d11220c31d45 100644 --- a/src/mol-repr/structure/visual/polymer-direction-wedge.ts +++ b/src/mol-repr/structure/visual/polymer-direction-wedge.ts @@ -92,7 +92,7 @@ export const PolymerDirectionParams = { } export type PolymerDirectionParams = typeof PolymerDirectionParams -export function PolymerDirectionVisual(): UnitsVisual<PolymerDirectionParams> { +export function PolymerDirectionVisual(materialId: number): UnitsVisual<PolymerDirectionParams> { return UnitsMeshVisual<PolymerDirectionParams>({ defaultProps: PD.getDefaultValues(PolymerDirectionParams), createGeometry: createPolymerDirectionWedgeMesh, @@ -104,5 +104,5 @@ export function PolymerDirectionVisual(): UnitsVisual<PolymerDirectionParams> { newProps.sizeFactor !== currentProps.sizeFactor ) } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/polymer-gap-cylinder.ts b/src/mol-repr/structure/visual/polymer-gap-cylinder.ts index dc80fba747b4d4de619b47257899b0efc3ec3a14..28dddc9f1eefcede5512fae57dc399d14de9d660 100644 --- a/src/mol-repr/structure/visual/polymer-gap-cylinder.ts +++ b/src/mol-repr/structure/visual/polymer-gap-cylinder.ts @@ -85,7 +85,7 @@ export const PolymerGapParams = { } export type PolymerGapParams = typeof PolymerGapParams -export function PolymerGapVisual(): UnitsVisual<PolymerGapParams> { +export function PolymerGapVisual(materialId: number): UnitsVisual<PolymerGapParams> { return UnitsMeshVisual<PolymerGapParams>({ defaultProps: PD.getDefaultValues(PolymerGapParams), createGeometry: createPolymerGapCylinderMesh, @@ -98,5 +98,5 @@ export function PolymerGapVisual(): UnitsVisual<PolymerGapParams> { newProps.radialSegments !== currentProps.radialSegments ) } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/polymer-trace-mesh.ts b/src/mol-repr/structure/visual/polymer-trace-mesh.ts index dfbd3b6a363862434493f0977d83a5a362ab0b09..9fafb82b81d350f00d38afd0c6a80304d3608d19 100644 --- a/src/mol-repr/structure/visual/polymer-trace-mesh.ts +++ b/src/mol-repr/structure/visual/polymer-trace-mesh.ts @@ -104,7 +104,7 @@ export const PolymerTraceParams = { } export type PolymerTraceParams = typeof PolymerTraceParams -export function PolymerTraceVisual(): UnitsVisual<PolymerTraceParams> { +export function PolymerTraceVisual(materialId: number): UnitsVisual<PolymerTraceParams> { return UnitsMeshVisual<PolymerTraceParams>({ defaultProps: PD.getDefaultValues(PolymerTraceParams), createGeometry: createPolymerTraceMesh, @@ -120,5 +120,5 @@ export function PolymerTraceVisual(): UnitsVisual<PolymerTraceParams> { newProps.arrowFactor !== currentProps.arrowFactor ) } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/structure/visual/polymer-tube-mesh.ts b/src/mol-repr/structure/visual/polymer-tube-mesh.ts index 94accbff631fddd68ac6de7a8b8640d53f64a7d2..8f433bf01a8c4ba16704f1e13601db57148fd33e 100644 --- a/src/mol-repr/structure/visual/polymer-tube-mesh.ts +++ b/src/mol-repr/structure/visual/polymer-tube-mesh.ts @@ -70,7 +70,7 @@ export const PolymerTubeParams = { } export type PolymerTubeParams = typeof PolymerTubeParams -export function PolymerTubeVisual(): UnitsVisual<PolymerTubeParams> { +export function PolymerTubeVisual(materialId: number): UnitsVisual<PolymerTubeParams> { return UnitsMeshVisual<PolymerTubeParams>({ defaultProps: PD.getDefaultValues(PolymerTubeParams), createGeometry: createPolymerTubeMesh, @@ -84,5 +84,5 @@ export function PolymerTubeVisual(): UnitsVisual<PolymerTubeParams> { newProps.radialSegments !== currentProps.radialSegments ) } - }) + }, materialId) } \ No newline at end of file diff --git a/src/mol-repr/volume/direct-volume.ts b/src/mol-repr/volume/direct-volume.ts index 805045ae744120de65151dbd556ee97ad3d20f04..813a030f9899169011e9fa674f953800afa93abb 100644 --- a/src/mol-repr/volume/direct-volume.ts +++ b/src/mol-repr/volume/direct-volume.ts @@ -163,7 +163,7 @@ export function getDirectVolumeParams(ctx: ThemeRegistryContext, volume: VolumeD return PD.clone(DirectVolumeParams) } -export function DirectVolumeVisual(): VolumeVisual<DirectVolumeParams> { +export function DirectVolumeVisual(materialId: number): VolumeVisual<DirectVolumeParams> { return VolumeVisual<DirectVolume, DirectVolumeParams>({ defaultProps: PD.getDefaultValues(DirectVolumeParams), createGeometry: createDirectVolume, @@ -173,7 +173,7 @@ export function DirectVolumeVisual(): VolumeVisual<DirectVolumeParams> { setUpdateState: (state: VisualUpdateState, volume: VolumeData, newProps: PD.Values<DirectVolumeParams>, currentProps: PD.Values<DirectVolumeParams>) => { }, geometryUtils: DirectVolume.Utils - }) + }, materialId) } export function DirectVolumeRepresentation(ctx: RepresentationContext, getParams: RepresentationParamsGetter<VolumeData, DirectVolumeParams>): VolumeRepresentation<DirectVolumeParams> { diff --git a/src/mol-repr/volume/isosurface.ts b/src/mol-repr/volume/isosurface.ts index b29c7afe5970b0898958696bda5c23590a15f924..364e3c42e4afdeac974c990881cff75732d03c3d 100644 --- a/src/mol-repr/volume/isosurface.ts +++ b/src/mol-repr/volume/isosurface.ts @@ -89,7 +89,7 @@ export const IsosurfaceMeshParams = { } export type IsosurfaceMeshParams = typeof IsosurfaceMeshParams -export function IsosurfaceMeshVisual(): VolumeVisual<IsosurfaceMeshParams> { +export function IsosurfaceMeshVisual(materialId: number): VolumeVisual<IsosurfaceMeshParams> { return VolumeVisual<Mesh, IsosurfaceMeshParams>({ defaultProps: PD.getDefaultValues(IsosurfaceMeshParams), createGeometry: createVolumeIsosurfaceMesh, @@ -100,7 +100,7 @@ export function IsosurfaceMeshVisual(): VolumeVisual<IsosurfaceMeshParams> { if (!VolumeIsoValue.areSame(newProps.isoValue, currentProps.isoValue, volume.dataStats)) state.createGeometry = true }, geometryUtils: Mesh.Utils - }) + }, materialId) } // @@ -125,7 +125,7 @@ export const IsosurfaceWireframeParams = { } export type IsosurfaceWireframeParams = typeof IsosurfaceWireframeParams -export function IsosurfaceWireframeVisual(): VolumeVisual<IsosurfaceWireframeParams> { +export function IsosurfaceWireframeVisual(materialId: number): VolumeVisual<IsosurfaceWireframeParams> { return VolumeVisual<Lines, IsosurfaceWireframeParams>({ defaultProps: PD.getDefaultValues(IsosurfaceWireframeParams), createGeometry: createVolumeIsosurfaceWireframe, @@ -136,7 +136,7 @@ export function IsosurfaceWireframeVisual(): VolumeVisual<IsosurfaceWireframePar if (!VolumeIsoValue.areSame(newProps.isoValue, currentProps.isoValue, volume.dataStats)) state.createGeometry = true }, geometryUtils: Lines.Utils - }) + }, materialId) } // diff --git a/src/mol-repr/volume/representation.ts b/src/mol-repr/volume/representation.ts index 9b2472a4cd1a29540f927f8127ba97ffac0db454..13a4b1a0371d7f6a166c4c51c4b0449317194b18 100644 --- a/src/mol-repr/volume/representation.ts +++ b/src/mol-repr/volume/representation.ts @@ -13,7 +13,7 @@ import { Geometry, GeometryUtils } from 'mol-geo/geometry/geometry'; import { ParamDefinition as PD } from 'mol-util/param-definition'; import { PickingId } from 'mol-geo/geometry/picking'; import { MarkerAction } from 'mol-geo/geometry/marker-data'; -import { GraphicsRenderObject, createRenderObject } from 'mol-gl/render-object'; +import { GraphicsRenderObject, createRenderObject, getNextMaterialId } from 'mol-gl/render-object'; import { Interval } from 'mol-data/int'; import { LocationIterator } from 'mol-geo/util/location-iterator'; import { VisualUpdateState } from 'mol-repr/util'; @@ -30,12 +30,12 @@ import { Overpaint } from 'mol-theme/overpaint'; export interface VolumeVisual<P extends VolumeParams> extends Visual<VolumeData, P> { } -function createVolumeRenderObject<G extends Geometry>(volume: VolumeData, geometry: G, locationIt: LocationIterator, theme: Theme, props: PD.Values<Geometry.Params<G>>) { +function createVolumeRenderObject<G extends Geometry>(volume: VolumeData, geometry: G, locationIt: LocationIterator, theme: Theme, props: PD.Values<Geometry.Params<G>>, materialId: number) { const { createValues, createRenderableState } = Geometry.getUtils(geometry) const transform = createIdentityTransform() const values = createValues(geometry, transform, locationIt, theme, props) const state = createRenderableState(props) - return createRenderObject(geometry.kind, values, state) + return createRenderObject(geometry.kind, values, state, materialId) } interface VolumeVisualBuilder<P extends VolumeParams, G extends Geometry> { @@ -51,7 +51,7 @@ interface VolumeVisualGeometryBuilder<P extends VolumeParams, G extends Geometry geometryUtils: GeometryUtils<G> } -export function VolumeVisual<G extends Geometry, P extends VolumeParams & Geometry.Params<G>>(builder: VolumeVisualGeometryBuilder<P, G>): VolumeVisual<P> { +export function VolumeVisual<G extends Geometry, P extends VolumeParams & Geometry.Params<G>>(builder: VolumeVisualGeometryBuilder<P, G>, materialId: number): VolumeVisual<P> { const { defaultProps, createGeometry, createLocationIterator, getLoci, eachLocation, setUpdateState } = builder const { updateValues, updateBoundingSphere, updateRenderableState } = builder.geometryUtils const updateState = VisualUpdateState.create() @@ -104,7 +104,7 @@ export function VolumeVisual<G extends Geometry, P extends VolumeParams & Geomet if (updateState.createNew) { locationIt = createLocationIterator(newVolume) if (newGeometry) { - renderObject = createVolumeRenderObject(newVolume, newGeometry, locationIt, newTheme, newProps) + renderObject = createVolumeRenderObject(newVolume, newGeometry, locationIt, newTheme, newProps, materialId) } else { throw new Error('expected geometry to be given') } @@ -204,9 +204,10 @@ export const VolumeParams = { } export type VolumeParams = typeof VolumeParams -export function VolumeRepresentation<P extends VolumeParams>(label: string, ctx: RepresentationContext, getParams: RepresentationParamsGetter<VolumeData, P>, visualCtor: () => VolumeVisual<P>): VolumeRepresentation<P> { +export function VolumeRepresentation<P extends VolumeParams>(label: string, ctx: RepresentationContext, getParams: RepresentationParamsGetter<VolumeData, P>, visualCtor: (materialId: number) => VolumeVisual<P>): VolumeRepresentation<P> { let version = 0 const updated = new Subject<number>() + const materialId = getNextMaterialId() const renderObjects: GraphicsRenderObject[] = [] const _state = Representation.createState() let visual: VolumeVisual<P> | undefined @@ -225,7 +226,7 @@ export function VolumeRepresentation<P extends VolumeParams>(label: string, ctx: _props = Object.assign({}, _props, props) return Task.create('Creating or updating VolumeRepresentation', async runtime => { - if (!visual) visual = visualCtor() + if (!visual) visual = visualCtor(materialId) const promise = visual.createOrUpdate({ webgl: ctx.webgl, runtime }, _theme, _props, volume) if (promise) await promise // update list of renderObjects diff --git a/src/tests/browser/render-lines.ts b/src/tests/browser/render-lines.ts index 9eeecd9a090d762b12fb75c563488aad41d40da6..40962cea9511bd2940f28dbf733a856028cd1f81 100644 --- a/src/tests/browser/render-lines.ts +++ b/src/tests/browser/render-lines.ts @@ -35,7 +35,7 @@ function linesRepr() { const values = Lines.Utils.createValuesSimple(lines, {}, Color(0xFF0000), 3) const state = Lines.Utils.createRenderableState({}) - const renderObject = createRenderObject('lines', values, state) + const renderObject = createRenderObject('lines', values, state, -1) const repr = Representation.fromRenderObject('cage-lines', renderObject) return repr } diff --git a/src/tests/browser/render-mesh.ts b/src/tests/browser/render-mesh.ts index 4c63a2eb90fbef2500adcdcfea766fc5d045e153..13d752b7d66c0c6fd45fa42cba6be670c3c57646 100644 --- a/src/tests/browser/render-mesh.ts +++ b/src/tests/browser/render-mesh.ts @@ -29,7 +29,7 @@ canvas3d.animate() function meshRepr() { const builderState = MeshBuilder.createState() - + const t = Mat4.identity() MeshBuilder.addCage(builderState, t, HexagonalPrismCage(), 0.005, 2) @@ -41,7 +41,7 @@ function meshRepr() { const values = Mesh.Utils.createValuesSimple(mesh, {}, Color(0xFF0000), 1) const state = Mesh.Utils.createRenderableState({}) - const renderObject = createRenderObject('mesh', values, state) + const renderObject = createRenderObject('mesh', values, state, -1) const repr = Representation.fromRenderObject('mesh', renderObject) return repr } diff --git a/src/tests/browser/render-spheres.ts b/src/tests/browser/render-spheres.ts index d17e32eb5250a57ee4376f759b57c7d22a96af77..c933d27819eb94058201acaee3b175be2f4f1a84 100644 --- a/src/tests/browser/render-spheres.ts +++ b/src/tests/browser/render-spheres.ts @@ -33,7 +33,7 @@ function spheresRepr() { const values = Spheres.Utils.createValuesSimple(spheres, {}, Color(0xFF0000), 1) const state = Spheres.Utils.createRenderableState({}) - const renderObject = createRenderObject('spheres', values, state) + const renderObject = createRenderObject('spheres', values, state, -1) console.log(renderObject) const repr = Representation.fromRenderObject('spheres', renderObject) return repr diff --git a/src/tests/browser/render-structure.ts b/src/tests/browser/render-structure.ts index 9dae8a78c7380888fce1cf4db1a64259745cba21..53ee0a2de8b8b8352102a9535679aebba5b867a5 100644 --- a/src/tests/browser/render-structure.ts +++ b/src/tests/browser/render-structure.ts @@ -66,8 +66,8 @@ async function init() { const models = await getModels(cif) console.time('computeModelDSSP') const secondaryStructure = computeModelDSSP(models[0].atomicHierarchy, models[0].atomicConformation) - console.timeEnd('computeModelDSSP') - ;(models[0].properties as any).secondaryStructure = secondaryStructure + console.timeEnd('computeModelDSSP'); + (models[0].properties as any).secondaryStructure = secondaryStructure const structure = await getStructure(models[0]) const cartoonRepr = getCartoonRepr() @@ -76,7 +76,7 @@ async function init() { size: reprCtx.sizeThemeRegistry.create('uniform', { structure }) }) await cartoonRepr.createOrUpdate({ ...CartoonRepresentationProvider.defaultValues, quality: 'auto' }, structure).run() - + canvas3d.add(cartoonRepr) canvas3d.resetCamera() } diff --git a/src/tests/browser/render-text.ts b/src/tests/browser/render-text.ts index 4c453479b34dcd3041d72219f577b1b7e143bbb8..c8f55c2fb9659ecf1883bac6a07b129ac3e148f5 100644 --- a/src/tests/browser/render-text.ts +++ b/src/tests/browser/render-text.ts @@ -51,7 +51,7 @@ function textRepr() { const values = Text.Utils.createValuesSimple(text, props, Color(0xFFDD00), 1) const state = Text.Utils.createRenderableState(props) - const renderObject = createRenderObject('text', values, state) + const renderObject = createRenderObject('text', values, state, -1) console.log('text', renderObject, props) const repr = Representation.fromRenderObject('text', renderObject) return repr @@ -66,7 +66,7 @@ function spheresRepr() { const values = Spheres.Utils.createValuesSimple(spheres, {}, Color(0xFF0000), 0.2) const state = Spheres.Utils.createRenderableState({}) - const renderObject = createRenderObject('spheres', values, state) + const renderObject = createRenderObject('spheres', values, state, -1) console.log('spheres', renderObject) const repr = Representation.fromRenderObject('spheres', renderObject) return repr