diff --git a/direct/src/distributed/ClientDistUpdate.py b/direct/src/distributed/ClientDistUpdate.py index 1a7d0be0eb..b51c7e3c2f 100644 --- a/direct/src/distributed/ClientDistUpdate.py +++ b/direct/src/distributed/ClientDistUpdate.py @@ -1,85 +1,78 @@ -"""ClientDistUpdate module: contains the ClientDistUpdate class""" - -import DirectNotifyGlobal -import Datagram -from MsgTypes import * - -class ClientDistUpdate: - notify = DirectNotifyGlobal.directNotify.newCategory("ClientDistUpdate") - - def __init__(self, cdc, dcField): - self.cdc = cdc - self.field = dcField - self.number = dcField.getNumber() - self.name = dcField.getName() - self.types = [] - self.divisors = [] - self.deriveTypesFromParticle(dcField) - # Figure out our function pointer - exec("import " + cdc.name) - try: - self.func = eval(cdc.name + "." + cdc.name + "." + self.name) - except: - ClientDistUpdate.notify.warning(cdc.name + "." + self.name + - " does not exist") - self.func = None - return None - - def deriveTypesFromParticle(self, dcField): - dcFieldAtomic = dcField.asAtomicField() - dcFieldMolecular = dcField.asMolecularField() - if dcFieldAtomic: - for i in range(0, dcFieldAtomic.getNumElements()): - self.types.append(dcFieldAtomic.getElementType(i)) - self.divisors.append(dcFieldAtomic.getElementDivisor(i)) - elif dcFieldMolecular: - for i in range(0, dcFieldMolecular.getNumAtomics()): - componentField = dcFieldMolecular.getAtomic(i) - for j in range(0, componentField.getNumElements()): - self.types.append(componentField.getElementType(j)) - self.divisors.append(componentField.getElementDivisor(j)) - else: - ClientDistUpdate.notify.error("field is neither atom nor molecule") - return None - - def updateField(self, cdc, do, di): - - #func = eval(cdc.name + "." + cdc.name + "." + self.name) - #print("Calling: " + cdc.name + "." + cdc.name + "." + self.name + - # " for do " + str(do.getDoId())) - - # Get the arguments into a list - args = self.extractArgs(di) - - # Apply the function to the object with the arguments - apply(self.func, [do] + args) - - return None - - def extractArgs(self, di): - args = [] - assert(len(self.types) == len(self.divisors)) - numTypes = len(self.types) - for i in range(numTypes): - args.append(di.getArg(self.types[i], self.divisors[i])) - return args - - def addArgs(self, datagram, args): - # Add the args to the datagram - numElems = len(args) - assert (numElems == len(self.types) == len(self.divisors)) - for i in range(0, numElems): - datagram.putArg(args[i], self.types[i], self.divisors[i]) - - def sendUpdate(self, cr, do, args): - datagram = Datagram.Datagram() - # Add message type - datagram.addUint16(CLIENT_OBJECT_UPDATE_FIELD) - # Add the DO id - datagram.addUint32(do.doId) - # Add the field id - datagram.addUint16(self.number) - # Add the arguments - self.addArgs(datagram, args) - # send the datagram - cr.send(datagram) +"""ClientDistUpdate module: contains the ClientDistUpdate class""" + +import DirectNotifyGlobal +import Datagram +from MsgTypes import * + +class ClientDistUpdate: + notify = DirectNotifyGlobal.directNotify.newCategory("ClientDistUpdate") + + def __init__(self, cdc, dcField): + self.cdc = cdc + self.field = dcField + self.number = dcField.getNumber() + self.name = dcField.getName() + self.types = [] + self.divisors = [] + self.deriveTypesFromParticle(dcField) + # Figure out our function pointer + exec("import " + cdc.name) + try: + self.func = eval(cdc.name + "." + cdc.name + "." + self.name) + except: + ClientDistUpdate.notify.warning(cdc.name + "." + self.name + + " does not exist") + self.func = None + return None + + def deriveTypesFromParticle(self, dcField): + dcFieldAtomic = dcField.asAtomicField() + dcFieldMolecular = dcField.asMolecularField() + if dcFieldAtomic: + for i in range(0, dcFieldAtomic.getNumElements()): + self.types.append(dcFieldAtomic.getElementType(i)) + self.divisors.append(dcFieldAtomic.getElementDivisor(i)) + elif dcFieldMolecular: + for i in range(0, dcFieldMolecular.getNumAtomics()): + componentField = dcFieldMolecular.getAtomic(i) + for j in range(0, componentField.getNumElements()): + self.types.append(componentField.getElementType(j)) + self.divisors.append(componentField.getElementDivisor(j)) + else: + ClientDistUpdate.notify.error("field is neither atom nor molecule") + return None + + def updateField(self, cdc, do, di): + # Get the arguments into a list + args = self.extractArgs(di) + # Apply the function to the object with the arguments + apply(self.func, [do] + args) + return None + + def extractArgs(self, di): + args = [] + assert(len(self.types) == len(self.divisors)) + numTypes = len(self.types) + for i in range(numTypes): + args.append(di.getArg(self.types[i], self.divisors[i])) + return args + + def addArgs(self, datagram, args): + # Add the args to the datagram + numElems = len(args) + assert (numElems == len(self.types) == len(self.divisors)) + for i in range(0, numElems): + datagram.putArg(args[i], self.types[i], self.divisors[i]) + + def sendUpdate(self, cr, do, args): + datagram = Datagram.Datagram() + # Add message type + datagram.addUint16(CLIENT_OBJECT_UPDATE_FIELD) + # Add the DO id + datagram.addUint32(do.doId) + # Add the field id + datagram.addUint16(self.number) + # Add the arguments + self.addArgs(datagram, args) + # send the datagram + cr.send(datagram)