diff --git a/direct/src/level/EntityTypeRegistry.py b/direct/src/level/EntityTypeRegistry.py index 1f07629aa7..2dcf63cb40 100755 --- a/direct/src/level/EntityTypeRegistry.py +++ b/direct/src/level/EntityTypeRegistry.py @@ -11,9 +11,6 @@ class EntityTypeRegistry: def __init__(self, entityTypeModule=EntityTypes): """pass in a module that contains EntityType classes""" - # maps entity typename to type class - self.typeName2class = {} - # get a list of the entity type classes in the type module classes = [] for key, value in entityTypeModule.__dict__.items(): @@ -26,37 +23,49 @@ class EntityTypeRegistry: # scrub through the class heirarchy and compile complete # attribute descriptor lists for each concrete Entity type class + typeName2class = {} for c in classes: # if this is a concrete Entity type, add it to the dict if c.__dict__.has_key('type'): - if self.typeName2class.has_key(c.type): + if typeName2class.has_key(c.type): EntityTypeRegistry.notify.debug( "replacing %s with %s for type '%s'" % - (self.typeName2class[c.type], c, c.type)) - self.typeName2class[c.type] = c + (typeName2class[c.type], c, c.type)) + typeName2class[c.type] = c self.privCompileAttribDescs(c) + # maps entity typename to ordered list of attrib names + self.typeName2attribNames = {} + # maps entity typename to dict of attrib name -> attrib descriptor + self.typeName2attribDescDict = {} + + for typeName, c in typeName2class.items(): + self.typeName2attribNames[typeName] = [] + self.typeName2attribDescDict[typeName] = {} + + # ordered list of attrib descriptors + attribDescs = c._attribDescs + + for desc in attribDescs: + attribName = desc.getName() + self.typeName2attribNames[typeName].append(attribName) + self.typeName2attribDescDict[typeName][attribName] = desc + def getAttribNames(self, entityTypeName): """ returns ordered list of attribute names for entity type """ - assert entityTypeName in self.typeName2class - # TODO: precompute this - attribDescs = self.typeName2class[entityTypeName]._attribDescs - attribNames = [] - for desc in attribDescs: - attribNames.append(desc.getName()) - return attribNames + assert entityTypeName in self.typeName2attribNames + return self.typeName2attribNames[entityTypeName] def getAttribDescDict(self, entityTypeName): """ returns dict of attribName -> attribDescriptor """ - assert entityTypeName in self.typeName2class - # TODO: precompute this - attribDescs = self.typeName2class[entityTypeName]._attribDescs - attribNames = self.getAttribNames(entityTypeName) - name2desc = {} - for name, desc in zip(attribNames, attribDescs): - name2desc[name] = desc - return name2desc + assert entityTypeName in self.typeName2attribDescDict + return self.typeName2attribDescDict[entityTypeName] + + def __hash__(self): + return hash(str(self)) + def __str__(self): + return str(self.typeName2attribNames)+str(self.typeName2attribDescDict) def privCompileAttribDescs(self, entTypeClass): # has someone already compiled the info?