@babylonjs/core
Version:
Getting started? Play directly with the Babylon.js API using our [playground](https://playground.babylonjs.com/). It also contains a lot of samples to learn how to use it.
139 lines • 5.85 kB
JavaScript
import { Scene } from "../scene.js";
import { SceneComponentConstants } from "../sceneComponent.js";
import { PrePassRenderer } from "./prePassRenderer.js";
import { Logger } from "../Misc/logger.js";
Object.defineProperty(Scene.prototype, "prePassRenderer", {
get: function () {
return this._prePassRenderer;
},
set: function (value) {
if (value && value.isSupported) {
this._prePassRenderer = value;
}
},
enumerable: true,
configurable: true,
});
Scene.prototype.enablePrePassRenderer = function () {
if (this._prePassRenderer) {
return this._prePassRenderer;
}
this._prePassRenderer = new PrePassRenderer(this);
if (!this._prePassRenderer.isSupported) {
this._prePassRenderer = null;
Logger.Error("PrePassRenderer needs WebGL 2 support.\n" + "Maybe you tried to use the following features that need the PrePassRenderer :\n" + " + Subsurface Scattering");
}
return this._prePassRenderer;
};
Scene.prototype.disablePrePassRenderer = function () {
if (!this._prePassRenderer) {
return;
}
this._prePassRenderer.dispose();
this._prePassRenderer = null;
};
/**
* Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful
* in several rendering techniques.
*/
export class PrePassRendererSceneComponent {
/**
* Creates a new instance of the component for the given scene
* @param scene Defines the scene to register the component in
*/
constructor(scene) {
/**
* The component name helpful to identify the component in the list of scene components.
*/
this.name = SceneComponentConstants.NAME_PREPASSRENDERER;
this.scene = scene;
}
/**
* Registers the component in a given scene
*/
register() {
this.scene._beforeCameraDrawStage.registerStep(SceneComponentConstants.STEP_BEFORECAMERADRAW_PREPASS, this, this._beforeCameraDraw);
this.scene._afterCameraDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_PREPASS, this, this._afterCameraDraw);
this.scene._beforeRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERTARGETDRAW_PREPASS, this, this._beforeRenderTargetDraw);
this.scene._afterRenderTargetDrawStage.registerStep(SceneComponentConstants.STEP_AFTERCAMERADRAW_PREPASS, this, this._afterRenderTargetDraw);
this.scene._beforeClearStage.registerStep(SceneComponentConstants.STEP_BEFORECLEAR_PREPASS, this, this._beforeClearStage);
this.scene._beforeRenderTargetClearStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERTARGETCLEAR_PREPASS, this, this._beforeRenderTargetClearStage);
this.scene._beforeRenderingMeshStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERINGMESH_PREPASS, this, this._beforeRenderingMeshStage);
this.scene._afterRenderingMeshStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERINGMESH_PREPASS, this, this._afterRenderingMeshStage);
}
_beforeRenderTargetDraw(renderTarget, faceIndex, layer) {
if (this.scene.prePassRenderer && !renderTarget.noPrePassRenderer) {
this.scene.prePassRenderer._setRenderTarget(renderTarget._prePassRenderTarget);
this.scene.prePassRenderer._beforeDraw(undefined, faceIndex, layer);
}
}
_afterRenderTargetDraw(renderTarget, faceIndex, layer) {
if (this.scene.prePassRenderer && !renderTarget.noPrePassRenderer) {
this.scene.prePassRenderer._afterDraw(faceIndex, layer);
}
}
_beforeRenderTargetClearStage(renderTarget) {
if (this.scene.prePassRenderer && !renderTarget.noPrePassRenderer) {
if (!renderTarget._prePassRenderTarget) {
renderTarget._prePassRenderTarget = this.scene.prePassRenderer._createRenderTarget(renderTarget.name + "_prePassRTT", renderTarget);
}
this.scene.prePassRenderer._setRenderTarget(renderTarget._prePassRenderTarget);
this.scene.prePassRenderer._clear();
}
}
_beforeCameraDraw(camera) {
if (this.scene.prePassRenderer) {
this.scene.prePassRenderer._setRenderTarget(null);
this.scene.prePassRenderer._beforeDraw(camera);
}
}
_afterCameraDraw() {
if (this.scene.prePassRenderer) {
this.scene.prePassRenderer._afterDraw();
}
}
_beforeClearStage() {
if (this.scene.prePassRenderer) {
this.scene.prePassRenderer._setRenderTarget(null);
this.scene.prePassRenderer._clear();
}
}
_beforeRenderingMeshStage(mesh, subMesh, batch, effect) {
if (!effect) {
return;
}
// Render to MRT
const scene = mesh.getScene();
if (scene.prePassRenderer) {
scene.prePassRenderer.bindAttachmentsForEffect(effect, subMesh);
}
}
_afterRenderingMeshStage(mesh) {
const scene = mesh.getScene();
if (scene.prePassRenderer) {
scene.prePassRenderer.restoreAttachments();
}
}
/**
* Rebuilds the elements related to this component in case of
* context lost for instance.
*/
rebuild() {
// Nothing to do for this component
}
/**
* Disposes the component and the associated resources
*/
dispose() {
this.scene.disablePrePassRenderer();
}
}
PrePassRenderer._SceneComponentInitialization = (scene) => {
// Register the G Buffer component to the scene.
let component = scene._getComponent(SceneComponentConstants.NAME_PREPASSRENDERER);
if (!component) {
component = new PrePassRendererSceneComponent(scene);
scene._addComponent(component);
}
};
//# sourceMappingURL=prePassRendererSceneComponent.js.map