From 39448de88999708d4c8e36f397bb5ed1c227ee7c Mon Sep 17 00:00:00 2001 From: Darren Ranalli Date: Fri, 19 Sep 2003 23:04:37 +0000 Subject: [PATCH] fixed entity cleanup --- direct/src/level/DistributedLevel.py | 6 +++++- direct/src/level/EntityCreatorBase.py | 2 +- direct/src/level/LevelBase.py | 12 +++++++++--- direct/src/level/LevelMgr.py | 12 +++++++++--- direct/src/level/LevelMgrAI.py | 2 ++ 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/direct/src/level/DistributedLevel.py b/direct/src/level/DistributedLevel.py index 12747d551f..e3798d0e1b 100755 --- a/direct/src/level/DistributedLevel.py +++ b/direct/src/level/DistributedLevel.py @@ -102,7 +102,7 @@ class DistributedLevel(DistributedObject.DistributedObject, def handleLevelMgrCreated(self): # as soon as the levelMgr has been created, load up the model # and extract zone info - self.geom = loader.loadModel(self.modelFilename) + self.geom = self.levelMgr.geom def findNumberedNodes(baseString, model=self.geom, self=self): # finds nodes whose name follows the pattern 'baseString#' @@ -182,6 +182,10 @@ class DistributedLevel(DistributedObject.DistributedObject, def disable(self): self.notify.debug('disable') + + # geom is owned by the levelMgr + del self.geom + self.destroyLevel() DistributedObject.DistributedObject.disable(self) self.ignoreAll() diff --git a/direct/src/level/EntityCreatorBase.py b/direct/src/level/EntityCreatorBase.py index 26d343df34..19ce831246 100755 --- a/direct/src/level/EntityCreatorBase.py +++ b/direct/src/level/EntityCreatorBase.py @@ -20,7 +20,7 @@ class EntityCreatorBase: (entType, entId)) # inheritor must define doCreateEntity - self.doCreateEntity(self.entType2Ctor[entType], entId) + return self.doCreateEntity(self.entType2Ctor[entType], entId) def privRegisterType(self, entType, ctor): if self.entType2Ctor.has_key(entType): diff --git a/direct/src/level/LevelBase.py b/direct/src/level/LevelBase.py index 2fc03e70e4..c20a1b9e93 100755 --- a/direct/src/level/LevelBase.py +++ b/direct/src/level/LevelBase.py @@ -74,9 +74,15 @@ class LevelBase: self.removeEntityCreationHandlers() def destroyLevel(self): - for entity in self.createdEntities: - entity.destroy() - del self.createdEntities + if hasattr(self, 'createdEntities'): + # destroy the entities in reverse order + while len(self.createdEntities) > 0: + entity = self.createdEntities.pop() + self.notify.debug('destroying %s entity %s' % + (self.getEntityType(entity.entId), + entity.entId)) + entity.destroy() + del self.createdEntities del self.entities del self.entId2spec del self.spec diff --git a/direct/src/level/LevelMgr.py b/direct/src/level/LevelMgr.py index 6959ade787..bae70d1b95 100755 --- a/direct/src/level/LevelMgr.py +++ b/direct/src/level/LevelMgr.py @@ -6,7 +6,13 @@ class LevelMgr(Entity.Entity): """This class manages editable client-side level attributes""" def __init__(self, level, entId): Entity.Entity.__init__(self, level, entId) - self.callSetters('modelFilename') + self.level.levelMgr = self + + # load the model + self.geom = loader.loadModel(self.modelFilename) - def setModelFilename(self, modelFilename): - self.level.modelFilename = modelFilename + def destroy(self): + del self.level.levelMgr + self.geom.removeNode() + del self.geom + Entity.Entity.destroy(self) diff --git a/direct/src/level/LevelMgrAI.py b/direct/src/level/LevelMgrAI.py index 00bdd16dda..d82504d35f 100755 --- a/direct/src/level/LevelMgrAI.py +++ b/direct/src/level/LevelMgrAI.py @@ -6,3 +6,5 @@ class LevelMgrAI(Entity.Entity): """This class manages editable AI level attributes""" def __init__(self, level, entId): Entity.Entity.__init__(self, level, entId) + self.level.levelMgr = self +