scene.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { PointRenderable, MeshRenderable, Renderable } from './renderable'
  7. import { ValueCell } from 'mol-util';
  8. import { Context } from './webgl/context';
  9. let _renderObjectId = 0;
  10. function getNextId() {
  11. return _renderObjectId++ % 0x7FFFFFFF;
  12. }
  13. export type RenderData = { [k: string]: ValueCell<Helpers.TypedArray> }
  14. export interface BaseRenderObject { id: number, type: string, props: {}, visible: boolean }
  15. export interface MeshRenderObject extends BaseRenderObject { type: 'mesh', props: MeshRenderable.Props }
  16. export interface PointRenderObject extends BaseRenderObject { type: 'point', props: PointRenderable.Props }
  17. export type RenderObject = MeshRenderObject | PointRenderObject
  18. export function createMeshRenderObject(props: MeshRenderable.Props): MeshRenderObject {
  19. return { id: getNextId(), type: 'mesh', props, visible: true }
  20. }
  21. export function createPointRenderObject(props: PointRenderable.Props): PointRenderObject {
  22. return { id: getNextId(), type: 'point', props, visible: true }
  23. }
  24. export function createRenderable(ctx: Context, o: RenderObject) {
  25. switch (o.type) {
  26. case 'mesh': return MeshRenderable.create(ctx, o.props)
  27. case 'point': return PointRenderable.create(ctx, o.props)
  28. }
  29. }
  30. interface Scene {
  31. add: (o: RenderObject) => void
  32. remove: (o: RenderObject) => void
  33. clear: () => void
  34. forEach: (callbackFn: (value: Renderable<any>, key: RenderObject) => void) => void
  35. count: number
  36. }
  37. namespace Scene {
  38. export function create(ctx: Context): Scene {
  39. const renderableMap = new Map<RenderObject, Renderable<any>>()
  40. return {
  41. add: (o: RenderObject) => {
  42. if (!renderableMap.has(o)) {
  43. renderableMap.set(o, createRenderable(ctx, o))
  44. } else {
  45. console.warn(`RenderObject with id '${o.id}' already present`)
  46. }
  47. },
  48. remove: (o: RenderObject) => {
  49. const renderable = renderableMap.get(o)
  50. if (renderable) {
  51. renderable.dispose()
  52. renderableMap.delete(o)
  53. }
  54. },
  55. clear: () => {
  56. renderableMap.forEach(renderable => renderable.dispose())
  57. renderableMap.clear()
  58. },
  59. forEach: (callbackFn: (value: Renderable<any>, key: RenderObject) => void) => {
  60. renderableMap.forEach(callbackFn)
  61. },
  62. get count() {
  63. return renderableMap.size
  64. }
  65. }
  66. }
  67. }
  68. export default Scene