From 3806d4b59f2f995148ed876bb0b9681d3130f281 Mon Sep 17 00:00:00 2001 From: David Vierra Date: Sun, 4 Jan 2015 15:46:40 -1000 Subject: [PATCH] Destroy lists when removing children from rendergraph, make parent link a weakref to avoid cyclic refs/gc --- src/mcedit2/rendering/rendergraph.py | 22 +++++++++++++++++++++- src/mcedit2/rendering/scenegraph.py | 15 ++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/mcedit2/rendering/rendergraph.py b/src/mcedit2/rendering/rendergraph.py index 0373139..43e7169 100644 --- a/src/mcedit2/rendering/rendergraph.py +++ b/src/mcedit2/rendering/rendergraph.py @@ -4,6 +4,7 @@ from __future__ import absolute_import, division, print_function import collections import logging +import weakref from OpenGL import GL import numpy from mcedit2.rendering import cubes @@ -24,11 +25,23 @@ class RenderNode(object): self.displayList = DisplayList() # Recompiled whenever this node's scenegraph node is dirty # or node gains or loses children self.childNeedsRecompile = True - self.parent = None def __repr__(self): return "%s(%s)" % (self.__class__.__name__, self.sceneNode) + _parent = None + @property + def parent(self): + if self._parent: + return self._parent() + + @parent.setter + def parent(self, value): + if value: + self._parent = weakref.ref(value) + else: + self._parent = value + def addChild(self, node): self.children.append(node) self._addChild(node) @@ -99,6 +112,12 @@ class RenderNode(object): def drawSelf(self): pass + def destroyLists(self): + for child in self.children: + child.destroyLists() + self.displayList.destroy() + + class RenderstateRenderNode(RenderNode): def draw(self): @@ -362,6 +381,7 @@ def updateChildren(renderNode): for dc in deadChildren: renderNode.removeChild(dc) + dc.destroyLists() for index, sceneChild in enumerate(sceneNode.children): renderChild = renderNode.childrenBySceneNode.get(sceneChild) diff --git a/src/mcedit2/rendering/scenegraph.py b/src/mcedit2/rendering/scenegraph.py index 93d834e..f7e9ef2 100644 --- a/src/mcedit2/rendering/scenegraph.py +++ b/src/mcedit2/rendering/scenegraph.py @@ -3,6 +3,7 @@ """ from __future__ import absolute_import, division, print_function import logging +import weakref from mcedit2.rendering import rendergraph @@ -20,11 +21,23 @@ class Node(object): self._dirty = True self.childrenChanged = False self.descendentChildrenChanged = False - self.parent = None def __repr__(self): return "%s(visible=%s, children=%d)" % (self.__class__.__name__, self.visible, len(self._children)) + _parent = None + @property + def parent(self): + if self._parent: + return self._parent() + + @parent.setter + def parent(self, value): + if value: + self._parent = weakref.ref(value) + else: + self._parent = value + def touchChildren(self): node = self node.childrenChanged = True