threepipe
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ExtendedShaderPass.ts 2.9KB

пре 3 година
пре 3 година
пре 3 година
пре 1 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
пре 3 година
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 {onChange2, 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. declare material: ShaderMaterial2
  11. overrideReadBuffer: {texture?: WebGLRenderTarget['texture']}|null = null
  12. readonly isExtendedShaderPass = true
  13. // private _textureIDs: string[]
  14. @uiToggle('Enabled') @serialize()
  15. @onChange2(ExtendedShaderPass.prototype.setDirty)
  16. enabled = true
  17. constructor(shader: ShaderMaterial2|ShaderMaterialParameters, ...textureID: string[]) {
  18. super(
  19. (<ShaderMaterial2>shader).isMaterial ? <ShaderMaterial2>shader : new ExtendedShaderMaterial(<ShaderMaterialParameters>shader, textureID),
  20. textureID.length < 1 ? ExtendedShaderPass.DEFAULT_TEX_ID : textureID[0])
  21. this.setDirty = this.setDirty.bind(this)
  22. }
  23. render(renderer: IWebGLRenderer, writeBuffer?: WebGLMultipleRenderTargets|WebGLRenderTarget|null, readBuffer?: WebGLMultipleRenderTargets|WebGLRenderTarget, deltaTime?: number, maskActive?: boolean) {
  24. if (!this.enabled) return
  25. renderer.renderWithModes({
  26. backgroundRender: false,
  27. }, ()=>{
  28. super.render(renderer, writeBuffer || null, (this.overrideReadBuffer as WebGLRenderTarget) || readBuffer, deltaTime, maskActive)
  29. })
  30. }
  31. /**
  32. * to be called from beforeRender or onObjectRender or similar.
  33. * @param updater
  34. */
  35. updateShaderProperties(updater?: (IShaderPropertiesUpdater|undefined) | (IShaderPropertiesUpdater|undefined)[]) {
  36. if (!updater) return
  37. if (!Array.isArray(updater)) updater = [updater]
  38. updater.forEach(value => value?.updateShaderProperties(this.material))
  39. }
  40. public onDirty: (()=>void)[] = []
  41. dispose() {
  42. this.material?.dispose?.()
  43. this.fsQuad?.dispose?.()
  44. this.onDirty = []
  45. }
  46. setDirty() {
  47. if (this.material) this.material.needsUpdate = true // do this when material defines etc are changed
  48. this.onDirty?.forEach(v=>v())
  49. }
  50. // legacy
  51. /**
  52. * @deprecated renamed to {@link isExtendedShaderPass}
  53. */
  54. get isShaderPass2() {
  55. console.error('isShaderPass2 is deprecated, use isExtendedShaderPass instead')
  56. return true
  57. }
  58. }
  59. /**
  60. * @deprecated renamed to {@link ExtendedShaderPass}
  61. */
  62. export class ShaderPass2 extends ExtendedShaderPass {
  63. constructor(shader: Shader|ShaderMaterial2, ...textureID: string[]) {
  64. console.error('ShaderPass2 is renamed to ExtendedShaderPass')
  65. super(shader, ...textureID)
  66. }
  67. }