threepipe
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

3 роки тому
3 роки тому
3 роки тому
3 роки тому
3 роки тому
3 роки тому
3 роки тому
3 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import {ISerializedConfig, ThreeViewer} from './ThreeViewer'
  2. import {Event, EventDispatcher} from 'three'
  3. import {SerializationMetaType, ThreeSerialization} from '../utils'
  4. import {IViewerPlugin, IViewerPluginAsync} from './IViewerPlugin'
  5. import {UiObjectConfig} from 'uiconfig.js'
  6. /**
  7. * Base Class for Viewer Plugins
  8. * @category Viewer
  9. */
  10. export abstract class AViewerPlugin<T extends string = string, TViewer extends ThreeViewer = ThreeViewer, IsSync extends boolean = boolean> extends EventDispatcher<Event, T|'serialize'|'deserialize'> implements IViewerPlugin<TViewer, IsSync> {
  11. declare ['constructor']: typeof AViewerPlugin
  12. public static readonly PluginType: string = 'AViewerPlugin'
  13. protected _dirty = false
  14. uiConfig?: UiObjectConfig = undefined // todo: this should work when uncommented, remove all get uiConfig and do it properly
  15. protected _viewer?: TViewer
  16. // this is just a property, not an indicator that a plugin is used, to disable a plugin, just remove it from the viewer
  17. abstract enabled: boolean
  18. abstract onAdded(viewer: TViewer): IsSync extends false ? Promise<void> : void
  19. abstract onRemove(viewer: TViewer): IsSync extends false ? Promise<void> : void
  20. dispose(): void {
  21. return
  22. }
  23. toJSON(meta?: SerializationMetaType): ISerializedConfig {
  24. const data: any = ThreeSerialization.Serialize(this, meta, true)
  25. data.type = (this as any).constructor.PluginType
  26. data.assetType = 'config'
  27. this.dispatchEvent({type: 'serialize', data})
  28. return data
  29. }
  30. fromJSON(data: ISerializedConfig, meta?: SerializationMetaType): this|null|Promise<this|null> {
  31. if (data.type !== this.constructor.PluginType)
  32. return null
  33. ThreeSerialization.Deserialize(data, this, meta, true)
  34. this.dispatchEvent({type: 'deserialize', data, meta})
  35. return this
  36. }
  37. protected _storeKey(prefix?: string) {
  38. return (prefix ?? 'webgi') + '_' + (this.constructor.PluginType || this.constructor.name)
  39. }
  40. exportState() {
  41. return this._viewer?.exportPluginConfig(this) ?? this.toJSON?.()
  42. }
  43. async importState(state: any) {
  44. if (this._viewer) await this._viewer.importPluginConfig(state, this)
  45. else this.fromJSON?.(state)
  46. }
  47. // todo: move to ThreeViewer
  48. // storeState(prefix?: string, storage?: Storage, data?: any): void {
  49. // storage = storage || (window ? window.localStorage : undefined)
  50. // if (!storage) {
  51. // console.warn('Unable to store state')
  52. // return
  53. // }
  54. // if (data === undefined) data = this.exportState()
  55. // if (data) storage.setItem(this._storeKey(prefix), JSON.stringify(data))
  56. // }
  57. //
  58. // async loadState(prefix?: string, storage?: Storage): Promise<void> {
  59. // storage = storage || (window ? window.localStorage : undefined)
  60. // if (!storage) {
  61. // console.warn('Unable to load state')
  62. // return
  63. // }
  64. // const data = storage.getItem(this._storeKey(prefix))
  65. // if (data) await this.importState(JSON.parse(data))
  66. // }
  67. get dirty(): boolean {
  68. return this.enabled && this._dirty
  69. }
  70. set dirty(value: boolean) {
  71. this._dirty = value
  72. }
  73. /**
  74. * Template
  75. toJSON(meta?: any): any {
  76. const data = super.toJSON(meta)
  77. if (!data.type) return data
  78. // add here
  79. return data
  80. }
  81. fromJSON(data: any, meta?: any): this | null {
  82. if (!super.fromJSON(data, meta)) return null
  83. // add here
  84. return this
  85. }
  86. */
  87. }
  88. /**
  89. * Base Class for Sync Viewer Plugins
  90. * @category Viewer
  91. */
  92. export abstract class AViewerPluginSync<T extends string, TViewer extends ThreeViewer = ThreeViewer> extends AViewerPlugin<T, TViewer, true> {
  93. declare ['constructor']: (typeof AViewerPluginSync) & (typeof AViewerPlugin)
  94. onAdded(viewer: TViewer): void {
  95. this._viewer = viewer
  96. }
  97. onRemove(viewer: TViewer): void {
  98. if (this._viewer !== viewer) viewer.console.error('Wrong viewer')
  99. this._viewer = undefined
  100. }
  101. }
  102. /**
  103. * Base Class for Async Viewer Plugins
  104. * @category Viewer
  105. */
  106. export abstract class AViewerPluginAsync<T extends string, TViewer extends ThreeViewer = ThreeViewer> extends AViewerPlugin<T, TViewer, false> implements IViewerPluginAsync<TViewer> {
  107. declare ['constructor']: (typeof AViewerPluginAsync) & (typeof AViewerPlugin)
  108. async onAdded(viewer: TViewer): Promise<void> {
  109. this._viewer = viewer
  110. }
  111. async onRemove(viewer: TViewer): Promise<void> {
  112. if (this._viewer !== viewer) viewer.console.error('Wrong viewer')
  113. this._viewer = undefined
  114. }
  115. }