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