2
0
Darren Ranalli 21 жил өмнө
parent
commit
11b51badff

+ 64 - 3
direct/src/distributed/DistributedSmoothNodeBase.py

@@ -2,11 +2,13 @@
 
 
 from ClockDelta import *
 from ClockDelta import *
 from direct.task import Task
 from direct.task import Task
-from direct.showbase.PythonUtil import randFloat
+from direct.showbase.PythonUtil import randFloat, Enum
 
 
 class DistributedSmoothNodeBase:
 class DistributedSmoothNodeBase:
     """common base class for DistributedSmoothNode and DistributedSmoothNodeAI
     """common base class for DistributedSmoothNode and DistributedSmoothNodeAI
     """
     """
+    BroadcastTypes = Enum('FULL, XYH')
+    
     def __init__(self):
     def __init__(self):
         pass
         pass
 
 
@@ -62,7 +64,19 @@ class DistributedSmoothNodeBase:
     def stopPosHprBroadcast(self):
     def stopPosHprBroadcast(self):
         taskMgr.remove(self.getPosHprBroadcastTaskName())
         taskMgr.remove(self.getPosHprBroadcastTaskName())
 
 
-    def startPosHprBroadcast(self, period=.2, stagger=0):
+    def startPosHprBroadcast(self, period=.2, stagger=0, type=None):
+        BT = DistributedSmoothNodeBase.BroadcastTypes
+        if type is None:
+            type = BT.FULL
+        # set the broadcast type
+        self.broadcastType = type
+
+        broadcastFuncs = {
+            BT.FULL: self.d_broadcastPosHpr_FULL,
+            BT.XYH:  self.d_broadcastPosHpr_XYH,
+            }
+        self.d_broadcastPosHpr = broadcastFuncs[self.broadcastType]
+        
         # Set stagger to non-zero to randomly delay the initial task execution
         # Set stagger to non-zero to randomly delay the initial task execution
         # over 'period' seconds, to spread out task processing over time
         # over 'period' seconds, to spread out task processing over time
         # when a large number of SmoothNodes are created simultaneously.
         # when a large number of SmoothNodes are created simultaneously.
@@ -103,7 +117,7 @@ class DistributedSmoothNodeBase:
                               self.posHprBroadcast, taskName)
                               self.posHprBroadcast, taskName)
         return Task.done
         return Task.done
 
 
-    def d_broadcastPosHpr(self):
+    def d_broadcastPosHpr_FULL(self):
         # send out the minimal bits to describe our new position
         # send out the minimal bits to describe our new position
         xyz = self.getPos()
         xyz = self.getPos()
         hpr = self.getHpr()
         hpr = self.getHpr()
@@ -183,3 +197,50 @@ class DistributedSmoothNodeBase:
             self.d_setSmPosHpr(self.__storeX, self.__storeY, self.__storeZ,
             self.d_setSmPosHpr(self.__storeX, self.__storeY, self.__storeZ,
                                self.__storeH, self.__storeP, self.__storeR)
                                self.__storeH, self.__storeP, self.__storeR)
             # print ("XYZHPR change")
             # print ("XYZHPR change")
+
+    def d_broadcastPosHpr_XYH(self):
+        # send out the minimal bits to describe our new position
+        xyz = self.getPos()
+        h   = self.getH()
+
+        if abs(self.__storeX - xyz[0]) > self.__epsilon:
+            self.__storeX = xyz[0]
+            newX = 1
+        else:
+            newX = 0
+
+        if abs(self.__storeY - xyz[1]) > self.__epsilon:
+            self.__storeY = xyz[1]
+            newY = 1
+        else:
+            newY = 0
+
+        if abs(self.__storeH - h) > self.__epsilon:
+            self.__storeH = h
+            newH = 1
+        else:
+            newH = 0
+
+        # Check for changes:
+        if not(newX or newY or newH):
+            # No change
+            # Send one and only one "stop" message.
+            if not self.__storeStop:
+                self.__storeStop = 1
+                self.d_setSmStop()
+            # print 'no change'
+        elif (newH) and not(newX or newY):
+            # Only change in H
+            self.__storeStop = 0
+            self.d_setSmH(self.__storeH)
+            # print ("H change")
+        elif (newX or newY) and not(newH):
+            # Only change in X, Y
+            self.__storeStop = 0
+            self.d_setSmXY(self.__storeX, self.__storeY)
+            # print ("XY change")
+        else:
+            # Only change in X, Y, H
+            self.__storeStop = 0
+            self.d_setSmXYH(self.__storeX, self.__storeY, self.__storeH)
+            # print ("XYH change")