Source code for direct.distributed.PyDatagramIterator


# This is built as a subclass instead of an extension so we can define the
# class variable FuncDict and so we can import DCSubatomicType at the top
# of the file rather than every time we call the putArg function.

from panda3d.core import *
from panda3d.direct import *
# Import the type numbers


[docs]class PyDatagramIterator(DatagramIterator): # This is a little helper Dict to replace the huge <if> statement # for trying to match up datagram subatomic types with add funtions # If Python had an O(1) "case" statement we would use that instead FuncDict = { STInt8: DatagramIterator.getInt8, STInt16: DatagramIterator.getInt16, STInt32: DatagramIterator.getInt32, STInt64: DatagramIterator.getInt64, STUint8: DatagramIterator.getUint8, STUint16: DatagramIterator.getUint16, STUint32: DatagramIterator.getUint32, STUint64: DatagramIterator.getUint64, STFloat64: DatagramIterator.getFloat64, STString: DatagramIterator.getString, STBlob: DatagramIterator.getBlob, STBlob32: DatagramIterator.getBlob32, } getChannel = DatagramIterator.getUint64
[docs] def __init__(self, datagram=None, offset=0): if datagram is not None: super().__init__(datagram, offset) # Retain a reference to it so that it doesn't get deleted. self.__initialDatagram = datagram else: super().__init__()
[docs] def assign(self, datagram, offset = 0): super().assign(datagram, offset) self.__initialDatagram = datagram
[docs] def getArg(self, subatomicType, divisor=1): # Import the type numbers if divisor == 1: # See if it is in the handy dict getFunc = self.FuncDict.get(subatomicType) if getFunc: retVal = getFunc(self) # No division necessary elif subatomicType == STInt8array: len = self.getUint16() retVal = [] for i in range(len): retVal.append(self.getInt8()) elif subatomicType == STInt16array: len = self.getUint16() >> 1 retVal = [] for i in range(len): retVal.append(self.getInt16()) elif subatomicType == STInt32array: len = self.getUint16() >> 2 retVal = [] for i in range(len): retVal.append(self.getInt32()) elif subatomicType == STUint8array: len = self.getUint16() retVal = [] for i in range(len): retVal.append(self.getUint8()) elif subatomicType == STUint16array: len = self.getUint16() >> 1 retVal = [] for i in range(len): retVal.append(self.getUint16()) elif subatomicType == STUint32array: len = self.getUint16() >> 2 retVal = [] for i in range(len): retVal.append(self.getUint32()) elif subatomicType == STUint32uint8array: len = self.getUint16() / 5 retVal = [] for i in range(len): a = self.getUint32() b = self.getUint8() retVal.append((a, b)) else: raise Exception("Error: No such type as: " + str(subatomicType)) else: # See if it is in the handy dict getFunc = self.FuncDict.get(subatomicType) if getFunc: retVal = (getFunc(self)/float(divisor)) elif subatomicType == STInt8array: len = self.getUint8() >> 1 retVal = [] for i in range(len): retVal.append(self.getInt8()/float(divisor)) elif subatomicType == STInt16array: len = self.getUint16() >> 1 retVal = [] for i in range(len): retVal.append(self.getInt16()/float(divisor)) elif subatomicType == STInt32array: len = self.getUint16() >> 2 retVal = [] for i in range(len): retVal.append(self.getInt32()/float(divisor)) elif subatomicType == STUint8array: len = self.getUint8() >> 1 retVal = [] for i in range(len): retVal.append(self.getUint8()/float(divisor)) elif subatomicType == STUint16array: len = self.getUint16() >> 1 retVal = [] for i in range(len): retVal.append(self.getUint16()/float(divisor)) elif subatomicType == STUint32array: len = self.getUint16() >> 2 retVal = [] for i in range(len): retVal.append(self.getUint32()/float(divisor)) elif subatomicType == STUint32uint8array: len = self.getUint16() / 5 retVal = [] for i in range(len): a = self.getUint32() b = self.getUint8() retVal.append((a / float(divisor), b / float(divisor))) else: raise Exception("Error: No such type as: " + str(subatomicType)) return retVal