renderable.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /**
  2. * Copyright (c) 2018-2022 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. const getNextRenderableId = idFactory();
  13. export type RenderableState = {
  14. disposed: boolean
  15. visible: boolean
  16. alphaFactor: number
  17. pickable: boolean
  18. colorOnly: boolean
  19. opaque: boolean
  20. writeDepth: boolean
  21. }
  22. export interface Renderable<T extends RenderableValues> {
  23. readonly id: number
  24. readonly materialId: number
  25. readonly values: T
  26. readonly state: RenderableState
  27. render: (variant: GraphicsRenderVariant, sharedTexturesCount: number) => void
  28. getProgram: (variant: GraphicsRenderVariant) => Program
  29. update: () => void
  30. dispose: () => void
  31. }
  32. export function createRenderable<T extends Values<RenderableSchema>>(renderItem: GraphicsRenderItem, values: T, state: RenderableState): Renderable<T> {
  33. return {
  34. id: getNextRenderableId(),
  35. materialId: renderItem.materialId,
  36. values,
  37. state,
  38. render: (variant: GraphicsRenderVariant, sharedTexturesCount: number) => {
  39. if (values.uAlpha && values.alpha) {
  40. ValueCell.updateIfChanged(values.uAlpha, clamp(values.alpha.ref.value * state.alphaFactor, 0, 1));
  41. }
  42. renderItem.render(variant, sharedTexturesCount);
  43. },
  44. getProgram: (variant: GraphicsRenderVariant) => renderItem.getProgram(variant),
  45. update: () => renderItem.update(),
  46. dispose: () => renderItem.destroy()
  47. };
  48. }
  49. export type GraphicsRenderable = Renderable<RenderableValues & BaseValues>
  50. //
  51. export interface ComputeRenderable<T extends RenderableValues> {
  52. readonly id: number
  53. readonly values: T
  54. render: () => void
  55. update: () => void
  56. dispose: () => void
  57. }
  58. export function createComputeRenderable<T extends Values<RenderableSchema>>(renderItem: ComputeRenderItem, values: T): ComputeRenderable<T> {
  59. return {
  60. id: getNextRenderableId(),
  61. values,
  62. render: () => renderItem.render('compute', 0),
  63. update: () => renderItem.update(),
  64. dispose: () => renderItem.destroy()
  65. };
  66. }