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

VirtualCamerasPlugin.ts 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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<'preRenderCamera' | 'preBlitCamera' | 'postRenderCamera'> {
  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.isDisabled() || !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. this.dispatchEvent({type: 'preRenderCamera', camera: v})
  30. viewer.scene.renderCamera = camera
  31. viewer.renderManager.render(viewer.scene, false)
  32. const source = viewer.renderManager.composer.readBuffer.texture
  33. this.dispatchEvent({type: 'preBlitCamera', camera: v, readBuffer: source})
  34. viewer.renderManager.blit(v.target, {source})
  35. this.dispatchEvent({type: 'postRenderCamera', camera: v})
  36. } catch (e: any) {
  37. viewer.console.error(e)
  38. v.enabled = false
  39. if (viewer.debug) throw e
  40. }
  41. }
  42. },
  43. }
  44. addCamera(camera: ICamera) {
  45. if (!this._viewer) throw 'Plugin not added to viewer'
  46. const target = this._viewer.renderManager.composerTarget.clone(true)
  47. target.name = camera.name + '_virtualCamTarget'
  48. const vCam: VirtualCamera = {camera, target, enabled: true}
  49. this.cameras.push(vCam)
  50. // todo: track for jitter in progressive or something else for jittering
  51. return vCam
  52. }
  53. }