render-object.ts 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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 { RenderableState, Renderable } from './renderable';
  7. import { idFactory } from '../mol-util/id-factory';
  8. import { WebGLContext } from './webgl/context';
  9. import { DirectVolumeValues, DirectVolumeRenderable } from './renderable/direct-volume';
  10. import { MeshValues, MeshRenderable } from './renderable/mesh';
  11. import { PointsValues, PointsRenderable } from './renderable/points';
  12. import { LinesValues, LinesRenderable } from './renderable/lines';
  13. import { SpheresValues, SpheresRenderable } from './renderable/spheres';
  14. import { TextValues, TextRenderable } from './renderable/text';
  15. import { TextureMeshValues, TextureMeshRenderable } from './renderable/texture-mesh';
  16. import { ImageValues, ImageRenderable } from './renderable/image';
  17. const getNextId = idFactory(0, 0x7FFFFFFF);
  18. export const getNextMaterialId = idFactory(0, 0x7FFFFFFF);
  19. export interface GraphicsRenderObject<T extends RenderObjectType = RenderObjectType> {
  20. readonly id: number,
  21. readonly type: T,
  22. readonly values: RenderObjectValues<T>,
  23. readonly state: RenderableState,
  24. readonly materialId: number
  25. }
  26. export type RenderObjectType = 'mesh' | 'points' | 'spheres' | 'text' | 'lines' | 'direct-volume' | 'image' | 'texture-mesh'
  27. export type RenderObjectValues<T extends RenderObjectType> =
  28. T extends 'mesh' ? MeshValues :
  29. T extends 'points' ? PointsValues :
  30. T extends 'spheres' ? SpheresValues :
  31. T extends 'text' ? TextValues :
  32. T extends 'lines' ? LinesValues :
  33. T extends 'direct-volume' ? DirectVolumeValues :
  34. T extends 'image' ? ImageValues :
  35. T extends 'texture-mesh' ? TextureMeshValues : never
  36. //
  37. export function createRenderObject<T extends RenderObjectType>(type: T, values: RenderObjectValues<T>, state: RenderableState, materialId: number): GraphicsRenderObject<T> {
  38. return { id: getNextId(), type, values, state, materialId } as GraphicsRenderObject<T>;
  39. }
  40. export function createRenderable<T extends RenderObjectType>(ctx: WebGLContext, o: GraphicsRenderObject<T>): Renderable<any> {
  41. switch (o.type) {
  42. case 'mesh': return MeshRenderable(ctx, o.id, o.values as MeshValues, o.state, o.materialId);
  43. case 'points': return PointsRenderable(ctx, o.id, o.values as PointsValues, o.state, o.materialId);
  44. case 'spheres': return SpheresRenderable(ctx, o.id, o.values as SpheresValues, o.state, o.materialId);
  45. case 'text': return TextRenderable(ctx, o.id, o.values as TextValues, o.state, o.materialId);
  46. case 'lines': return LinesRenderable(ctx, o.id, o.values as LinesValues, o.state, o.materialId);
  47. case 'direct-volume': return DirectVolumeRenderable(ctx, o.id, o.values as DirectVolumeValues, o.state, o.materialId);
  48. case 'image': return ImageRenderable(ctx, o.id, o.values as ImageValues, o.state, o.materialId);
  49. case 'texture-mesh': return TextureMeshRenderable(ctx, o.id, o.values as TextureMeshValues, o.state, o.materialId);
  50. }
  51. throw new Error('unsupported type');
  52. }