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.
76 lines • 2.77 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { AViewerPluginSync } from '../../viewer';
import { onChange, serialize } from 'ts-browser-helpers';
import { wrapThisFunction2 } from '../../utils';
import { uiToggle } from 'uiconfig.js';
/**
* Pipeline Pass Plugin
*
* Base class for creating a plugin that registers a custom pass to the main render pipeline
*
* @category Plugins
*/
export class PipelinePassPlugin extends AViewerPluginSync {
/**
* This function is called every frame before composer render, if this pass is being used in the pipeline
* @param _
* @param _1
* @param _2
*/
_beforeRender(_, _1, _2) {
if (!this._pass)
return false;
this._pass.enabled = !this.isDisabled();
return this._pass.enabled;
}
constructor() {
super();
this.enabled = true;
this._beforeRender = this._beforeRender.bind(this);
}
onAdded(viewer) {
super.onAdded(viewer);
this._pass = this._createPass();
this._pass.onDirty?.push(viewer.setDirty);
this._pass.beforeRender = wrapThisFunction2(this._beforeRender, this._pass.beforeRender);
viewer.renderManager.registerPass(this._pass);
}
onRemove(viewer) {
if (this._pass) {
viewer.renderManager.unregisterPass(this._pass);
if (this._pass.dispose)
this._pass.dispose();
}
this._pass = undefined;
super.onRemove(viewer);
}
get pass() {
return this._pass;
}
toJSON(meta) {
return super.toJSON(meta);
}
fromJSON(data, meta) {
return super.fromJSON(data, meta);
}
setDirty() {
if (this._pass)
this._pass.enabled = !this.isDisabled();
this._viewer?.setDirty();
this.uiConfig?.uiRefresh?.(true, 'postFrame', 100); // adding delay for a few frames, so render target(if any can update)
}
}
__decorate([
serialize(),
uiToggle('Enabled'),
onChange(PipelinePassPlugin.prototype.setDirty)
], PipelinePassPlugin.prototype, "enabled", void 0);
__decorate([
serialize('pass')
], PipelinePassPlugin.prototype, "_pass", void 0);
//# sourceMappingURL=PipelinePassPlugin.js.map