diff --git a/direct/src/showbase/DirectObject.py b/direct/src/showbase/DirectObject.py index 6cd536561a..fcbdb39aa1 100644 --- a/direct/src/showbase/DirectObject.py +++ b/direct/src/showbase/DirectObject.py @@ -43,3 +43,31 @@ class DirectObject: def classTree(self): return ClassTree(self) + + #This function must be used if you want a managed task + def addTask(self, *args, **kwargs): + if(not hasattr(self,"_taskList")): + self._taskList = {} + kwargs['owner']=self + task = taskMgr.add(*args, **kwargs) + self._taskList[task.id] = task + return task + + def doMethodLater(self, *args, **kwargs): + if(not hasattr(self,"_taskList")): + self._taskList ={} + kwargs['owner']=self + task = taskMgr.doMethodLater(*args, **kwargs) + self._taskList[task.id] = task + return task + + def removeTask(self, task): + task.remove() + + def removeAllTasks(self): + for task in self._taskList.values(): + task.remove() + + def _clearTask(self, task): + del self._taskList[task.id] + diff --git a/direct/src/task/Task.py b/direct/src/task/Task.py index fb28ed49c5..4f6b0b8324 100644 --- a/direct/src/task/Task.py +++ b/direct/src/task/Task.py @@ -84,6 +84,10 @@ class Task: # Unique ID for each task self.id = Task.count Task.count += 1 + + #set to have the task managed + self.owner = None + self.__call__ = callback self._priority = priority self._removed = 0 @@ -125,6 +129,8 @@ class Task: def remove(self): if not self._removed: + if(self.owner): + self.owner._clearTask(self) self._removed = 1 # Remove any refs to real objects # In case we hang around the doLaterList for a while @@ -474,7 +480,7 @@ class TaskManager: return cont def doMethodLater(self, delayTime, funcOrTask, name, extraArgs=None, - priority=0, uponDeath=None, appendTask=False): + priority=0, uponDeath=None, appendTask=False, owner = None): if delayTime < 0: self.notify.warning('doMethodLater: added task: %s with negative delay: %s' % (name, delayTime)) if isinstance(funcOrTask, Task): @@ -485,6 +491,7 @@ class TaskManager: self.notify.error('doMethodLater: Tried to add a task that was not a Task or a func') task.setPriority(priority) task.name = name + task.owner = owner if extraArgs == None: extraArgs = [] appendTask = True @@ -518,7 +525,8 @@ class TaskManager: return task def add(self, funcOrTask, name, priority=0, extraArgs=None, uponDeath=None, - appendTask = False): + appendTask = False, owner = None): + """ Add a new task to the taskMgr. You can add a Task object or a method that takes one argument. @@ -533,6 +541,7 @@ class TaskManager: 'add: Tried to add a task that was not a Task or a func') task.setPriority(priority) task.name = name + task.owner = owner if extraArgs == None: extraArgs = [] appendTask = True