render-object.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 { RenderableState, Renderable } from './renderable'
  7. import { RenderableValues } from './renderable/schema';
  8. import { idFactory } from '../mol-util/id-factory';
  9. import { WebGLContext } from './webgl/context';
  10. import { DirectVolumeValues, DirectVolumeRenderable } from './renderable/direct-volume';
  11. import { MeshValues, MeshRenderable } from './renderable/mesh';
  12. import { PointsValues, PointsRenderable } from './renderable/points';
  13. import { LinesValues, LinesRenderable } from './renderable/lines';
  14. import { SpheresValues, SpheresRenderable } from './renderable/spheres';
  15. import { TextValues, TextRenderable } from './renderable/text';
  16. import { TextureMeshValues, TextureMeshRenderable } from './renderable/texture-mesh';
  17. const getNextId = idFactory(0, 0x7FFFFFFF)
  18. export const getNextMaterialId = idFactory(0, 0x7FFFFFFF)
  19. export interface BaseRenderObject<T extends RenderableValues> { id: number, type: string, values: T, state: RenderableState, materialId: number }
  20. export interface MeshRenderObject extends BaseRenderObject<MeshValues> { type: 'mesh' }
  21. export interface PointsRenderObject extends BaseRenderObject<PointsValues> { type: 'points' }
  22. export interface SpheresRenderObject extends BaseRenderObject<SpheresValues> { type: 'spheres' }
  23. export interface TextRenderObject extends BaseRenderObject<TextValues> { type: 'text' }
  24. export interface LinesRenderObject extends BaseRenderObject<LinesValues> { type: 'lines' }
  25. export interface DirectVolumeRenderObject extends BaseRenderObject<DirectVolumeValues> { type: 'direct-volume' }
  26. export interface TextureMeshRenderObject extends BaseRenderObject<TextureMeshValues> { type: 'texture-mesh' }
  27. //
  28. export type GraphicsRenderObject = MeshRenderObject | PointsRenderObject | SpheresRenderObject | TextRenderObject | LinesRenderObject | DirectVolumeRenderObject | TextureMeshRenderObject
  29. export type RenderObjectKindType = {
  30. 'mesh': MeshRenderObject
  31. 'points': PointsRenderObject
  32. 'spheres': SpheresRenderObject
  33. 'text': TextRenderObject
  34. 'lines': LinesRenderObject
  35. 'direct-volume': DirectVolumeRenderObject
  36. 'texture-mesh': TextureMeshRenderObject
  37. }
  38. export type RenderObjectValuesType = {
  39. 'mesh': MeshValues
  40. 'points': PointsValues
  41. 'spheres': SpheresValues
  42. 'text': TextValues
  43. 'lines': LinesValues
  44. 'direct-volume': DirectVolumeValues
  45. 'texture-mesh': TextureMeshValues
  46. }
  47. export type RenderObjectType = keyof RenderObjectKindType
  48. //
  49. export function createRenderObject<T extends RenderObjectType>(type: T, values: RenderObjectValuesType[T], state: RenderableState, materialId: number): RenderObjectKindType[T] {
  50. return { id: getNextId(), type, values, state, materialId } as RenderObjectKindType[T]
  51. }
  52. export function createRenderable(ctx: WebGLContext, o: GraphicsRenderObject): Renderable<any> {
  53. switch (o.type) {
  54. case 'mesh': return MeshRenderable(ctx, o.id, o.values, o.state, o.materialId)
  55. case 'points': return PointsRenderable(ctx, o.id, o.values, o.state, o.materialId)
  56. case 'spheres': return SpheresRenderable(ctx, o.id, o.values, o.state, o.materialId)
  57. case 'text': return TextRenderable(ctx, o.id, o.values, o.state, o.materialId)
  58. case 'lines': return LinesRenderable(ctx, o.id, o.values, o.state, o.materialId)
  59. case 'direct-volume': return DirectVolumeRenderable(ctx, o.id, o.values, o.state, o.materialId)
  60. case 'texture-mesh': return TextureMeshRenderable(ctx, o.id, o.values, o.state, o.materialId)
  61. }
  62. }