Destroy lists when removing children from rendergraph, make parent link a weakref to avoid cyclic refs/gc

This commit is contained in:
David Vierra 2015-01-04 15:46:40 -10:00
parent bdb8233f91
commit 3806d4b59f
2 changed files with 35 additions and 2 deletions

View File

@ -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)

View File

@ -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