renderable.ts 2.4 KB

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