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 • 2.79 kB
JavaScript
import { AViewerPluginSync } from '../../viewer/AViewerPlugin';
import { shaderReplaceString } from '../../utils';
import { GBufferPlugin } from '../pipeline/GBufferPlugin';
/**
* Base Screen Pass Extension Plugin
*
* Extend the class to add an extension to {@link ScreenPass} material.
* See {@link TonemapPlugin} and {@link VignettePlugin} for examples.
*
*
* @category Plugins
*/
export class AScreenPassExtensionPlugin extends AViewerPluginSync {
set uniformsNeedUpdate(v) {
if (v)
this.setDirty();
}
constructor(shaderPatch = '') {
super();
/**
* The priority of the material extension when applied to the material in ScreenPass
* set to very low priority, so applied at the end
*/
this.priority = -100;
this._shaderPatch = '';
this.computeCacheKey = (_) => this.isDisabled() ? '0' : '1';
this._shaderPatch = shaderPatch;
this.setDirty = this.setDirty.bind(this);
}
shaderExtender(shader, _, _1) {
if (this.isDisabled())
return;
shader.fragmentShader = shaderReplaceString(shader.fragmentShader, '#glMarker', '\n' + this._shaderPatch + '\n', { prepend: true });
}
getUiConfig() {
return this.uiConfig;
}
isCompatible(_) {
return true; // (material as MeshStandardMaterial2).isMeshStandardMaterial2
}
setDirty() {
this.__setDirty?.(); // this will update version which will set needsUpdate on material
this._viewer?.renderManager.screenPass.setDirty();
}
fromJSON(data, meta) {
// really old legacy
if (data.pass) {
data = { ...data };
data.extension = { ...data.pass };
delete data.extension.enabled;
delete data.pass;
}
// legacy
if (data.extension) {
data = { ...data, ...data.extension };
delete data.extension;
}
return super.fromJSON(data, meta);
}
onAdded(viewer) {
super.onAdded(viewer);
viewer.forPlugin(GBufferPlugin, (gbuffer) => {
gbuffer.registerGBufferUpdater(this.constructor.PluginType, this.updateGBufferFlags.bind(this));
}, (gbuffer) => {
gbuffer.unregisterGBufferUpdater(this.constructor.PluginType);
});
viewer.renderManager.screenPass.material.registerMaterialExtensions([this]);
}
onRemove(viewer) {
viewer.getPlugin(GBufferPlugin)?.unregisterGBufferUpdater(this.constructor.PluginType);
viewer.renderManager.screenPass.material.unregisterMaterialExtensions([this]);
super.onRemove(viewer);
}
updateGBufferFlags(_, _1) {
return;
}
}
//# sourceMappingURL=AScreenPassExtensionPlugin.js.map