diff --git a/src/mol-geo/geometry/cylinders/cylinders.ts b/src/mol-geo/geometry/cylinders/cylinders.ts index 9aec0b9b30579880d942f317179d85d4f330299b..2c4d4db856ee15a246f084703e751745b739f8dd 100644 --- a/src/mol-geo/geometry/cylinders/cylinders.ts +++ b/src/mol-geo/geometry/cylinders/cylinders.ts @@ -213,6 +213,8 @@ export namespace Cylinders { const boundingSphere = calculateTransformBoundingSphere(invariantBoundingSphere, transform.aTransform.ref.value, instanceCount); return { + dGeometryType: ValueCell.create('cylinders'), + aMapping: cylinders.mappingBuffer, aGroup: cylinders.groupBuffer, aStart: cylinders.startBuffer, diff --git a/src/mol-geo/geometry/direct-volume/direct-volume.ts b/src/mol-geo/geometry/direct-volume/direct-volume.ts index 1754091ad9f9d837279415b8e0510a44d015256d..75ae9df445d07949614e6542c1eddf6d60d3966f 100644 --- a/src/mol-geo/geometry/direct-volume/direct-volume.ts +++ b/src/mol-geo/geometry/direct-volume/direct-volume.ts @@ -223,6 +223,8 @@ export namespace DirectVolume { const transferTex = createTransferFunctionTexture(controlPoints); return { + dGeometryType: ValueCell.create('directVolume'), + ...color, ...marker, ...overpaint, @@ -246,7 +248,6 @@ export namespace DirectVolume { uJumpLength: ValueCell.create(props.jumpLength), uTransform: gridTransform, uGridDim: gridDimension, - dRenderMode: ValueCell.create('volume'), tTransferTex: transferTex, uTransferScale: ValueCell.create(getTransferScale(props.stepsPerCell)), diff --git a/src/mol-geo/geometry/image/image.ts b/src/mol-geo/geometry/image/image.ts index 296cdfc19fbb681faa0d8aad1c095a823562127a..e479434faca3396a1c7064512f3638628da93277 100644 --- a/src/mol-geo/geometry/image/image.ts +++ b/src/mol-geo/geometry/image/image.ts @@ -155,6 +155,8 @@ namespace Image { const boundingSphere = calculateTransformBoundingSphere(invariantBoundingSphere, transform.aTransform.ref.value, instanceCount); return { + dGeometryType: ValueCell.create('image'), + ...color, ...marker, ...overpaint, diff --git a/src/mol-geo/geometry/lines/lines.ts b/src/mol-geo/geometry/lines/lines.ts index 87b249930a5e4631ab4562fb76d8d62b352fbef6..d8e4051fe11931dffcbea168227d021f70471d84 100644 --- a/src/mol-geo/geometry/lines/lines.ts +++ b/src/mol-geo/geometry/lines/lines.ts @@ -220,6 +220,8 @@ export namespace Lines { const boundingSphere = calculateTransformBoundingSphere(invariantBoundingSphere, transform.aTransform.ref.value, instanceCount); return { + dGeometryType: ValueCell.create('lines'), + aMapping: lines.mappingBuffer, aGroup: lines.groupBuffer, aStart: lines.startBuffer, diff --git a/src/mol-geo/geometry/mesh/mesh.ts b/src/mol-geo/geometry/mesh/mesh.ts index ccc9396ced4d228374b8511f3ae2da9c36140323..be1169af7613b3b6d656772c44a5d47365275a95 100644 --- a/src/mol-geo/geometry/mesh/mesh.ts +++ b/src/mol-geo/geometry/mesh/mesh.ts @@ -677,6 +677,8 @@ export namespace Mesh { const boundingSphere = calculateTransformBoundingSphere(invariantBoundingSphere, transform.aTransform.ref.value, instanceCount); return { + dGeometryType: ValueCell.create('mesh'), + aPosition: mesh.vertexBuffer, aNormal: mesh.normalBuffer, aGroup: mesh.groupBuffer, diff --git a/src/mol-geo/geometry/points/points.ts b/src/mol-geo/geometry/points/points.ts index 29fd38324c9a7d8a752f2c7472c7d4074065ccb2..6ff2e72b39eb3e9117046939bfe46b5b7aa90f28 100644 --- a/src/mol-geo/geometry/points/points.ts +++ b/src/mol-geo/geometry/points/points.ts @@ -182,6 +182,8 @@ export namespace Points { const boundingSphere = calculateTransformBoundingSphere(invariantBoundingSphere, transform.aTransform.ref.value, instanceCount); return { + dGeometryType: ValueCell.create('points'), + aPosition: points.centerBuffer, aGroup: points.groupBuffer, boundingSphere: ValueCell.create(boundingSphere), diff --git a/src/mol-geo/geometry/spheres/spheres.ts b/src/mol-geo/geometry/spheres/spheres.ts index a614df930ab69e7759a5467dd18ad7f622da97af..d5531baa6d2210503a2b9c934a1aaf878e7dffdd 100644 --- a/src/mol-geo/geometry/spheres/spheres.ts +++ b/src/mol-geo/geometry/spheres/spheres.ts @@ -183,6 +183,8 @@ export namespace Spheres { const boundingSphere = calculateTransformBoundingSphere(invariantBoundingSphere, transform.aTransform.ref.value, instanceCount); return { + dGeometryType: ValueCell.create('spheres'), + aPosition: spheres.centerBuffer, aMapping: spheres.mappingBuffer, aGroup: spheres.groupBuffer, diff --git a/src/mol-geo/geometry/text/text.ts b/src/mol-geo/geometry/text/text.ts index 61d626d7a462d6e4ea13a22bcb65e755929a6acf..85a11f973e7aa51b15f666e788a29ddadc102847 100644 --- a/src/mol-geo/geometry/text/text.ts +++ b/src/mol-geo/geometry/text/text.ts @@ -224,6 +224,8 @@ export namespace Text { const boundingSphere = calculateTransformBoundingSphere(invariantBoundingSphere, transform.aTransform.ref.value, instanceCount); return { + dGeometryType: ValueCell.create('text'), + aPosition: text.centerBuffer, aMapping: text.mappingBuffer, aDepth: text.depthBuffer, diff --git a/src/mol-geo/geometry/texture-mesh/texture-mesh.ts b/src/mol-geo/geometry/texture-mesh/texture-mesh.ts index fbb6ff8524099eb4e1c5f128f5489bcc4ba20d90..4ec8f376d25f45092759eaeefcd6b6f3d95695a1 100644 --- a/src/mol-geo/geometry/texture-mesh/texture-mesh.ts +++ b/src/mol-geo/geometry/texture-mesh/texture-mesh.ts @@ -147,6 +147,8 @@ export namespace TextureMesh { const boundingSphere = calculateTransformBoundingSphere(invariantBoundingSphere, transform.aTransform.ref.value, instanceCount); return { + dGeometryType: ValueCell.create('textureMesh'), + uGeoTexDim: textureMesh.geoTextureDim, tPosition: textureMesh.vertexTexture, tGroup: textureMesh.groupTexture, @@ -172,7 +174,6 @@ export namespace TextureMesh { dXrayShaded: ValueCell.create(props.xrayShaded), uBumpFrequency: ValueCell.create(props.bumpFrequency), uBumpAmplitude: ValueCell.create(props.bumpAmplitude), - dGeoTexture: ValueCell.create(true), meta: ValueCell.create(textureMesh.meta), }; diff --git a/src/mol-gl/renderable/direct-volume.ts b/src/mol-gl/renderable/direct-volume.ts index 5b47cf8c0cc71d59d1d7f5baf35c098e4279a213..19b3a5fb90c775ad72c84c82dce93a74fb2f7355 100644 --- a/src/mol-gl/renderable/direct-volume.ts +++ b/src/mol-gl/renderable/direct-volume.ts @@ -25,7 +25,6 @@ export const DirectVolumeSchema = { uJumpLength: UniformSpec('f'), uTransform: UniformSpec('m4'), uGridDim: UniformSpec('v3'), - dRenderMode: DefineSpec('string', ['volume']), tTransferTex: TextureSpec('image-uint8', 'alpha', 'ubyte', 'linear'), uTransferScale: UniformSpec('f'), diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index 642cbf813d518f646850b4351d63f5f10193db49..f97c76b721e0e4dd23817c931f0b3633976f4b30 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -258,6 +258,8 @@ export type ClippingSchema = typeof ClippingSchema export type ClippingValues = Values<ClippingSchema> export const BaseSchema = { + dGeometryType: DefineSpec('string', ['cylinders', 'directVolume', 'image', 'lines', 'mesh', 'points', 'spheres', 'text', 'textureMesh']), + ...ColorSchema, ...MarkerSchema, ...OverpaintSchema, diff --git a/src/mol-gl/renderable/texture-mesh.ts b/src/mol-gl/renderable/texture-mesh.ts index ce1769684110268ecb2ab85db936670e70083330..badae508661038f7467e367824628237a65f1c2f 100644 --- a/src/mol-gl/renderable/texture-mesh.ts +++ b/src/mol-gl/renderable/texture-mesh.ts @@ -23,7 +23,6 @@ export const TextureMeshSchema = { dFlipSided: DefineSpec('boolean'), dIgnoreLight: DefineSpec('boolean'), dXrayShaded: DefineSpec('boolean'), - dGeoTexture: DefineSpec('boolean'), uBumpFrequency: UniformSpec('f'), uBumpAmplitude: UniformSpec('f'), meta: ValueSpec('unknown') diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index 58e978e63509933d12c5ec68524fc4aea68b17ca..d569dd22193da138fd5abe594c646ce256981a38 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -136,7 +136,7 @@ function getLight(props: RendererProps['light'], light?: Light): Light { namespace Renderer { export function create(ctx: WebGLContext, props: Partial<RendererProps> = {}): Renderer { - const { gl, state, stats, extensions: { fragDepth } } = ctx; + const { gl, state, stats } = ctx; const p = PD.merge(RendererParams, PD.getDefaultValues(RendererParams), props); const light = getLight(p.light); @@ -245,9 +245,9 @@ namespace Renderer { globalUniformsNeedUpdate = false; } - if (r.values.dRenderMode) { // indicates direct-volume - if ((variant === 'pick' || variant === 'depth') && r.values.dRenderMode.ref.value === 'volume') { - return; // no picking/depth in volume mode + if (r.values.dGeometryType.ref.value === 'directVolume') { + if (!variant.startsWith('color')) { + return; // only color supported } // culling done in fragment shader @@ -256,14 +256,8 @@ namespace Renderer { if (variant === 'colorBlended') { // depth test done manually in shader against `depthTexture` - // still need to enable when fragDepth can be used to write depth - if (r.values.dRenderMode.ref.value === 'volume' || !fragDepth) { - state.disable(gl.DEPTH_TEST); - state.depthMask(false); - } else { - state.enable(gl.DEPTH_TEST); - state.depthMask(r.values.uAlpha.ref.value === 1.0); - } + state.disable(gl.DEPTH_TEST); + state.depthMask(false); } } else { if (r.values.uDoubleSided) { @@ -506,7 +500,7 @@ namespace Renderer { // TODO: simplify, handle in renderable.state??? // uAlpha is updated in "render" so we need to recompute it here const alpha = clamp(r.values.alpha.ref.value * r.state.alphaFactor, 0, 1); - if (alpha === 1 && r.values.transparencyAverage.ref.value !== 1 && r.values.dRenderMode?.ref.value !== 'volume' && r.values.dPointStyle?.ref.value !== 'fuzzy' && !r.values.dXrayShaded?.ref.value) { + if (alpha === 1 && r.values.transparencyAverage.ref.value !== 1 && r.values.dGeometryType.ref.value !== 'directVolume' && r.values.dPointStyle?.ref.value !== 'fuzzy' && !r.values.dXrayShaded?.ref.value) { renderObject(r, 'colorWboit'); } } @@ -522,7 +516,7 @@ namespace Renderer { // TODO: simplify, handle in renderable.state??? // uAlpha is updated in "render" so we need to recompute it here const alpha = clamp(r.values.alpha.ref.value * r.state.alphaFactor, 0, 1); - if (alpha < 1 || r.values.transparencyAverage.ref.value > 0 || r.values.dRenderMode?.ref.value === 'volume' || r.values.dPointStyle?.ref.value === 'fuzzy' || !!r.values.uBackgroundColor || r.values.dXrayShaded?.ref.value) { + if (alpha < 1 || r.values.transparencyAverage.ref.value > 0 || r.values.dGeometryType.ref.value === 'directVolume' || r.values.dPointStyle?.ref.value === 'fuzzy' || !!r.values.uBackgroundColor || r.values.dXrayShaded?.ref.value) { renderObject(r, 'colorWboit'); } } diff --git a/src/mol-gl/shader/chunks/assign-group.glsl.ts b/src/mol-gl/shader/chunks/assign-group.glsl.ts index 74541fa1a9712a1e442f5693cb990fe1d60d1502..477dbdaf86d4f66eb8371282c933b320e0e9994a 100644 --- a/src/mol-gl/shader/chunks/assign-group.glsl.ts +++ b/src/mol-gl/shader/chunks/assign-group.glsl.ts @@ -1,5 +1,5 @@ export const assign_group = ` -#ifdef dGeoTexture +#ifdef dGeometryType_textureMesh float group = decodeFloatRGB(readFromTexture(tGroup, VertexID, uGeoTexDim).rgb); #else float group = aGroup; diff --git a/src/mol-gl/shader/chunks/assign-position.glsl.ts b/src/mol-gl/shader/chunks/assign-position.glsl.ts index 2f971cc0493ae4129aa67b73bf2f842b8ef4fc5c..125522ca778d84e9b9a843dbab912ed02ffe8ea7 100644 --- a/src/mol-gl/shader/chunks/assign-position.glsl.ts +++ b/src/mol-gl/shader/chunks/assign-position.glsl.ts @@ -1,7 +1,7 @@ export const assign_position = ` mat4 model = uModel * aTransform; mat4 modelView = uView * model; -#ifdef dGeoTexture +#ifdef dGeometryType_textureMesh vec3 position = readFromTexture(tPosition, VertexID, uGeoTexDim).xyz; #else vec3 position = aPosition; diff --git a/src/mol-gl/shader/chunks/wboit-write.glsl.ts b/src/mol-gl/shader/chunks/wboit-write.glsl.ts index 658819a0d997090516aac81d3532215d19477e66..9e1143b59c6e5ab2aa79bf0741a94b3e27990019 100644 --- a/src/mol-gl/shader/chunks/wboit-write.glsl.ts +++ b/src/mol-gl/shader/chunks/wboit-write.glsl.ts @@ -18,7 +18,7 @@ export const wboit_write = ` float wboitWeight = alpha * clamp(pow(1.0 - fragmentDepth, 2.0), 0.01, 1.0); gl_FragColor = vec4(gl_FragColor.rgb * alpha * wboitWeight, alpha); // extra alpha is to handle pre-multiplied alpha - #ifndef dRenderMode_volume + #ifndef dGeometryType_directVolume gl_FragData[1] = vec4((uTransparentBackground ? alpha : 1.0) * alpha * wboitWeight); #else gl_FragData[1] = vec4(alpha * alpha * wboitWeight); diff --git a/src/mol-gl/shader/mesh.vert.ts b/src/mol-gl/shader/mesh.vert.ts index 1a024414bade0366930c5bd96b7b3af6b1ad9186..2bdc9f0d291a8992a8f860cc46fe967d5faff027 100644 --- a/src/mol-gl/shader/mesh.vert.ts +++ b/src/mol-gl/shader/mesh.vert.ts @@ -16,7 +16,7 @@ precision highp sampler2D; #include common_clip #include texture3d_from_2d_linear -#ifdef dGeoTexture +#ifdef dGeometryType_textureMesh uniform vec2 uGeoTexDim; uniform sampler2D tPosition; uniform sampler2D tGroup; @@ -39,7 +39,7 @@ void main(){ #include assign_color_varying #include clip_instance - #ifdef dGeoTexture + #ifdef dGeometryType_textureMesh vec3 normal = readFromTexture(tNormal, VertexID, uGeoTexDim).xyz; #else vec3 normal = aNormal;