def __init__(self, collada, id, name, sourcebyid, primitives=None, xmlnode=None, double_sided=False): """Create a geometry instance :param collada.Collada collada: The collada object this geometry belongs to :param str id: A unique string identifier for the geometry :param str name: A text string naming the geometry :param sourcebyid: A list of :class:`collada.source.Source` objects or a dictionary mapping source ids to the actual objects :param list primitives: List of primitive objects contained within the geometry. Do not set this argument manually. Instead, create a :class:`collada.geometry.Geometry` first and then append to :attr:`primitives` with the `create*` functions. :param xmlnode: When loaded, the xmlnode it comes from. :param bool double_sided: Whether or not the geometry should be rendered double sided """ self.collada = collada """The :class:`collada.Collada` object this geometry belongs to""" self.id = id """The unique string identifier for the geometry""" self.name = name """The text string naming the geometry""" self.double_sided = double_sided """A boolean indicating whether or not the geometry should be rendered double sided""" self.sourceById = sourcebyid """A dictionary containing :class:`collada.source.Source` objects indexed by their id.""" if type(sourcebyid) is types.ListType: self.sourceById = {} for src in sourcebyid: self.sourceById[src.id] = src self.primitives = [] """List of primitives (base type :class:`collada.primitive.Primitive`) inside this geometry.""" if primitives is not None: self.primitives = primitives if xmlnode != None: self.xmlnode = xmlnode """ElementTree representation of the geometry.""" else: sourcenodes = [] verticesnode = None for srcid, src in self.sourceById.iteritems(): sourcenodes.append(src.xmlnode) if verticesnode is None: # pick first source to be in the useless <vertices> tag verticesnode = E.vertices( E.input(semantic="POSITION", source="#%s" % srcid), id=srcid + "-vertices" ) meshnode = E.mesh(*sourcenodes) meshnode.append(verticesnode) self.xmlnode = E.geometry(meshnode) if len(self.id) > 0: self.xmlnode.set("id", self.id) if len(self.name) > 0: self.xmlnode.set("name", self.name)