浏览代码

Small update to behaviors

David Catuhe 7 年之前
父节点
当前提交
01b1206448

文件差异内容过多而无法显示
+ 4386 - 4375
dist/preview release/babylon.d.ts


文件差异内容过多而无法显示
+ 38 - 38
dist/preview release/babylon.js


+ 51 - 19
dist/preview release/babylon.max.js

@@ -12293,11 +12293,21 @@ var BABYLON;
             return this._scene.getEngine();
         };
         Node.prototype.addBehavior = function (behavior) {
+            var _this = this;
             var index = this._behaviors.indexOf(behavior);
             if (index !== -1) {
                 return this;
             }
-            behavior.attach(this);
+            if (this._scene.isLoading) {
+                // We defer the attach when the scene will be loaded
+                var observer = this._scene.onDataLoadedObservable.add(function () {
+                    behavior.attach(_this);
+                    _this._scene.onDataLoadedObservable.remove(observer);
+                });
+            }
+            else {
+                behavior.attach(this);
+            }
             this._behaviors.push(behavior);
             return this;
         };
@@ -17487,6 +17497,11 @@ var BABYLON;
             */
             this.onAfterSpritesRenderingObservable = new BABYLON.Observable();
             /**
+            * An event triggered when SceneLoader.Append or SceneLoader.Load or SceneLoader.ImportMesh were successfully executed
+            * @type {BABYLON.Observable}
+            */
+            this.onDataLoadedObservable = new BABYLON.Observable();
+            /**
             * An event triggered when a camera is created
             * @type {BABYLON.Observable}
             */
@@ -18925,14 +18940,25 @@ var BABYLON;
             this._pendingData.push(data);
         };
         Scene.prototype._removePendingData = function (data) {
+            var wasLoading = this.isLoading;
             var index = this._pendingData.indexOf(data);
             if (index !== -1) {
                 this._pendingData.splice(index, 1);
             }
+            if (wasLoading && !this.isLoading) {
+                this.onDataLoadedObservable.notifyObservers(this);
+            }
         };
         Scene.prototype.getWaitingItemsCount = function () {
             return this._pendingData.length;
         };
+        Object.defineProperty(Scene.prototype, "isLoading", {
+            get: function () {
+                return this._pendingData.length > 0;
+            },
+            enumerable: true,
+            configurable: true
+        });
         /**
          * Registers a function to be executed when the scene is ready.
          * @param {Function} func - the function to be executed.
@@ -20446,6 +20472,7 @@ var BABYLON;
             this.onAfterPhysicsObservable.clear();
             this.onBeforeAnimationsObservable.clear();
             this.onAfterAnimationsObservable.clear();
+            this.onDataLoadedObservable.clear();
             this.detachControl();
             // Release sounds & sounds tracks
             if (BABYLON.AudioEngine) {
@@ -49760,7 +49787,10 @@ var BABYLON;
             _this._engine = scene.getEngine();
             _this.name = name;
             _this.isRenderTarget = true;
+            _this._initialSizeParameter = size;
             _this._processSizeParameter(size);
+            _this._resizeObserver = _this.getScene().getEngine().onResizeObservable.add(function () {
+            });
             _this._generateMipMaps = generateMipMaps ? true : false;
             _this._doNotChangeAspectRatio = doNotChangeAspectRatio;
             // Rendering groups
@@ -49857,6 +49887,11 @@ var BABYLON;
             enumerable: true,
             configurable: true
         });
+        RenderTargetTexture.prototype._onRatioRescale = function () {
+            if (this._sizeRatio) {
+                this.resize(this._initialSizeParameter);
+            }
+        };
         RenderTargetTexture.prototype._processSizeParameter = function (size) {
             if (size.ratio) {
                 this._sizeRatio = size.ratio;
@@ -50250,6 +50285,10 @@ var BABYLON;
                 this._postProcessManager = null;
             }
             this.clearPostProcesses(true);
+            if (this._resizeObserver) {
+                this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver);
+                this._resizeObserver = null;
+            }
             this.renderList = null;
             // Remove from custom render targets
             var scene = this.getScene();
@@ -50464,17 +50503,6 @@ var BABYLON;
             _this._blurKernelY = 0;
             _this._blurRatio = 1.0;
             _this.ignoreCameraViewport = true;
-            _this._resizeObserver = _this.getScene().getEngine().onResizeObservable.add(function () {
-                if (size.ratio) {
-                    _this.resize(size);
-                    if (!_this._adaptiveBlurKernel) {
-                        _this._preparePostProcesses();
-                    }
-                }
-                if (_this._adaptiveBlurKernel) {
-                    _this._autoComputeBlurKernel();
-                }
-            });
             _this.onBeforeRenderObservable.add(function () {
                 BABYLON.Matrix.ReflectionToRef(_this.mirrorPlane, _this._mirrorMatrix);
                 _this._savedViewMatrix = scene.getViewMatrix();
@@ -50557,6 +50585,17 @@ var BABYLON;
             this.blurKernelX = this._adaptiveBlurKernel * dw;
             this.blurKernelY = this._adaptiveBlurKernel * dh;
         };
+        MirrorTexture.prototype._onRatioRescale = function () {
+            if (this._sizeRatio) {
+                this.resize(this._initialSizeParameter);
+                if (!this._adaptiveBlurKernel) {
+                    this._preparePostProcesses();
+                }
+            }
+            if (this._adaptiveBlurKernel) {
+                this._autoComputeBlurKernel();
+            }
+        };
         MirrorTexture.prototype._preparePostProcesses = function () {
             this.clearPostProcesses(true);
             if (this._blurKernelX && this._blurKernelY) {
@@ -50602,13 +50641,6 @@ var BABYLON;
             serializationObject.mirrorPlane = this.mirrorPlane.asArray();
             return serializationObject;
         };
-        MirrorTexture.prototype.dispose = function () {
-            if (this._resizeObserver) {
-                this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver);
-                this._resizeObserver = null;
-            }
-            _super.prototype.dispose.call(this);
-        };
         return MirrorTexture;
     }(BABYLON.RenderTargetTexture));
     BABYLON.MirrorTexture = MirrorTexture;

文件差异内容过多而无法显示
+ 4386 - 4375
dist/preview release/babylon.module.d.ts


文件差异内容过多而无法显示
+ 38 - 38
dist/preview release/babylon.worker.js


+ 46 - 33
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts

@@ -897,6 +897,11 @@ declare module BABYLON {
         */
         onAfterSpritesRenderingObservable: Observable<Scene>;
         /**
+        * An event triggered when SceneLoader.Append or SceneLoader.Load or SceneLoader.ImportMesh were successfully executed
+        * @type {BABYLON.Observable}
+        */
+        onDataLoadedObservable: Observable<Scene>;
+        /**
         * An event triggered when a camera is created
         * @type {BABYLON.Observable}
         */
@@ -1297,6 +1302,7 @@ declare module BABYLON {
         _addPendingData(data: any): void;
         _removePendingData(data: any): void;
         getWaitingItemsCount(): number;
+        readonly isLoading: boolean;
         /**
          * Registers a function to be executed when the scene is ready.
          * @param {Function} func - the function to be executed.
@@ -14257,6 +14263,36 @@ declare module BABYLON {
 }
 
 declare module BABYLON {
+    class ReflectionProbe {
+        name: string;
+        private _scene;
+        private _renderTargetTexture;
+        private _projectionMatrix;
+        private _viewMatrix;
+        private _target;
+        private _add;
+        private _attachedMesh;
+        invertYAxis: boolean;
+        position: Vector3;
+        constructor(name: string, size: number, scene: Scene, generateMipMaps?: boolean);
+        samples: number;
+        refreshRate: number;
+        getScene(): Scene;
+        readonly cubeTexture: RenderTargetTexture;
+        readonly renderList: Nullable<AbstractMesh[]>;
+        attachToMesh(mesh: AbstractMesh): void;
+        /**
+         * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.
+         *
+         * @param renderingGroupId The rendering group id corresponding to its index
+         * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.
+         */
+        setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean): void;
+        dispose(): void;
+    }
+}
+
+declare module BABYLON {
     class AnaglyphPostProcess extends PostProcess {
         private _passedProcess;
         constructor(name: string, options: number | PostProcessOptions, rigCameras: Camera[], samplingMode?: number, engine?: Engine, reusable?: boolean);
@@ -14783,36 +14819,6 @@ declare module BABYLON {
 }
 
 declare module BABYLON {
-    class ReflectionProbe {
-        name: string;
-        private _scene;
-        private _renderTargetTexture;
-        private _projectionMatrix;
-        private _viewMatrix;
-        private _target;
-        private _add;
-        private _attachedMesh;
-        invertYAxis: boolean;
-        position: Vector3;
-        constructor(name: string, size: number, scene: Scene, generateMipMaps?: boolean);
-        samples: number;
-        refreshRate: number;
-        getScene(): Scene;
-        readonly cubeTexture: RenderTargetTexture;
-        readonly renderList: Nullable<AbstractMesh[]>;
-        attachToMesh(mesh: AbstractMesh): void;
-        /**
-         * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.
-         *
-         * @param renderingGroupId The rendering group id corresponding to its index
-         * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.
-         */
-        setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean): void;
-        dispose(): void;
-    }
-}
-
-declare module BABYLON {
     class BoundingBoxRenderer {
         frontColor: Color3;
         backColor: Color3;
@@ -18593,13 +18599,13 @@ declare module BABYLON {
         private _blurKernelX;
         private _blurKernelY;
         private _blurRatio;
-        private _resizeObserver;
         blurRatio: number;
         adaptiveBlurKernel: number;
         blurKernel: number;
         blurKernelX: number;
         blurKernelY: number;
         private _autoComputeBlurKernel();
+        protected _onRatioRescale(): void;
         constructor(name: string, size: number | {
             width: number;
             height: number;
@@ -18609,7 +18615,6 @@ declare module BABYLON {
         private _preparePostProcesses();
         clone(): MirrorTexture;
         serialize(): any;
-        dispose(): void;
     }
 }
 
@@ -18701,6 +18706,7 @@ declare module BABYLON {
         ignoreCameraViewport: boolean;
         private _postProcessManager;
         private _postProcesses;
+        private _resizeObserver;
         /**
         * An event triggered when the texture is unbind.
         * @type {BABYLON.Observable}
@@ -18739,7 +18745,13 @@ declare module BABYLON {
             width: number;
             height: number;
         };
-        private _sizeRatio;
+        protected _initialSizeParameter: number | {
+            width: number;
+            height: number;
+        } | {
+            ratio: number;
+        };
+        protected _sizeRatio: Nullable<number>;
         _generateMipMaps: boolean;
         protected _renderingManager: RenderingManager;
         _waitingRenderList: string[];
@@ -18751,6 +18763,7 @@ declare module BABYLON {
         protected _renderTargetOptions: RenderTargetCreationOptions;
         readonly renderTargetOptions: RenderTargetCreationOptions;
         protected _engine: Engine;
+        protected _onRatioRescale(): void;
         constructor(name: string, size: number | {
             width: number;
             height: number;

文件差异内容过多而无法显示
+ 38 - 38
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js


+ 51 - 19
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js

@@ -12293,11 +12293,21 @@ var BABYLON;
             return this._scene.getEngine();
         };
         Node.prototype.addBehavior = function (behavior) {
+            var _this = this;
             var index = this._behaviors.indexOf(behavior);
             if (index !== -1) {
                 return this;
             }
-            behavior.attach(this);
+            if (this._scene.isLoading) {
+                // We defer the attach when the scene will be loaded
+                var observer = this._scene.onDataLoadedObservable.add(function () {
+                    behavior.attach(_this);
+                    _this._scene.onDataLoadedObservable.remove(observer);
+                });
+            }
+            else {
+                behavior.attach(this);
+            }
             this._behaviors.push(behavior);
             return this;
         };
@@ -17487,6 +17497,11 @@ var BABYLON;
             */
             this.onAfterSpritesRenderingObservable = new BABYLON.Observable();
             /**
+            * An event triggered when SceneLoader.Append or SceneLoader.Load or SceneLoader.ImportMesh were successfully executed
+            * @type {BABYLON.Observable}
+            */
+            this.onDataLoadedObservable = new BABYLON.Observable();
+            /**
             * An event triggered when a camera is created
             * @type {BABYLON.Observable}
             */
@@ -18925,14 +18940,25 @@ var BABYLON;
             this._pendingData.push(data);
         };
         Scene.prototype._removePendingData = function (data) {
+            var wasLoading = this.isLoading;
             var index = this._pendingData.indexOf(data);
             if (index !== -1) {
                 this._pendingData.splice(index, 1);
             }
+            if (wasLoading && !this.isLoading) {
+                this.onDataLoadedObservable.notifyObservers(this);
+            }
         };
         Scene.prototype.getWaitingItemsCount = function () {
             return this._pendingData.length;
         };
+        Object.defineProperty(Scene.prototype, "isLoading", {
+            get: function () {
+                return this._pendingData.length > 0;
+            },
+            enumerable: true,
+            configurable: true
+        });
         /**
          * Registers a function to be executed when the scene is ready.
          * @param {Function} func - the function to be executed.
@@ -20446,6 +20472,7 @@ var BABYLON;
             this.onAfterPhysicsObservable.clear();
             this.onBeforeAnimationsObservable.clear();
             this.onAfterAnimationsObservable.clear();
+            this.onDataLoadedObservable.clear();
             this.detachControl();
             // Release sounds & sounds tracks
             if (BABYLON.AudioEngine) {
@@ -49606,7 +49633,10 @@ var BABYLON;
             _this._engine = scene.getEngine();
             _this.name = name;
             _this.isRenderTarget = true;
+            _this._initialSizeParameter = size;
             _this._processSizeParameter(size);
+            _this._resizeObserver = _this.getScene().getEngine().onResizeObservable.add(function () {
+            });
             _this._generateMipMaps = generateMipMaps ? true : false;
             _this._doNotChangeAspectRatio = doNotChangeAspectRatio;
             // Rendering groups
@@ -49703,6 +49733,11 @@ var BABYLON;
             enumerable: true,
             configurable: true
         });
+        RenderTargetTexture.prototype._onRatioRescale = function () {
+            if (this._sizeRatio) {
+                this.resize(this._initialSizeParameter);
+            }
+        };
         RenderTargetTexture.prototype._processSizeParameter = function (size) {
             if (size.ratio) {
                 this._sizeRatio = size.ratio;
@@ -50096,6 +50131,10 @@ var BABYLON;
                 this._postProcessManager = null;
             }
             this.clearPostProcesses(true);
+            if (this._resizeObserver) {
+                this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver);
+                this._resizeObserver = null;
+            }
             this.renderList = null;
             // Remove from custom render targets
             var scene = this.getScene();
@@ -50310,17 +50349,6 @@ var BABYLON;
             _this._blurKernelY = 0;
             _this._blurRatio = 1.0;
             _this.ignoreCameraViewport = true;
-            _this._resizeObserver = _this.getScene().getEngine().onResizeObservable.add(function () {
-                if (size.ratio) {
-                    _this.resize(size);
-                    if (!_this._adaptiveBlurKernel) {
-                        _this._preparePostProcesses();
-                    }
-                }
-                if (_this._adaptiveBlurKernel) {
-                    _this._autoComputeBlurKernel();
-                }
-            });
             _this.onBeforeRenderObservable.add(function () {
                 BABYLON.Matrix.ReflectionToRef(_this.mirrorPlane, _this._mirrorMatrix);
                 _this._savedViewMatrix = scene.getViewMatrix();
@@ -50403,6 +50431,17 @@ var BABYLON;
             this.blurKernelX = this._adaptiveBlurKernel * dw;
             this.blurKernelY = this._adaptiveBlurKernel * dh;
         };
+        MirrorTexture.prototype._onRatioRescale = function () {
+            if (this._sizeRatio) {
+                this.resize(this._initialSizeParameter);
+                if (!this._adaptiveBlurKernel) {
+                    this._preparePostProcesses();
+                }
+            }
+            if (this._adaptiveBlurKernel) {
+                this._autoComputeBlurKernel();
+            }
+        };
         MirrorTexture.prototype._preparePostProcesses = function () {
             this.clearPostProcesses(true);
             if (this._blurKernelX && this._blurKernelY) {
@@ -50448,13 +50487,6 @@ var BABYLON;
             serializationObject.mirrorPlane = this.mirrorPlane.asArray();
             return serializationObject;
         };
-        MirrorTexture.prototype.dispose = function () {
-            if (this._resizeObserver) {
-                this.getScene().getEngine().onResizeObservable.remove(this._resizeObserver);
-                this._resizeObserver = null;
-            }
-            _super.prototype.dispose.call(this);
-        };
         return MirrorTexture;
     }(BABYLON.RenderTargetTexture));
     BABYLON.MirrorTexture = MirrorTexture;

+ 46 - 33
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.module.d.ts

@@ -902,6 +902,11 @@ declare module BABYLON {
         */
         onAfterSpritesRenderingObservable: Observable<Scene>;
         /**
+        * An event triggered when SceneLoader.Append or SceneLoader.Load or SceneLoader.ImportMesh were successfully executed
+        * @type {BABYLON.Observable}
+        */
+        onDataLoadedObservable: Observable<Scene>;
+        /**
         * An event triggered when a camera is created
         * @type {BABYLON.Observable}
         */
@@ -1302,6 +1307,7 @@ declare module BABYLON {
         _addPendingData(data: any): void;
         _removePendingData(data: any): void;
         getWaitingItemsCount(): number;
+        readonly isLoading: boolean;
         /**
          * Registers a function to be executed when the scene is ready.
          * @param {Function} func - the function to be executed.
@@ -14262,6 +14268,36 @@ declare module BABYLON {
 }
 
 declare module BABYLON {
+    class ReflectionProbe {
+        name: string;
+        private _scene;
+        private _renderTargetTexture;
+        private _projectionMatrix;
+        private _viewMatrix;
+        private _target;
+        private _add;
+        private _attachedMesh;
+        invertYAxis: boolean;
+        position: Vector3;
+        constructor(name: string, size: number, scene: Scene, generateMipMaps?: boolean);
+        samples: number;
+        refreshRate: number;
+        getScene(): Scene;
+        readonly cubeTexture: RenderTargetTexture;
+        readonly renderList: Nullable<AbstractMesh[]>;
+        attachToMesh(mesh: AbstractMesh): void;
+        /**
+         * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.
+         *
+         * @param renderingGroupId The rendering group id corresponding to its index
+         * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.
+         */
+        setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean): void;
+        dispose(): void;
+    }
+}
+
+declare module BABYLON {
     class AnaglyphPostProcess extends PostProcess {
         private _passedProcess;
         constructor(name: string, options: number | PostProcessOptions, rigCameras: Camera[], samplingMode?: number, engine?: Engine, reusable?: boolean);
@@ -14788,36 +14824,6 @@ declare module BABYLON {
 }
 
 declare module BABYLON {
-    class ReflectionProbe {
-        name: string;
-        private _scene;
-        private _renderTargetTexture;
-        private _projectionMatrix;
-        private _viewMatrix;
-        private _target;
-        private _add;
-        private _attachedMesh;
-        invertYAxis: boolean;
-        position: Vector3;
-        constructor(name: string, size: number, scene: Scene, generateMipMaps?: boolean);
-        samples: number;
-        refreshRate: number;
-        getScene(): Scene;
-        readonly cubeTexture: RenderTargetTexture;
-        readonly renderList: Nullable<AbstractMesh[]>;
-        attachToMesh(mesh: AbstractMesh): void;
-        /**
-         * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.
-         *
-         * @param renderingGroupId The rendering group id corresponding to its index
-         * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.
-         */
-        setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean): void;
-        dispose(): void;
-    }
-}
-
-declare module BABYLON {
     class BoundingBoxRenderer {
         frontColor: Color3;
         backColor: Color3;
@@ -18598,13 +18604,13 @@ declare module BABYLON {
         private _blurKernelX;
         private _blurKernelY;
         private _blurRatio;
-        private _resizeObserver;
         blurRatio: number;
         adaptiveBlurKernel: number;
         blurKernel: number;
         blurKernelX: number;
         blurKernelY: number;
         private _autoComputeBlurKernel();
+        protected _onRatioRescale(): void;
         constructor(name: string, size: number | {
             width: number;
             height: number;
@@ -18614,7 +18620,6 @@ declare module BABYLON {
         private _preparePostProcesses();
         clone(): MirrorTexture;
         serialize(): any;
-        dispose(): void;
     }
 }
 
@@ -18706,6 +18711,7 @@ declare module BABYLON {
         ignoreCameraViewport: boolean;
         private _postProcessManager;
         private _postProcesses;
+        private _resizeObserver;
         /**
         * An event triggered when the texture is unbind.
         * @type {BABYLON.Observable}
@@ -18744,7 +18750,13 @@ declare module BABYLON {
             width: number;
             height: number;
         };
-        private _sizeRatio;
+        protected _initialSizeParameter: number | {
+            width: number;
+            height: number;
+        } | {
+            ratio: number;
+        };
+        protected _sizeRatio: Nullable<number>;
         _generateMipMaps: boolean;
         protected _renderingManager: RenderingManager;
         _waitingRenderList: string[];
@@ -18756,6 +18768,7 @@ declare module BABYLON {
         protected _renderTargetOptions: RenderTargetCreationOptions;
         readonly renderTargetOptions: RenderTargetCreationOptions;
         protected _engine: Engine;
+        protected _onRatioRescale(): void;
         constructor(name: string, size: number | {
             width: number;
             height: number;

+ 4 - 0
src/Behaviors/Cameras/babylon.autoRotationBehavior.ts

@@ -81,6 +81,10 @@ module BABYLON {
 		private _lastInteractionTime = -Infinity;
 		private _cameraRotationSpeed: number = 0;
 
+		public init(): void {
+			// Do notihng
+		}
+
         public attach(camera: ArcRotateCamera): void {
             this._attachedCamera = camera;
             let scene = this._attachedCamera.getScene();

+ 5 - 0
src/Behaviors/Cameras/babylon.bouncingBehavior.ts

@@ -78,6 +78,11 @@ module BABYLON {
         private _attachedCamera: Nullable<ArcRotateCamera>;
 		private _onAfterCheckInputsObserver: Nullable<Observer<Camera>>;	
 		private _onMeshTargetChangedObserver: Nullable<Observer<AbstractMesh>>;
+
+		public init(): void {
+			// Do notihng
+		}
+		
         public attach(camera: ArcRotateCamera): void {
             this._attachedCamera = camera;
             this._onAfterCheckInputsObserver = camera.onAfterCheckInputsObservable.add(() => {

+ 6 - 2
src/Behaviors/Cameras/babylon.framingBehavior.ts

@@ -145,8 +145,12 @@ module BABYLON {
 		private _onMeshTargetChangedObserver: Nullable<Observer<AbstractMesh>>;
         private _attachedCamera: Nullable<ArcRotateCamera>;
         private _isPointerDown = false;
-        private _lastInteractionTime = -Infinity;
-
+		private _lastInteractionTime = -Infinity;
+		
+		public init(): void {
+			// Do notihng
+		}
+		
         public attach(camera: ArcRotateCamera): void {
             this._attachedCamera = camera;
 			let scene = this._attachedCamera.getScene();

+ 1 - 0
src/Behaviors/babylon.behavior.ts

@@ -2,6 +2,7 @@ module BABYLON {
     export interface Behavior<T extends Node> {
         name: string;
 
+        init(): void
         attach(node: T): void;
         detach(): void;
     }

+ 13 - 23
src/Materials/Textures/babylon.mirrorTexture.ts

@@ -13,8 +13,6 @@
         private _blurKernelY = 0;
         private _blurRatio = 1.0;
 
-        private _resizeObserver: Nullable<Observer<Engine>>;
-
         public set blurRatio(value: number) {
             if (this._blurRatio === value) {
                 return;
@@ -73,24 +71,24 @@
             this.blurKernelY = this._adaptiveBlurKernel * dh;
         }
 
+        protected _onRatioRescale(): void {
+            if (this._sizeRatio) {
+                this.resize(this._initialSizeParameter);
+                if (!this._adaptiveBlurKernel) {
+                    this._preparePostProcesses();
+                }
+            }
+
+            if (this._adaptiveBlurKernel) {
+                this._autoComputeBlurKernel();
+            }
+        }
+
         constructor(name: string, size: number | {width: number, height: number} | {ratio: number}, scene: Scene, generateMipMaps?: boolean, type: number = Engine.TEXTURETYPE_UNSIGNED_INT, samplingMode = Texture.BILINEAR_SAMPLINGMODE, generateDepthBuffer = true) {
             super(name, size, scene, generateMipMaps, true, type, false, samplingMode, generateDepthBuffer);
 
             this.ignoreCameraViewport = true;
 
-            this._resizeObserver = this.getScene()!.getEngine().onResizeObservable.add(() => {
-                if ((<{ratio: number}>size).ratio) {
-                    this.resize(size);
-                    if (!this._adaptiveBlurKernel) {
-                        this._preparePostProcesses();
-                    }
-                }
-
-                if (this._adaptiveBlurKernel) {
-                    this._autoComputeBlurKernel();
-                }
-            });
-
             this.onBeforeRenderObservable.add(() => {
                 Matrix.ReflectionToRef(this.mirrorPlane, this._mirrorMatrix);
                 this._savedViewMatrix = scene.getViewMatrix();
@@ -183,13 +181,5 @@
 
             return serializationObject;
         }
-
-        public dispose(): void {
-            if (this._resizeObserver) {
-                this.getScene()!.getEngine().onResizeObservable.remove(this._resizeObserver);
-                this._resizeObserver = null;
-            }
-            super.dispose();
-        }
     }
 } 

+ 20 - 2
src/Materials/Textures/babylon.renderTargetTexture.ts

@@ -35,7 +35,9 @@
         public ignoreCameraViewport: boolean = false;
 
         private _postProcessManager: Nullable<PostProcessManager>;
-        private _postProcesses: PostProcess[];
+        private _postProcesses: PostProcess[];        
+
+        private _resizeObserver: Nullable<Observer<Engine>>;
 
         // Events
 
@@ -103,7 +105,8 @@
 
         public clearColor: Color4;
         protected _size: number | {width: number, height: number};
-        private _sizeRatio: Nullable<number>;
+        protected _initialSizeParameter: number | {width: number, height: number} | {ratio: number}
+        protected _sizeRatio: Nullable<number>;
         public _generateMipMaps: boolean;
         protected _renderingManager: RenderingManager;
         public _waitingRenderList: string[];
@@ -119,6 +122,12 @@
 
         protected _engine: Engine;
 
+        protected _onRatioRescale(): void {
+            if (this._sizeRatio) {
+                this.resize(this._initialSizeParameter);
+            }
+        }
+
         constructor(name: string, size: number | {width: number, height: number} | {ratio: number}, scene: Nullable<Scene>, generateMipMaps?: boolean, doNotChangeAspectRatio: boolean = true, type: number = Engine.TEXTURETYPE_UNSIGNED_INT, public isCube = false, samplingMode = Texture.TRILINEAR_SAMPLINGMODE, generateDepthBuffer = true, generateStencilBuffer = false, isMulti = false) {
             super(null, scene, !generateMipMaps);
             scene = this.getScene();
@@ -130,9 +139,13 @@
             this._engine = scene.getEngine();
             this.name = name;
             this.isRenderTarget = true;
+            this._initialSizeParameter = size;
 
             this._processSizeParameter(size);
 
+            this._resizeObserver = this.getScene()!.getEngine().onResizeObservable.add(() => {
+            });            
+
             this._generateMipMaps = generateMipMaps ? true : false;
             this._doNotChangeAspectRatio = doNotChangeAspectRatio;
 
@@ -648,6 +661,11 @@
 
             this.clearPostProcesses(true);
 
+            if (this._resizeObserver) {
+                this.getScene()!.getEngine().onResizeObservable.remove(this._resizeObserver);
+                this._resizeObserver = null;
+            }
+
             this.renderList = null;
 
             // Remove from custom render targets

+ 1 - 0
src/babylon.node.ts

@@ -114,6 +114,7 @@
                 return this;
             }
 
+            behavior.init();
             if (this._scene.isLoading) {
                 // We defer the attach when the scene will be loaded
                 var observer = this._scene.onDataLoadedObservable.add(() => {

二进制
tests/validation/ReferenceImages/GLTF LOD.png