Skip to content

Commit 7b99ed4

Browse files
committed
Critical fix - cleanup three.js object before each update
1 parent c15111e commit 7b99ed4

File tree

1 file changed

+31
-4
lines changed

1 file changed

+31
-4
lines changed

scripts/JSRoot3DPainter.js

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,28 @@
317317
return control;
318318
}
319319

320+
JSROOT.Painter.DisposeThreejsObject = function(obj) {
321+
if (!obj) return;
322+
323+
if (obj.children) {
324+
for (var i = 0; i < obj.children.length; i++)
325+
JSROOT.Painter.DisposeThreejsObject(obj.children[i]);
326+
}
327+
if (obj.geometry) {
328+
obj.geometry.dispose();
329+
obj.geometry = undefined;
330+
}
331+
if (obj.material) {
332+
if (obj.material.map) {
333+
obj.material.map.dispose();
334+
obj.material.map = undefined;
335+
}
336+
obj.material.dispose();
337+
obj.material = undefined;
338+
}
339+
obj = undefined;
340+
}
341+
320342
JSROOT.Painter.HPainter_Create3DScene = function(arg) {
321343

322344
if ((arg!==undefined) && (arg<0)) {
@@ -325,9 +347,13 @@
325347
this.TestAxisVisibility(null, this.toplevel);
326348

327349
this.clear_3d_canvas();
350+
351+
JSROOT.Painter.DisposeThreejsObject(this.scene);
352+
328353
delete this.size3d;
329354
delete this.scene;
330355
delete this.toplevel;
356+
delete this.tooltip_mesh;
331357
delete this.camera;
332358
delete this.pointLight;
333359
delete this.renderer;
@@ -342,12 +368,13 @@
342368
if ('toplevel' in this) {
343369
// it is indication that all 3D object created, just replace it with empty
344370

345-
var newtop = new THREE.Object3D();
346-
347371
this.scene.remove(this.toplevel);
372+
JSROOT.Painter.DisposeThreejsObject(this.toplevel);
373+
delete this.toplevel;
374+
delete this.tooltip_mesh;
348375

376+
var newtop = new THREE.Object3D();
349377
this.scene.add(newtop);
350-
351378
this.toplevel = newtop;
352379

353380
return;
@@ -382,7 +409,7 @@
382409
this.webgl = JSROOT.Painter.TestWebGL();
383410

384411
this.renderer = this.webgl ? new THREE.WebGLRenderer({ antialias : true, alpha: true }) :
385-
new THREE.CanvasRenderer({ antialias : true, alpha: true });
412+
new THREE.CanvasRenderer({ antialias : true, alpha: true });
386413
//renderer.setClearColor(0xffffff, 1);
387414
// renderer.setClearColor(0x0, 0);
388415
this.renderer.setSize(this.scene_width, this.scene_height);

0 commit comments

Comments
 (0)