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

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