threepipe
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

EditorViewWidgetPlugin.ts 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import {AViewerPluginSync, type IViewerEvent, ThreeViewer} from '../../viewer'
  2. import {DomPlacement, GizmoOrientation, ViewHelper2} from '../../three'
  3. import {uiFolderContainer, uiToggle} from 'uiconfig.js'
  4. import {onChange} from 'ts-browser-helpers'
  5. @uiFolderContainer('Editor View Widget')
  6. export class EditorViewWidgetPlugin extends AViewerPluginSync<''> {
  7. public static readonly PluginType = 'EditorViewWidgetPlugin'
  8. @uiToggle()
  9. @onChange(EditorViewWidgetPlugin.prototype.setDirty)
  10. enabled = true
  11. setDirty() {
  12. if (!this._viewer || !this.widget) return
  13. this.widget.domContainer.style.display = !this.isDisabled() ? 'block' : 'none'
  14. }
  15. constructor(public readonly placement: DomPlacement = 'top-left', public readonly size = 128) {
  16. super()
  17. }
  18. widget?: ViewHelper2
  19. onAdded(v: ThreeViewer) {
  20. super.onAdded(v)
  21. this.widget = new ViewHelper2(v.scene.mainCamera as any, v.canvas, this.placement, this.size)
  22. this.widget.target = v.scene.mainCamera.target
  23. this.widget.addEventListener('animating-changed', (e)=>{
  24. const val = e.detail.value
  25. v.scene.mainCamera.setInteractions(!val, EditorViewWidgetPlugin.PluginType)
  26. })
  27. this.widget.addEventListener('update', ()=>this._needsRender = true) // when mouse hover and leave.
  28. v.scene.addEventListener('mainCameraChange', this._mainCameraChange)
  29. v.scene.addEventListener('mainCameraUpdate', this._mainCameraUpdate)
  30. }
  31. onRemove(viewer: ThreeViewer) {
  32. this.widget?.dispose()
  33. this.widget = undefined
  34. viewer.scene.removeEventListener('mainCameraChange', this._mainCameraChange)
  35. viewer.scene.removeEventListener('mainCameraUpdate', this._mainCameraUpdate)
  36. super.onRemove(viewer)
  37. }
  38. protected _mainCameraChange() {
  39. if (!this._viewer || !this.widget) return
  40. this.widget.camera = this._viewer.scene.mainCamera as any
  41. }
  42. protected _mainCameraUpdate() {
  43. if (!this._viewer || !this.widget) return
  44. this.widget.target = this._viewer.scene.mainCamera.target
  45. }
  46. // this is required separately so that when we hover on the gizmo we dont need to set dirty for the whole viewer
  47. protected _needsRender = false
  48. protected _viewerListeners = {
  49. postRender: (_: IViewerEvent)=>{
  50. if (!this._viewer || !this.widget || this.isDisabled()) return
  51. this._needsRender = true
  52. },
  53. postFrame: (_: IViewerEvent)=>{
  54. if (!this._viewer || !this.widget || this.isDisabled() || !this._needsRender) return
  55. this.widget.update()
  56. this.widget.render()
  57. if (this.widget.animating) this._viewer.scene.mainCamera.setDirty()
  58. this._needsRender = false
  59. },
  60. }
  61. setOrientation(orientation: GizmoOrientation) {
  62. if (!this.widget) return
  63. this.widget.setOrientation(orientation)
  64. }
  65. }