threepipe
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

TweakpaneEditorPlugin.ts 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import {
  2. AViewerPlugin,
  3. AViewerPluginSync,
  4. Class,
  5. createDiv,
  6. createStyles,
  7. FullScreenPlugin,
  8. safeSetProperty,
  9. ThreeViewer,
  10. } from 'threepipe'
  11. import {setupFullscreenButton, setupUtilButtonsBar} from './util-buttons'
  12. import {setupWebGiLogo} from './logo'
  13. import styles from './TweakpaneEditorPlugin.css'
  14. import tippy from 'tippy.js'
  15. import tippyStyles from 'tippy.js/dist/tippy.css'
  16. import {TweakpaneUiPlugin} from '@threepipe/plugin-tweakpane'
  17. export class TweakpaneEditorPlugin extends AViewerPluginSync<string> {
  18. public static readonly PluginType: string = 'TweakpaneEditorPlugin'
  19. enabled = true
  20. dependencies = [TweakpaneUiPlugin, FullScreenPlugin]
  21. constructor() {
  22. super()
  23. }
  24. onAdded(viewer: ThreeViewer) {
  25. super.onAdded(viewer)
  26. createStyles(styles)
  27. createStyles(tippyStyles)
  28. tippy.setDefaultProps({
  29. theme: 'editor',
  30. duration: 300,
  31. arrow: true,
  32. appendTo: () => viewer.container, // for fullscreen
  33. })
  34. setupWebGiLogo(viewer)
  35. setupFullscreenButton(viewer)
  36. }
  37. private _selectedMode = 0
  38. modeKeys: string[] = []
  39. modePlugins: Class<AViewerPlugin>[][] = []
  40. modeDivs: (HTMLDivElement | undefined)[] = []
  41. // picking?: PickingPlugin
  42. uiPlugin?: TweakpaneUiPlugin
  43. loadPlugins(plugins: Record<string, Class<AViewerPlugin<any>>[]> = {}) {
  44. if (!this._viewer) throw new Error('Plugin not added to viewer.')
  45. setupUtilButtonsBar(this._viewer, Object.values(plugins).flat())
  46. // this.picking = viewer.getPlugin(PickingPlugin)
  47. this.uiPlugin = this._viewer.getPlugin(TweakpaneUiPlugin)!
  48. // Modes UI
  49. const buttonsContainer = createDiv({
  50. classList: ['mode-buttons-container', 'button-bar'],
  51. addToBody: true,
  52. })
  53. this.modeKeys = Object.keys(plugins)
  54. this.modePlugins = this.modeKeys.map(key => plugins[key])
  55. this.modeDivs = this.modeKeys.map((key, i) => {
  56. const d = createDiv({
  57. innerHTML: key, classList: ['mode-button', 'button-bar-button'],
  58. })
  59. d.onclick = () => this.setSelectedMode(i)
  60. buttonsContainer.appendChild(d)
  61. return d
  62. })
  63. // picking?.addEventListener('selectedObjectChanged', () => {
  64. // if (picking?.getSelectedObject() && !['Picking', 'Modifiers', 'Configurators'].includes(this.modeKeys[_selectedMode])) {
  65. // setSelectedMode(modePlugins.findIndex(o=>o.includes(PickingPlugin)))
  66. // }
  67. // })
  68. this.setSelectedMode(0)
  69. }
  70. setSelectedMode(mode: number) {
  71. this._selectedMode = mode
  72. // if (picking) picking.enabled = true
  73. for (let i = 0; i < this.modePlugins.length; i++) {
  74. const plugins = this.modePlugins[i].map(p => this._viewer?.getPlugin(p))
  75. const visible = i === mode
  76. for (const plugin of plugins) {
  77. if (!plugin?.uiConfig) continue
  78. if (!plugin.uiConfig.uiRef) this.uiPlugin?.setupPluginUi(plugin)
  79. safeSetProperty(plugin.uiConfig, 'hidden', !visible, true)
  80. }
  81. }
  82. for (let i = 0; i < this.modeKeys.length; i++) {
  83. this.modeDivs[i]?.classList[this._selectedMode !== i ? 'remove' : 'add']('mode-button-selected', 'button-bar-selected')
  84. }
  85. // this._viewer.setDirty()
  86. this.uiPlugin?.refreshPluginsEnabled()
  87. // todo: expand the ui if collapsed
  88. }
  89. }