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ů.

VirtualCamerasPlugin.ts 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import {AViewerPluginSync} from '../../viewer'
  2. import {IRenderTarget} from '../../rendering'
  3. import {ICamera} from '../../core'
  4. import {uiFolderContainer, uiToggle} from 'uiconfig.js'
  5. export interface VirtualCamera {
  6. camera: ICamera
  7. target: IRenderTarget
  8. enabled: boolean
  9. }
  10. @uiFolderContainer('Virtual Cameras')
  11. export class VirtualCamerasPlugin extends AViewerPluginSync<''> {
  12. public static readonly PluginType = 'VirtualCamerasPlugin'
  13. @uiToggle()
  14. enabled = true
  15. toJSON: any = undefined // disable serialization
  16. constructor(enabled = true) {
  17. super()
  18. this.enabled = enabled
  19. }
  20. cameras: VirtualCamera[] = []
  21. protected _viewerListeners = {
  22. preRender: () => {
  23. if (!this.enabled || !this._viewer) return
  24. const viewer = this._viewer
  25. for (const v of this.cameras) {
  26. if (!v.enabled) continue
  27. const camera = v.camera
  28. try {
  29. viewer.scene.renderCamera = camera
  30. viewer.renderManager.render(viewer.scene, false)
  31. const source = viewer.renderManager.composer.readBuffer.texture
  32. viewer.renderManager.blit(v.target, {source})
  33. } catch (e: any) {
  34. viewer.console.error(e)
  35. v.enabled = false
  36. if (viewer.debug) throw e
  37. }
  38. }
  39. },
  40. }
  41. addCamera(camera: ICamera) {
  42. if (!this._viewer) throw 'Plugin not added to viewer'
  43. const target = this._viewer.renderManager.composerTarget.clone(true)
  44. target.name = camera.name + '_virtualCamTarget'
  45. const vCam: VirtualCamera = {camera, target, enabled: true}
  46. this.cameras.push(vCam)
  47. // todo: track for jitter in progressive or something else for jittering
  48. return vCam
  49. }
  50. }