active-voxels.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /**
  2. * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { createComputeRenderable } from '../../renderable'
  7. import { WebGLContext } from '../../webgl/context';
  8. import { createComputeRenderItem } from '../../webgl/render-item';
  9. import { AttributeSpec, Values, TextureSpec, ValueSpec, UniformSpec } from '../../renderable/schema';
  10. import { Texture, createTexture } from 'mol-gl/webgl/texture';
  11. import { ShaderCode } from 'mol-gl/shader-code';
  12. import { ValueCell } from 'mol-util';
  13. import { GLRenderingContext } from 'mol-gl/webgl/compat';
  14. import { Vec3 } from 'mol-math/linear-algebra';
  15. import { QuadPositions } from '../util';
  16. import { getTriCount } from './tables';
  17. /** name for shared framebuffer used for gpu marching cubes operations */
  18. const FramebufferName = 'marching-cubes'
  19. const ActiveVoxelsSchema = {
  20. drawCount: ValueSpec('number'),
  21. instanceCount: ValueSpec('number'),
  22. aPosition: AttributeSpec('float32', 2, 0),
  23. tTriCount: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'),
  24. tVolumeData: TextureSpec('texture', 'rgba', 'ubyte', 'nearest'),
  25. uIsoValue: UniformSpec('f'),
  26. uGridDim: UniformSpec('v3'),
  27. uGridTexDim: UniformSpec('v3'),
  28. }
  29. function getActiveVoxelsRenderable(ctx: WebGLContext, volumeData: Texture, gridDimensions: Vec3, isoValue: number) {
  30. const values: Values<typeof ActiveVoxelsSchema> = {
  31. drawCount: ValueCell.create(6),
  32. instanceCount: ValueCell.create(1),
  33. aPosition: ValueCell.create(QuadPositions),
  34. tTriCount: ValueCell.create(getTriCount()),
  35. tVolumeData: ValueCell.create(volumeData),
  36. uIsoValue: ValueCell.create(isoValue),
  37. uGridDim: ValueCell.create(gridDimensions),
  38. uGridTexDim: ValueCell.create(Vec3.create(volumeData.width, volumeData.height, 0)),
  39. }
  40. const schema = { ...ActiveVoxelsSchema }
  41. const shaderCode = ShaderCode(
  42. require('mol-gl/shader/quad.vert').default,
  43. require('mol-gl/shader/marching-cubes/active-voxels.frag').default,
  44. { standardDerivatives: false, fragDepth: false }
  45. )
  46. const renderItem = createComputeRenderItem(ctx, 'triangles', shaderCode, schema, values)
  47. return createComputeRenderable(renderItem, values);
  48. }
  49. function setRenderingDefaults(gl: GLRenderingContext) {
  50. gl.disable(gl.CULL_FACE)
  51. gl.disable(gl.BLEND)
  52. gl.disable(gl.DEPTH_TEST)
  53. gl.depthMask(false)
  54. }
  55. export function calcActiveVoxels(ctx: WebGLContext, cornerTex: Texture, gridDimensions: Vec3, isoValue: number) {
  56. const { gl, framebufferCache } = ctx
  57. const { width, height } = cornerTex
  58. const framebuffer = framebufferCache.get(FramebufferName).value
  59. framebuffer.bind()
  60. const activeVoxelsTex = createTexture(ctx, 'image-float32', 'rgba', 'float', 'nearest')
  61. activeVoxelsTex.define(width, height)
  62. const renderable = getActiveVoxelsRenderable(ctx, cornerTex, gridDimensions, isoValue)
  63. renderable.update()
  64. renderable.use()
  65. activeVoxelsTex.attachFramebuffer(framebuffer, 0)
  66. setRenderingDefaults(gl)
  67. gl.viewport(0, 0, width, height)
  68. renderable.render()
  69. // const at = readTexture(ctx, activeVoxelsTex)
  70. // console.log('at', at)
  71. return activeVoxelsTex
  72. }