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 from __future__ import absolute_import, division, print_function
import collections import collections
import logging import logging
import weakref
from OpenGL import GL from OpenGL import GL
import numpy import numpy
from mcedit2.rendering import cubes from mcedit2.rendering import cubes
@ -24,11 +25,23 @@ class RenderNode(object):
self.displayList = DisplayList() # Recompiled whenever this node's scenegraph node is dirty self.displayList = DisplayList() # Recompiled whenever this node's scenegraph node is dirty
# or node gains or loses children # or node gains or loses children
self.childNeedsRecompile = True self.childNeedsRecompile = True
self.parent = None
def __repr__(self): def __repr__(self):
return "%s(%s)" % (self.__class__.__name__, self.sceneNode) 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): def addChild(self, node):
self.children.append(node) self.children.append(node)
self._addChild(node) self._addChild(node)
@ -99,6 +112,12 @@ class RenderNode(object):
def drawSelf(self): def drawSelf(self):
pass pass
def destroyLists(self):
for child in self.children:
child.destroyLists()
self.displayList.destroy()
class RenderstateRenderNode(RenderNode): class RenderstateRenderNode(RenderNode):
def draw(self): def draw(self):
@ -362,6 +381,7 @@ def updateChildren(renderNode):
for dc in deadChildren: for dc in deadChildren:
renderNode.removeChild(dc) renderNode.removeChild(dc)
dc.destroyLists()
for index, sceneChild in enumerate(sceneNode.children): for index, sceneChild in enumerate(sceneNode.children):
renderChild = renderNode.childrenBySceneNode.get(sceneChild) renderChild = renderNode.childrenBySceneNode.get(sceneChild)

View File

@ -3,6 +3,7 @@
""" """
from __future__ import absolute_import, division, print_function from __future__ import absolute_import, division, print_function
import logging import logging
import weakref
from mcedit2.rendering import rendergraph from mcedit2.rendering import rendergraph
@ -20,11 +21,23 @@ class Node(object):
self._dirty = True self._dirty = True
self.childrenChanged = False self.childrenChanged = False
self.descendentChildrenChanged = False self.descendentChildrenChanged = False
self.parent = None
def __repr__(self): def __repr__(self):
return "%s(visible=%s, children=%d)" % (self.__class__.__name__, self.visible, len(self._children)) 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): def touchChildren(self):
node = self node = self
node.childrenChanged = True node.childrenChanged = True