Przeglądaj źródła

Fixing tons of bugs with PostProcessRenderPipeline

David Catuhe 11 lat temu
rodzic
commit
c5618f8e7e

+ 10 - 65
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.js

@@ -1,14 +1,13 @@
 var BABYLON;
 (function (BABYLON) {
     var PostProcessRenderEffect = (function () {
-        function PostProcessRenderEffect(engine, name, postProcessType, ratio, samplingMode, singleInstance) {
+        function PostProcessRenderEffect(engine, name, getPostProcess, singleInstance) {
             this._engine = engine;
             this._name = name;
-            this._postProcessType = postProcessType;
-            this._ratio = ratio || 1.0;
-            this._samplingMode = samplingMode || null;
             this._singleInstance = singleInstance || true;
 
+            this._getPostProcess = getPostProcess;
+
             this._cameras = [];
 
             this._postProcesses = [];
@@ -16,64 +15,7 @@ var BABYLON;
 
             this._renderPasses = [];
             this._renderEffectAsPasses = [];
-
-            this.parameters = function (effect) {
-            };
         }
-        PostProcessRenderEffect._GetInstance = function (engine, postProcessType, ratio, samplingMode) {
-            var postProcess;
-            var instance;
-            var args = [];
-
-            var parameters = PostProcessRenderEffect._GetParametersNames(postProcessType);
-            for (var i = 0; i < parameters.length; i++) {
-                switch (parameters[i]) {
-                    case "name":
-                        args[i] = postProcessType.toString();
-                        break;
-                    case "ratio":
-                        args[i] = ratio;
-                        break;
-                    case "camera":
-                        args[i] = null;
-                        break;
-                    case "samplingMode":
-                        args[i] = samplingMode;
-                        break;
-                    case "engine":
-                        args[i] = engine;
-                        break;
-                    case "reusable":
-                        args[i] = true;
-                        break;
-                    default:
-                        args[i] = null;
-                        break;
-                }
-            }
-
-            postProcess = function () {
-            };
-            postProcess.prototype = postProcessType.prototype;
-
-            instance = new postProcess();
-            postProcessType.apply(instance, args);
-
-            return instance;
-        };
-
-        PostProcessRenderEffect._GetParametersNames = function (func) {
-            var commentsRegex = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
-            var functWithoutComments = func.toString().replace(commentsRegex, '');
-
-            var parameters = functWithoutComments.slice(functWithoutComments.indexOf('(') + 1, functWithoutComments.indexOf(')')).match(/([^\s,]+)/g);
-
-            if (parameters === null)
-                parameters = [];
-
-            return parameters;
-        };
-
         PostProcessRenderEffect.prototype._update = function () {
             for (var renderPassName in this._renderPasses) {
                 this._renderPasses[renderPassName]._update();
@@ -127,11 +69,11 @@ var BABYLON;
                     cameraKey = cameraName;
                 }
 
-                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || PostProcessRenderEffect._GetInstance(this._engine, this._postProcessType, this._ratio, this._samplingMode);
+                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || this._getPostProcess();
 
                 var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
 
-                if (this._indicesForCamera[cameraName] === null) {
+                if (!this._indicesForCamera[cameraName]) {
                     this._indicesForCamera[cameraName] = [];
                 }
 
@@ -214,8 +156,11 @@ var BABYLON;
         PostProcessRenderEffect.prototype._linkParameters = function () {
             var _this = this;
             for (var index in this._postProcesses) {
-                this._postProcesses[index].onApply = function (effect) {
-                    _this.parameters(effect);
+                if (this.applyParameters) {
+                    this.applyParameters(this._postProcesses[index]);
+                }
+
+                this._postProcesses[index].onBeforeRender = function (effect) {
                     _this._linkTextures(effect);
                 };
             }

+ 12 - 67
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.ts

@@ -3,10 +3,8 @@ module BABYLON {
         private _engine: Engine;
 
         private _postProcesses: PostProcess[];
-        private _postProcessType; //The type must inherit from PostProcess (example: BABYLON.BlackAndWhitePostProcess, like this without quotes).
+        private _getPostProcess: () => PostProcess;
 
-        private _ratio: number;
-        private _samplingMode: number;
         private _singleInstance: boolean;
 
         private _cameras: Camera[];
@@ -18,16 +16,15 @@ module BABYLON {
         // private
         public _name: string;
 
-        public parameters: (effect: Effect) => void;
+        public applyParameters: (postProcess: PostProcess) => void;
 
-        constructor(engine: Engine, name: string, postProcessType, ratio?: number, samplingMode?: number, singleInstance?: boolean) {
+        constructor(engine: Engine, name: string, getPostProcess: () => PostProcess, singleInstance?: boolean) {
             this._engine = engine;
             this._name = name;
-            this._postProcessType = postProcessType;
-            this._ratio = ratio || 1.0;
-            this._samplingMode = samplingMode || null;
             this._singleInstance = singleInstance || true;
 
+            this._getPostProcess = getPostProcess;
+
             this._cameras = [];
 
             this._postProcesses = [];
@@ -35,61 +32,6 @@ module BABYLON {
 
             this._renderPasses = [];
             this._renderEffectAsPasses = [];
-
-            this.parameters = (effect: Effect) => { };
-        }
-
-        private static _GetInstance(engine: Engine, postProcessType, ratio: number, samplingMode: number): PostProcess {
-            var postProcess;
-            var instance;
-            var args = [];
-
-            var parameters = PostProcessRenderEffect._GetParametersNames(postProcessType);
-            for (var i = 0; i < parameters.length; i++) {
-                switch (parameters[i]) {
-                    case "name":
-                        args[i] = postProcessType.toString();
-                        break;
-                    case "ratio":
-                        args[i] = ratio;
-                        break;
-                    case "camera":
-                        args[i] = null;
-                        break;
-                    case "samplingMode":
-                        args[i] = samplingMode;
-                        break;
-                    case "engine":
-                        args[i] = engine;
-                        break;
-                    case "reusable":
-                        args[i] = true;
-                        break;
-                    default:
-                        args[i] = null;
-                        break;
-                }
-            }
-
-            postProcess = function () { };
-            postProcess.prototype = postProcessType.prototype;
-
-            instance = new postProcess();
-            postProcessType.apply(instance, args);
-
-            return instance;
-        }
-
-        private static _GetParametersNames(func): string[] {
-            var commentsRegex = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
-            var functWithoutComments = func.toString().replace(commentsRegex, '');
-
-            var parameters = functWithoutComments.slice(functWithoutComments.indexOf('(') + 1, functWithoutComments.indexOf(')')).match(/([^\s,]+)/g);
-
-            if (parameters === null)
-                parameters = [];
-
-            return parameters;
         }
 
         public _update(): void {
@@ -149,11 +91,11 @@ module BABYLON {
                     cameraKey = cameraName;
                 }
 
-                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || PostProcessRenderEffect._GetInstance(this._engine, this._postProcessType, this._ratio, this._samplingMode);
+                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || this._getPostProcess();
 
                 var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
 
-                if (this._indicesForCamera[cameraName] === null) {
+                if (!this._indicesForCamera[cameraName]) {
                     this._indicesForCamera[cameraName] = [];
                 }
 
@@ -245,8 +187,11 @@ module BABYLON {
 
         private _linkParameters(): void {
             for (var index in this._postProcesses) {
-                this._postProcesses[index].onApply = (effect: Effect) => {
-                    this.parameters(effect);
+                if (this.applyParameters) {
+                    this.applyParameters(this._postProcesses[index]);
+                }
+
+                this._postProcesses[index].onBeforeRender = (effect: Effect) => {
                     this._linkTextures(effect);
                 };
             }

+ 10 - 4
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.js

@@ -21,7 +21,7 @@ var BABYLON;
                 return;
             }
 
-            renderEffects.enable(BABYLON.Tools.MakeArray(cameras || this._cameras));
+            renderEffects._enable(BABYLON.Tools.MakeArray(cameras || this._cameras));
         };
 
         PostProcessRenderPipeline.prototype._disableEffect = function (renderEffectName, cameras) {
@@ -31,7 +31,7 @@ var BABYLON;
                 return;
             }
 
-            renderEffects.disable(BABYLON.Tools.MakeArray(cameras || this._cameras));
+            renderEffects._disable(BABYLON.Tools.MakeArray(cameras || this._cameras));
         };
 
         PostProcessRenderPipeline.prototype._attachCameras = function (cameras, unique) {
@@ -72,6 +72,7 @@ var BABYLON;
         };
 
         PostProcessRenderPipeline.prototype._enableDisplayOnlyPass = function (passName, cameras) {
+            var _this = this;
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
 
             var pass = null;
@@ -98,7 +99,9 @@ var BABYLON;
                 var camera = _cam[i];
                 var cameraName = camera.name;
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, function () {
+                    return new BABYLON.DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, _this._engine, true);
+                });
                 this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
                 this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
                 this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
@@ -106,13 +109,16 @@ var BABYLON;
         };
 
         PostProcessRenderPipeline.prototype._disableDisplayOnlyPass = function (cameras) {
+            var _this = this;
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
 
             for (var i = 0; i < _cam.length; i++) {
                 var camera = _cam[i];
                 var cameraName = camera.name;
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, function () {
+                    return new BABYLON.DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, _this._engine, true);
+                });
                 this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
             }
 

+ 8 - 6
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.ts

@@ -32,25 +32,25 @@ module BABYLON {
         public _enableEffect(renderEffectName: string, cameras: Camera);
         public _enableEffect(renderEffectName: string, cameras: Camera[]);
         public _enableEffect(renderEffectName: string, cameras: any): void {
-            var renderEffects = this._renderEffects[renderEffectName];
+            var renderEffects: PostProcessRenderEffect = this._renderEffects[renderEffectName];
 
             if (!renderEffects) {
                 return;
             }
 
-            renderEffects.enable(Tools.MakeArray(cameras || this._cameras));
+            renderEffects._enable(Tools.MakeArray(cameras || this._cameras));
         }
 
         public _disableEffect(renderEffectName: string, cameras: Camera);
         public _disableEffect(renderEffectName: string, cameras: Camera[]);
         public _disableEffect(renderEffectName: string, cameras): void {
-            var renderEffects = this._renderEffects[renderEffectName];
+            var renderEffects: PostProcessRenderEffect = this._renderEffects[renderEffectName];
 
             if (!renderEffects) {
                 return;
             }
 
-            renderEffects.disable(Tools.MakeArray(cameras || this._cameras));
+            renderEffects._disable(Tools.MakeArray(cameras || this._cameras));
         }
 
         public _attachCameras(cameras: Camera, unique: boolean);
@@ -124,7 +124,8 @@ module BABYLON {
                 var camera = _cam[i];
                 var cameraName = camera.name;
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME,
+                    () => {return new DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, this._engine, true) });
                 this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
                 this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
                 this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
@@ -140,7 +141,8 @@ module BABYLON {
                 var camera = _cam[i];
                 var cameraName = camera.name;
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, 
+                                    () => {return new DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, this._engine, true) });
                 this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
             }
 

+ 7 - 7
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.js

@@ -2,7 +2,7 @@ var BABYLON;
 (function (BABYLON) {
     var PostProcessRenderPipelineManager = (function () {
         function PostProcessRenderPipelineManager() {
-            this._renderPipelines = [];
+            this._renderPipelines = new Array();
         }
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
             this._renderPipelines[renderPipeline._name] = renderPipeline;
@@ -15,7 +15,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.attachCameras(cameras, unique);
+            renderPipeline._attachCameras(cameras, unique);
         };
 
         PostProcessRenderPipelineManager.prototype.detachCamerasFromRenderPipeline = function (renderPipelineName, cameras) {
@@ -25,7 +25,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.detachCameras(cameras);
+            renderPipeline._detachCameras(cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.enableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
@@ -35,7 +35,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.enableEffect(renderEffectName, cameras);
+            renderPipeline._enableEffect(renderEffectName, cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.disableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
@@ -45,7 +45,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.disableEffect(renderEffectName, cameras);
+            renderPipeline._disableEffect(renderEffectName, cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.enableDisplayOnlyPassInPipeline = function (renderPipelineName, passName, cameras) {
@@ -55,7 +55,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.enableDisplayOnlyPass(passName, cameras);
+            renderPipeline._enableDisplayOnlyPass(passName, cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.disableDisplayOnlyPassInPipeline = function (renderPipelineName, cameras) {
@@ -65,7 +65,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.disableDisplayOnlyPass(cameras);
+            renderPipeline._disableDisplayOnlyPass(cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.update = function () {

+ 14 - 14
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.ts

@@ -1,9 +1,9 @@
 module BABYLON {
     export class PostProcessRenderPipelineManager {
-        private _renderPipelines: PostProcessRenderPipeline[];
+        private _renderPipelines: Array<PostProcessRenderPipeline>;
 
         constructor() {
-            this._renderPipelines = [];
+            this._renderPipelines = new Array<PostProcessRenderPipeline>();
         }
 
         public addPipeline(renderPipeline: PostProcessRenderPipeline): void {
@@ -13,73 +13,73 @@ module BABYLON {
         public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: Camera, unique?: boolean);
         public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: Camera[], unique?: boolean);
         public attachCamerasToRenderPipeline(renderPipelineName: string, cameras: any, unique?: boolean): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
             if (!renderPipeline) {
                 return;
             }
 
-            renderPipeline.attachCameras(cameras, unique);
+            renderPipeline._attachCameras(cameras, unique);
         }
 
         public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: Camera);
         public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: Camera[]);
         public detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
             if (!renderPipeline) {
                 return;
             }
 
-            renderPipeline.detachCameras(cameras);
+            renderPipeline._detachCameras(cameras);
         }
 
         public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera);
         public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[]);
         public enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
             if (!renderPipeline) {
                 return;
             }
 
-            renderPipeline.enableEffect(renderEffectName, cameras);
+            renderPipeline._enableEffect(renderEffectName, cameras);
         }
 
         public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera);
         public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[]);
         public disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
             if (!renderPipeline) {
                 return;
             }
 
-            renderPipeline.disableEffect(renderEffectName, cameras);
+            renderPipeline._disableEffect(renderEffectName, cameras);
         }
 
         public enableDisplayOnlyPassInPipeline(renderPipelineName: string, passName: string, cameras: Camera);
         public enableDisplayOnlyPassInPipeline(renderPipelineName: string, passName: string, cameras: Camera[]);
         public enableDisplayOnlyPassInPipeline(renderPipelineName: string, passName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
             if (!renderPipeline) {
                 return;
             }
 
-            renderPipeline.enableDisplayOnlyPass(passName, cameras);
+            renderPipeline._enableDisplayOnlyPass(passName, cameras);
         }
 
         public disableDisplayOnlyPassInPipeline(renderPipelineName: string, cameras: Camera);
         public disableDisplayOnlyPassInPipeline(renderPipelineName: string, cameras: Camera[]);
         public disableDisplayOnlyPassInPipeline(renderPipelineName: string, cameras: any): void {
-            var renderPipeline = this._renderPipelines[renderPipelineName];
+            var renderPipeline: PostProcessRenderPipeline = this._renderPipelines[renderPipelineName];
 
             if (!renderPipeline) {
                 return;
             }
 
-            renderPipeline.disableDisplayOnlyPass(cameras);
+            renderPipeline._disableDisplayOnlyPass(cameras);
         }
 
         public update(): void {

+ 1 - 0
Babylon/PostProcess/babylon.postProcess.ts

@@ -1,6 +1,7 @@
 module BABYLON {
     export class PostProcess {
         public onApply: (Effect) => void;
+        public onBeforeRender: (Effect) => void;
         public onSizeChanged: () => void;
         public onActivate: (Camera) => void;
         public width = -1;

+ 6 - 1
Babylon/PostProcess/babylon.postProcessManager.js

@@ -64,9 +64,14 @@
                     break;
                 }
 
-                var effect = postProcesses[postProcessesTakenIndices[index]].apply();
+                var pp = postProcesses[postProcessesTakenIndices[index]];
+                var effect = pp.apply();
 
                 if (effect) {
+                    if (pp.onBeforeRender) {
+                        pp.onBeforeRender(effect);
+                    }
+
                     // VBOs
                     engine.bindBuffers(this._vertexBuffer, this._indexBuffer, this._vertexDeclaration, this._vertexStrideSize, effect);
 

+ 6 - 1
Babylon/PostProcess/babylon.postProcessManager.ts

@@ -68,9 +68,14 @@
                     break;
                 }
 
-                var effect = postProcesses[postProcessesTakenIndices[index]].apply();
+                var pp = postProcesses[postProcessesTakenIndices[index]];
+                var effect = pp.apply();
 
                 if (effect) {
+                    if (pp.onBeforeRender) {
+                        pp.onBeforeRender(effect);
+                    }
+
                     // VBOs
                     engine.bindBuffers(this._vertexBuffer, this._indexBuffer, this._vertexDeclaration, this._vertexStrideSize, effect);
 

+ 33 - 77
babylon.1.14-RC-debug.js

@@ -15884,9 +15884,14 @@ var BABYLON;
                     break;
                 }
 
-                var effect = postProcesses[postProcessesTakenIndices[index]].apply();
+                var pp = postProcesses[postProcessesTakenIndices[index]];
+                var effect = pp.apply();
 
                 if (effect) {
+                    if (pp.onBeforeRender) {
+                        pp.onBeforeRender(effect);
+                    }
+
                    
                     engine.bindBuffers(this._vertexBuffer, this._indexBuffer, this._vertexDeclaration, this._vertexStrideSize, effect);
 
@@ -21815,14 +21820,13 @@ var BABYLON;
 var BABYLON;
 (function (BABYLON) {
     var PostProcessRenderEffect = (function () {
-        function PostProcessRenderEffect(engine, name, postProcessType, ratio, samplingMode, singleInstance) {
+        function PostProcessRenderEffect(engine, name, getPostProcess, singleInstance) {
             this._engine = engine;
             this._name = name;
-            this._postProcessType = postProcessType;
-            this._ratio = ratio || 1.0;
-            this._samplingMode = samplingMode || null;
             this._singleInstance = singleInstance || true;
 
+            this._getPostProcess = getPostProcess;
+
             this._cameras = [];
 
             this._postProcesses = [];
@@ -21830,64 +21834,7 @@ var BABYLON;
 
             this._renderPasses = [];
             this._renderEffectAsPasses = [];
-
-            this.parameters = function (effect) {
-            };
         }
-        PostProcessRenderEffect._GetInstance = function (engine, postProcessType, ratio, samplingMode) {
-            var postProcess;
-            var instance;
-            var args = [];
-
-            var parameters = PostProcessRenderEffect._GetParametersNames(postProcessType);
-            for (var i = 0; i < parameters.length; i++) {
-                switch (parameters[i]) {
-                    case "name":
-                        args[i] = postProcessType.toString();
-                        break;
-                    case "ratio":
-                        args[i] = ratio;
-                        break;
-                    case "camera":
-                        args[i] = null;
-                        break;
-                    case "samplingMode":
-                        args[i] = samplingMode;
-                        break;
-                    case "engine":
-                        args[i] = engine;
-                        break;
-                    case "reusable":
-                        args[i] = true;
-                        break;
-                    default:
-                        args[i] = null;
-                        break;
-                }
-            }
-
-            postProcess = function () {
-            };
-            postProcess.prototype = postProcessType.prototype;
-
-            instance = new postProcess();
-            postProcessType.apply(instance, args);
-
-            return instance;
-        };
-
-        PostProcessRenderEffect._GetParametersNames = function (func) {
-            var commentsRegex = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
-            var functWithoutComments = func.toString().replace(commentsRegex, '');
-
-            var parameters = functWithoutComments.slice(functWithoutComments.indexOf('(') + 1, functWithoutComments.indexOf(')')).match(/([^\s,]+)/g);
-
-            if (parameters === null)
-                parameters = [];
-
-            return parameters;
-        };
-
         PostProcessRenderEffect.prototype._update = function () {
             for (var renderPassName in this._renderPasses) {
                 this._renderPasses[renderPassName]._update();
@@ -21941,11 +21888,11 @@ var BABYLON;
                     cameraKey = cameraName;
                 }
 
-                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || PostProcessRenderEffect._GetInstance(this._engine, this._postProcessType, this._ratio, this._samplingMode);
+                this._postProcesses[cameraKey] = this._postProcesses[cameraKey] || this._getPostProcess();
 
                 var index = camera.attachPostProcess(this._postProcesses[cameraKey]);
 
-                if (this._indicesForCamera[cameraName] === null) {
+                if (!this._indicesForCamera[cameraName]) {
                     this._indicesForCamera[cameraName] = [];
                 }
 
@@ -22028,8 +21975,11 @@ var BABYLON;
         PostProcessRenderEffect.prototype._linkParameters = function () {
             var _this = this;
             for (var index in this._postProcesses) {
-                this._postProcesses[index].onApply = function (effect) {
-                    _this.parameters(effect);
+                if (this.applyParameters) {
+                    this.applyParameters(this._postProcesses[index]);
+                }
+
+                this._postProcesses[index].onBeforeRender = function (effect) {
                     _this._linkTextures(effect);
                 };
             }
@@ -22071,7 +22021,7 @@ var BABYLON;
                 return;
             }
 
-            renderEffects.enable(BABYLON.Tools.MakeArray(cameras || this._cameras));
+            renderEffects._enable(BABYLON.Tools.MakeArray(cameras || this._cameras));
         };
 
         PostProcessRenderPipeline.prototype._disableEffect = function (renderEffectName, cameras) {
@@ -22081,7 +22031,7 @@ var BABYLON;
                 return;
             }
 
-            renderEffects.disable(BABYLON.Tools.MakeArray(cameras || this._cameras));
+            renderEffects._disable(BABYLON.Tools.MakeArray(cameras || this._cameras));
         };
 
         PostProcessRenderPipeline.prototype._attachCameras = function (cameras, unique) {
@@ -22122,6 +22072,7 @@ var BABYLON;
         };
 
         PostProcessRenderPipeline.prototype._enableDisplayOnlyPass = function (passName, cameras) {
+            var _this = this;
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
 
             var pass = null;
@@ -22148,7 +22099,9 @@ var BABYLON;
                 var camera = _cam[i];
                 var cameraName = camera.name;
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, function () {
+                    return new BABYLON.DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, _this._engine, true);
+                });
                 this._renderEffectsForIsolatedPass[cameraName].emptyPasses();
                 this._renderEffectsForIsolatedPass[cameraName].addPass(pass);
                 this._renderEffectsForIsolatedPass[cameraName]._attachCameras(camera);
@@ -22156,13 +22109,16 @@ var BABYLON;
         };
 
         PostProcessRenderPipeline.prototype._disableDisplayOnlyPass = function (cameras) {
+            var _this = this;
             var _cam = BABYLON.Tools.MakeArray(cameras || this._cameras);
 
             for (var i = 0; i < _cam.length; i++) {
                 var camera = _cam[i];
                 var cameraName = camera.name;
 
-                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, "BABYLON.DisplayPassPostProcess", 1.0, null, null);
+                this._renderEffectsForIsolatedPass[cameraName] = this._renderEffectsForIsolatedPass[cameraName] || new BABYLON.PostProcessRenderEffect(this._engine, PostProcessRenderPipeline.PASS_EFFECT_NAME, function () {
+                    return new BABYLON.DisplayPassPostProcess(PostProcessRenderPipeline.PASS_EFFECT_NAME, 1.0, null, null, _this._engine, true);
+                });
                 this._renderEffectsForIsolatedPass[cameraName]._disable(camera);
             }
 
@@ -22193,7 +22149,7 @@ var BABYLON;
 (function (BABYLON) {
     var PostProcessRenderPipelineManager = (function () {
         function PostProcessRenderPipelineManager() {
-            this._renderPipelines = [];
+            this._renderPipelines = new Array();
         }
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
             this._renderPipelines[renderPipeline._name] = renderPipeline;
@@ -22206,7 +22162,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.attachCameras(cameras, unique);
+            renderPipeline._attachCameras(cameras, unique);
         };
 
         PostProcessRenderPipelineManager.prototype.detachCamerasFromRenderPipeline = function (renderPipelineName, cameras) {
@@ -22216,7 +22172,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.detachCameras(cameras);
+            renderPipeline._detachCameras(cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.enableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
@@ -22226,7 +22182,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.enableEffect(renderEffectName, cameras);
+            renderPipeline._enableEffect(renderEffectName, cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.disableEffectInPipeline = function (renderPipelineName, renderEffectName, cameras) {
@@ -22236,7 +22192,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.disableEffect(renderEffectName, cameras);
+            renderPipeline._disableEffect(renderEffectName, cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.enableDisplayOnlyPassInPipeline = function (renderPipelineName, passName, cameras) {
@@ -22246,7 +22202,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.enableDisplayOnlyPass(passName, cameras);
+            renderPipeline._enableDisplayOnlyPass(passName, cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.disableDisplayOnlyPassInPipeline = function (renderPipelineName, cameras) {
@@ -22256,7 +22212,7 @@ var BABYLON;
                 return;
             }
 
-            renderPipeline.disableDisplayOnlyPass(cameras);
+            renderPipeline._disableDisplayOnlyPass(cameras);
         };
 
         PostProcessRenderPipelineManager.prototype.update = function () {

Plik diff jest za duży
+ 6 - 6
babylon.1.14-RC.js


+ 4 - 7
babylon.d.ts

@@ -2910,6 +2910,7 @@ declare module BABYLON {
     class PostProcess {
         public name: string;
         public onApply: (Effect: any) => void;
+        public onBeforeRender: (Effect: any) => void;
         public onSizeChanged: () => void;
         public onActivate: (Camera: any) => void;
         public width: number;
@@ -2957,19 +2958,15 @@ declare module BABYLON {
     class PostProcessRenderEffect {
         private _engine;
         private _postProcesses;
-        private _postProcessType;
-        private _ratio;
-        private _samplingMode;
+        private _getPostProcess;
         private _singleInstance;
         private _cameras;
         private _indicesForCamera;
         private _renderPasses;
         private _renderEffectAsPasses;
         public _name: string;
-        public parameters: (effect: Effect) => void;
-        constructor(engine: Engine, name: string, postProcessType: any, ratio?: number, samplingMode?: number, singleInstance?: boolean);
-        private static _GetInstance(engine, postProcessType, ratio, samplingMode);
-        private static _GetParametersNames(func);
+        public applyParameters: (postProcess: PostProcess) => void;
+        constructor(engine: Engine, name: string, getPostProcess: () => PostProcess, singleInstance?: boolean);
         public _update(): void;
         public addPass(renderPass: PostProcessRenderPass): void;
         public removePass(renderPass: PostProcessRenderPass): void;