active-voxels.ts 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 { Values, TextureSpec, 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 { Vec3, Vec2 } from '../../../mol-math/linear-algebra';
  14. import { QuadSchema, QuadValues } from '../util';
  15. import { getTriCount } from './tables';
  16. import quad_vert from '../../../mol-gl/shader/quad.vert'
  17. import active_voxels_frag from '../../../mol-gl/shader/marching-cubes/active-voxels.frag'
  18. /** name for shared framebuffer used for gpu marching cubes operations */
  19. const FramebufferName = 'marching-cubes-active-voxels'
  20. const ActiveVoxelsSchema = {
  21. ...QuadSchema,
  22. tTriCount: TextureSpec('image-uint8', 'alpha', 'ubyte', 'nearest'),
  23. tVolumeData: TextureSpec('texture', 'rgba', 'ubyte', 'nearest'),
  24. uIsoValue: UniformSpec('f'),
  25. uGridDim: UniformSpec('v3'),
  26. uGridTexDim: UniformSpec('v3'),
  27. uScale: UniformSpec('v2'),
  28. }
  29. function getActiveVoxelsRenderable(ctx: WebGLContext, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, isoValue: number, scale: Vec2) {
  30. const values: Values<typeof ActiveVoxelsSchema> = {
  31. ...QuadValues,
  32. uQuadScale: ValueCell.create(scale),
  33. tTriCount: ValueCell.create(getTriCount()),
  34. tVolumeData: ValueCell.create(volumeData),
  35. uIsoValue: ValueCell.create(isoValue),
  36. uGridDim: ValueCell.create(gridDim),
  37. uGridTexDim: ValueCell.create(gridTexDim),
  38. uScale: ValueCell.create(scale),
  39. }
  40. const schema = { ...ActiveVoxelsSchema }
  41. const shaderCode = ShaderCode(quad_vert, active_voxels_frag)
  42. const renderItem = createComputeRenderItem(ctx, 'triangles', shaderCode, schema, values)
  43. return createComputeRenderable(renderItem, values);
  44. }
  45. function setRenderingDefaults(ctx: WebGLContext) {
  46. const { gl, state } = ctx
  47. state.disable(gl.CULL_FACE)
  48. state.disable(gl.BLEND)
  49. state.disable(gl.DEPTH_TEST)
  50. state.disable(gl.SCISSOR_TEST)
  51. state.depthMask(false)
  52. state.colorMask(true, true, true, true)
  53. state.clearColor(0, 0, 0, 0)
  54. }
  55. export function calcActiveVoxels(ctx: WebGLContext, volumeData: Texture, gridDim: Vec3, gridTexDim: Vec3, isoValue: number, gridScale: Vec2) {
  56. const { gl, framebufferCache } = ctx
  57. const { width, height } = volumeData
  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, volumeData, gridDim, gridTexDim, isoValue, gridScale)
  63. ctx.state.currentRenderItemId = -1
  64. activeVoxelsTex.attachFramebuffer(framebuffer, 0)
  65. setRenderingDefaults(ctx)
  66. gl.viewport(0, 0, width, height)
  67. renderable.render()
  68. // console.log('gridScale', gridScale, 'gridTexDim', gridTexDim, 'gridDim', gridDim)
  69. // console.log('volumeData', volumeData)
  70. // console.log('at', readTexture(ctx, activeVoxelsTex))
  71. gl.finish()
  72. return activeVoxelsTex
  73. }