Преглед изворни кода

Merge branch 'master' of https://github.com/BabylonJS/Babylon.js

David Catuhe пре 7 година
родитељ
комит
9d2513d3ff

+ 8 - 1
Viewer/src/templateManager.ts

@@ -163,6 +163,7 @@ export class TemplateManager {
         Object.keys(this.templates).forEach(template => {
             this.templates[template].dispose();
         });
+        this.templates = {};
 
         this.onInit.clear();
         this.onAllLoaded.clear();
@@ -355,11 +356,17 @@ export class Template {
         this.onStateChange.clear();
         this.isLoaded = false;
         // remove from parent
-        this.parent.removeChild(this.fragment);
+        try {
+            this.parent.removeChild(this.fragment);
+        } catch (e) {
+            //noop
+        }
 
         this.loadRequests.forEach(request => {
             request.abort();
         });
+
+        delete this.fragment;
     }
 
     private getTemplateAsHtml(templateConfig: ITemplateConfiguration): Promise<string> {

+ 32 - 0
Viewer/src/viewer/viewer.ts

@@ -33,6 +33,8 @@ export abstract class AbstractViewer {
     protected maxShadows: number;
     private _hdrSupport: boolean;
 
+    private _isDisposed: boolean;
+
     public get isHdrSupported() {
         return this._hdrSupport;
     }
@@ -619,20 +621,50 @@ export abstract class AbstractViewer {
     }
 
     public dispose() {
+        if (this._isDisposed) {
+            return;
+        }
         window.removeEventListener('resize', this.resize);
         if (this.sceneOptimizer) {
             this.sceneOptimizer.stop();
             this.sceneOptimizer.dispose();
         }
 
+        if (this.environmentHelper) {
+            this.environmentHelper.dispose();
+        }
+
+        //observers
+        this.onEngineInitObservable.clear();
+        delete this.onEngineInitObservable;
+        this.onInitDoneObservable.clear();
+        delete this.onInitDoneObservable;
+        this.onLoaderInitObservable.clear();
+        delete this.onLoaderInitObservable;
+        this.onModelLoadedObservable.clear();
+        delete this.onModelLoadedObservable;
+        this.onModelLoadErrorObservable.clear();
+        delete this.onModelLoadErrorObservable;
+        this.onModelLoadProgressObservable.clear();
+        delete this.onModelLoadProgressObservable;
+        this.onSceneInitObservable.clear();
+        delete this.onSceneInitObservable;
+
         if (this.scene.activeCamera) {
             this.scene.activeCamera.detachControl(this.canvas);
         }
 
+        this.models.forEach(model => {
+            model.dispose();
+        });
+
+        this.models.length = 0;
+
         this.scene.dispose();
         this.engine.dispose();
 
         this.templateManager.dispose();
+        this._isDisposed = true;
     }
 
     protected abstract prepareContainerElement();

+ 3 - 1
Viewer/webpack.config.js

@@ -24,7 +24,9 @@ module.exports = {
     },
     externals: {
         // until physics will be integrated in the viewer, ignore cannon
-        cannon: 'CANNON'
+        cannon: 'CANNON',
+        oimo: 'OIMO',
+        './Oimo': 'OIMO'
     },
     devtool: 'source-map',
     plugins: [

Разлика између датотеке није приказан због своје велике величине
+ 10 - 10
dist/preview release/viewer/babylon.viewer.js


+ 32 - 1
dist/preview release/viewer/babylon.viewer.max.js

@@ -94112,17 +94112,42 @@ var AbstractViewer = (function () {
         }
     };
     AbstractViewer.prototype.dispose = function () {
+        if (this._isDisposed) {
+            return;
+        }
         window.removeEventListener('resize', this.resize);
         if (this.sceneOptimizer) {
             this.sceneOptimizer.stop();
             this.sceneOptimizer.dispose();
         }
+        if (this.environmentHelper) {
+            this.environmentHelper.dispose();
+        }
+        this.onEngineInitObservable.clear();
+        delete this.onEngineInitObservable;
+        this.onInitDoneObservable.clear();
+        delete this.onInitDoneObservable;
+        this.onLoaderInitObservable.clear();
+        delete this.onLoaderInitObservable;
+        this.onModelLoadedObservable.clear();
+        delete this.onModelLoadedObservable;
+        this.onModelLoadErrorObservable.clear();
+        delete this.onModelLoadErrorObservable;
+        this.onModelLoadProgressObservable.clear();
+        delete this.onModelLoadProgressObservable;
+        this.onSceneInitObservable.clear();
+        delete this.onSceneInitObservable;
         if (this.scene.activeCamera) {
             this.scene.activeCamera.detachControl(this.canvas);
         }
+        this.models.forEach(function (model) {
+            model.dispose();
+        });
+        this.models.length = 0;
         this.scene.dispose();
         this.engine.dispose();
         this.templateManager.dispose();
+        this._isDisposed = true;
     };
     AbstractViewer.prototype.onTemplatesLoaded = function () {
         return Promise.resolve(this);
@@ -94677,6 +94702,7 @@ var TemplateManager = (function () {
         Object.keys(this.templates).forEach(function (template) {
             _this.templates[template].dispose();
         });
+        this.templates = {};
         this.onInit.clear();
         this.onAllLoaded.clear();
         this.onEventTriggered.clear();
@@ -94830,10 +94856,15 @@ var Template = (function () {
         this.onLoaded.clear();
         this.onStateChange.clear();
         this.isLoaded = false;
-        this.parent.removeChild(this.fragment);
+        try {
+            this.parent.removeChild(this.fragment);
+        }
+        catch (e) {
+        }
         this.loadRequests.forEach(function (request) {
             request.abort();
         });
+        delete this.fragment;
     };
     Template.prototype.getTemplateAsHtml = function (templateConfig) {
         var _this = this;