direct-volume.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Renderable, RenderableState, createRenderable } from '../renderable'
  7. import { Context } from '../webgl/context';
  8. import { createRenderItem } from '../webgl/render-item';
  9. import { AttributeSpec, Values, UniformSpec, GlobalUniformSchema, InternalSchema, TextureSpec, ValueSpec, ElementsSpec, DefineSpec, InternalValues } from './schema';
  10. import { DirectVolumeShaderCode } from '../shader-code';
  11. import { ValueCell } from 'mol-util';
  12. export const DirectVolumeSchema = {
  13. drawCount: ValueSpec('number'),
  14. instanceCount: ValueSpec('number'),
  15. aPosition: AttributeSpec('float32', 3, 0),
  16. elements: ElementsSpec('uint32'),
  17. uAlpha: UniformSpec('f'),
  18. dUseFog: DefineSpec('boolean'),
  19. uIsoValue: UniformSpec('f'),
  20. uBboxMin: UniformSpec('v3'),
  21. uBboxMax: UniformSpec('v3'),
  22. uBboxSize: UniformSpec('v3'),
  23. uTransform: UniformSpec('m4'),
  24. uGridDim: UniformSpec('v3'),
  25. uGridTexDim: UniformSpec('v2'),
  26. tGridTex: TextureSpec('rgba', 'ubyte', 'linear'),
  27. dRenderMode: DefineSpec('string', ['isosurface', 'volume']),
  28. tTransferTex: TextureSpec('rgba', 'ubyte', 'linear'),
  29. }
  30. export type DirectVolumeSchema = typeof DirectVolumeSchema
  31. export type DirectVolumeValues = Values<DirectVolumeSchema>
  32. export function DirectVolumeRenderable(ctx: Context, id: number, values: DirectVolumeValues, state: RenderableState): Renderable<DirectVolumeValues> {
  33. const schema = { ...GlobalUniformSchema, ...InternalSchema, ...DirectVolumeSchema }
  34. const internalValues: InternalValues = {
  35. dWebGL2: ValueCell.create(ctx.isWebGL2),
  36. uObjectId: ValueCell.create(id)
  37. }
  38. const shaderCode = DirectVolumeShaderCode
  39. const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues })
  40. const renderable = createRenderable(renderItem, values, state);
  41. Object.defineProperty(renderable, 'opaque', { get: () => false });
  42. return renderable
  43. }