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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import {IDisposable, PartialRecord} from 'ts-browser-helpers'
  2. import {Clock, Event, ShaderMaterial, Texture, Vector2, Vector4, WebGLRenderer, WebGLRenderTarget} from 'three'
  3. import {CreateRenderTargetOptions, IRenderTarget, RenderTargetManager} from '../rendering'
  4. import {IShaderPropertiesUpdater} from '../materials'
  5. import {EffectComposer2, IPassID, IPipelinePass} from '../postprocessing'
  6. import {IScene} from './IScene'
  7. import {BlobExt} from '../assetmanager'
  8. export type TThreeRendererMode = 'shadowMapRender' | 'backgroundRender' | 'sceneRender' | 'opaqueRender' | 'transparentRender' | 'transmissionRender' | 'mainRenderPass' | 'screenSpaceRendering'
  9. export type TThreeRendererModeUserData = PartialRecord<TThreeRendererMode, boolean>
  10. export interface IAnimationLoopEvent extends Event{
  11. renderer: IWebGLRenderer
  12. deltaTime: number
  13. time: number
  14. xrFrame?: XRFrame
  15. }
  16. export interface IRenderManagerUpdateEvent extends Event{
  17. change: 'registerPass' | 'unregisterPass' | 'useLegacyLights' | 'passRefresh' | 'size' | 'rebuild' | string
  18. data: any
  19. pass: IPipelinePass
  20. }
  21. export type IRenderManagerEvent = Partial<IAnimationLoopEvent>&Partial<IRenderManagerUpdateEvent>&Event & {
  22. [key: string]: any
  23. }
  24. export type IRenderManagerEventTypes = 'animationLoop'|'update'|'resize'|'contextLost'|'contextRestored'
  25. export interface IRenderManager<E extends IRenderManagerEvent = IRenderManagerEvent, ET extends string = IRenderManagerEventTypes> extends RenderTargetManager<E, ET>, IDisposable, IShaderPropertiesUpdater{
  26. readonly renderer: IWebGLRenderer
  27. readonly needsRender: boolean
  28. rebuildPipeline(setDirty?: boolean): void
  29. setSize(width: number, height: number): void
  30. render(scene: IScene): void
  31. reset(): void
  32. resetShadows(): void
  33. refreshPasses(): void
  34. registerPass(pass: IPipelinePass, replaceId?: boolean): void
  35. unregisterPass(pass: IPipelinePass): void
  36. readonly frameCount: number
  37. readonly totalFrameCount: number
  38. pipeline: IPassID[]
  39. composer: EffectComposer2
  40. readonly passes: IPipelinePass[]
  41. readonly isWebGL2: boolean
  42. readonly composerTarget: IRenderTarget
  43. readonly renderSize: Vector2
  44. renderScale: number
  45. readonly context: WebGLRenderingContext
  46. useLegacyLights: boolean
  47. webglRenderer: WebGLRenderer
  48. clock: Clock
  49. blit(destination: IRenderTarget|undefined|null, options?: {source?: Texture, viewport?: Vector4, material?: ShaderMaterial, clear?: boolean}): void
  50. clearColor({r, g, b, a, target, depth = true, stencil = true, viewport}:
  51. {r?: number, g?: number, b?: number, a?: number, target?: IRenderTarget, depth?: boolean, stencil?: boolean, viewport?: Vector4}): void
  52. renderTargetToDataUrl(target: WebGLRenderTarget, mimeType?: string, quality?: number): string
  53. renderTargetToBuffer(target: WebGLRenderTarget): Uint8Array|Uint16Array|Float32Array
  54. exportRenderTarget(target: WebGLRenderTarget, mimeType?: 'auto'|string): BlobExt
  55. }
  56. export interface IRenderManagerOptions {
  57. canvas: HTMLCanvasElement,
  58. alpha?: boolean, // default = true
  59. targetOptions?: CreateRenderTargetOptions
  60. rgbm?: boolean,
  61. msaa?: boolean,
  62. depthBuffer?: boolean,
  63. }
  64. export interface IWebGLRenderer<TManager extends IRenderManager=IRenderManager> extends WebGLRenderer {
  65. renderManager: TManager
  66. userData: TThreeRendererModeUserData & {
  67. // eslint-disable-next-line @typescript-eslint/naming-convention
  68. __isIWebGLRenderer: true
  69. [key: string]: any
  70. }
  71. renderWithModes(ud: TThreeRendererModeUserData, render: ()=>void): void
  72. // legacy
  73. /**
  74. * @deprecated use {@link renderManager} instead
  75. */
  76. baseRenderer?: IRenderManager
  77. }
  78. export function upgradeWebGLRenderer<TManager extends IRenderManager=IRenderManager>(this: IWebGLRenderer<TManager>, manager: TManager): IWebGLRenderer<TManager> {
  79. if (this.userData?.__isIWebGLRenderer) return this
  80. // eslint-disable-next-line @typescript-eslint/naming-convention
  81. if (!this.userData) this.userData = {__isIWebGLRenderer: true}
  82. this.userData.__isIWebGLRenderer = true
  83. if (!this.renderWithModes) this.renderWithModes = renderWithModes
  84. this.renderManager = manager
  85. // legacy
  86. if (!this.baseRenderer) {
  87. Object.defineProperty(this, 'baseRenderer', {
  88. get: ()=>{
  89. console.warn('IWebGLRenderer.baseRenderer is deprecated, use IWebGLRenderer.renderManager instead')
  90. return this.renderManager
  91. },
  92. })
  93. }
  94. return this
  95. }
  96. function renderWithModes(this: IWebGLRenderer, ud: TThreeRendererModeUserData, render: ()=>void) {
  97. const rud = this.userData
  98. const {backgroundRender, transparentRender, shadowMapRender, mainRenderPass, opaqueRender, transmissionRender, sceneRender, screenSpaceRendering} = rud
  99. if (ud.backgroundRender !== undefined) rud.backgroundRender = ud.backgroundRender
  100. if (ud.transparentRender !== undefined) rud.transparentRender = ud.transparentRender
  101. if (ud.shadowMapRender !== undefined) rud.shadowMapRender = ud.shadowMapRender
  102. if (ud.mainRenderPass !== undefined) rud.mainRenderPass = ud.mainRenderPass
  103. if (ud.opaqueRender !== undefined) rud.opaqueRender = ud.opaqueRender
  104. if (ud.sceneRender !== undefined) rud.sceneRender = ud.sceneRender
  105. if (ud.transmissionRender !== undefined) rud.transmissionRender = ud.transmissionRender
  106. if (ud.screenSpaceRendering !== undefined) rud.screenSpaceRendering = ud.screenSpaceRendering
  107. render()
  108. rud.backgroundRender = backgroundRender
  109. rud.transparentRender = transparentRender
  110. rud.shadowMapRender = shadowMapRender
  111. rud.mainRenderPass = mainRenderPass
  112. rud.opaqueRender = opaqueRender
  113. rud.sceneRender = sceneRender
  114. rud.transmissionRender = transmissionRender
  115. rud.screenSpaceRendering = screenSpaceRendering
  116. }
  117. /**
  118. * @deprecated renamed to {@link renderWithModes}, use {@link IWebGLRenderer.renderWithModes}
  119. */
  120. export const setThreeRendererMode = renderWithModes