From db97ccea34e6d7572792146ecfcaab47d367096a Mon Sep 17 00:00:00 2001 From: Sergey Linev <S.Linev@gsi.de> Date: Mon, 1 Mar 2021 17:40:28 +0100 Subject: [PATCH] [eve7] implement cleanup of GLViewer class When drawing different projection via View -> Browse to menu commands, one have to cleanup previosely shown views. --- ui5/eve7/controller/GL.controller.js | 28 ++++++++++++++++++++-------- ui5/eve7/lib/EveScene.js | 13 ++++++++++++- ui5/eve7/lib/GlViewer.js | 10 ++++++++-- ui5/eve7/lib/GlViewerThree.js | 24 +++++++++++++++++++----- 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/ui5/eve7/controller/GL.controller.js b/ui5/eve7/controller/GL.controller.js index 5fdda58eea1..1e122e5191e 100644 --- a/ui5/eve7/controller/GL.controller.js +++ b/ui5/eve7/controller/GL.controller.js @@ -49,11 +49,9 @@ sap.ui.define([ { let args = oEvent.getParameter("arguments"); - console.log('ON MATCHED', args.viewName); - - console.log('MORE DATA', JSROOT.$eve7tmp); - - console.log('COMPONENT DATA', Component.getOwnerComponentFor(this.getView()).getComponentData()); + // console.log('ON MATCHED', args.viewName); + // console.log('MORE DATA', JSROOT.$eve7tmp); + // console.log('COMPONENT DATA', Component.getOwnerComponentFor(this.getView()).getComponentData()); this.setupManagerAndViewType(Component.getOwnerComponentFor(this.getView()).getComponentData(), args.viewName, JSROOT.$eve7tmp); @@ -66,6 +64,13 @@ sap.ui.define([ // Initialization that can be done immediately onInit or later through UI5 bootstrap callbacks. setupManagerAndViewType: function(data, viewName, moredata) { + delete this.standalone; + delete this.viewer_class; + if (this.viewer) { + this.viewer.cleanup(); + delete this.viewer; + } + if (viewName) { data.standalone = viewName; @@ -80,7 +85,6 @@ sap.ui.define([ this.eveViewerId = moredata.eveViewerId; this.kind = moredata.kind; this.standalone = viewName; - this.checkViewReady(); } else if (data.standalone && data.conn_handle) @@ -212,10 +216,18 @@ sap.ui.define([ redrawScenes: function() { + if (!this.created_scenes) return; + for (let s of this.created_scenes) - { s.redrawScene(); - } + }, + + removeScenes: function() { + if (!this.created_scenes) return; + + for (let s of this.created_scenes) + s.removeScene(); + delete this.created_scenes; }, /// invoked from ResizeHandler diff --git a/ui5/eve7/lib/EveScene.js b/ui5/eve7/lib/EveScene.js index c34ed893ba7..b310911dbe5 100644 --- a/ui5/eve7/lib/EveScene.js +++ b/ui5/eve7/lib/EveScene.js @@ -122,7 +122,7 @@ sap.ui.define(['rootui5/eve7/lib/EveManager'], function(EveManager) { /** method insert all objects into three.js container */ EveScene.prototype.redrawScene = function() { - if ( ! this.glctrl) return; + if (!this.glctrl) return; let res3d = this.create3DObjects(true); if ( ! res3d.length && this.first_time) return; @@ -140,6 +140,17 @@ sap.ui.define(['rootui5/eve7/lib/EveManager'], function(EveManager) { this.first_time = false; } + EveScene.prototype.removeScene = function() + { + if (!this.glctrl) return; + + let cont = this.glctrl.getSceneContainer("scene" + this.id); + while (cont.children.length > 0) + cont.remove(cont.children[0]); + + this.first_time = true; + } + EveScene.prototype.update3DObjectsVisibility = function(arr, all_ancestor_children_visible) { if (!arr) return; diff --git a/ui5/eve7/lib/GlViewer.js b/ui5/eve7/lib/GlViewer.js index 2a0a6dfff64..c8c504af203 100644 --- a/ui5/eve7/lib/GlViewer.js +++ b/ui5/eve7/lib/GlViewer.js @@ -6,20 +6,26 @@ sap.ui.define([], function() { { this.viewer_class = viewer_class; - console.log(this.get_name() + " - constructor"); + // console.log(this.get_name() + " - constructor"); }; GlViewer.prototype = { init: function(controller) { - console.log(this.get_name() + ".init()"); + // console.log(this.get_name() + ".init()"); if (this.controller) throw new Error(this.get_name() + "already initialized."); this.controller = controller; }, + cleanup: function() + { + // console.log(this.get_name() + ".cleanup()"); + delete this.controller; + }, + //============================================================================== get_name: function() { return "EVE.GlViewer" + this.viewer_class; }, diff --git a/ui5/eve7/lib/GlViewerThree.js b/ui5/eve7/lib/GlViewerThree.js index 3f16fbb78d7..5fbb18c0f4e 100644 --- a/ui5/eve7/lib/GlViewerThree.js +++ b/ui5/eve7/lib/GlViewerThree.js @@ -55,6 +55,13 @@ sap.ui.define([ this.controller.glViewerInitDone(); }, + cleanup: function() { + if (this.controller) this.controller.removeScenes(); + this.destroyThreejsRenderer(); + GlViewer.prototype.cleanup.call(this); + }, + + //============================================================================== make_object: function(name) { @@ -70,10 +77,9 @@ sap.ui.define([ //============================================================================== createThreejsRenderer: function() { - var w = this.get_width(); - var h = this.get_height(); + var w = this.get_width(), h = this.get_height(); - // console.log("createThreejsRenderer", this.kind, "w=", w, "h=", h); + // console.log("createThreejsRenderer", this.controller.kind, "w=", w, "h=", h); this.scene = new THREE.Scene(); // this.scene.fog = new THREE.FogExp2( 0xaaaaaa, 0.05 ); @@ -137,6 +143,15 @@ sap.ui.define([ this.composer.addPass(this.fxaa_pass); }, + destroyThreejsRenderer: function() { + if (this.renderer) + this.get_view().getDomRef().removeChild(this.renderer.domElement); + + delete this.renderer; + delete this.scene; + delete this.composer; + }, + setupThreejsDomAndEventHandlers: function() { this.get_view().getDomRef().appendChild(this.renderer.domElement); @@ -449,8 +464,7 @@ sap.ui.define([ this.ttip.style.top = null; } - // show tooltip only in static mode - if (this.handle.kind != "file") this.ttip.style.display = "block"; + this.ttip.style.display = "block"; }, remoteToolTip: function(msg) { this.ttip_text.innerHTML = msg; -- GitLab