diff --git a/CHANGELOG.md b/CHANGELOG.md index 2436029294438d002156c147c1ac7134fbd782e8..463462db587e649109cd41fb5e9787ed4f71c939 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Note that since we don't clearly distinguish between a public and private interf - Fix: only update camera state if manualReset is off (#494) - Improve handling principal axes of points in a plane - Add 'material' annotation support for textures +- More effort to avoid using ``flat`` qualifier in shaders: add ``dVaryingGroup`` ## [v3.12.1] - 2022-07-20 diff --git a/src/mol-geo/geometry/mesh/mesh.ts b/src/mol-geo/geometry/mesh/mesh.ts index 29b08ba3a935cac0f9a95f70da6e7bcef23f1ad5..10b9c9b058105fa54e6fd2d95f743f36dec8d059 100644 --- a/src/mol-geo/geometry/mesh/mesh.ts +++ b/src/mol-geo/geometry/mesh/mesh.ts @@ -45,6 +45,8 @@ export interface Mesh { readonly normalBuffer: ValueCell<Float32Array>, /** Group buffer as array of group ids for each vertex wrapped in a value cell */ readonly groupBuffer: ValueCell<Float32Array>, + /** Indicates that group may vary within a triangle, wrapped in a value cell */ + readonly varyingGroup: ValueCell<boolean>, /** Bounding sphere of the mesh */ readonly boundingSphere: Sphere3D @@ -95,6 +97,7 @@ export namespace Mesh { indexBuffer: ValueCell.create(indices), normalBuffer: ValueCell.create(normals), groupBuffer: ValueCell.create(groups), + varyingGroup: ValueCell.create(false), get boundingSphere() { const newHash = hashCode(mesh); if (newHash !== currentHash) { @@ -686,6 +689,7 @@ export namespace Mesh { aNormal: mesh.normalBuffer, aGroup: mesh.groupBuffer, elements: mesh.indexBuffer, + dVaryingGroup: mesh.varyingGroup, boundingSphere: ValueCell.create(boundingSphere), invariantBoundingSphere: ValueCell.create(invariantBoundingSphere), uInvariantBoundingSphere: ValueCell.create(Vec4.ofSphere(invariantBoundingSphere)), diff --git a/src/mol-geo/geometry/texture-mesh/texture-mesh.ts b/src/mol-geo/geometry/texture-mesh/texture-mesh.ts index 8c941543972963b7e949c500ee4c0d5c41ab347e..0a246b3e0e29a1b49e1dfec9ef18accccbf7c01b 100644 --- a/src/mol-geo/geometry/texture-mesh/texture-mesh.ts +++ b/src/mol-geo/geometry/texture-mesh/texture-mesh.ts @@ -38,6 +38,7 @@ export interface TextureMesh { readonly vertexTexture: ValueCell<Texture>, readonly groupTexture: ValueCell<Texture>, readonly normalTexture: ValueCell<Texture>, + readonly varyingGroup: ValueCell<boolean>, readonly doubleBuffer: TextureMesh.DoubleBuffer readonly boundingSphere: Sphere3D @@ -92,6 +93,7 @@ export namespace TextureMesh { vertexTexture: ValueCell.create(vertexTexture), groupTexture: ValueCell.create(groupTexture), normalTexture: ValueCell.create(normalTexture), + varyingGroup: ValueCell.create(false), doubleBuffer: new DoubleBuffer(), boundingSphere: Sphere3D.clone(boundingSphere), meta: {} @@ -157,6 +159,7 @@ export namespace TextureMesh { tPosition: textureMesh.vertexTexture, tGroup: textureMesh.groupTexture, tNormal: textureMesh.normalTexture, + dVaryingGroup: textureMesh.varyingGroup, boundingSphere: ValueCell.create(boundingSphere), invariantBoundingSphere: ValueCell.create(invariantBoundingSphere), diff --git a/src/mol-gl/compute/marching-cubes/isosurface.ts b/src/mol-gl/compute/marching-cubes/isosurface.ts index 93263e22713b409f2e343f85bd84d648e5e20085..3c628b25554fbd79c14f59fee00d2fbf236c3c7c 100644 --- a/src/mol-gl/compute/marching-cubes/isosurface.ts +++ b/src/mol-gl/compute/marching-cubes/isosurface.ts @@ -42,12 +42,13 @@ const IsosurfaceSchema = { dPackedGroup: DefineSpec('boolean'), dAxisOrder: DefineSpec('string', ['012', '021', '102', '120', '201', '210']), + dConstantGroup: DefineSpec('boolean'), }; type IsosurfaceValues = Values<typeof IsosurfaceSchema> const IsosurfaceName = 'isosurface'; -function getIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture, activeVoxelsBase: Texture, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, levels: number, scale: Vec2, count: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3): ComputeRenderable<IsosurfaceValues> { +function getIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture, activeVoxelsBase: Texture, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, levels: number, scale: Vec2, count: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, constantGroup: boolean): ComputeRenderable<IsosurfaceValues> { if (ctx.namedComputeRenderables[IsosurfaceName]) { const v = ctx.namedComputeRenderables[IsosurfaceName].values as IsosurfaceValues; @@ -66,17 +67,18 @@ function getIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture ValueCell.update(v.uGridTransform, transform); ValueCell.update(v.uScale, scale); - ValueCell.update(v.dPackedGroup, packedGroup); + ValueCell.updateIfChanged(v.dPackedGroup, packedGroup); ValueCell.updateIfChanged(v.dAxisOrder, axisOrder.join('')); + ValueCell.updateIfChanged(v.dConstantGroup, constantGroup); ctx.namedComputeRenderables[IsosurfaceName].update(); } else { - ctx.namedComputeRenderables[IsosurfaceName] = createIsosurfaceRenderable(ctx, activeVoxelsPyramid, activeVoxelsBase, volumeData, gridDim, gridTexDim, transform, isoValue, levels, scale, count, invert, packedGroup, axisOrder); + ctx.namedComputeRenderables[IsosurfaceName] = createIsosurfaceRenderable(ctx, activeVoxelsPyramid, activeVoxelsBase, volumeData, gridDim, gridTexDim, transform, isoValue, levels, scale, count, invert, packedGroup, axisOrder, constantGroup); } return ctx.namedComputeRenderables[IsosurfaceName]; } -function createIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture, activeVoxelsBase: Texture, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, levels: number, scale: Vec2, count: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3) { +function createIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Texture, activeVoxelsBase: Texture, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, levels: number, scale: Vec2, count: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, constantGroup: boolean) { // console.log('uSize', Math.pow(2, levels)) const values: IsosurfaceValues = { ...QuadValues, @@ -99,6 +101,7 @@ function createIsosurfaceRenderable(ctx: WebGLContext, activeVoxelsPyramid: Text dPackedGroup: ValueCell.create(packedGroup), dAxisOrder: ValueCell.create(axisOrder.join('')), + dConstantGroup: ValueCell.create(constantGroup), }; const schema = { ...IsosurfaceSchema }; @@ -119,7 +122,7 @@ function setRenderingDefaults(ctx: WebGLContext) { state.clearColor(0, 0, 0, 0); } -export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Texture, volumeData: Texture, histogramPyramid: HistogramPyramid, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, vertexTexture?: Texture, groupTexture?: Texture, normalTexture?: Texture) { +export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Texture, volumeData: Texture, histogramPyramid: HistogramPyramid, gridDim: Vec3, gridTexDim: Vec3, transform: Mat4, isoValue: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, constantGroup: boolean, vertexTexture?: Texture, groupTexture?: Texture, normalTexture?: Texture) { const { drawBuffers } = ctx.extensions; if (!drawBuffers) throw new Error('need WebGL draw buffers'); @@ -178,7 +181,7 @@ export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Tex groupTexture.attachFramebuffer(framebuffer, 1); normalTexture.attachFramebuffer(framebuffer, 2); - const renderable = getIsosurfaceRenderable(ctx, pyramidTex, activeVoxelsBase, volumeData, gridDim, gridTexDim, transform, isoValue, levels, scale, count, invert, packedGroup, axisOrder); + const renderable = getIsosurfaceRenderable(ctx, pyramidTex, activeVoxelsBase, volumeData, gridDim, gridTexDim, transform, isoValue, levels, scale, count, invert, packedGroup, axisOrder, constantGroup); ctx.state.currentRenderItemId = -1; framebuffer.bind(); @@ -210,11 +213,11 @@ export function createIsosurfaceBuffers(ctx: WebGLContext, activeVoxelsBase: Tex * * Implementation based on http://www.miaumiau.cat/2016/10/stream-compaction-in-webgl/ */ -export function extractIsosurface(ctx: WebGLContext, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, gridTexScale: Vec2, transform: Mat4, isoValue: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, vertexTexture?: Texture, groupTexture?: Texture, normalTexture?: Texture) { +export function extractIsosurface(ctx: WebGLContext, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, gridTexScale: Vec2, transform: Mat4, isoValue: number, invert: boolean, packedGroup: boolean, axisOrder: Vec3, constantGroup: boolean, vertexTexture?: Texture, groupTexture?: Texture, normalTexture?: Texture) { if (isTimingMode) ctx.timer.mark('extractIsosurface'); const activeVoxelsTex = calcActiveVoxels(ctx, volumeData, gridDim, gridTexDim, isoValue, gridTexScale); const compacted = createHistogramPyramid(ctx, activeVoxelsTex, gridTexScale, gridTexDim); - const gv = createIsosurfaceBuffers(ctx, activeVoxelsTex, volumeData, compacted, gridDim, gridTexDim, transform, isoValue, invert, packedGroup, axisOrder, vertexTexture, groupTexture, normalTexture); + const gv = createIsosurfaceBuffers(ctx, activeVoxelsTex, volumeData, compacted, gridDim, gridTexDim, transform, isoValue, invert, packedGroup, axisOrder, constantGroup, vertexTexture, groupTexture, normalTexture); if (isTimingMode) ctx.timer.markEnd('extractIsosurface'); return gv; diff --git a/src/mol-gl/renderable/mesh.ts b/src/mol-gl/renderable/mesh.ts index 5b04ba32bdc7b444443f4f92f5b4c10067d0d19d..fa5244d23e7e8aa87a87febf33619dee44861a5c 100644 --- a/src/mol-gl/renderable/mesh.ts +++ b/src/mol-gl/renderable/mesh.ts @@ -17,6 +17,7 @@ export const MeshSchema = { aPosition: AttributeSpec('float32', 3, 0), aNormal: AttributeSpec('float32', 3, 0), elements: ElementsSpec('uint32'), + dVaryingGroup: DefineSpec('boolean'), dFlatShaded: DefineSpec('boolean'), uDoubleSided: UniformSpec('b', 'material'), dFlipSided: DefineSpec('boolean'), diff --git a/src/mol-gl/renderable/texture-mesh.ts b/src/mol-gl/renderable/texture-mesh.ts index 48cd5ce006a3140a4d1b3d982c59ce562aac1c66..2436be94e4d17229f4ae060007d6c4b3b80c1d2d 100644 --- a/src/mol-gl/renderable/texture-mesh.ts +++ b/src/mol-gl/renderable/texture-mesh.ts @@ -17,7 +17,7 @@ export const TextureMeshSchema = { tPosition: TextureSpec('texture', 'rgb', 'float', 'nearest'), tGroup: TextureSpec('texture', 'alpha', 'float', 'nearest'), tNormal: TextureSpec('texture', 'rgb', 'float', 'nearest'), - + dVaryingGroup: DefineSpec('boolean'), dFlatShaded: DefineSpec('boolean'), uDoubleSided: UniformSpec('b', 'material'), dFlipSided: DefineSpec('boolean'), diff --git a/src/mol-gl/shader/chunks/color-frag-params.glsl.ts b/src/mol-gl/shader/chunks/color-frag-params.glsl.ts index 82d1601d20f547069991ce1670db797f7b671ba7..4027046f94f18175e895cf440b82aa6623e470ae 100644 --- a/src/mol-gl/shader/chunks/color-frag-params.glsl.ts +++ b/src/mol-gl/shader/chunks/color-frag-params.glsl.ts @@ -27,7 +27,7 @@ uniform float uBumpiness; varying vec4 vSubstance; #endif #elif defined(dRenderVariant_pick) - #if __VERSION__ == 100 + #if __VERSION__ == 100 || !defined(dVaryingGroup) #ifdef requiredDrawBuffers varying vec4 vObject; varying vec4 vInstance; @@ -36,6 +36,7 @@ uniform float uBumpiness; varying vec4 vColor; #endif #else + // avoid flat until EXT_provoking_vertex is supported #ifdef requiredDrawBuffers flat in vec4 vObject; flat in vec4 vInstance; diff --git a/src/mol-gl/shader/chunks/color-vert-params.glsl.ts b/src/mol-gl/shader/chunks/color-vert-params.glsl.ts index 5459d2fc31658b1eb257bb67852009c2692bea8d..0b4c5c45f230aa15a3e846936d23596ae0312ee6 100644 --- a/src/mol-gl/shader/chunks/color-vert-params.glsl.ts +++ b/src/mol-gl/shader/chunks/color-vert-params.glsl.ts @@ -55,7 +55,7 @@ uniform float uBumpiness; #endif #endif #elif defined(dRenderVariant_pick) - #if __VERSION__ == 100 + #if __VERSION__ == 100 || !defined(dVaryingGroup) #ifdef requiredDrawBuffers varying vec4 vObject; varying vec4 vInstance; @@ -64,6 +64,7 @@ uniform float uBumpiness; varying vec4 vColor; #endif #else + // avoid flat until EXT_provoking_vertex is supported #ifdef requiredDrawBuffers flat out vec4 vObject; flat out vec4 vInstance; diff --git a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts index ed80baa099f4e2a9e6ca991a87b7d712fba841aa..5722cb8a2c3ed77e340bcf3354fee9b771f5fdf5 100644 --- a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts @@ -14,10 +14,11 @@ uniform int uMarkingType; uniform vec3 uClipObjectScale[dClipObjectCount]; #if defined(dClipping) - #if __VERSION__ == 100 || defined(dClippingType_instance) + #if __VERSION__ == 100 || defined(dClippingType_instance) || !defined(dVaryingGroup) varying float vClipping; #else - flat in float vClipping; // avoid if possible, causes slowdown, ASR + // avoid flat until EXT_provoking_vertex is supported + flat in float vClipping; #endif #endif #endif @@ -32,10 +33,11 @@ uniform int uMarkingType; #if defined(dNeedsMarker) uniform float uMarker; - #if __VERSION__ == 100 || defined(dMarkerType_instance) + #if __VERSION__ == 100 || defined(dMarkerType_instance) || !defined(dVaryingGroup) varying float vMarker; #else - flat in float vMarker; // avoid if possible, causes slowdown, ASR + // avoid flat until EXT_provoking_vertex is supported + flat in float vMarker; #endif #endif diff --git a/src/mol-gl/shader/chunks/common-vert-params.glsl.ts b/src/mol-gl/shader/chunks/common-vert-params.glsl.ts index e93faa764c6a41085262c46bebf8266d71dd1cdc..2e391530c42fd9340e6bf3af92c1d379bccfe787 100644 --- a/src/mol-gl/shader/chunks/common-vert-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-vert-params.glsl.ts @@ -21,10 +21,11 @@ uniform int uPickType; #if defined(dClipping) uniform vec2 uClippingTexDim; uniform sampler2D tClipping; - #if __VERSION__ == 100 || defined(dClippingType_instance) + #if __VERSION__ == 100 || defined(dClippingType_instance) || !defined(dVaryingGroup) varying float vClipping; #else - flat out float vClipping; // avoid if possible, causes slowdown, ASR + // avoid flat until EXT_provoking_vertex is supported + flat out float vClipping; #endif #endif #endif @@ -33,10 +34,11 @@ uniform int uPickType; uniform float uMarker; uniform vec2 uMarkerTexDim; uniform sampler2D tMarker; - #if __VERSION__ == 100 || defined(dMarkerType_instance) + #if __VERSION__ == 100 || defined(dMarkerType_instance) || !defined(dVaryingGroup) varying float vMarker; #else - flat out float vMarker; // avoid if possible, causes slowdown, ASR + // avoid flat until EXT_provoking_vertex is supported + flat out float vMarker; #endif #endif diff --git a/src/mol-gl/shader/marching-cubes/isosurface.frag.ts b/src/mol-gl/shader/marching-cubes/isosurface.frag.ts index ac7f0cf3d8fc48321804bb1a4d99ea23eb4a46b7..964bfdf1753935172219deb41d2593b7479d5c00 100644 --- a/src/mol-gl/shader/marching-cubes/isosurface.frag.ts +++ b/src/mol-gl/shader/marching-cubes/isosurface.frag.ts @@ -268,9 +268,9 @@ void main(void) { gl_FragData[0].xyz = (uGridTransform * vec4(b0 + t * (b0 - b1), 1.0)).xyz; // group id - #if __VERSION__ == 100 + #if __VERSION__ == 100 || defined(dConstantGroup) // webgl1 does not support 'flat' interpolation (i.e. no interpolation) - // so we ensure a constant group id per triangle here + // ensure a constant group id per triangle as needed #ifdef dPackedGroup gl_FragData[1] = vec4(voxel(coord3d).rgb, 1.0); #else diff --git a/src/mol-model-formats/shape/ply.ts b/src/mol-model-formats/shape/ply.ts index d94a8047f4b8777bcbca1fadb303206cd0da0863..3d488a8889a009b5e7286f41289669afe786931e 100644 --- a/src/mol-model-formats/shape/ply.ts +++ b/src/mol-model-formats/shape/ply.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2019-2022 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Schäfer, Marco <marco.schaefer@uni-tuebingen.de> * @author Alexander Rose <alexander.rose@weirdbyte.de> @@ -19,6 +19,7 @@ import { ParamDefinition as PD } from '../../mol-util/param-definition'; import { ColorNames } from '../../mol-util/color/names'; import { deepClone } from '../../mol-util/object'; import { stringToWords } from '../../mol-util/string'; +import { ValueCell } from '../../mol-util/value-cell'; // TODO support 'edge' element, see https://www.mathworks.com/help/vision/ug/the-ply-format.html // TODO support missing face element @@ -170,6 +171,9 @@ async function getMesh(ctx: RuntimeContext, vertex: PlyTable, face: PlyList, gro const m = MeshBuilder.getMesh(builderState); if (!hasNormals) Mesh.computeNormals(m); + // TODO: check if needed + ValueCell.updateIfChanged(m.varyingGroup, true); + return m; } diff --git a/src/mol-repr/structure/visual/gaussian-surface-mesh.ts b/src/mol-repr/structure/visual/gaussian-surface-mesh.ts index 884f7045262d152833701362bb9ae9b3d9632e50..85da9b6064cf3e6d59dd19a88ccc118a92fbb152 100644 --- a/src/mol-repr/structure/visual/gaussian-surface-mesh.ts +++ b/src/mol-repr/structure/visual/gaussian-surface-mesh.ts @@ -28,6 +28,7 @@ import { applyTextureMeshColorSmoothing } from '../../../mol-geo/geometry/textur import { ColorSmoothingParams, getColorSmoothingProps } from '../../../mol-geo/geometry/base'; import { Vec3 } from '../../../mol-math/linear-algebra'; import { isTimingMode } from '../../../mol-util/debug'; +import { ValueCell } from '../../../mol-util/value-cell'; const SharedParams = { ...GaussianDensityParams, @@ -101,7 +102,12 @@ async function createGaussianSurfaceMesh(ctx: VisualContext, unit: Unit, structu (surface.meta.resolution as GaussianSurfaceMeta['resolution']) = resolution; Mesh.transform(surface, transform); - if (ctx.webgl && !ctx.webgl.isWebGL2) Mesh.uniformTriangleGroup(surface); + if (ctx.webgl && !ctx.webgl.isWebGL2) { + Mesh.uniformTriangleGroup(surface); + ValueCell.updateIfChanged(surface.varyingGroup, false); + } else { + ValueCell.updateIfChanged(surface.varyingGroup, true); + } const sphere = Sphere3D.expand(Sphere3D(), unit.boundary.sphere, maxRadius); surface.setBoundingSphere(sphere); @@ -162,7 +168,12 @@ async function createStructureGaussianSurfaceMesh(ctx: VisualContext, structure: (surface.meta.resolution as GaussianSurfaceMeta['resolution']) = resolution; Mesh.transform(surface, transform); - if (ctx.webgl && !ctx.webgl.isWebGL2) Mesh.uniformTriangleGroup(surface); + if (ctx.webgl && !ctx.webgl.isWebGL2) { + Mesh.uniformTriangleGroup(surface); + ValueCell.updateIfChanged(surface.varyingGroup, false); + } else { + ValueCell.updateIfChanged(surface.varyingGroup, true); + } const sphere = Sphere3D.expand(Sphere3D(), structure.boundary.sphere, maxRadius); surface.setBoundingSphere(sphere); @@ -229,7 +240,7 @@ async function createGaussianSurfaceTextureMesh(ctx: VisualContext, unit: Unit, const axisOrder = Vec3.create(0, 1, 2); const buffer = textureMesh?.doubleBuffer.get(); - const gv = extractIsosurface(ctx.webgl, densityTextureData.texture, densityTextureData.gridDim, densityTextureData.gridTexDim, densityTextureData.gridTexScale, densityTextureData.transform, isoLevel, false, true, axisOrder, buffer?.vertex, buffer?.group, buffer?.normal); + const gv = extractIsosurface(ctx.webgl, densityTextureData.texture, densityTextureData.gridDim, densityTextureData.gridTexDim, densityTextureData.gridTexScale, densityTextureData.transform, isoLevel, false, true, axisOrder, true, buffer?.vertex, buffer?.group, buffer?.normal); if (isTimingMode) ctx.webgl.timer.markEnd('createGaussianSurfaceTextureMesh'); const groupCount = unit.elements.length; @@ -303,7 +314,7 @@ async function createStructureGaussianSurfaceTextureMesh(ctx: VisualContext, str const axisOrder = Vec3.create(0, 1, 2); const buffer = textureMesh?.doubleBuffer.get(); - const gv = extractIsosurface(ctx.webgl, densityTextureData.texture, densityTextureData.gridDim, densityTextureData.gridTexDim, densityTextureData.gridTexScale, densityTextureData.transform, isoLevel, false, true, axisOrder, buffer?.vertex, buffer?.group, buffer?.normal); + const gv = extractIsosurface(ctx.webgl, densityTextureData.texture, densityTextureData.gridDim, densityTextureData.gridTexDim, densityTextureData.gridTexScale, densityTextureData.transform, isoLevel, false, true, axisOrder, true, buffer?.vertex, buffer?.group, buffer?.normal); if (isTimingMode) ctx.webgl.timer.markEnd('createStructureGaussianSurfaceTextureMesh'); const groupCount = structure.elementCount; diff --git a/src/mol-repr/structure/visual/molecular-surface-mesh.ts b/src/mol-repr/structure/visual/molecular-surface-mesh.ts index 173a5181c1111e935b0ac9ab3ba3bcefccc3fb7b..72e1a972c6f5c04d0eac95cc39527cab2406c5a5 100644 --- a/src/mol-repr/structure/visual/molecular-surface-mesh.ts +++ b/src/mol-repr/structure/visual/molecular-surface-mesh.ts @@ -22,6 +22,7 @@ import { Texture } from '../../../mol-gl/webgl/texture'; import { WebGLContext } from '../../../mol-gl/webgl/context'; import { applyMeshColorSmoothing } from '../../../mol-geo/geometry/mesh/color-smoothing'; import { ColorSmoothingParams, getColorSmoothingProps } from '../../../mol-geo/geometry/base'; +import { ValueCell } from '../../../mol-util'; export const MolecularSurfaceMeshParams = { ...UnitsMeshParams, @@ -55,7 +56,12 @@ async function createMolecularSurfaceMesh(ctx: VisualContext, unit: Unit, struct } Mesh.transform(surface, transform); - if (ctx.webgl && !ctx.webgl.isWebGL2) Mesh.uniformTriangleGroup(surface); + if (ctx.webgl && !ctx.webgl.isWebGL2) { + Mesh.uniformTriangleGroup(surface); + ValueCell.updateIfChanged(surface.varyingGroup, false); + } else { + ValueCell.updateIfChanged(surface.varyingGroup, true); + } const sphere = Sphere3D.expand(Sphere3D(), unit.boundary.sphere, maxRadius); surface.setBoundingSphere(sphere); diff --git a/src/mol-repr/volume/isosurface.ts b/src/mol-repr/volume/isosurface.ts index 7f413cc883337afa8c69d84759dd710d2a853abd..d7b1f068e1cb1cb5f96cfd68726188f7a769fca0 100644 --- a/src/mol-repr/volume/isosurface.ts +++ b/src/mol-repr/volume/isosurface.ts @@ -29,6 +29,7 @@ import { WebGLContext } from '../../mol-gl/webgl/context'; import { CustomPropertyDescriptor } from '../../mol-model/custom-property'; import { Texture } from '../../mol-gl/webgl/texture'; import { BaseGeometry } from '../../mol-geo/geometry/base'; +import { ValueCell } from '../../mol-util/value-cell'; export const VolumeIsosurfaceParams = { isoValue: Volume.IsoValueParam @@ -94,6 +95,9 @@ export async function createVolumeIsosurfaceMesh(ctx: VisualContext, volume: Vol // 2nd arg means not to split triangles based on group id. Splitting triangles // is too expensive if each cell has its own group id as is the case here. Mesh.uniformTriangleGroup(surface, false); + ValueCell.updateIfChanged(surface.varyingGroup, false); + } else { + ValueCell.updateIfChanged(surface.varyingGroup, true); } surface.setBoundingSphere(Volume.getBoundingSphere(volume)); @@ -185,7 +189,7 @@ async function createVolumeIsosurfaceTextureMesh(ctx: VisualContext, volume: Vol const axisOrder = volume.grid.cells.space.axisOrderSlowToFast as Vec3; const buffer = textureMesh?.doubleBuffer.get(); - const gv = extractIsosurface(ctx.webgl, texture, gridDimension, gridTexDim, gridTexScale, transform, isoLevel, value < 0, false, axisOrder, buffer?.vertex, buffer?.group, buffer?.normal); + const gv = extractIsosurface(ctx.webgl, texture, gridDimension, gridTexDim, gridTexScale, transform, isoLevel, value < 0, false, axisOrder, true, buffer?.vertex, buffer?.group, buffer?.normal); const groupCount = volume.grid.cells.data.length; const surface = TextureMesh.create(gv.vertexCount, groupCount, gv.vertexTexture, gv.groupTexture, gv.normalTexture, Volume.getBoundingSphere(volume), textureMesh); diff --git a/src/tests/browser/marching-cubes.ts b/src/tests/browser/marching-cubes.ts index 8c501aa700eaf6213f255cb5cb71cf5780f1c49d..5f585b77984a400c5b3ceaa0979db8dbe1ec8a52 100644 --- a/src/tests/browser/marching-cubes.ts +++ b/src/tests/browser/marching-cubes.ts @@ -1,5 +1,5 @@ /** - * Copyright (c) 2019-2021 mol* contributors, licensed under MIT, See LICENSE file for more info. + * Copyright (c) 2019-2022 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ @@ -73,7 +73,7 @@ async function init() { console.timeEnd('gpu mc pyramid2'); console.time('gpu mc vert2'); - createIsosurfaceBuffers(webgl, activeVoxelsTex2, densityTextureData2.texture, compacted2, densityTextureData2.gridDim, densityTextureData2.gridTexDim, densityTextureData2.transform, isoValue, false, true, Vec3.create(0, 1, 2)); + createIsosurfaceBuffers(webgl, activeVoxelsTex2, densityTextureData2.texture, compacted2, densityTextureData2.gridDim, densityTextureData2.gridTexDim, densityTextureData2.transform, isoValue, false, true, Vec3.create(0, 1, 2), true); webgl.waitForGpuCommandsCompleteSync(); console.timeEnd('gpu mc vert2'); console.timeEnd('gpu mc2'); @@ -96,7 +96,7 @@ async function init() { console.timeEnd('gpu mc pyramid'); console.time('gpu mc vert'); - const gv = createIsosurfaceBuffers(webgl, activeVoxelsTex, densityTextureData.texture, compacted, densityTextureData.gridDim, densityTextureData.gridTexDim, densityTextureData.transform, isoValue, false, true, Vec3.create(0, 1, 2)); + const gv = createIsosurfaceBuffers(webgl, activeVoxelsTex, densityTextureData.texture, compacted, densityTextureData.gridDim, densityTextureData.gridTexDim, densityTextureData.transform, isoValue, false, true, Vec3.create(0, 1, 2), true); webgl.waitForGpuCommandsCompleteSync(); console.timeEnd('gpu mc vert'); console.timeEnd('gpu mc');