diff --git a/direct/src/distributed/DistributedSmoothNodeBase.py b/direct/src/distributed/DistributedSmoothNodeBase.py index da8b54817d..6655e7de87 100755 --- a/direct/src/distributed/DistributedSmoothNodeBase.py +++ b/direct/src/distributed/DistributedSmoothNodeBase.py @@ -2,11 +2,13 @@ from ClockDelta import * from direct.task import Task -from direct.showbase.PythonUtil import randFloat +from direct.showbase.PythonUtil import randFloat, Enum class DistributedSmoothNodeBase: """common base class for DistributedSmoothNode and DistributedSmoothNodeAI """ + BroadcastTypes = Enum('FULL, XYH') + def __init__(self): pass @@ -62,7 +64,19 @@ class DistributedSmoothNodeBase: def stopPosHprBroadcast(self): 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 # over 'period' seconds, to spread out task processing over time # when a large number of SmoothNodes are created simultaneously. @@ -103,7 +117,7 @@ class DistributedSmoothNodeBase: self.posHprBroadcast, taskName) return Task.done - def d_broadcastPosHpr(self): + def d_broadcastPosHpr_FULL(self): # send out the minimal bits to describe our new position xyz = self.getPos() hpr = self.getHpr() @@ -183,3 +197,50 @@ class DistributedSmoothNodeBase: self.d_setSmPosHpr(self.__storeX, self.__storeY, self.__storeZ, self.__storeH, self.__storeP, self.__storeR) # 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")