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

ExtendedShaderPass.ts 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import {IPass} from './Pass'
  2. import {ShaderPass} from 'three/examples/jsm/postprocessing/ShaderPass.js'
  3. import {ExtendedShaderMaterial, IWebGLRenderer, ShaderMaterial2} from '../core'
  4. import {Shader, ShaderMaterialParameters, WebGLMultipleRenderTargets, WebGLRenderTarget} from 'three'
  5. import {uiToggle} from 'uiconfig.js'
  6. import {serialize} from 'ts-browser-helpers'
  7. import {IShaderPropertiesUpdater} from '../materials'
  8. export class ExtendedShaderPass extends ShaderPass implements IPass {
  9. public static readonly DEFAULT_TEX_ID = 'tDiffuse'
  10. material!: ShaderMaterial2
  11. overrideReadBuffer: WebGLRenderTarget|null = null
  12. readonly isExtendedShaderPass = true
  13. // private _textureIDs: string[]
  14. @uiToggle('Enabled') @serialize() enabled = true
  15. constructor(shader: ShaderMaterial2|ShaderMaterialParameters, ...textureID: string[]) {
  16. super(
  17. (<ShaderMaterial2>shader).isMaterial ? <ShaderMaterial2>shader : new ExtendedShaderMaterial(<ShaderMaterialParameters>shader, textureID),
  18. textureID.length < 1 ? ExtendedShaderPass.DEFAULT_TEX_ID : textureID[0])
  19. this.setDirty = this.setDirty.bind(this)
  20. }
  21. render(renderer: IWebGLRenderer, writeBuffer?: WebGLMultipleRenderTargets|WebGLRenderTarget|null, readBuffer?: WebGLMultipleRenderTargets|WebGLRenderTarget, deltaTime?: number, maskActive?: boolean) {
  22. if (!this.enabled) return
  23. renderer.renderWithModes({
  24. backgroundRender: false,
  25. }, ()=>{
  26. super.render(renderer, writeBuffer || null, this.overrideReadBuffer || readBuffer, deltaTime, maskActive)
  27. })
  28. }
  29. updateShaderProperties(updater?: (IShaderPropertiesUpdater|undefined) | (IShaderPropertiesUpdater|undefined)[]) {
  30. if (!updater) return
  31. if (!Array.isArray(updater)) updater = [updater]
  32. updater.forEach(value => value?.updateShaderProperties(this.material))
  33. }
  34. public onDirty: (()=>void)[] = []
  35. dispose() {
  36. this.material?.dispose?.()
  37. this.fsQuad?.dispose?.()
  38. this.onDirty = []
  39. }
  40. setDirty() {
  41. this.onDirty.forEach(v=>v())
  42. }
  43. // legacy
  44. /**
  45. * @deprecated renamed to {@link isExtendedShaderPass}
  46. */
  47. get isShaderPass2() {
  48. console.error('isShaderPass2 is deprecated, use isExtendedShaderPass instead')
  49. return true
  50. }
  51. }
  52. /**
  53. * @deprecated renamed to {@link ExtendedShaderPass}
  54. */
  55. export class ShaderPass2 extends ExtendedShaderPass {
  56. constructor(shader: Shader|ShaderMaterial2, ...textureID: string[]) {
  57. console.error('ShaderPass2 is renamed to ExtendedShaderPass')
  58. super(shader, ...textureID)
  59. }
  60. }