threepipe
Version:
A modern 3D viewer framework built on top of three.js, written in TypeScript, designed to make creating high-quality, modular, and extensible 3D experiences on the web simple and enjoyable.
78 lines (65 loc) • 2.22 kB
text/typescript
import {uiColor, uiFolderContainer, uiSlider, uiToggle} from 'uiconfig.js'
import {Color} from 'three'
import {glsl, onChange, serialize} from 'ts-browser-helpers'
import {uniform} from '../../three'
import vignette from './shaders/VignettePlugin.glsl'
import {AScreenPassExtensionPlugin} from './AScreenPassExtensionPlugin'
/**
* Vignette Plugin
*
* Adds an extension to {@link ScreenPass} material
* for applying vignette effect on the final buffer before rendering to screen.
* The power of the vignette can be controlled with the `power` property.
* The color of the vignette can be controlled with the `color`(previously `bgcolor`) property.
*
* @category Plugins
*/
('Vignette')
export class VignettePlugin extends AScreenPassExtensionPlugin {
static readonly PluginType = 'Vignette'
readonly extraUniforms = {
power: {value: 1},
bgcolor: {value: new Color()},
} as const
(VignettePlugin.prototype.setDirty)
('Enable')
() enabled: boolean
('Power', [0.1, 4], 0.01)
({propKey: 'power'})
() power = 0.5
<VignettePlugin>('Color', t=>({onChange:()=>t?.setDirty()}))
({propKey: 'bgcolor'})
('bgcolor') color = new Color(0x000000)
/**
* The priority of the material extension when applied to the material in ScreenPass
* set to very low priority, so applied at the end
*/
priority = -50
parsFragmentSnippet = () => {
if (this.isDisabled()) return ''
return glsl`
uniform float power;
uniform vec3 bgcolor;
${vignette}
`
}
protected _shaderPatch = 'diffuseColor = Vignette(diffuseColor);'
/**
* @deprecated
*/
get bgcolor() {
console.warn('VignettePlugin.bgcolor is deprecated, use VignettePlugin.color instead')
return this.color
}
/**
* @deprecated
*/
set bgcolor(v) {
console.warn('VignettePlugin.bgcolor is deprecated, use VignettePlugin.color instead')
this.color = v
}
constructor(enabled = true) {
super()
this.enabled = enabled
}
}