Browse Source

*** empty log message ***

Joe Shochet 24 years ago
parent
commit
de41ee6447
33 changed files with 305 additions and 458 deletions
  1. 9 3
      direct/src/actor/Actor.py
  2. 2 2
      direct/src/cluster/ClusterClient.py
  3. 5 5
      direct/src/cluster/ClusterServer.py
  4. 2 2
      direct/src/directdevices/DirectFastrak.py
  5. 3 3
      direct/src/directdevices/DirectJoybox.py
  6. 2 2
      direct/src/directdevices/DirectRadamec.py
  7. 27 27
      direct/src/directtools/DirectCameraControl.py
  8. 15 15
      direct/src/directtools/DirectManipulation.py
  9. 14 15
      direct/src/directtools/DirectSession.py
  10. 2 2
      direct/src/directtools/DirectUtil.py
  11. 2 2
      direct/src/directutil/Mopath.py
  12. 4 5
      direct/src/distributed/ClientRepository.py
  13. 3 3
      direct/src/distributed/DistributedSmoothNode.py
  14. 101 103
      direct/src/distributed/ServerRepository.py
  15. 1 1
      direct/src/extensions/NodePath-extensions.py
  16. 4 4
      direct/src/gui/DirectGuiBase.py
  17. 7 7
      direct/src/gui/DirectGuiTest.py
  18. 4 4
      direct/src/gui/DirectScrolledList.py
  19. 4 4
      direct/src/interval/Interval.py
  20. 6 7
      direct/src/leveleditor/LevelEditor.py
  21. 3 4
      direct/src/leveleditor/PieMenu.py
  22. 2 2
      direct/src/showbase/EventManager.py
  23. 8 9
      direct/src/showbase/ShowBase.py
  24. 1 3
      direct/src/showbase/TkGlobal.py
  25. 9 9
      direct/src/showbase/Transitions.py
  26. 41 191
      direct/src/task/Task.py
  27. 3 3
      direct/src/task/Timer.py
  28. 2 2
      direct/src/tkpanels/AnimPanel.py
  29. 12 12
      direct/src/tkpanels/MopathRecorder.py
  30. 1 1
      direct/src/tkpanels/Placer.py
  31. 2 2
      direct/src/tkpanels/TaskManagerPanel.py
  32. 2 2
      direct/src/tkwidgets/Dial.py
  33. 2 2
      direct/src/tkwidgets/Floater.py

+ 9 - 3
direct/src/actor/Actor.py

@@ -301,12 +301,18 @@ class Actor(PandaObject, NodePath):
 
     def getPartBundleDict(self):
         return self.__partBundleDict
-    
+
+        
     def getLODNames(self):
         """getLODNames(self):
         Return list of Actor LOD names. If not an LOD actor,
-        returns 'lodRoot'"""
-        return self.__partBundleDict.keys()
+        returns 'lodRoot'
+        Sorts them from highest lod to lowest.
+        """
+        lodNames = self.__partBundleDict.keys()
+        # Reverse sort the doing a string->int
+        lodNames.sort(lambda x,y : cmp(int(y), int(x)))
+        return lodNames
     
     def getPartNames(self):
         """getPartNames(self):

+ 2 - 2
direct/src/cluster/ClusterClient.py

@@ -92,7 +92,7 @@ class ClusterManager(DirectObject.DirectObject):
 
     def startMoveCamTask(self):
         task = Task.Task(self.moveCameraTask,49)
-        taskMgr.spawnTaskNamed(task, "moveCamTask")
+        taskMgr.add(task, "moveCamTask")
         return None        
 
     def moveCameraTask(self,task):
@@ -113,7 +113,7 @@ class ClusterManagerSync(ClusterManager):
 
     def startSwapCoordinatorTask(self):
         task = Task.Task(self.swapCoordinator,51)
-        taskMgr.spawnTaskNamed(task, "clientSwapCoordinator")
+        taskMgr.add(task, "clientSwapCoordinator")
         return None
 
     def swapCoordinator(self,task):

+ 5 - 5
direct/src/cluster/ClusterServer.py

@@ -45,7 +45,7 @@ class ClusterServer(DirectObject.DirectObject):
 
     def startListenerPollTask(self):
         task = Task.Task(self.listenerPoll)
-        taskMgr.spawnTaskNamed(task, "serverListenerPollTask")
+        taskMgr.add(task, "serverListenerPollTask")
         return None
 
     def listenerPoll(self, task):
@@ -69,7 +69,7 @@ class ClusterServer(DirectObject.DirectObject):
 
     def startReaderPollTask(self):
         task = Task.Task(self.readerPollUntilEmpty,-10)
-        taskMgr.spawnTaskNamed(task, "serverReaderPollTask")
+        taskMgr.add(task, "serverReaderPollTask")
         return None
 
     def readerPollUntilEmpty(self, task):
@@ -144,7 +144,7 @@ class ClusterServerSync(ClusterServer):
 
     def startListenerPollTask(self):
         task = Task.Task(self.listenerPoll,-2)
-        taskMgr.spawnTaskNamed(task, "serverListenerPollTask")
+        taskMgr.add(task, "serverListenerPollTask")
         return None
 
     def listenerPoll(self, task):
@@ -175,7 +175,7 @@ class ClusterServerSync(ClusterServer):
 
     def startReaderPollTask(self):
         task = Task.Task(self.readPos,-1)
-        taskMgr.spawnTaskNamed(task, "serverReadPosTask")
+        taskMgr.add(task, "serverReadPosTask")
         return None
 
     def readPos(self, task):
@@ -202,7 +202,7 @@ class ClusterServerSync(ClusterServer):
 
     def startSwapCoordinator(self):
         task = Task.Task(self.swapCoordinatorTask, 51)
-        taskMgr.spawnTaskNamed(task, "serverSwapCoordinator")
+        taskMgr.add(task, "serverSwapCoordinator")
         return None
 
     def swapCoordinatorTask(self, task):

+ 2 - 2
direct/src/directdevices/DirectFastrak.py

@@ -45,10 +45,10 @@ class DirectFastrak(PandaObject):
         # Initialize tracker
         self.tracker = direct.deviceManager.createTracker(self.device)
         # Update task
-        taskMgr.spawnMethodNamed(self.updateTask, self.name + '-updateTask')
+        taskMgr.add(self.updateTask, self.name + '-updateTask')
     
     def disable(self):
-        taskMgr.removeTasksNamed(self.name + '-updateTask')
+        taskMgr.remove(self.name + '-updateTask')
 
     def destroy(self):
         self.disable()

+ 3 - 3
direct/src/directdevices/DirectJoybox.py

@@ -80,10 +80,10 @@ class DirectJoybox(PandaObject):
         self.acceptSwitchModeEvent()
         self.acceptUprightCameraEvent()
         # Update task
-        taskMgr.spawnMethodNamed(self.updateTask, self.name + '-updateTask')
+        taskMgr.add(self.updateTask, self.name + '-updateTask')
     
     def disable(self):
-        taskMgr.removeTasksNamed(self.name + '-updateTask')
+        taskMgr.remove(self.name + '-updateTask')
         # Ignore button events
         self.ignoreSwitchModeEvent()
         self.ignoreUprightCameraEvent()
@@ -189,7 +189,7 @@ class DirectJoybox(PandaObject):
         def hideText(state, s = self):
             s.readout.setText('')
             return Task.done
-        taskMgr.removeTasksNamed(self.name + '-showMode')
+        taskMgr.remove(self.name + '-showMode')
         # Update display
         self.readout.setText(modeText)
         t = taskMgr.doMethodLater(3.0, hideText, self.name + '-showMode')

+ 2 - 2
direct/src/directdevices/DirectRadamec.py

@@ -46,10 +46,10 @@ class DirectRadamec(PandaObject):
         # Kill existing task
         self.disable()
         # Update task
-        taskMgr.spawnMethodNamed(self.updateTask, self.name + '-updateTask')
+        taskMgr.add(self.updateTask, self.name + '-updateTask')
     
     def disable(self):
-        taskMgr.removeTasksNamed(self.name + '-updateTask')
+        taskMgr.remove(self.name + '-updateTask')
 
     def destroy(self):
         self.disable()

+ 27 - 27
direct/src/directtools/DirectCameraControl.py

@@ -84,7 +84,7 @@ class DirectCameraControl(PandaObject):
                 self.spawnMouseRotateTask()
 
     def mouseFlyStop(self):
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         stopT = globalClock.getFrameTime()
         deltaT = stopT - self.startT
         stopF = globalClock.getFrameCount()
@@ -111,39 +111,39 @@ class DirectCameraControl(PandaObject):
 
     def spawnXZTranslateOrHPanYZoom(self):
         # Kill any existing tasks
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Spawn the new task
         t = Task.Task(self.XZTranslateOrHPanYZoomTask)
         # For HPanYZoom
         t.zoomSF = Vec3(self.coaMarker.getPos(direct.camera)).length()
-        taskMgr.spawnTaskNamed(t, 'manipulateCamera')
+        taskMgr.add(t, 'manipulateCamera')
 
     def spawnXZTranslateOrHPPan(self):
         # Kill any existing tasks
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Spawn new task
-        taskMgr.spawnMethodNamed(self.XZTranslateOrHPPanTask,
-                                 'manipulateCamera')
+        taskMgr.add(self.XZTranslateOrHPPanTask,
+                    'manipulateCamera')
 
     def spawnXZTranslate(self):
         # Kill any existing tasks
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Spawn new task
-        taskMgr.spawnMethodNamed(self.XZTranslateTask, 'manipulateCamera')
+        taskMgr.add(self.XZTranslateTask, 'manipulateCamera')
 
     def spawnHPanYZoom(self):
         # Kill any existing tasks
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Spawn new task
         t = Task.Task(self.HPanYZoomTask)
         t.zoomSF = Vec3(self.coaMarker.getPos(direct.camera)).length()
-        taskMgr.spawnTaskNamed(t, 'manipulateCamera')
+        taskMgr.add(t, 'manipulateCamera')
 
     def spawnHPPan(self):
         # Kill any existing tasks
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Spawn new task
-        taskMgr.spawnMethodNamed(self.HPPanTask, 'manipulateCamera')
+        taskMgr.add(self.HPPanTask, 'manipulateCamera')
 
     def XZTranslateOrHPanYZoomTask(self, state):
         if direct.fShift:
@@ -205,7 +205,7 @@ class DirectCameraControl(PandaObject):
 
     def spawnMouseRotateTask(self):
         # Kill any existing tasks
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Set at markers position in render coordinates
         self.camManipRef.setPos(self.coaMarkerPos)
         self.camManipRef.setHpr(direct.camera, ZERO_POINT)
@@ -214,7 +214,7 @@ class DirectCameraControl(PandaObject):
             t.constrainedDir = 'y'
         else:
             t.constrainedDir = 'x'
-        taskMgr.spawnTaskNamed(t, 'manipulateCamera')
+        taskMgr.add(t, 'manipulateCamera')
 
     def mouseRotateTask(self, state):
         # If moving outside of center, ignore motion perpendicular to edge
@@ -245,7 +245,7 @@ class DirectCameraControl(PandaObject):
 
     def spawnMouseRollTask(self):
         # Kill any existing tasks
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Set at markers position in render coordinates
         self.camManipRef.setPos(self.coaMarkerPos)
         self.camManipRef.setHpr(direct.camera, ZERO_POINT)
@@ -253,7 +253,7 @@ class DirectCameraControl(PandaObject):
         t.coaCenter = getScreenXY(self.coaMarker)
         t.lastAngle = getCrankAngle(t.coaCenter)
         t.wrtMat = direct.camera.getMat( self.camManipRef )
-        taskMgr.spawnTaskNamed(t, 'manipulateCamera')
+        taskMgr.add(t, 'manipulateCamera')
 
     def mouseRollTask(self, state):
         wrtMat = state.wrtMat
@@ -383,7 +383,7 @@ class DirectCameraControl(PandaObject):
         self.updateCoaMarkerSize()
 
     def uprightCam(self):
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Record undo point
         direct.pushUndo([direct.camera])
         # Pitch camera till upright
@@ -395,7 +395,7 @@ class DirectCameraControl(PandaObject):
                               task = 'manipulateCamera')
 
     def orbitUprightCam(self):
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Record undo point
         direct.pushUndo([direct.camera])
         # Transform camera z axis to render space
@@ -439,7 +439,7 @@ class DirectCameraControl(PandaObject):
         self.centerCamIn(0.)
 
     def centerCamIn(self, t):
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Record undo point
         direct.pushUndo([direct.camera])
         # Determine marker location
@@ -456,7 +456,7 @@ class DirectCameraControl(PandaObject):
         t.uponDeath = self.updateCoaMarkerSizeOnDeath
 
     def zoomCam(self, zoomFactor, t):
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Record undo point
         direct.pushUndo([direct.camera])
         # Find a point zoom factor times the current separation
@@ -474,7 +474,7 @@ class DirectCameraControl(PandaObject):
         
     def spawnMoveToView(self, view):
         # Kill any existing tasks
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # Record undo point
         direct.pushUndo([direct.camera])
         # Calc hprOffset
@@ -525,7 +525,7 @@ class DirectCameraControl(PandaObject):
         
     def swingCamAboutWidget(self, degrees, t):
         # Remove existing camera manipulation task
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
 
         # Record undo point
         direct.pushUndo([direct.camera])
@@ -553,7 +553,7 @@ class DirectCameraControl(PandaObject):
     def fitOnWidget(self, nodePath = 'None Given'):
         # Fit the node on the screen
         # stop any ongoing tasks
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
         # How big is the node?
         nodeScale = direct.widget.scalingNode.getScale(render)
         maxScale = max(nodeScale[0],nodeScale[1],nodeScale[2])
@@ -601,16 +601,16 @@ class DirectCameraControl(PandaObject):
         # Push state onto undo stack
         direct.pushUndo(direct.selected)
         # Remove the task to keep the widget attached to the object
-        taskMgr.removeTasksNamed('followSelectedNodePath')
+        taskMgr.remove('followSelectedNodePath')
         # Spawn a task to keep the selected objects with the widget
-        taskMgr.spawnMethodNamed(self.stickToWidgetTask, 'stickToWidget')
+        taskMgr.add(self.stickToWidgetTask, 'stickToWidget')
         # Spawn a task to move the widget
         t = direct.widget.lerpPos(Point3(centerVec),
                                   CAM_MOVE_DURATION,
                                   other = direct.camera, 
                                   blendType = 'easeInOut',
                                   task = 'moveToFitTask')
-        t.uponDeath = lambda state: taskMgr.removeTasksNamed('stickToWidget')
+        t.uponDeath = lambda state: taskMgr.remove('stickToWidget')
 
     def stickToWidgetTask(self, state):
         # Move the objects with the widget
@@ -636,5 +636,5 @@ class DirectCameraControl(PandaObject):
         base.enableMouse()
 
     def removeManipulateCameraTask(self):
-        taskMgr.removeTasksNamed('manipulateCamera')
+        taskMgr.remove('manipulateCamera')
 

+ 15 - 15
direct/src/directtools/DirectManipulation.py

@@ -52,7 +52,7 @@ class DirectManipulationControl(PandaObject):
             self.constraint = None
         # Check to see if we are moving the object
         # We are moving the object if we either wait long enough
-        taskMgr.spawnTaskNamed(
+        taskMgr.add(
             Task.doLater(MANIPULATION_MOVE_DELAY,
                          Task.Task(self.switchToMoveMode),
                          'manip-move-wait'),
@@ -62,10 +62,10 @@ class DirectManipulationControl(PandaObject):
         watchMouseTask = Task.Task(self.watchMouseTask)
         watchMouseTask.initX = direct.dr.mouseX
         watchMouseTask.initY = direct.dr.mouseY
-        taskMgr.spawnTaskNamed(watchMouseTask, 'manip-watch-mouse')
+        taskMgr.add(watchMouseTask, 'manip-watch-mouse')
 
     def switchToMoveMode(self, state):
-        taskMgr.removeTasksNamed('manip-watch-mouse')
+        taskMgr.remove('manip-watch-mouse')
         self.mode = 'move'
         self.manipulateObject()
         return Task.done
@@ -73,7 +73,7 @@ class DirectManipulationControl(PandaObject):
     def watchMouseTask(self, state):
         if (((abs (state.initX - direct.dr.mouseX)) > 0.01) or
             ((abs (state.initY - direct.dr.mouseY)) > 0.01)):
-            taskMgr.removeTasksNamed('manip-move-wait')
+            taskMgr.remove('manip-move-wait')
             self.mode = 'move'
             self.manipulateObject()
             return Task.done
@@ -81,9 +81,9 @@ class DirectManipulationControl(PandaObject):
             return Task.cont
 
     def manipulationStop(self):
-        taskMgr.removeTasksNamed('manipulateObject')
-        taskMgr.removeTasksNamed('manip-move-wait')
-        taskMgr.removeTasksNamed('manip-watch-mouse')
+        taskMgr.remove('manipulateObject')
+        taskMgr.remove('manip-move-wait')
+        taskMgr.remove('manip-watch-mouse')
         # depending on flag.....
         if self.mode == 'select':
             # Check for object under mouse
@@ -123,7 +123,7 @@ class DirectManipulationControl(PandaObject):
         if not direct.selected.last:
             return
         # Clear out old task to make sure
-        taskMgr.removeTasksNamed('followSelectedNodePath')
+        taskMgr.remove('followSelectedNodePath')
         # Where are the object handles relative to the selected object
         pos = VBase3(0)
         hpr = VBase3(0)
@@ -136,7 +136,7 @@ class DirectManipulationControl(PandaObject):
         t.hpr = hpr
         t.base = direct.selected.last
         # Spawn the task
-        taskMgr.spawnTaskNamed(t, 'followSelectedNodePath')
+        taskMgr.add(t, 'followSelectedNodePath')
 
     def followSelectedNodePathTask(self, state):
         direct.widget.setPosHpr(state.base, state.pos, state.hpr)
@@ -160,15 +160,15 @@ class DirectManipulationControl(PandaObject):
             self.objectHandles.manipModeColor()
 
     def removeManipulateObjectTask(self):
-        taskMgr.removeTasksNamed('manipulateObject')
+        taskMgr.remove('manipulateObject')
 
     def manipulateObject(self):
         # Only do this if something is selected
         if direct.selected:
             # Remove the task to keep the widget attached to the object
-            taskMgr.removeTasksNamed('followSelectedNodePath')
+            taskMgr.remove('followSelectedNodePath')
             # and the task to highlight the widget
-            taskMgr.removeTasksNamed('highlightWidgetTask')
+            taskMgr.remove('highlightWidgetTask')
             # Set manipulation flag
             self.fManip = 1
             # Record undo point
@@ -204,7 +204,7 @@ class DirectManipulationControl(PandaObject):
         # These are used to rotate about view vector
         if t.fMouseX and t.fMouseY:
             t.lastAngle = getCrankAngle(t.coaCenter)
-        taskMgr.spawnTaskNamed(t, 'manipulateObject')
+        taskMgr.add(t, 'manipulateObject')
 
     def manipulateObjectTask(self, state):
         # Widget takes precedence
@@ -732,14 +732,14 @@ class ObjectHandles(NodePath,PandaObject):
         self.setScale(1)
 
     def multiplyScalingFactorBy(self, factor):
-        taskMgr.removeTasksNamed('resizeObjectHandles')
+        taskMgr.remove('resizeObjectHandles')
         sf = self.ohScalingFactor = self.ohScalingFactor * factor
         self.scalingNode.lerpScale(sf,sf,sf, 0.5,
                                    blendType = 'easeInOut',
                                    task = 'resizeObjectHandles')
 
     def growToFit(self):
-        taskMgr.removeTasksNamed('resizeObjectHandles')
+        taskMgr.remove('resizeObjectHandles')
         # Increase handles scale until they cover 30% of the min dimension
         pos = direct.widget.getPos(direct.camera)
         minDim = min(direct.dr.nearWidth, direct.dr.nearHeight)

+ 14 - 15
direct/src/directtools/DirectSession.py

@@ -417,10 +417,10 @@ class DirectSession(PandaObject):
             # shrink the widget            
             self.widget.setScalingFactor(dnp.getRadius())
             # Spawn task to have object handles follow the selected object
-            taskMgr.removeTasksNamed('followSelectedNodePath')
+            taskMgr.remove('followSelectedNodePath')
             t = Task.Task(self.followSelectedNodePathTask)
             t.dnp = dnp
-            taskMgr.spawnTaskNamed(t, 'followSelectedNodePath')
+            taskMgr.add(t, 'followSelectedNodePath')
             # Send an message marking the event
             messenger.send('DIRECT_selectedNodePath', [dnp])
 
@@ -439,7 +439,7 @@ class DirectSession(PandaObject):
             self.widget.hideWidget()
             self.selectedNPReadout.reparentTo(hidden)
             self.selectedNPReadout.setText(' ')
-            taskMgr.removeTasksNamed('followSelectedNodePath')
+            taskMgr.remove('followSelectedNodePath')
             self.ancestry = []
             # Send an message marking the event
             messenger.send('DIRECT_deselectedNodePath', [dnp])
@@ -450,7 +450,7 @@ class DirectSession(PandaObject):
         self.widget.hideWidget()
         self.selectedNPReadout.reparentTo(hidden)
         self.selectedNPReadout.setText(' ')
-        taskMgr.removeTasksNamed('followSelectedNodePath')
+        taskMgr.remove('followSelectedNodePath')
 
     def setActiveParent(self, nodePath = None):
         # Record new parent
@@ -486,7 +486,7 @@ class DirectSession(PandaObject):
     def flash(self, nodePath = 'None Given'):
         """ Highlight an object by setting it red for a few seconds """
         # Clean up any existing task
-        taskMgr.removeTasksNamed('flashNodePath')
+        taskMgr.remove('flashNodePath')
         # Spawn new task if appropriate
         if nodePath == 'None Given':
             # If nothing specified, try selected node path
@@ -502,7 +502,7 @@ class DirectSession(PandaObject):
             # Temporarily set node path color
             nodePath.setColor(flashColor)
             # Clean up color in a few seconds
-            t = taskMgr.spawnTaskNamed(
+            t = taskMgr.add(
                 Task.doLater(DIRECT_FLASH_DURATION,
                              # This is just a dummy task
                              Task.Task(self.flashDummy),
@@ -537,7 +537,7 @@ class DirectSession(PandaObject):
     def isolate(self, nodePath = 'None Given'):
         """ Show a node path and hide its siblings """
         # First kill the flashing task to avoid complications
-        taskMgr.removeTasksNamed('flashNodePath')
+        taskMgr.remove('flashNodePath')
         # Use currently selected node path if node selected
         if nodePath == 'None Given':
             nodePath = self.selected.last
@@ -551,7 +551,7 @@ class DirectSession(PandaObject):
     def toggleVis(self, nodePath = 'None Given'):
         """ Toggle visibility of node path """
         # First kill the flashing task to avoid complications
-        taskMgr.removeTasksNamed('flashNodePath')
+        taskMgr.remove('flashNodePath')
         if nodePath == 'None Given':
             # If nothing specified, try selected node path
             nodePath = self.selected.last
@@ -691,8 +691,8 @@ class DirectSession(PandaObject):
 
     # UTILITY FUNCTIONS
     def message(self, text):
-        taskMgr.removeTasksNamed('hideDirectMessage')
-        taskMgr.removeTasksNamed('hideDirectMessageLater')
+        taskMgr.remove('hideDirectMessage')
+        taskMgr.remove('hideDirectMessageLater')
         self.directMessageReadout.reparentTo(aspect2d)
         self.directMessageReadout.setText(text)
         self.hideDirectMessageLater()
@@ -700,7 +700,7 @@ class DirectSession(PandaObject):
     def hideDirectMessageLater(self):
         seq = Task.doLater(3.0, Task.Task(self.hideDirectMessage),
                            'hideDirectMessage')
-        t = taskMgr.spawnTaskNamed(seq, 'hideDirectMessageLater')
+        t = taskMgr.add(seq, 'hideDirectMessageLater')
 
     def hideDirectMessage(self, state):
         self.directMessageReadout.reparentTo(hidden)
@@ -831,14 +831,13 @@ class DisplayRegionList(PandaObject):
 
     def stop(self):
         # Kill the existing context task
-        taskMgr.removeTasksNamed('DIRECTContextTask')
+        taskMgr.remove('DIRECTContextTask')
 
     def spawnContextTask(self):
-        taskMgr.spawnTaskNamed(Task.Task(self.contextTask),
-                               'DIRECTContextTask')
+        taskMgr.add(self.contextTask, 'DIRECTContextTask')
 
     def removeContextTask(self):
-        taskMgr.removeTasksNamed('DIRECTContextTask')
+        taskMgr.remove('DIRECTContextTask')
 
     def contextTask(self, state):
         # Window Data

+ 2 - 2
direct/src/directtools/DirectUtil.py

@@ -18,8 +18,8 @@ def lerpBackgroundColor(r,g,b,duration):
             b = sf * state.ec[2] + (1 - sf) * state.sc[2]
             setBackgroundColor(r,g,b)
             return Task.cont
-    taskMgr.removeTasksNamed('lerpBackgroundColor')
-    t = taskMgr.spawnMethodNamed(lerpColor, 'lerpBackgroundColor')
+    taskMgr.remove('lerpBackgroundColor')
+    t = taskMgr.add(lerpColor, 'lerpBackgroundColor')
     t.time = 0.0
     t.duration = duration
     t.sc = base.win.getGsg().getColorClearValue()

+ 2 - 2
direct/src/directutil/Mopath.py

@@ -106,12 +106,12 @@ class Mopath(PandaObject):
         self.node = node
         self.loop = loop
         self.stop()
-        t = taskMgr.spawnMethodNamed(self.__playTask, self.name + '-play')
+        t = taskMgr.add(self.__playTask, self.name + '-play')
         t.currentTime = time
         t.lastTime = globalClock.getFrameTime()
 
     def stop(self):
-        taskMgr.removeTasksNamed(self.name + '-play')
+        taskMgr.remove(self.name + '-play')
 
     def __playTask(self, state):
         time = globalClock.getFrameTime()

+ 4 - 5
direct/src/distributed/ClientRepository.py

@@ -71,11 +71,11 @@ class ClientRepository(DirectObject.DirectObject):
         task = Task.Task(self.rawReaderPollUntilEmpty)
         # Start with empty string
         task.currentRawString = ""
-        taskMgr.spawnTaskNamed(task, "rawReaderPollTask")
+        taskMgr.add(task, "rawReaderPollTask")
         return None
 
     def stopRawReaderPollTask(self):
-        taskMgr.removeTasksNamed("rawReaderPollTask")
+        taskMgr.remove("rawReaderPollTask")
         return None
 
     def rawReaderPollUntilEmpty(self, task):
@@ -107,12 +107,11 @@ class ClientRepository(DirectObject.DirectObject):
         # Stop any tasks we are running now
         self.stopRawReaderPollTask()
         self.stopReaderPollTask()
-        task = Task.Task(self.readerPollUntilEmpty)
-        taskMgr.spawnTaskNamed(task, "readerPollTask")
+        taskMgr.add(self.readerPollUntilEmpty, "readerPollTask")
         return None
 
     def stopReaderPollTask(self):
-        taskMgr.removeTasksNamed("readerPollTask")
+        taskMgr.remove("readerPollTask")
         return None
 
     def readerPollUntilEmpty(self, task):

+ 3 - 3
direct/src/distributed/DistributedSmoothNode.py

@@ -122,9 +122,9 @@ class DistributedSmoothNode(DistributedNode.DistributedNode):
 
         elif not self.smoothStarted:
             taskName = self.taskName("smooth")
-            taskMgr.removeTasksNamed(taskName)
+            taskMgr.remove(taskName)
             self.reloadPosition()
-            taskMgr.spawnMethodNamed(self.doSmoothTask, taskName)
+            taskMgr.add(self.doSmoothTask, taskName)
             self.smoothStarted = 1
             
         return
@@ -137,7 +137,7 @@ class DistributedSmoothNode(DistributedNode.DistributedNode):
         """
         if self.smoothStarted:
             taskName = self.taskName("smooth")
-            taskMgr.removeTasksNamed(taskName)
+            taskMgr.remove(taskName)
             self.forceToTruePosition()
             self.smoothStarted = 0
         return

+ 101 - 103
direct/src/distributed/ServerRepository.py

@@ -1,103 +1,101 @@
-"""ServerRepository module: contains the ServerRepository class"""
-
-from PandaModules import *
-from TaskManagerGlobal import *
-from MsgTypes import *
-import Task
-import DirectNotifyGlobal
-
-class ServerRepository:
-
-    def __init__(self, tcpPort, udpPort):
-        self.qcm = QueuedConnectionManager()
-        self.qcl = QueuedConnectionListener(self.qcm, 0)
-        self.qcr = QueuedConnectionReader(self.qcm, 0)
-        self.cw = ConnectionWriter(self.qcm,0)
-        self.tcpRendezvous = self.qcm.openTCPServerRendezvous(tcpPort, 10)
-        print self.tcpRendezvous
-        self.qcl.addConnection(self.tcpRendezvous)
-        self.startListenerPollTask()
-        self.startReaderPollTask()
-        self.startResetPollTask()
-        return None
-
-    def startListenerPollTask(self):
-        task = Task.Task(self.listenerPoll)
-        taskMgr.spawnTaskNamed(task, "serverListenerPollTask")
-        return None
-
-    def listenerPoll(self, task):
-        if self.qcl.newConnectionAvailable():
-            print "New connection is available"
-            rendezvous = PointerToConnection()
-            netAddress = NetAddress()
-            newConnection = PointerToConnection()
-            retVal = self.qcl.getNewConnection(rendezvous, netAddress,
-                                               newConnection)
-            if retVal:
-                # Crazy dereferencing
-                newConnection=newConnection.p()
-                self.qcr.addConnection(newConnection)
-                print "Got a connection!"
-                self.lastConnection = newConnection
-            else:
-                ServerRepository.notify.warning(
-                    "getNewConnection returned false")
-        return Task.cont
-
-    def startReaderPollTask(self):
-        task = Task.Task(self.readerPollUntilEmpty)
-        taskMgr.spawnTaskNamed(task, "serverReaderPollTask")
-        return None
-
-    def readerPollUntilEmpty(self, task):
-        while self.readerPollOnce():
-            pass
-        return Task.cont
-
-    def readerPollOnce(self):
-        availGetVal = self.qcr.dataAvailable()
-        if availGetVal:
-            datagram = NetDatagram()
-            readRetVal = self.qcr.getData(datagram)
-            if readRetVal:
-                self.handleDatagram(datagram)
-            else:
-                ClientRepository.notify.warning("getData returned false")
-        return availGetVal
-
-    def handleDatagram(self, datagram):
-        print "Server got a datagram!"
-        dgi = DatagramIterator(datagram)
-        print dgi.getUint16()
-        print dgi.getString()
-        print dgi.getUint32()
-        print dgi.getUint16()
-
-        newDatagram = Datagram()
-        newDatagram.addUint16(LOGIN_RESPONSE)
-        newDatagram.addUint8(ord('s'))
-        self.cw.send(newDatagram, self.lastConnection)
-        return None
-
-    def sendAvatarGenerate(self):
-        datagram = Datagram()
-        # Message type is 1
-        datagram.addUint16(ALL_OBJECT_GENERATE_WITH_REQUIRED)
-        # Avatar class type is 2
-        datagram.addUint8(2)
-        # A sample id
-        datagram.addUint32(10)
-        # The only required field is the zone field
-        datagram.addUint32(999)
-        self.cw.send(datagram, self.lastConnection)
-
-    def startResetPollTask(self):
-        return None
-    
-    def resetPollUntilEmpty(self):
-        return None
-
-    def resetPollOnce(self):
-        return None
-    
+"""ServerRepository module: contains the ServerRepository class"""
+
+from PandaModules import *
+from TaskManagerGlobal import *
+from MsgTypes import *
+import Task
+import DirectNotifyGlobal
+
+class ServerRepository:
+
+    def __init__(self, tcpPort, udpPort):
+        self.qcm = QueuedConnectionManager()
+        self.qcl = QueuedConnectionListener(self.qcm, 0)
+        self.qcr = QueuedConnectionReader(self.qcm, 0)
+        self.cw = ConnectionWriter(self.qcm,0)
+        self.tcpRendezvous = self.qcm.openTCPServerRendezvous(tcpPort, 10)
+        print self.tcpRendezvous
+        self.qcl.addConnection(self.tcpRendezvous)
+        self.startListenerPollTask()
+        self.startReaderPollTask()
+        self.startResetPollTask()
+        return None
+
+    def startListenerPollTask(self):
+        taskMgr.add(self.listenerPoll, "serverListenerPollTask")
+        return None
+
+    def listenerPoll(self, task):
+        if self.qcl.newConnectionAvailable():
+            print "New connection is available"
+            rendezvous = PointerToConnection()
+            netAddress = NetAddress()
+            newConnection = PointerToConnection()
+            retVal = self.qcl.getNewConnection(rendezvous, netAddress,
+                                               newConnection)
+            if retVal:
+                # Crazy dereferencing
+                newConnection=newConnection.p()
+                self.qcr.addConnection(newConnection)
+                print "Got a connection!"
+                self.lastConnection = newConnection
+            else:
+                ServerRepository.notify.warning(
+                    "getNewConnection returned false")
+        return Task.cont
+
+    def startReaderPollTask(self):
+        taskMgr.add(self.readerPollUntilEmpty, "serverReaderPollTask")
+        return None
+
+    def readerPollUntilEmpty(self, task):
+        while self.readerPollOnce():
+            pass
+        return Task.cont
+
+    def readerPollOnce(self):
+        availGetVal = self.qcr.dataAvailable()
+        if availGetVal:
+            datagram = NetDatagram()
+            readRetVal = self.qcr.getData(datagram)
+            if readRetVal:
+                self.handleDatagram(datagram)
+            else:
+                ClientRepository.notify.warning("getData returned false")
+        return availGetVal
+
+    def handleDatagram(self, datagram):
+        print "Server got a datagram!"
+        dgi = DatagramIterator(datagram)
+        print dgi.getUint16()
+        print dgi.getString()
+        print dgi.getUint32()
+        print dgi.getUint16()
+
+        newDatagram = Datagram()
+        newDatagram.addUint16(LOGIN_RESPONSE)
+        newDatagram.addUint8(ord('s'))
+        self.cw.send(newDatagram, self.lastConnection)
+        return None
+
+    def sendAvatarGenerate(self):
+        datagram = Datagram()
+        # Message type is 1
+        datagram.addUint16(ALL_OBJECT_GENERATE_WITH_REQUIRED)
+        # Avatar class type is 2
+        datagram.addUint8(2)
+        # A sample id
+        datagram.addUint32(10)
+        # The only required field is the zone field
+        datagram.addUint32(999)
+        self.cw.send(datagram, self.lastConnection)
+
+    def startResetPollTask(self):
+        return None
+    
+    def resetPollUntilEmpty(self):
+        return None
+
+    def resetPollOnce(self):
+        return None
+    

+ 1 - 1
direct/src/extensions/NodePath-extensions.py

@@ -319,7 +319,7 @@
             return lerpTask
         else:
             # spawn the lerp task
-            taskMgr.spawnTaskNamed(lerpTask, taskName)
+            taskMgr.add(lerpTask, taskName)
             return lerpTask
 
     def __autoLerp(self, functorFunc, time, blendType, taskName):

+ 4 - 4
direct/src/gui/DirectGuiBase.py

@@ -789,18 +789,18 @@ class DirectGuiWidget(DirectGuiBase, NodePath):
         #base.mouseWatcherNode.setModifierButtons(mb)
         
     def editStart(self, event):
-        taskMgr.removeTasksNamed('guiEditTask')
+        taskMgr.remove('guiEditTask')
         vWidget2render2d = self.getPos(render2d)
         vMouse2render2d = Point3(event.getMouse()[0], 0, event.getMouse()[1])
         editVec = Vec3(vWidget2render2d - vMouse2render2d)
         if base.mouseWatcherNode.getModifierButtons().isDown(
             KeyboardButton.control()):
-            t = taskMgr.spawnMethodNamed(self.guiScaleTask, 'guiEditTask')
+            t = taskMgr.add(self.guiScaleTask, 'guiEditTask')
             t.refPos = vWidget2render2d
             t.editVecLen = editVec.length()
             t.initScale = self.getScale()
         else:
-            t = taskMgr.spawnMethodNamed(self.guiDragTask, 'guiEditTask')
+            t = taskMgr.add(self.guiDragTask, 'guiEditTask')
             t.editVec = editVec
 
     def guiScaleTask(self, state):
@@ -827,7 +827,7 @@ class DirectGuiWidget(DirectGuiBase, NodePath):
         return Task.cont
 
     def editStop(self, event):
-        taskMgr.removeTasksNamed('guiEditTask')
+        taskMgr.remove('guiEditTask')
 
     def setState(self):
         if type(self['state']) == type(0):

+ 7 - 7
direct/src/gui/DirectGuiTest.py

@@ -12,8 +12,8 @@ def dummyCmd(index):
 # Define some commands to bind to enter, exit and click events
 def shrink(db):
     db['text2_text'] = 'Hi!'
-    taskMgr.removeTasksNamed('shrink')
-    taskMgr.removeTasksNamed('expand')
+    taskMgr.remove('shrink')
+    taskMgr.remove('expand')
     # Get a handle on the geometry for the rollover state
     rolloverSmiley = db.component('geom2')
     rolloverSmiley.setScale(db.component('geom0').getScale()[0])
@@ -22,17 +22,17 @@ def shrink(db):
 
 def expand(db):
     db['text0_text'] = 'Bye!'
-    taskMgr.removeTasksNamed('shrink')
-    taskMgr.removeTasksNamed('expand')
+    taskMgr.remove('shrink')
+    taskMgr.remove('expand')
     db.component('geom0').setScale(db.component('geom2').getScale()[0])
     db.component('geom0').lerpScale(1,1,1, 1, blendType = 'easeInOut',
                              task = 'expand')
     db.component('geom2').clearColor()
 
 def ouch(db):
-    taskMgr.removeTasksNamed('shrink')
-    taskMgr.removeTasksNamed('expand')
-    taskMgr.removeTasksNamed('runAway')
+    taskMgr.remove('shrink')
+    taskMgr.remove('expand')
+    taskMgr.remove('runAway')
     db.component('geom0').setScale(db.component('geom2').getScale()[0])
     db.component('geom1').setScale(db.component('geom2').getScale()[0])
     db['text2_text'] = 'Ouch!'

+ 4 - 4
direct/src/gui/DirectScrolledList.py

@@ -61,7 +61,7 @@ class DirectScrolledList(DirectFrame):
         self.numItemsVisible = self["numItemsVisible"]
 
     def destroy(self):
-        taskMgr.removeTasksNamed(self.taskName("scroll"))
+        taskMgr.remove(self.taskName("scroll"))
         DirectFrame.destroy(self)
 
     def scrollBy(self, delta):
@@ -122,7 +122,7 @@ class DirectScrolledList(DirectFrame):
         task.prevTime = 0.0
         task.delta = 1
         self.scrollBy(task.delta)
-        taskMgr.spawnTaskNamed(task, self.taskName("scroll"))
+        taskMgr.add(task, self.taskName("scroll"))
 
     def __decButtonDown(self, event):
         task = Task.Task(self.__scrollByTask)
@@ -130,10 +130,10 @@ class DirectScrolledList(DirectFrame):
         task.prevTime = 0.0
         task.delta = -1
         self.scrollBy(task.delta)
-        taskMgr.spawnTaskNamed(task, self.taskName("scroll"))
+        taskMgr.add(task, self.taskName("scroll"))
 
     def __buttonUp(self, event):
-        taskMgr.removeTasksNamed(self.taskName("scroll"))
+        taskMgr.remove(self.taskName("scroll"))
 
     def addItem(self, item):
         """

+ 4 - 4
direct/src/interval/Interval.py

@@ -94,7 +94,7 @@ class Interval(DirectObject):
             t0 = self.duration
 
         # Kill ongoing play task
-        taskMgr.removeTasksNamed(self.name + '-play')
+        taskMgr.remove(self.name + '-play')
         # Start new one
         self.offset = t0
         self.startT = self.clock.getFrameTime()
@@ -110,7 +110,7 @@ class Interval(DirectObject):
         assert(t0 <= self.endTime)
 
         # Spawn task
-        taskMgr.spawnMethodNamed(self.__playTask, self.name + '-play')
+        taskMgr.add(self.__playTask, self.name + '-play')
 
     def loop(self, t0=0.0, duration=0.0, scale=1.0):
         self.accept(self.name + '-loop', self.play,
@@ -125,7 +125,7 @@ class Interval(DirectObject):
         for stopEvent in self.stopEventList:
             messenger.send(stopEvent)
         # Kill task
-        taskMgr.removeTasksNamed(self.name + '-play')
+        taskMgr.remove(self.name + '-play')
         # No more looping.
         self.ignore(self.name + '-loop')
         return self.curr_t
@@ -188,7 +188,7 @@ class Interval(DirectObject):
         # So when you drag scale with mouse its like you started a playback
         def onPress(s=self,es=es):
             # Kill playback task
-            taskMgr.removeTasksNamed(s.name + '-play')
+            taskMgr.remove(s.name + '-play')
             # INIT interval
             s.setT(es.get(), event = IVAL_INIT)
         es.onPress = onPress

+ 6 - 7
direct/src/leveleditor/LevelEditor.py

@@ -593,7 +593,7 @@ class LevelEditor(NodePath, PandaObject):
         # Disable Pie Menu mouse interaction
         self.disableMouse()
         # Remove insertion marker task
-        taskMgr.removeTasksNamed('insertionMarkerTask')
+        taskMgr.remove('insertionMarkerTask')
 
     def reset(self, fDeleteToplevel = 1, fCreateToplevel = 1,
               fUpdateExplorer = 1):
@@ -1369,7 +1369,7 @@ class LevelEditor(NodePath, PandaObject):
         # Position it
         # First kill autoposition task so grid can jump to its final
         # destination (part of cleanup
-        taskMgr.removeTasksNamed('autoPositionGrid')
+        taskMgr.remove('autoPositionGrid')
         # Now find where to put node path
         if (hotKey is not None) and nodeClass.eq(DNA_PROP):
             # If its a prop and a copy, place it based upon current
@@ -2190,8 +2190,7 @@ class LevelEditor(NodePath, PandaObject):
         self.insertionMarker.create()
 
     def spawnInsertionMarkerTask(self):
-        t = Task.Task(self.insertionMarkerTask)
-        taskMgr.spawnTaskNamed(t, 'insertionMarkerTask')
+        taskMgr.add(self.insertionMarkerTask, 'insertionMarkerTask')
 
     def insertionMarkerTask(self, state):
         self.insertionMarker.setPosHpr(direct.grid, 0,0,0, 0,0,0)
@@ -2227,7 +2226,7 @@ class LevelEditor(NodePath, PandaObject):
             return 1
 
     def autoPositionGrid(self):
-        taskMgr.removeTasksNamed('autoPositionGrid')
+        taskMgr.remove('autoPositionGrid')
         # Move grid to prepare for placement of next object
         selectedNode = direct.selected.last
         if selectedNode:
@@ -2266,12 +2265,12 @@ class LevelEditor(NodePath, PandaObject):
             t.uponDeath = self.autoPositionCleanup
             
         # Also move the camera
-        taskMgr.removeTasksNamed('autoMoveDelay')
+        taskMgr.remove('autoMoveDelay')
         handlesToCam = direct.widget.getPos(direct.camera)
         handlesToCam = handlesToCam * ( direct.dr.near/handlesToCam[1])
         if ((abs(handlesToCam[0]) > (direct.dr.nearWidth * 0.4)) or
             (abs(handlesToCam[2]) > (direct.dr.nearHeight * 0.4))):
-            taskMgr.removeTasksNamed('manipulateCamera')
+            taskMgr.remove('manipulateCamera')
             direct.cameraControl.centerCamIn(0.5)
 
     def autoPositionCleanup(self,state):

+ 3 - 4
direct/src/leveleditor/PieMenu.py

@@ -35,13 +35,13 @@ class PieMenu(NodePath, PandaObject):
             self.action(value)
 
     def removePieMenuTask(self):
-        taskMgr.removeTasksNamed('pieMenuTask')
+        taskMgr.remove('pieMenuTask')
         self.reparentTo(hidden)
         self.lines.reset()
 
     def spawnPieMenuTask(self):
         # Make sure no errant tasks lying around
-        taskMgr.removeTasksNamed('pieMenuTask')
+        taskMgr.remove('pieMenuTask')
 
         # Where did the user press the button?
         self.originX = direct.dr.mouseX
@@ -61,8 +61,7 @@ class PieMenu(NodePath, PandaObject):
 
         # Spawn task to update line and select new texture
         self.currItem = -1
-        t = Task.Task(self.pieMenuTask)
-        taskMgr.spawnTaskNamed(t, 'pieMenuTask')
+        taskMgr.add(self.pieMenuTask, 'pieMenuTask')
 
     def pieMenuTask(self,state):
         mouseX = direct.dr.mouseX

+ 2 - 2
direct/src/showbase/EventManager.py

@@ -73,7 +73,7 @@ class EventManager:
 
 
     def restart(self):
-        taskMgr.spawnTaskNamed(Task.Task(self.eventLoop), 'eventManager')
+        taskMgr.add(self.eventLoop, 'eventManager')
 
     def shutdown(self):
-        taskMgr.removeTasksNamed('eventManager')
+        taskMgr.remove('eventManager')

+ 8 - 9
direct/src/showbase/ShowBase.py

@@ -437,15 +437,14 @@ class ShowBase:
         """enableParticles(self)"""
         self.particleMgrEnabled = 1
         self.physicsMgrEnabled = 1
-        self.taskMgr.removeTasksNamed('manager-update')
-        self.taskMgr.spawnTaskNamed(Task.Task(self.updateManagers),
-                                        'manager-update')
+        self.taskMgr.remove('manager-update')
+        self.taskMgr.add(self.updateManagers, 'manager-update')
 
     def disableParticles(self):
         """enableParticles(self)"""
         self.particleMgrEnabled = 0
         self.physicsMgrEnabled = 0
-        self.taskMgr.removeTasksNamed('manager-update')
+        self.taskMgr.remove('manager-update')
 
     def toggleParticles(self):
         if self.particleMgrEnabled == 0:
@@ -555,15 +554,15 @@ class ShowBase:
         self.shutdown()
         # give the igloop task a reasonably "late" priority,
         # so that it will get run after most tasks
-        self.taskMgr.spawnTaskNamed(Task.Task(self.igloop, 50), 'igloop')
+        self.taskMgr.add(self.igloop, 'igloop', priority = 50)
         # give the dataloop task a reasonably "early" priority,
         # so that it will get run before most tasks
-        self.taskMgr.spawnTaskNamed(Task.Task(self.dataloop, -50), 'dataloop')
+        self.taskMgr.add(self.dataloop, 'dataloop', priority = -50)
         self.eventMgr.restart()
 
     def shutdown(self):
-        self.taskMgr.removeTasksNamed('igloop')
-        self.taskMgr.removeTasksNamed('dataloop')
+        self.taskMgr.remove('igloop')
+        self.taskMgr.remove('dataloop')
         self.eventMgr.shutdown()
 
     def toggleBackface(self):
@@ -834,7 +833,7 @@ class ShowBase:
         """
         globalClock.setMode(ClockObject.MNonRealTime)
         globalClock.setDt(1.0/float(fps))
-        t = taskMgr.spawnMethodNamed(self._movieTask, namePrefix + '_task')
+        t = taskMgr.add(self._movieTask, namePrefix + '_task')
         t.endT = globalClock.getFrameTime() + duration
         t.frameIndex = 1
         t.outputString = namePrefix + '_%0' + `sd` + 'd.' + format

+ 1 - 3
direct/src/showbase/TkGlobal.py

@@ -5,8 +5,6 @@ import Pmw
 import __builtin__
 __builtin__.tkroot = Pmw.initialise()
 
-import Task
-
 def tkloop(self):
     # Do all the tkinter events waiting on this frame
     # dooneevent will return 0 if there are no more events
@@ -21,6 +19,6 @@ def tkloop(self):
 from TaskManagerGlobal import *
 
 # Spawn this task
-taskMgr.spawnTaskNamed(Task.Task(tkloop), "tkloop")
+taskMgr.add(tkloop, "tkloop")
 
 

+ 9 - 9
direct/src/showbase/Transitions.py

@@ -48,7 +48,7 @@ class Transitions:
                 Task.Task(self.__fadeInLerpDone))
             # Spawn the sequence
             if not block:
-                taskMgr.spawnTaskNamed(task, self.fadeTaskName)
+                taskMgr.add(task, self.fadeTaskName)
             else:
                 return task
             
@@ -57,7 +57,7 @@ class Transitions:
         As a sequence: Fade in, execute the given task
         """
         seq = Task.sequence(self.fadeIn(time, block=1), task)
-        taskMgr.spawnTaskNamed(seq, 'fadeInTaskSeq')
+        taskMgr.add(seq, 'fadeInTaskSeq')
 
     def fadeOut(self, t=0.5, block=0):
         """
@@ -125,13 +125,13 @@ class Transitions:
             seq = Task.sequence(self.fadeOut(time, block=1), task)
             
         # do it
-        taskMgr.spawnTaskNamed(seq, 'fadeOutTaskSeq')
+        taskMgr.add(seq, 'fadeOutTaskSeq')
 
     def noFade(self):
         """
         Removes any current fade tasks and parents the fade polygon away
         """
-        taskMgr.removeTasksNamed(self.fadeTaskName)
+        taskMgr.remove(self.fadeTaskName)
         if self.fade != None:
             self.fade.reparentTo(hidden)
         
@@ -164,7 +164,7 @@ class Transitions:
                 Task.Task(self.__irisInLerpDone))
             # Spawn the sequence
             if not block:
-                taskMgr.spawnTaskNamed(task, self.irisTaskName)
+                taskMgr.add(task, self.irisTaskName)
             else:
                 return task
             
@@ -173,7 +173,7 @@ class Transitions:
         As a sequence: iris in, execute the given task
         """
         seq = Task.sequence(self.irisIn(time, block=1), task)
-        taskMgr.spawnTaskNamed(seq, 'irisInTaskSeq')
+        taskMgr.add(seq, 'irisInTaskSeq')
 
     def irisOutLerpDone(self, task):
         # This is a helper function to the fadeIn sequence
@@ -207,7 +207,7 @@ class Transitions:
                 Task.Task(self.irisOutLerpDone))
             # Spawn the sequence
             if not block:
-                taskMgr.spawnTaskNamed(task, self.irisTaskName)
+                taskMgr.add(task, self.irisTaskName)
             else:
                 return task
 
@@ -227,13 +227,13 @@ class Transitions:
             seq = Task.sequence(self.irisOut(time, block=1), task)
             
         # do it
-        taskMgr.spawnTaskNamed(seq, 'irisOutTaskSeq')
+        taskMgr.add(seq, 'irisOutTaskSeq')
 
     def noIris(self):
         """
         Removes any current iris tasks and parents the iris polygon away
         """
-        taskMgr.removeTasksNamed(self.irisTaskName)
+        taskMgr.remove(self.irisTaskName)
         if self.iris != None:
             self.iris.reparentTo(hidden)
 

+ 41 - 191
direct/src/task/Task.py

@@ -53,18 +53,6 @@ def print_exc_plus():
 # Store the global clock
 globalClock = ClockObject.getGlobalClock()
 
-def getTimeFrame():
-    # WARNING: If you are testing tasks without an igloop,
-    # you must manually tick the clock
-
-    # Ask for the time last frame
-    t = globalClock.getFrameTime()
-
-    # Get the new frame count
-    f = globalClock.getFrameCount()
-
-    return t, f
-
 
 class Task:
     count = 0
@@ -120,17 +108,6 @@ def pause(delayTime):
     task.delayTime = delayTime
     return task
 
-
-def release():
-    def func(self):
-        # A release is immediately done
-        # TaskManager.notify.debug('release done: ' + self.name)
-        return done
-    task = Task(func)
-    task.name = 'release'
-    return task
-
-
 def sequence(*taskList):
     return make_sequence(taskList)
 
@@ -240,66 +217,6 @@ def make_loop(taskList):
     return task
 
 
-def makeSpawner(task, taskName, taskMgr):
-    def func(self):
-        self.taskMgr.spawnTaskNamed(self.task, self.taskName)
-        return done
-    newTask = Task(func)
-    newTask.name = taskName + "-spawner"
-    newTask.task = task
-    newTask.taskName = taskName
-    newTask.taskMgr = taskMgr
-    return newTask
-
-
-def makeSequenceFromTimeline(timelineList, taskMgr):
-    timeline = []
-    lastPause = 0
-    sortedList = list(timelineList)
-    sortedList.sort()
-    for triple in sortedList:
-        t = triple[0] - lastPause
-        lastPause = triple[0]
-        task = triple[1]
-        taskName = triple[2]
-        timeline.append(pause(t))
-        timeline.append(makeSpawner(task, taskName, taskMgr))
-    return make_sequence(timeline)
-
-
-def timeline(*timelineList):
-    def func(self):
-        # Step our sub task manager (returns the number of tasks remaining)
-        lenTaskList = self.taskMgr.step()
-
-        # The sequence start time is the same as our start time
-        self.sequence.time = self.time
-        self.sequence.frame = self.frame
-
-        if (not self.sequenceDone):
-            # Execute the sequence for this frame
-            seqRet = self.sequence(self.sequence)
-            # See if sequence is done
-            if (seqRet == done):
-                self.sequenceDone = 1
-                # See if the timeline is done
-                if (lenTaskList == 0):
-                    # TaskManager.notify.debug('timeline done: ' + self.name)
-                    return done
-                else:
-                    return cont
-            else:
-                return cont
-        else:
-            return cont
-    task = Task(func)
-    task.name = 'timeline'
-    task.taskMgr = TaskManager()
-    task.sequence = makeSequenceFromTimeline(timelineList, task.taskMgr)
-    task.sequenceDone = 0
-    return task
-
-
 class TaskManager:
 
     notify = None
@@ -308,7 +225,7 @@ class TaskManager:
         self.running = 0
         self.stepping = 0
         self.taskList = []
-        self.currentTime, self.currentFrame = getTimeFrame()
+        self.currentTime, self.currentFrame = self.__getTimeFrame()
         if (TaskManager.notify == None):
             TaskManager.notify = directNotify.newCategory("TaskManager")
         self.taskTimerVerbose = 0
@@ -324,11 +241,32 @@ class TaskManager:
         self.fVerbose = value
         messenger.send('TaskManager-setVerbose', sentArgs = [value])
 
-    def spawnMethodNamed(self, func, name):
-        task = Task(func)
-        return self.spawnTaskNamed(task, name)
+    def add(self, funcOrTask, name, priority = 0):
+        """
+        Add a new task to the taskMgr.
+        You can add a Task object or a method that takes one argument.
+        """
+        if isinstance(funcOrTask, Task):
+            funcOrTask.setPriority(priority)
+            return self.__spawnTaskNamed(funcOrTask, name)
+        elif callable(funcOrTask):
+            return self.__spawnMethodNamed(funcOrTask, name, priority)
+        else:
+            self.notify.error('Tried to add a task that was not a Task or a func')
+
+    def remove(self, taskOrName):
+        if type(taskOrName) == type(''):
+            return self.__removeTasksNamed(taskOrName)
+        elif isinstance(taskOrName, Task):
+            return self.__removeTask(taskOrName)
+        else:
+            self.notify.error('remove takes a string or a Task')
 
-    def spawnTaskNamed(self, task, name):
+    def __spawnMethodNamed(self, func, name, priority=0):
+        task = Task(func, priority)
+        return self.__spawnTaskNamed(task, name)
+
+    def __spawnTaskNamed(self, task, name):
         if TaskManager.notify.getDebug():
             TaskManager.notify.debug('spawning task named: ' + name)
         task.name = name
@@ -368,17 +306,11 @@ class TaskManager:
         task = Task(func)
         seq = doLater(delayTime, task, taskName)
         seq.laterTask = task
-        return self.spawnTaskNamed(seq, 'doLater-' + taskName)
-
-    def removeAllTasks(self):
-        # Make a shallow copy so we do not modify the list in place
-        taskListCopy = self.taskList[:]
-        for task in taskListCopy:
-            self.removeTask(task)
+        return self.__spawnTaskNamed(seq, taskName)
 
-    def removeTask(self, task):
-        # if TaskManager.notify.getDebug():
-        #     TaskManager.notify.debug('removing task: ' + `task`)
+    def __removeTask(self, task):
+        if TaskManager.notify.getDebug():
+            TaskManager.notify.debug('removing task: ' + `task`)
         if task in self.taskList:
             self.taskList.remove(task)
             if task.uponDeath:
@@ -388,7 +320,7 @@ class TaskManager:
                 messenger.send('TaskManager-removeTask',
                                sentArgs = [task, task.name])
 
-    def removeTasksNamed(self, taskName):
+    def __removeTasksNamed(self, taskName):
         if TaskManager.notify.getDebug():
             TaskManager.notify.debug('removing tasks named: ' + taskName)
 
@@ -400,7 +332,7 @@ class TaskManager:
 
         # Now iterate through the tasks we need to remove and remove them
         for task in removedTasks:
-            self.removeTask(task)
+            self.__removeTask(task)
 
         # Return the number of tasks removed
         return len(removedTasks)
@@ -429,7 +361,7 @@ class TaskManager:
 
         # Now iterate through the tasks we need to remove and remove them
         for task in removedTasks:
-           self.removeTask(task)
+           self.__removeTask(task)
 
         # Return the number of tasks removed
         return len(removedTasks)
@@ -437,7 +369,7 @@ class TaskManager:
     def step(self):
         if TaskManager.notify.getDebug():
             TaskManager.notify.debug('step')
-        self.currentTime, self.currentFrame = getTimeFrame()
+        self.currentTime, self.currentFrame = self.__getTimeFrame()
         for task in self.taskList:
             task.setCurrentTimeFrame(self.currentTime, self.currentFrame)
 
@@ -473,9 +405,9 @@ class TaskManager:
             if (ret == cont):
                 continue
             elif (ret == done):
-                self.removeTask(task)
+                self.__removeTask(task)
             elif (ret == exit):
-                self.removeTask(task)
+                self.__removeTask(task)
             else:
                 raise StandardError, "Task named %s did not return cont, exit, or done" % task.name
         return len(self.taskList)
@@ -589,90 +521,8 @@ class TaskManager:
         import TaskManagerPanel
         return TaskManagerPanel.TaskManagerPanel(self)
 
-
-"""
-import Task
-from ShowBaseGlobal import * # to get taskMgr, and run()
-
-# sequence
-
-def seq1(state):
-    print 'seq1'
-    return Task.done
-def seq2(state):
-    print 'seq2'
-    return Task.done
-
-t = Task.sequence(Task.pause(1.0), Task.Task(seq1), Task.release(),
-                  Task.pause(3.0), Task.Task(seq2))
-taskMgr.spawnTaskNamed(t, 'sequence')
-run()
-
-# If you want it to loop, make a loop
-t = Task.loop(Task.pause(1.0), Task.Task(seq1), Task.release(),
-              Task.pause(3.0), Task.Task(seq2))
-taskMgr.spawnTaskNamed(t, 'sequence')
-run()
-
-
-
-# timeline
-
-def keyframe1(state):
-    print 'keyframe1'
-    return Task.done
-def keyframe2(state):
-    print 'keyframe2'
-    return Task.done
-def keyframe3(state):
-    print 'keyframe3'
-    return Task.done
-
-testtl = Task.timeline(
-    (0.5, Task.Task(keyframe1), 'key1'),
-    (0.6, Task.Task(keyframe2), 'key2'),
-    (0.7, Task.Task(keyframe3), 'key3')
-    )
-
-t = taskMgr.spawnTaskNamed(testtl, 'timeline')
-run()
-
-# do later - returns a sequence
-
-def foo(state):
-    print 'later...'
-    return Task.done
-
-seq = Task.doLater(3.0, Task.Task(foo), 'fooLater')
-t = taskMgr.spawnTaskNamed(seq, 'doLater-fooLater')
-run()
-
-# tasks with state
-# Combined with uponDeath
-
-someValue = 1
-
-def func(state):
-    if (state.someValue > 10):
-        print 'true!'
-        return Task.done
-    else:
-        state.someValue = state.someValue + 1
-        return Task.cont
-
-def deathFunc(state):
-    print 'Value at death: ', state.someValue
-
-task = Task.Task(func)
-
-# set task state here
-task.someValue = someValue
-
-# Use instance variable uponDeath to specify function
-# to perform on task removal
-# Default value of uponDeath is None
-task.uponDeath = deathFunc
-
-t = taskMgr.spawnTaskNamed(task, 'funcTask')
-run()
-"""
+    def __getTimeFrame(self):
+        # WARNING: If you are testing tasks without an igloop,
+        # you must manually tick the clock        
+        # Ask for the time last frame
+        return globalClock.getFrameTime(), globalClock.getFrameCount()

+ 3 - 3
direct/src/task/Timer.py

@@ -28,7 +28,7 @@ class Timer:
         self.name = name
         self.startT = self.clock.getFrameTime()
         self.currT = 0.0
-        taskMgr.spawnMethodNamed(self.__timerTask, self.name + '-run')
+        taskMgr.add(self.__timerTask, self.name + '-run')
         self.started = 1
 
     def startCallback(self, t, callback):
@@ -40,7 +40,7 @@ class Timer:
         self.finalT = t
         self.startT = self.clock.getFrameTime()
         self.currT = 0.0
-        taskMgr.spawnMethodNamed(self.__timerTask, self.name + '-run')
+        taskMgr.add(self.__timerTask, self.name + '-run')
         self.started = 1
 
     def stop(self):
@@ -48,7 +48,7 @@ class Timer:
         """
         if (not self.started):
             return 0.0
-        taskMgr.removeTasksNamed(self.name + '-run')
+        taskMgr.remove(self.name + '-run')
         self.started = 0
         return self.currT
 

+ 2 - 2
direct/src/tkpanels/AnimPanel.py

@@ -174,7 +174,7 @@ class AnimPanel(AppShell):
         self.stopActorControls()
         self.lastT = globalClock.getFrameTime()
         self.playList = self.actorControlList[:]
-        taskMgr.spawnMethodNamed(self.play, self.id + '_UpdateTask')
+        taskMgr.add(self.play, self.id + '_UpdateTask')
 
     def play(self, task):
         if not self.playList:
@@ -188,7 +188,7 @@ class AnimPanel(AppShell):
         return Task.cont
 
     def stopActorControls(self):
-        taskMgr.removeTasksNamed(self.id + '_UpdateTask')
+        taskMgr.remove(self.id + '_UpdateTask')
 
     def getActorControlAt(self, index):
         return self.actorControlList[index]

+ 12 - 12
direct/src/tkpanels/MopathRecorder.py

@@ -655,18 +655,18 @@ class MopathRecorder(AppShell, PandaObject):
         Hook called upon selection of a node path used to select playback
         marker if subnode selected
         """
-        taskMgr.removeTasksNamed(self.name + '-curveEditTask')
+        taskMgr.remove(self.name + '-curveEditTask')
         if nodePath.id() == self.playbackMarker.getChild(0).id():
             direct.select(self.playbackMarker)
         elif nodePath.id() == self.tangentMarker.getChild(0).id():
             direct.select(self.tangentMarker)
         elif nodePath.id() == self.playbackMarker.id():
             self.tangentGroup.show()
-            taskMgr.spawnMethodNamed(self.curveEditTask,
+            taskMgr.add(self.curveEditTask,
                                      self.name + '-curveEditTask')
         elif nodePath.id() == self.tangentMarker.id():
             self.tangentGroup.show()
-            taskMgr.spawnMethodNamed(self.curveEditTask,
+            taskMgr.add(self.curveEditTask,
                                      self.name + '-curveEditTask')
         else:
             self.tangentGroup.hide()
@@ -755,9 +755,9 @@ class MopathRecorder(AppShell, PandaObject):
         direct.deselect(self.playbackMarker)
         direct.deselect(self.tangentMarker)
         # Remove tasks
-        taskMgr.removeTasksNamed(self.name + '-recordTask')
-        taskMgr.removeTasksNamed(self.name + '-playbackTask')
-        taskMgr.removeTasksNamed(self.name + '-curveEditTask')
+        taskMgr.remove(self.name + '-recordTask')
+        taskMgr.remove(self.name + '-playbackTask')
+        taskMgr.remove(self.name + '-curveEditTask')
 
     def createNewPointSet(self):
         self.pointSetName = self.name + '-ps-' + `self.pointSetCount`
@@ -924,8 +924,8 @@ class MopathRecorder(AppShell, PandaObject):
     def toggleRecord(self):
         if self.getVariable('Recording', 'Record').get():
             # Kill old tasks
-            taskMgr.removeTasksNamed(self.name + '-recordTask')
-            taskMgr.removeTasksNamed(self.name + '-curveEditTask')
+            taskMgr.remove(self.name + '-recordTask')
+            taskMgr.remove(self.name + '-curveEditTask')
             # Remove old curve
             self.nurbsCurveDrawer.hide()
             # Reset curve fitters
@@ -966,13 +966,13 @@ class MopathRecorder(AppShell, PandaObject):
                     # start flying nodePath along path
                     self.startPlayback()
                 # Start new task
-                t = taskMgr.spawnMethodNamed(
+                t = taskMgr.add(
                     self.recordTask, self.name + '-recordTask')
                 t.startTime = globalClock.getFrameTime()
         else:
             if self.samplingMode == 'Continuous':
                 # Kill old task
-                taskMgr.removeTasksNamed(self.name + '-recordTask')
+                taskMgr.remove(self.name + '-recordTask')
                 if ((self.recordingType.get() == 'Refine') or
                     (self.recordingType.get() == 'Extend')):
                     # Reparent node path back to parent
@@ -1263,7 +1263,7 @@ class MopathRecorder(AppShell, PandaObject):
         # Make sure checkbutton is set
         self.getVariable('Playback', 'Play').set(1)
         # Start new playback task
-        t = taskMgr.spawnMethodNamed(
+        t = taskMgr.add(
             self.playbackTask, self.name + '-playbackTask')
         t.currentTime = self.playbackTime
         t.lastTime = globalClock.getFrameTime()
@@ -1314,7 +1314,7 @@ class MopathRecorder(AppShell, PandaObject):
 
     def stopPlayback(self):
         self.getVariable('Playback', 'Play').set(0)
-        taskMgr.removeTasksNamed(self.name + '-playbackTask')
+        taskMgr.remove(self.name + '-playbackTask')
 
     def jumpToStartOfPlayback(self):
         self.stopPlayback()

+ 1 - 1
direct/src/tkpanels/Placer.py

@@ -598,7 +598,7 @@ class Placer(AppShell):
         self.pushUndo()
         # If moving widget kill follow task and update wrts
         if self.nodePathMenu.get() == 'widget':
-            taskMgr.removeTasksNamed('followSelectedNodePath')
+            taskMgr.remove('followSelectedNodePath')
             # Record relationship between selected nodes and widget
             direct.selected.getWrtAll()
         # Record initial state

+ 2 - 2
direct/src/tkpanels/TaskManagerPanel.py

@@ -185,7 +185,7 @@ class TaskManagerWidget(PandaObject):
                                  parent = self.parent,
                                  default = 'cancel')
             if ok:
-                self.taskMgr.removeTask(self.currentTask)
+                self.taskMgr.remove(self.currentTask)
                 self.updateTaskListBox()
 
     def removeMatchingTasks(self):
@@ -201,7 +201,7 @@ class TaskManagerWidget(PandaObject):
                              parent = self.parent,
                              default = 'cancel')
         if ok:
-            self.taskMgr.removeTasksNamed(name)
+            self.taskMgr.remove(name)
             self.updateTaskListBox()
 
     def onDestroy(self):

+ 2 - 2
direct/src/tkwidgets/Dial.py

@@ -606,7 +606,7 @@ class DialWidget(Pmw.MegaWidget):
     def knobMouseDown(self,event):
         self._onButtonPress()
         self.knobSF = 0.0
-        t = taskMgr.spawnMethodNamed(self.knobComputeVelocity, 'cv')
+        t = taskMgr.add(self.knobComputeVelocity, 'cv')
         t.lastTime = globalClock.getFrameTime()
 
     def knobComputeVelocity(self, state):
@@ -633,7 +633,7 @@ class DialWidget(Pmw.MegaWidget):
             return -sf
 
     def knobMouseUp(self, event):
-        taskMgr.removeTasksNamed('cv')
+        taskMgr.remove('cv')
         self.knobSF = 0.0
         self._onButtonRelease()
 

+ 2 - 2
direct/src/tkwidgets/Floater.py

@@ -128,7 +128,7 @@ class Floater(Pmw.MegaWidget):
     def _startFloaterTask(self,event):
         self._fFloaterTask = 1
         apply(self.onPress,self['callbackData'])
-        taskMgr.spawnMethodNamed(self._floaterTask, 'floaterTask')
+        taskMgr.add(self._floaterTask, 'floaterTask')
 
     def _floaterTask(self, state):
         if self.velocity != 0.0:
@@ -136,7 +136,7 @@ class Floater(Pmw.MegaWidget):
         return Task.cont
 
     def _floaterReset(self, event):
-        taskMgr.removeTasksNamed('floaterTask')
+        taskMgr.remove('floaterTask')
         self.velocity = 0.0
         self.scale.set(0.0)
         apply(self.onRelease, self['callbackData'])