Destroy lists when removing children from rendergraph, make parent link a weakref to avoid cyclic refs/gc
This commit is contained in:
parent
bdb8233f91
commit
3806d4b59f
@ -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)
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user