123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- 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
|