-
Notifications
You must be signed in to change notification settings - Fork 12
/
ExtendedShaderPass.ts
80 lines (65 loc) · 2.85 KB
/
ExtendedShaderPass.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import {IPass} from './Pass'
import {ShaderPass} from 'three/examples/jsm/postprocessing/ShaderPass.js'
import {ExtendedShaderMaterial, IWebGLRenderer, ShaderMaterial2} from '../core'
import {Shader, ShaderMaterialParameters, WebGLMultipleRenderTargets, WebGLRenderTarget} from 'three'
import {uiToggle} from 'uiconfig.js'
import {serialize} from 'ts-browser-helpers'
import {IShaderPropertiesUpdater} from '../materials'
export class ExtendedShaderPass extends ShaderPass implements IPass {
public static readonly DEFAULT_TEX_ID = 'tDiffuse'
material!: ShaderMaterial2
overrideReadBuffer: {texture?: WebGLRenderTarget['texture']}|null = null
readonly isExtendedShaderPass = true
// private _textureIDs: string[]
@uiToggle('Enabled') @serialize() enabled = true
constructor(shader: ShaderMaterial2|ShaderMaterialParameters, ...textureID: string[]) {
super(
(<ShaderMaterial2>shader).isMaterial ? <ShaderMaterial2>shader : new ExtendedShaderMaterial(<ShaderMaterialParameters>shader, textureID),
textureID.length < 1 ? ExtendedShaderPass.DEFAULT_TEX_ID : textureID[0])
this.setDirty = this.setDirty.bind(this)
}
render(renderer: IWebGLRenderer, writeBuffer?: WebGLMultipleRenderTargets|WebGLRenderTarget|null, readBuffer?: WebGLMultipleRenderTargets|WebGLRenderTarget, deltaTime?: number, maskActive?: boolean) {
if (!this.enabled) return
renderer.renderWithModes({
backgroundRender: false,
}, ()=>{
super.render(renderer, writeBuffer || null, (this.overrideReadBuffer as WebGLRenderTarget) || readBuffer, deltaTime, maskActive)
})
}
/**
* to be called from beforeRender or onObjectRender or similar.
* @param updater
*/
updateShaderProperties(updater?: (IShaderPropertiesUpdater|undefined) | (IShaderPropertiesUpdater|undefined)[]) {
if (!updater) return
if (!Array.isArray(updater)) updater = [updater]
updater.forEach(value => value?.updateShaderProperties(this.material))
}
public onDirty: (()=>void)[] = []
dispose() {
this.material?.dispose?.()
this.fsQuad?.dispose?.()
this.onDirty = []
}
setDirty() {
this.material.needsUpdate = true // do this when material defines etc are changed
this.onDirty.forEach(v=>v())
}
// legacy
/**
* @deprecated renamed to {@link isExtendedShaderPass}
*/
get isShaderPass2() {
console.error('isShaderPass2 is deprecated, use isExtendedShaderPass instead')
return true
}
}
/**
* @deprecated renamed to {@link ExtendedShaderPass}
*/
export class ShaderPass2 extends ExtendedShaderPass {
constructor(shader: Shader|ShaderMaterial2, ...textureID: string[]) {
console.error('ShaderPass2 is renamed to ExtendedShaderPass')
super(shader, ...textureID)
}
}