direct-volume.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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 } 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 = {
  35. uObjectId: ValueCell.create(id)
  36. }
  37. const shaderCode = DirectVolumeShaderCode
  38. const renderItem = createRenderItem(ctx, 'triangles', shaderCode, schema, { ...values, ...internalValues })
  39. const renderable = createRenderable(renderItem, values, state);
  40. Object.defineProperty(renderable, 'opaque', { get: () => false });
  41. return renderable
  42. }