Explorar el Código

task: Fix re-adding task object removing extraArgs (#1132)

Fixes #1097
Timothy Paustian hace 2 años
padre
commit
50de135641
Se han modificado 2 ficheros con 38 adiciones y 2 borrados
  1. 10 2
      direct/src/task/Task.py
  2. 28 0
      tests/task/test_task_arg.py

+ 10 - 2
direct/src/task/Task.py

@@ -410,8 +410,10 @@ class TaskManager:
         return task
 
     def __setupTask(self, funcOrTask, name, priority, sort, extraArgs, taskChain, appendTask, owner, uponDeath):
+        wasTask = False
         if isinstance(funcOrTask, AsyncTask):
             task = funcOrTask
+            wasTask = True
         elif hasattr(funcOrTask, '__call__') or \
              hasattr(funcOrTask, 'cr_await') or \
              isinstance(funcOrTask, types.GeneratorType):
@@ -427,8 +429,14 @@ class TaskManager:
         if hasattr(task, 'setArgs'):
             # It will only accept arguments if it's a PythonTask.
             if extraArgs is None:
-                extraArgs = []
-                appendTask = True
+                if wasTask:
+                    extraArgs = task.getArgs()
+                    #do not append the task to an existing task. It was already there
+                    #from the last time it was addeed
+                    appendTask = False
+                else:
+                    extraArgs = []
+                    appendTask = True
             task.setArgs(extraArgs, appendTask)
         elif extraArgs is not None:
             self.notify.error(

+ 28 - 0
tests/task/test_task_arg.py

@@ -0,0 +1,28 @@
+from direct.showbase.ShowBase import ShowBase
+from direct.task import Task
+from panda3d.core import Vec2
+
+def test_task_arg():
+    def test(ship, flood, task):
+        ship.y += flood
+        return task.done
+
+    ship = Vec2(2.2, 2)
+    flood = 1
+
+    base = ShowBase(windowType='none')
+    task = base.addTask(test, 'test_task', extraArgs=[ship, flood], appendTask=True)
+    base.taskMgr.step()
+    assert ship.y == 3
+    base.remove_task(task)
+    task = base.addTask(task)
+    base.taskMgr.step()
+    assert ship.y == 4
+    task = base.taskMgr.add(test, 'test_task', extraArgs=[ship, flood], appendTask=True)
+    base.taskMgr.step()
+    assert ship.y == 5
+    base.remove_task(task)
+    task = base.taskMgr.add(task)
+    base.taskMgr.step()
+    assert ship.y == 6
+