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

ViewerRenderManager.ts 3.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import {IRenderTarget, RenderManager} from '../rendering'
  2. import {HalfFloatType, LinearMipMapLinearFilter, NoColorSpace, RGBM16ColorSpace, UnsignedByteType} from 'three'
  3. import {IRenderManagerEvent, IRenderManagerOptions, IScene} from '../core'
  4. import {ExtendedRenderPass, ScreenPass, TViewerScreenShader} from '../postprocessing'
  5. import {uiFolderContainer, UiObjectConfig} from 'uiconfig.js'
  6. import {MaterialExtension} from '../materials'
  7. import {onChange3} from 'ts-browser-helpers'
  8. export interface ViewerRenderManagerOptions extends IRenderManagerOptions {
  9. rgbm?: boolean,
  10. msaa?: boolean | number,
  11. depthBuffer?: boolean,
  12. zPrepass?: boolean,
  13. screenShader?: TViewerScreenShader
  14. }
  15. @uiFolderContainer('Render Manager')
  16. export class ViewerRenderManager extends RenderManager<IRenderManagerEvent, 'gbufferUnpackExtensionChanged'> {
  17. readonly rgbm: boolean
  18. readonly msaa: boolean | number
  19. readonly depthBuffer: boolean
  20. readonly zPrepass: boolean
  21. readonly renderPass: ExtendedRenderPass
  22. readonly screenPass: ScreenPass
  23. declare uiConfig: UiObjectConfig
  24. constructor({rgbm = true, msaa = false, depthBuffer = false, ...options}: ViewerRenderManagerOptions) {
  25. super({
  26. ...options,
  27. targetOptions: {
  28. samples: msaa ? typeof msaa !== 'number' ? 4 : msaa : 0,
  29. colorSpace: rgbm ? RGBM16ColorSpace : NoColorSpace,
  30. type: rgbm ? UnsignedByteType : HalfFloatType,
  31. depthBuffer: depthBuffer,
  32. generateMipmaps: msaa ? true : undefined, // todo: hack for now, fix blurTransmissionTarget in ExtendedRenderPass
  33. minFilter: msaa ? LinearMipMapLinearFilter : undefined, // todo: hack for now, fix blurTransmissionTarget in ExtendedRenderPass
  34. },
  35. })
  36. this.rgbm = rgbm
  37. this.msaa = msaa && this.isWebGL2
  38. this.depthBuffer = depthBuffer
  39. this.zPrepass = options.zPrepass || false
  40. let doTransmissionFix = true // const for debugging, todo could be made into a static prop maybe?
  41. if (!this._renderer.userData) {
  42. doTransmissionFix = false
  43. this._renderer.userData = {__isIWebGLRenderer: true}
  44. }
  45. this._renderer.userData.renderTransmissionPass = !doTransmissionFix // hack. used in WebGLRenderer.js
  46. this.renderPass = new ExtendedRenderPass(this)
  47. this.screenPass = new ScreenPass(options.screenShader || '')
  48. this.registerPass(this.renderPass)
  49. this.registerPass(this.screenPass)
  50. }
  51. /**
  52. * Reference to the gbuffer target, if it exists. This can be set by plugins like {@link DepthBufferPlugin}, {@link GBufferPlugin}
  53. */
  54. gbufferTarget: IRenderTarget | undefined
  55. /**
  56. * The extension that can be used to upload and unpack the values in gbuffer target(s), if it exists. This can be set by plugins like {@link DepthBufferPlugin}, {@link GBufferPlugin}
  57. * Note: this should not be changed after set by some plugin.
  58. */
  59. @onChange3(ViewerRenderManager.prototype._gbufferUnpackExtensionChanged)
  60. gbufferUnpackExtension: MaterialExtension | undefined
  61. private _gbufferUnpackExtensionChanged(params: any) {
  62. this.dispatchEvent({type: 'gbufferUnpackExtensionChanged', ...params})
  63. }
  64. render(scene: IScene, renderToScreen?: boolean): void {
  65. const cbf = this.screenPass.clipBackgroundForce
  66. if (this.rgbm) {
  67. const val = !scene.background && !scene.backgroundColor
  68. if (val !== cbf) this.screenPass.clipBackgroundForce = val
  69. }
  70. super.render(scene, renderToScreen)
  71. }
  72. }