renderable.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /**
  2. * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Program } from './webgl/program';
  7. import { RenderableValues, Values, RenderableSchema, BaseValues } from './renderable/schema';
  8. import { GraphicsRenderItem, ComputeRenderItem, GraphicsRenderVariant } from './webgl/render-item';
  9. import { ValueCell } from '../mol-util';
  10. import { idFactory } from '../mol-util/id-factory';
  11. import { clamp } from '../mol-math/interpolate';
  12. import { Textures } from './webgl/texture';
  13. const getNextRenderableId = idFactory();
  14. export type RenderableState = {
  15. disposed: boolean
  16. visible: boolean
  17. alphaFactor: number
  18. pickable: boolean
  19. colorOnly: boolean
  20. opaque: boolean
  21. writeDepth: boolean
  22. noClip: boolean
  23. }
  24. export interface Renderable<T extends RenderableValues> {
  25. readonly id: number
  26. readonly materialId: number
  27. readonly values: T
  28. readonly state: RenderableState
  29. render: (variant: GraphicsRenderVariant, sharedTexturesList?: Textures) => void
  30. getProgram: (variant: GraphicsRenderVariant) => Program
  31. update: () => void
  32. dispose: () => void
  33. }
  34. export function createRenderable<T extends Values<RenderableSchema>>(renderItem: GraphicsRenderItem, values: T, state: RenderableState): Renderable<T> {
  35. return {
  36. id: getNextRenderableId(),
  37. materialId: renderItem.materialId,
  38. values,
  39. state,
  40. render: (variant: GraphicsRenderVariant, sharedTexturesList?: Textures) => {
  41. if (values.uAlpha && values.alpha) {
  42. ValueCell.updateIfChanged(values.uAlpha, clamp(values.alpha.ref.value * state.alphaFactor, 0, 1));
  43. }
  44. renderItem.render(variant, sharedTexturesList);
  45. },
  46. getProgram: (variant: GraphicsRenderVariant) => renderItem.getProgram(variant),
  47. update: () => renderItem.update(),
  48. dispose: () => renderItem.destroy()
  49. };
  50. }
  51. export type GraphicsRenderable = Renderable<RenderableValues & BaseValues>
  52. //
  53. export interface ComputeRenderable<T extends RenderableValues> {
  54. readonly id: number
  55. readonly values: T
  56. render: () => void
  57. update: () => void
  58. dispose: () => void
  59. }
  60. export function createComputeRenderable<T extends Values<RenderableSchema>>(renderItem: ComputeRenderItem, values: T): ComputeRenderable<T> {
  61. return {
  62. id: getNextRenderableId(),
  63. values,
  64. render: () => renderItem.render('compute'),
  65. update: () => renderItem.update(),
  66. dispose: () => renderItem.destroy()
  67. };
  68. }