renderable.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. }
  23. export interface Renderable<T extends RenderableValues> {
  24. readonly id: number
  25. readonly materialId: number
  26. readonly values: T
  27. readonly state: RenderableState
  28. render: (variant: GraphicsRenderVariant, sharedTexturesList?: Textures) => void
  29. getProgram: (variant: GraphicsRenderVariant) => Program
  30. update: () => void
  31. dispose: () => void
  32. }
  33. export function createRenderable<T extends Values<RenderableSchema>>(renderItem: GraphicsRenderItem, values: T, state: RenderableState): Renderable<T> {
  34. return {
  35. id: getNextRenderableId(),
  36. materialId: renderItem.materialId,
  37. values,
  38. state,
  39. render: (variant: GraphicsRenderVariant, sharedTexturesList?: Textures) => {
  40. if (values.uAlpha && values.alpha) {
  41. ValueCell.updateIfChanged(values.uAlpha, clamp(values.alpha.ref.value * state.alphaFactor, 0, 1));
  42. }
  43. renderItem.render(variant, sharedTexturesList);
  44. },
  45. getProgram: (variant: GraphicsRenderVariant) => renderItem.getProgram(variant),
  46. update: () => renderItem.update(),
  47. dispose: () => renderItem.destroy()
  48. };
  49. }
  50. export type GraphicsRenderable = Renderable<RenderableValues & BaseValues>
  51. //
  52. export interface ComputeRenderable<T extends RenderableValues> {
  53. readonly id: number
  54. readonly values: T
  55. render: () => void
  56. update: () => void
  57. dispose: () => void
  58. }
  59. export function createComputeRenderable<T extends Values<RenderableSchema>>(renderItem: ComputeRenderItem, values: T): ComputeRenderable<T> {
  60. return {
  61. id: getNextRenderableId(),
  62. values,
  63. render: () => renderItem.render('compute'),
  64. update: () => renderItem.update(),
  65. dispose: () => renderItem.destroy()
  66. };
  67. }