def save(self): """Saves the effect back to :attr:`xmlnode`""" self.xmlnode.set('id', self.id) self.xmlnode.set('name', self.id) profilenode = self.xmlnode.find( tag('profile_COMMON') ) tecnode = profilenode.find( tag('technique') ) tecnode.set('sid', 'common') self._fixColorValues() for param in self.params: param.save() if param.xmlnode not in profilenode.getchildren(): profilenode.insert(profilenode.index(tecnode), param.xmlnode) deletenodes = [] for oldparam in profilenode.findall( tag('newparam') ): if oldparam not in [param.xmlnode for param in self.params]: deletenodes.append(oldparam) for d in deletenodes: profilenode.remove(d) for shader in self.shaders: shadnode = tecnode.find(tag(shader)) if shadnode is not None and shader != self.shadingtype: tecnode.remove(shadnode) def getPropNode(prop, value): propnode = E(prop) if type(value) is Map: propnode.append(copy.deepcopy(value.xmlnode)) elif type(value) is float: propnode.append(E.float(str(value))) else: propnode.append(E.color(' '.join(map(str, value) ))) return propnode shadnode = tecnode.find(tag(self.shadingtype)) if shadnode is None: shadnode = E(self.shadingtype) for prop in self.supported: value = getattr(self, prop) if value is None: continue shadnode.append(getPropNode(prop, value)) tecnode.append(shadnode) else: for prop in self.supported: value = getattr(self, prop) propnode = shadnode.find(tag(prop)) if propnode is not None: shadnode.remove(propnode) if value is not None: shadnode.append(getPropNode(prop, value)) double_sided_node = profilenode.find('.//%s//%s' % (tag('extra'), tag('double_sided'))) if double_sided_node is None or double_sided_node.text is None: extranode = profilenode.find(tag('extra')) if extranode is None: extranode = E.extra() profilenode.append(extranode) teqnodes = extranode.findall(tag('technique')) goognode = None for teqnode in teqnodes: if teqnode.get('profile') == 'GOOGLEEARTH': goognode = teqnode break if goognode is None: goognode = E.technique(profile='GOOGLEEARTH') extranode.append(goognode) double_sided_node = goognode.find(tag('double_sided')) if double_sided_node is None: double_sided_node = E.double_sided() goognode.append(double_sided_node) double_sided_node.text = "1" if self.double_sided else "0"
def __init__(self, id, params, shadingtype, bumpmap = None, double_sided = False, emission = (0.0, 0.0, 0.0, 1.0), ambient = (0.0, 0.0, 0.0, 1.0), diffuse = (0.0, 0.0, 0.0, 1.0), specular = (0.0, 0.0, 0.0, 1.0), shininess = 0.0, reflective = (0.0, 0.0, 0.0, 1.0), reflectivity = 0.0, transparent = (0.0, 0.0, 0.0, 1.0), transparency = 0.0, index_of_refraction = None, xmlnode = None): """Create an effect instance out of properties. :param str id: A string identifier for the effect :param list params: A list containing elements of type :class:`collada.material.Sampler2D` and :class:`collada.material.Surface` :param str shadingtype: The type of shader to be used for this effect. Right now, we only supper the shaders listed in :attr:`shaders` :param `collada.material.Map` bumpmap: The bump map for this effect, or None if there isn't one :param bool double_sided: Whether or not the material should be rendered double sided :param emission: Either an RGBA-format tuple of four floats or an instance of :class:`collada.material.Map` :param ambient: Either an RGBA-format tuple of four floats or an instance of :class:`collada.material.Map` :param diffuse: Either an RGBA-format tuple of four floats or an instance of :class:`collada.material.Map` :param specular: Either an RGBA-format tuple of four floats or an instance of :class:`collada.material.Map` :param shininess: Either a single float or an instance of :class:`collada.material.Map` :param reflective: Either an RGBA-format tuple of four floats or an instance of :class:`collada.material.Map` :param reflectivity: Either a single float or an instance of :class:`collada.material.Map` :param tuple transparent: Either an RGBA-format tuple of four floats or an instance of :class:`collada.material.Map` :param transparency: Either a single float or an instance of :class:`collada.material.Map` :param float index_of_refraction: A single float indicating the index of refraction for perfectly refracted light :param xmlnode: If loaded from xml, the xml node """ self.id = id """The string identifier for the effect""" self.params = params """A list containing elements of type :class:`collada.material.Sampler2D` and :class:`collada.material.Surface`""" self.shadingtype = shadingtype """String with the type of the shading.""" self.bumpmap = bumpmap """Either the bump map of the effect of type :class:`collada.material.Map` or None if there is none.""" self.double_sided = double_sided """A boolean indicating whether or not the material should be rendered double sided""" self.emission = emission """Either an RGB-format tuple of three floats or an instance of :class:`collada.material.Map`""" self.ambient = ambient """Either an RGB-format tuple of three floats or an instance of :class:`collada.material.Map`""" self.diffuse = diffuse """Either an RGB-format tuple of three floats or an instance of :class:`collada.material.Map`""" self.specular = specular """Either an RGB-format tuple of three floats or an instance of :class:`collada.material.Map`""" self.shininess = shininess """Either a single float or an instance of :class:`collada.material.Map`""" self.reflective = reflective """Either an RGB-format tuple of three floats or an instance of :class:`collada.material.Map`""" self.reflectivity = reflectivity """Either a single float or an instance of :class:`collada.material.Map`""" self.transparent = transparent """Either an RGB-format tuple of three floats or an instance of :class:`collada.material.Map`""" self.transparency = transparency """Either a single float or an instance of :class:`collada.material.Map`""" self.index_of_refraction = index_of_refraction """A single float indicating the index of refraction for perfectly refracted light""" self._fixColorValues() if xmlnode is not None: self.xmlnode = xmlnode """ElementTree representation of the effect""" else: shadnode = E(self.shadingtype) for prop in self.supported: value = getattr(self, prop) if value is None: continue propnode = E(prop) shadnode.append( propnode ) if type(value) is Map: propnode.append(value.xmlnode) elif type(value) is float: propnode.append(E.float(str(value))) else: propnode.append(E.color(' '.join(map(str, value) ))) effect_nodes = [param.xmlnode for param in self.params] effect_nodes.append(E.technique(shadnode, sid='common')) self.xmlnode = E.effect( E.profile_COMMON(*effect_nodes) , id=self.id, name=self.id)